Ejemplo n.º 1
0
static void
gc_mark_objects(CRB_Interpreter *inter)
{
    CRB_Object *obj;
    Variable *v;
    CRB_LocalEnvironment *lv;
    int i;

    for (obj = inter->heap.header; obj; obj = obj->next) {
        gc_reset_mark(obj);
    }

    for (v = inter->variable; v; v = v->next) {
        if (dkc_is_object_value(v->value.type)) {
            gc_mark(v->value.u.object);
        }
    }

    for (lv = inter->top_environment; lv; lv = lv->next) {
        for (v = lv->variable; v; v = v->next) {
            if (dkc_is_object_value(v->value.type)) {
                gc_mark(v->value.u.object);
            }
        }
        gc_mark_ref_in_native_method(lv);
    }

    for (i = 0; i < inter->stack.stack_pointer; i++) {
        if (dkc_is_object_value(inter->stack.stack[i].type)) {
            gc_mark(inter->stack.stack[i].u.object);
        }
    }
}
Ejemplo n.º 2
0
static void
gc_mark_objects(MVM_VirtualMachine *mvm)
{
    MVM_Object *obj;
    int i;

    for (obj = mvm->heap.header; obj; obj = obj->next) {
        gc_reset_mark(obj);
    }
    
    for (i = 0; i < mvm->static_v.variable_count; i++) {
        if (mvm->executable->global_variable[i].type->basic_type
            == MVM_STRING_TYPE
            || (mvm->executable->global_variable[i].type->derive != NULL
                && (mvm->executable->global_variable[i].type->derive[0].tag
                    == MVM_ARRAY_DERIVE))) {
            gc_mark(mvm->static_v.variable[i].object);
        }
    }

    for (i = 0; i < mvm->stack.stack_pointer; i++) {
        if (mvm->stack.pointer_flags[i]) {
            gc_mark(mvm->stack.stack[i].object);
        }
    }
}