Merge pull request #2271 from BrzVlad/fix-sizeof-monoarray
authorJoão Matos <joao@tritao.eu>
Mon, 30 Nov 2015 19:21:48 +0000 (14:21 -0500)
committerJoão Matos <joao@tritao.eu>
Mon, 30 Nov 2015 19:21:48 +0000 (14:21 -0500)
[runtime] Fix sizeof MonoArray with non gnu compiler

mono/metadata/monitor.c
mono/metadata/object-internals.h
mono/metadata/object.c
mono/metadata/sgen-client-mono.h
mono/metadata/sgen-mono.c

index f86c4233baf90375a94ee5c248a54c3df585d88a..10125e249ddcb3bc778245a4bba27a963ec20d33 100644 (file)
@@ -410,7 +410,7 @@ mon_new (gsize id)
                if (!monitor_freelist) {
                        MonitorArray *last;
                        LOCK_DEBUG (g_message ("%s: allocating more monitors: %d", __func__, array_size));
-                       marray = g_malloc0 (sizeof (MonoArray) + array_size * sizeof (MonoThreadsSync));
+                       marray = g_malloc0 (MONO_SIZEOF_MONO_ARRAY + array_size * sizeof (MonoThreadsSync));
                        marray->num_monitors = array_size;
                        array_size *= 2;
                        /* link into the freelist */
index eb9e1c61a8c9d0e58ae4a84e29eaa806ce741306..115079beac398dd7260751cd8eef4eb385872d12 100644 (file)
@@ -163,6 +163,8 @@ struct _MonoArray {
        double vector [MONO_ZERO_LEN_ARRAY];
 };
 
+#define MONO_SIZEOF_MONO_ARRAY (sizeof (MonoArray) - MONO_ZERO_LEN_ARRAY * sizeof (double))
+
 struct _MonoString {
        MonoObject object;
        int32_t length;
index 938289bd8f85b8ce23dffe6e0cc52375aa52e0c7..4fd00ae43f27519a6d98ec8b12d134b9adeae668 100644 (file)
@@ -4815,9 +4815,9 @@ mono_array_calc_byte_len (MonoClass *klass, uintptr_t len, uintptr_t *res)
        if (CHECK_MUL_OVERFLOW_UN (byte_len, len))
                return FALSE;
        byte_len *= len;
-       if (CHECK_ADD_OVERFLOW_UN (byte_len, sizeof (MonoArray)))
+       if (CHECK_ADD_OVERFLOW_UN (byte_len, MONO_SIZEOF_MONO_ARRAY))
                return FALSE;
-       byte_len += sizeof (MonoArray);
+       byte_len += MONO_SIZEOF_MONO_ARRAY;
 
        *res = byte_len;
 
@@ -5283,7 +5283,7 @@ mono_object_get_size (MonoObject* o)
                return sizeof (MonoString) + 2 * mono_string_length ((MonoString*) o) + 2;
        } else if (o->vtable->rank) {
                MonoArray *array = (MonoArray*)o;
-               size_t size = sizeof (MonoArray) + mono_array_element_size (klass) * mono_array_length (array);
+               size_t size = MONO_SIZEOF_MONO_ARRAY + mono_array_element_size (klass) * mono_array_length (array);
                if (array->bounds) {
                        size += 3;
                        size &= ~3;
index ab0cedf6ad6d6fa1a27749b87a43bd9788bb3da2..b44d0bc1711998c053ad6a62f0674337810b360a 100644 (file)
@@ -114,7 +114,7 @@ sgen_mono_array_size (GCVTable vtable, MonoArray *array, mword *bounds_size, mwo
        else
                element_size = vtable->klass->sizes.element_size;
 
-       size_without_bounds = size = sizeof (MonoArray) + element_size * mono_array_length_fast (array);
+       size_without_bounds = size = MONO_SIZEOF_MONO_ARRAY + element_size * mono_array_length_fast (array);
 
        if (G_UNLIKELY (array->bounds)) {
                size += sizeof (mono_array_size_t) - 1;
index 2783e1af8fa6dd6967a4bc8312a2b4f2974ced7e..a133f91030f05fa31fe6f79c734dfb0b29211203 100644 (file)
@@ -376,7 +376,7 @@ get_array_fill_vtable (void)
 
                klass.element_class = mono_defaults.byte_class;
                klass.rank = 1;
-               klass.instance_size = sizeof (MonoArray);
+               klass.instance_size = MONO_SIZEOF_MONO_ARRAY;
                klass.sizes.element_size = 1;
                klass.name = "array_filler_type";
 
@@ -395,7 +395,7 @@ sgen_client_array_fill_range (char *start, size_t size)
 {
        MonoArray *o;
 
-       if (size < sizeof (MonoArray)) {
+       if (size < MONO_SIZEOF_MONO_ARRAY) {
                memset (start, 0, size);
                return FALSE;
        }
@@ -405,7 +405,7 @@ sgen_client_array_fill_range (char *start, size_t size)
        /* Mark this as not a real object */
        o->obj.synchronisation = GINT_TO_POINTER (-1);
        o->bounds = NULL;
-       o->max_length = (mono_array_size_t)(size - sizeof (MonoArray));
+       o->max_length = (mono_array_size_t)(size - MONO_SIZEOF_MONO_ARRAY);
 
        return TRUE;
 }
@@ -413,10 +413,10 @@ sgen_client_array_fill_range (char *start, size_t size)
 void
 sgen_client_zero_array_fill_header (void *p, size_t size)
 {
-       if (size >= sizeof (MonoArray)) {
-               memset (p, 0, sizeof (MonoArray));
+       if (size >= MONO_SIZEOF_MONO_ARRAY) {
+               memset (p, 0, MONO_SIZEOF_MONO_ARRAY);
        } else {
-               static guint8 zeros [sizeof (MonoArray)];
+               static guint8 zeros [MONO_SIZEOF_MONO_ARRAY];
 
                SGEN_ASSERT (0, !memcmp (p, zeros, size), "TLAB segment must be zeroed out.");
        }
@@ -1185,7 +1185,7 @@ create_allocator (int atype, gboolean slowpath)
                mono_mb_emit_ldarg (mb, 1);
                mono_mb_emit_byte (mb, CEE_MUL_OVF_UN);
                /* + sizeof (MonoArray) */
-               mono_mb_emit_icon (mb, sizeof (MonoArray));
+               mono_mb_emit_icon (mb, MONO_SIZEOF_MONO_ARRAY);
                mono_mb_emit_byte (mb, CEE_ADD_OVF_UN);
                mono_mb_emit_stloc (mb, size_var);