g_assert (size > SGEN_MAX_SMALL_OBJ_SIZE);
g_assert ((size & 1) == 0);
+ /*
+ * size + sizeof (LOSObject) <= SIZE_MAX - (mono_pagesize () - 1)
+ *
+ * therefore:
+ *
+ * size <= SIZE_MAX - (mono_pagesize () - 1) - sizeof (LOSObject)
+ */
+ if (size > SIZE_MAX - (mono_pagesize () - 1) - sizeof (LOSObject))
+ return NULL;
+
#ifdef LOS_DUMMY
if (!los_segment)
los_segment = sgen_alloc_os_memory (LOS_SEGMENT_SIZE, SGEN_ALLOC_HEAP | SGEN_ALLOC_ACTIVATE, NULL);
vtable = (MonoVTable*)SGEN_LOAD_VTABLE (obj->data);
if (obj->data == ptr) {
- SGEN_LOG (0, "%s (size %td pin %d)\n", los_kind, size, pinned ? 1 : 0);
+ SGEN_LOG (0, "%s (size %d pin %d)\n", los_kind, (int)size, pinned ? 1 : 0);
} else {
- SGEN_LOG (0, "%s (interior-ptr offset %td size %td pin %d)",
- los_kind, ptr - obj->data, size, pinned ? 1 : 0);
+ SGEN_LOG (0, "%s (interior-ptr offset %td size %d pin %d)",
+ los_kind, ptr - obj->data, (int)size, pinned ? 1 : 0);
}
return TRUE;
LOSObject *obj;
for (obj = los_object_list; obj; obj = obj->next) {
- guint8 *start_card = sgen_card_table_get_card_scan_address ((mword)obj->data);
- guint8 *end_card = sgen_card_table_get_card_scan_address ((mword)obj->data + obj->size - 1) + 1;
- size_t num_cards = end_card - start_card;
-
- if (!obj->cardtable_mod_union) {
- obj->cardtable_mod_union = sgen_alloc_internal_dynamic (num_cards,
- INTERNAL_MEM_CARDTABLE_MOD_UNION, TRUE);
- memcpy (obj->cardtable_mod_union, start_card, num_cards);
- } else {
- int i;
- for (i = 0; i < num_cards; ++i)
- obj->cardtable_mod_union [i] |= start_card [i];
- }
+ obj->cardtable_mod_union = sgen_card_table_update_mod_union (obj->cardtable_mod_union,
+ obj->data, obj->size, NULL);
}
}
LOSObject*
sgen_los_header_for_object (char *data)
{
+#if _MSC_VER
+ return (LOSObject*)(data - (int)(&(((LOSObject*)0)->data)));
+#else
return (LOSObject*)(data - sizeof (LOSObject));
+#endif
}
void