/** * @internal * GarbageCollector Marker */ void ctr_gc_mark(ctr_object* object) { ctr_object* el; ctr_mapitem* item; ctr_object* o; ctr_object* k; long i; if (object->info.type == CTR_OBJECT_TYPE_OTARRAY) { for (i = 0; i < object->value.avalue->head; i++) { el = *(object->value.avalue->elements+i); el->info.mark = 1; ctr_gc_mark(el); } } item = object->properties->head; while(item) { k = item->key; o = item->value; o->info.mark = 1; k->info.mark = 1; ctr_gc_mark(o); item = item->next; } item = object->methods->head; while(item) { o = item->value; k = item->key; o->info.mark = 1; k->info.mark = 1; ctr_gc_mark(o); item = item->next; } }
/** * Broom * * GarbageCollector, to invoke use: * * [Broom] sweep. */ ctr_object* ctr_gc_collect (ctr_object* myself, ctr_argument* argumentList) { ctr_object* context; int oldcid; ctr_gc_dust_counter = 0; ctr_gc_object_counter = 0; context = ctr_contexts[ctr_context_id]; oldcid = ctr_context_id; while(ctr_context_id > -1) { ctr_gc_mark(context); ctr_context_id--; context = ctr_contexts[ctr_context_id]; } ctr_gc_sweep(); ctr_context_id = oldcid; return myself; }