2002-02-16 Radek Doulik <rodo@ximian.com>
authorRadek Doulik <rodo@mono-cvs.ximian.com>
Sun, 17 Feb 2002 00:23:33 +0000 (00:23 -0000)
committerRadek Doulik <rodo@mono-cvs.ximian.com>
Sun, 17 Feb 2002 00:23:33 +0000 (00:23 -0000)
* icall.c (ves_icall_System_Enum_ToObject): in case of big endian
and s2 > s1, just copy lower bytes to be compatible with little
endian (i.e. 64bit value & 0xffffffff --> 32bit value)

svn path=/trunk/mono/; revision=2454

mono/metadata/ChangeLog
mono/metadata/icall.c

index 219661e67b0861bc5be39ee3f068120c92a335fe..4df461d0044aeb78c82617d168ecc560f9357894 100644 (file)
@@ -1,5 +1,9 @@
 2002-02-16  Radek Doulik  <rodo@ximian.com>
 
+       * icall.c (ves_icall_System_Enum_ToObject): in case of big endian
+       and s2 > s1, just copy lower bytes to be compatible with little
+       endian (i.e. 64bit value & 0xffffffff --> 32bit value)
+
        * unicode.c (ves_icall_iconv_new_encoder): decide on big_endian,
        force big_endian to be 1 for big endian machines 
        (ves_icall_iconv_new_decoder): ditto
index 0b380ac80bee81fd889077a77795e1e1cef9f718..ef3373ea33228ccd76d58f9ee037da651e90c198 100644 (file)
@@ -473,8 +473,13 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
        s2 = mono_class_value_size (obj->vtable->klass, NULL);
 
        res = mono_object_new (domain, enumc);
-       memcpy ((gpointer)res + sizeof (MonoObject), (gpointer)obj + sizeof (MonoObject), MIN (s1, s2));
 
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+       memcpy ((gpointer)res + sizeof (MonoObject), (gpointer)obj + sizeof (MonoObject), MIN (s1, s2));
+#else
+       memcpy ((gpointer)res + sizeof (MonoObject), (gpointer)obj + sizeof (MonoObject) + (s2 > s1 ? s2 - s1 : 0),
+               MIN (s1, s2));
+#endif
        return res;
 }