void* mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits) { /* It seems there are issues when the bitmap doesn't fit: play it safe */ if (numbits >= 30) return GC_NO_DESCRIPTOR; else return (gpointer)GC_make_descriptor ((GC_bitmap)bitmap, numbits); }
void BuildPrefixGCDescriptor(unsigned prefix_len) { if (prefix_len) { GC_word bits[1] = { 0 }; unsigned i; const UInt wordsInBagHeader = sizeof(BagHeader) / sizeof(Bag); for (i = 0; i < prefix_len; i++) GC_set_bit(bits, (i + wordsInBagHeader)); GCDesc[prefix_len] = GC_make_descriptor(bits, prefix_len + wordsInBagHeader); GC_set_bit(bits, 0); GCMDesc[prefix_len] = GC_make_descriptor(bits, prefix_len + wordsInBagHeader); } else { GCDesc[prefix_len] = GC_DS_LENGTH; GCMDesc[prefix_len] = GC_DS_LENGTH | sizeof(void *); } GCKind[prefix_len] = GC_new_kind(GC_new_free_list(), GCDesc[prefix_len], 0, 1); GCMKind[prefix_len] = GC_new_kind(GC_new_free_list(), GCMDesc[prefix_len], 0, 0); }
ILNativeInt ILGCCreateTypeDescriptor(ILNativeUInt bitmap[], ILNativeUInt len) { return (ILNativeInt)GC_make_descriptor((GC_bitmap)bitmap, (size_t)len); }