Hi,<br><br>The last argument is marshalled as VariantBool:<br><br>                            [MarshalAs (UnmanagedType.VariantBool)]<br>
bool bVBCustMarsh);<br><br>VariantBool is marshalled as: (2 bytes, VARIANT_TRUE = 0xFFFF, VARIANT_FALSE = 0)<br><br>so the the C function should receive 0xffff in bVBCustMarsh, not 1. No idea why this happens<br>on ppc.<br>
<br>                                    Zoltan<br><br><div class="gmail_quote">On Sat, May 30, 2009 at 3:36 AM, Steven Munroe <span dir="ltr">&lt;<a href="mailto:munroesj@us.ibm.com">munroesj@us.ibm.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">The test:<br>
<br>
    unsafe public static int test_0_VariantBool_In_Native ()<br>
    {<br>
        int ret;<br>
<br>
        ret = mono_test_marshal_bool_in (5, 0, false, false, false,<br>
false, false);<br>
        if (ret != 0)<br>
            return 0x0100 + ret;<br>
        ret = mono_test_marshal_bool_in (5, 0xFFFF, false, false, false,<br>
false, true);<br>
        if (ret != 0)<br>
            return 0x0200 + ret;<br>
<br>
        bool testVal = false;<br>
        bool* ptestVal = &amp;testVal;<br>
<br>
        Marshal.WriteByte ((IntPtr)ptestVal, 0x22);<br>
        ret = mono_test_marshal_bool_in (5, 0xFFFF, false, false, false,<br>
false, testVal);<br>
        if (ret != 0)<br>
            return 0x0300 + ret;<br>
<br>
        return 0;<br>
    }<br>
<br>
is failing specifically:<br>
<br>
        ret = mono_test_marshal_bool_in (5, 0xFFFF, false, false, false,<br>
false, true);<br>
        if (ret != 0)<br>
            return 0x0200 + ret;<br>
<br>
In PPC we pass 0x00000005 parm arg in R3, 0x0000FFFF to parm &quot;expected&quot;<br>
in R4 and 0x00000001 parm bVBCustMarsh in R9 to<br>
mono_test_marshal_bool_in. The Implementation of<br>
mono_test_marshal_bool_in is:<br>
<br>
LIBTEST_API int STDCALL<br>
mono_test_marshal_bool_in (int arg, unsigned int expected, unsigned int<br>
bDefaultMarsh, unsigned int bBoolCustMarsh,<br>
               char bI1CustMarsh, unsigned char bU1CustMarsh, unsigned<br>
short bVBCustMarsh)<br>
{<br>
    switch (arg) {<br>
    case 1:<br>
        if (bDefaultMarsh != expected)<br>
            return 1;<br>
        break;<br>
    case 2:<br>
        if (bBoolCustMarsh != expected)<br>
            return 2;<br>
        break;<br>
    case 3:<br>
        if (bI1CustMarsh != expected)<br>
            return 3;<br>
        break;<br>
    case 4:<br>
        if (bU1CustMarsh != expected)<br>
            return 4;<br>
        break;<br>
    case 5:<br>
        if (bVBCustMarsh != expected)<br>
            return 5;<br>
        break;<br>
    default:<br>
        return 999;<br>
    }<br>
    return 0;<br>
}<br>
<br>
In this case<br>
<br>
        if (bVBCustMarsh != expected)<br>
            return 5;<br>
<br>
will compare 0x0000FFFF != 0x00000001 and return 5.<br>
<br>
There seems to be a number of problems with this test and its not clean<br>
why it (appears to) work for x86_64. In marshalbool.cs we see<br>
mono_test_marshal_bool_in declared as:<br>
<br>
    [DllImport (&quot;libtest&quot;)]<br>
    static extern int mono_test_marshal_bool_in (int arg, uint expected,<br>
                             bool bDefaultMarsh,<br>
                             [MarshalAs (UnmanagedType.Bool)] bool<br>
bBoolCustMarsh,<br>
                             [MarshalAs (UnmanagedType.I1)] bool<br>
bI1CustMarsh,<br>
                             [MarshalAs (UnmanagedType.U1)] bool<br>
bU1CustMarsh,<br>
                             [MarshalAs (UnmanagedType.VariantBool)]<br>
bool bVBCustMarsh);<br>
<br>
Which does not match the declaration on libtest.c:<br>
<br>
LIBTEST_API int STDCALL<br>
mono_test_marshal_bool_in (int arg, unsigned int expected, unsigned int<br>
bDefaultMarsh, unsigned int bBoolCustMarsh,<br>
               char bI1CustMarsh, unsigned char bU1CustMarsh, unsigned<br>
short bVBCustMarsh)<br>
<br>
I don&#39;t see how this test is supposed to work (0x0000FFFF != 0x00000001)<br>
especially as we are comparing a unsigned int to a unsigned short?<br>
<br>
<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br>