I want to get rid of this flag, and move the special case of DOD marking into the mark() vtable entry. Here's a patch which accomplishes most of this (except for getting rid of the special case) and breaks Tcl's PMCs spectacularly.
A little patch review here would be swell. -- c
=== src/pmc/capture.pmc ================================================================== --- src/pmc/capture.pmc (revision 5058) +++ src/pmc/capture.pmc (local) @@ -55,8 +55,7 @@ CAPTURE_array(SELF) = NULL; CAPTURE_hash(SELF) = NULL; PMC_int_val(SELF) = CAPTURE_DATA_SIZE; - PObj_active_destroy_SET(SELF); - PObj_data_is_PMC_array_SET(SELF); + PObj_custom_mark_destroy_SETALL(SELF); } void destroy() { @@ -67,6 +66,17 @@ PMC_int_val(SELF) = 0; } + void mark() { + PMC *array = CAPTURE_array(SELF); + PMC *hash = CAPTURE_hash(SELF); + + if (!PMC_IS_NULL(array)) + pobject_lives(interp, (PObj *)array); + + if (!PMC_IS_NULL(hash)) + pobject_lives(interp, (PObj *)hash); + } + /* =item C<void set_number_keyed_int(INTVAL key, FLOATVAL value)> === src/pmc/fixedpmcarray.pmc ================================================================== --- src/pmc/fixedpmcarray.pmc (revision 5058) +++ src/pmc/fixedpmcarray.pmc (local) @@ -122,9 +122,8 @@ void init() { PMC_int_val(SELF) = 0; - PMC_data(SELF) = NULL; - PObj_active_destroy_SET(SELF); - PObj_data_is_PMC_array_SET(SELF); + PMC_data(SELF) = NULL; + PObj_custom_mark_destroy_SETALL(SELF); } /* @@ -141,7 +140,21 @@ SUPER(type); } +/* +*/ + void mark() { + INTVAL e = DYNSELF.elements(); + INTVAL i; + + for (i = 0; i < e; ++i) { + PMC *elem = DYNSELF.get_pmc_keyed_int(i); + if (!PMC_IS_NULL(elem)) + pobject_lives(interp, (PObj *)elem); + } + } + + /* =item C<void destroy()> @@ -177,7 +190,7 @@ PMC_int_val(dest) = size; PMC_data(dest) = mem_sys_allocate(size * sizeof (PMC*)); mem_sys_memcopy(PMC_data(dest), PMC_data(SELF), size*sizeof (PMC*)); - PObj_data_is_PMC_array_SET(dest); + PObj_custom_mark_destroy_SETALL(dest); } return dest; } @@ -450,7 +463,7 @@ PMC_data(SELF) = mem_sys_allocate(size * sizeof (PMC*)); mem_sys_memcopy(PMC_data(SELF), PMC_data(value), size*sizeof (PMC*)); PMC_int_val2(SELF) = size; - PObj_data_is_PMC_array_SET(SELF); + PObj_custom_mark_destroy_SETALL(SELF); } /* === src/pmc/parrotclass.pmc ================================================================== --- src/pmc/parrotclass.pmc (revision 5058) +++ src/pmc/parrotclass.pmc (local) @@ -195,10 +195,13 @@ void init() { /* No attributes to start with */ PMC_int_val(SELF) = CLASS_ATTRIB_COUNT(SELF) = 0; + /* But we are a class, really */ PObj_is_class_SET(SELF); + /* turn on marking of the class_data array */ - PObj_data_is_PMC_array_SET(SELF); + PObj_custom_mark_destroy_SETALL(SELF); + /* turn on custom destruction since our PMC* array is dynamically allocated */ PObj_active_destroy_SET(SELF); @@ -218,6 +221,21 @@ =cut */ + + void mark() { + SLOTTYPE **attribs = PMC_data_typed(SELF, SLOTTYPE *); + UINTVAL i; + + if (!attribs) + return; + + for (i = 0; i < PCD_MAX; ++i) { + PMC *attrib = get_attrib_num(attribs, i); + if (!PMC_IS_NULL(attrib)) + pobject_lives(interp, (PObj *)attrib); + } + } + void destroy() { if (PMC_int_val(SELF)) { mem_sys_free(PMC_data(SELF));