RE: Bug#1101694: gjs: test failures on big-endian

Pranav P <[email protected]>
Newsgroups gmane.linux.debian.ports.s390
Message-ID <CH2PR15MB35434D1C261D9DC086939AD9A08D2@CH2PR15MB3543.namprd15.prod.outlook.com>
Hi Jeremy,

It seems like when `simple_setters_caller` calls `simple_setter_caller<void*>` this function calls `gi_marshalling_tests_properties_accessors_object_set_flags` with `arg->v_pointer` as the `some_flags` where `some_flags` is an `enum` and arg->v_pointer is of `void*` (Actually it's a gpointer but is getting casted to void*).

Memory of arg->v_pointer will look the following (arg is a union):

> (gdb) x/8bx &arg->v_pointer
> 0x3ffffff5170:  0x00    0x00    0x00    0x02    0x00    0x00    0x00    0x00

So, for a direct integer casting( `(int)arg->v_pointer` ) a big endian machine will take the last 4 bytes and hence will be 0.

`some_flags` gets written into the object and a GIArgument is reconstructed back in a later stage when the value is tried to retrieve through a getter in `prop_getter_impl`. The value is written to this GIArgument variable through `simple_getter_caller<void*>` where the value is inserted via `arg->v_pointer` which is of type `void*`.
At this point memory of arg->v_pointer will look like the following:

> (gdb) x/8bx &arg->v_pointer
> 0x3ffffff5288:  0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x02

Now this data is read back from this GIArgument variable at line no. 3336 of arg.cpp where `_gjs_enum_from_int` ultimately return `arg->v_int` which will be the first 4 bytes of `arg` and hence will be 0. When these 2 values are corrected at runtime through gdb, the GIMarshalling tests are passing.

In a little endian machine the first byte will hold `0x02` and this won't cause any of these issues. Even when we set `arg->v_pointer = 2`, in a little endian machine `arg->v_int` will be 2 but not in a big endian machine.

Hope this helps.

Thanks,
Pranav
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.