Esempio n. 1
0
void mark_from_env(Env *env, Obj *root)
{
    Env *frame = env;
    for (; frame; frame = frame->next) {
        mark_obj(frame->vars);
    }
}
Esempio n. 2
0
void mark_obj(Obj *obj)
{
    if (obj && obj->type != TSPE && !MARKED(obj)) {
    /*
        if (DEBUG_GC)
            printf("marking %p (type: %d)\n", obj, obj->type);
            */

        MARK(obj);
        switch (obj->type) {
        case TCELL:
            mark_obj(obj->car);
            mark_obj(obj->cdr);
            break;
        case TFUNCTION:
        case TMACRO:
            mark_obj(obj->params);
            mark_obj(obj->body);
            break;
        }
    }
}
Esempio n. 3
0
static void
gc_mark_definite_locations_n(ScmObj *start, size_t n)
{
    ScmObj *objp;

    SCM_BEGIN_GC_SUBCONTEXT();

    SCM_ASSERT(SCMOBJ_ALIGNEDP(start));

    for (objp = start; objp < &start[n]; objp++)
        mark_obj(*objp);

    SCM_END_GC_SUBCONTEXT();
}
Esempio n. 4
0
void mark_from_root(Env *env, Obj *root)
{
    Obj *frame = root;
    for (; frame; frame = frame->cdr) {
        mark_obj(frame->car);
    }
    /*
    Obj **cframe = root;
    for (; cframe; cframe = (Obj **) cframe[0]) {
        int i = 2;
        for (; cframe[i] != (Obj *) -1; i++) {
            mark_obj(cframe[i]);
        }
    }
    */
}
Esempio n. 5
0
static void
gc_mark_protected_var(void)
{
    ScmObj **slot;

    SCM_BEGIN_GC_SUBCONTEXT();

    if (l_protected_vars) {
        for (slot = l_protected_vars;
             slot < &l_protected_vars[l_protected_vars_size];
             slot++)
        {
            if (*slot)
                mark_obj(**slot);
        }
    }

    SCM_END_GC_SUBCONTEXT();
}
Esempio n. 6
0
inline bool
ParMarkBitMap::mark_obj(oop obj)
{
 return mark_obj(obj, obj->size());
}
Esempio n. 7
0
static void
mark_obj(ScmObj obj)
{
#if SCM_USE_VECTOR
    scm_int_t i;
#endif

mark_loop:
    /* no need to mark constants */
    if (SCM_CONSTANTP(obj))
        return;

    /* avoid cyclic marking */
    if (SCM_MARKEDP(obj))
        return;

    /* mark this object */
    SCM_MARK(obj);

    /* mark recursively */
    switch (SCM_TYPE(obj)) {
    case ScmCons:
        mark_obj(CAR(obj));
        obj = CDR(obj);
        goto mark_loop;

    case ScmSymbol:
        obj = SCM_SYMBOL_VCELL(obj);
        goto mark_loop;

    case ScmClosure:
        mark_obj(SCM_CLOSURE_EXP(obj));
        obj = SCM_CLOSURE_ENV(obj);
        goto mark_loop;

#if SCM_USE_HYGIENIC_MACRO
    case ScmMacro:
        /* Assumes that ScmPackedEnv is an integer. */
        obj = SCM_HMACRO_RULES(obj);
        goto mark_loop;

    case ScmFarsymbol:
        /* Assumes that ScmPackedEnv is an integer. */
        obj = SCM_FARSYMBOL_SYM(obj);
        goto mark_loop;

    case ScmSubpat:
        obj = SCM_SUBPAT_OBJ(obj);
        goto mark_loop;
#endif /* SCM_USE_HYGIENIC_MACRO */

    case ScmValuePacket:
#if SCM_USE_VALUECONS
        mark_obj(SCM_VALUECONS_CAR(obj));
        obj = SCM_VALUECONS_CDR(obj);
#else
        obj = SCM_VALUEPACKET_VALUES(obj);
#endif
        goto mark_loop;

#if SCM_USE_VECTOR
    case ScmVector:
        for (i = 0; i < SCM_VECTOR_LEN(obj); i++) {
            mark_obj(SCM_VECTOR_VEC(obj)[i]);
        }
        break;
#endif

    default:
        break;
    }
}
Esempio n. 8
0
static void
mark_obj(ScmObj obj)
{
#if SCM_USE_VECTOR
    scm_int_t i, len;
    ScmObj *vec;
#endif

mark_loop:
    /* no need to mark immediates */
    if (SCM_IMMP(obj))
        return;

    /* avoid cyclic marking */
    if (SCM_MARKEDP(obj))
        return;

    /* mark this object */
    SCM_MARK(obj);

    /* mark recursively */
    switch (SCM_PTAG(obj)) {
    case SCM_PTAG_CONS:
        /* CONS accessors bypass tag manipulation by default so we
         * have to do it specially here. */
        obj = SCM_DROP_GCBIT(obj);
        mark_obj(SCM_CONS_CAR(obj));
        obj = SCM_CONS_CDR(obj);
        goto mark_loop;

    case SCM_PTAG_CLOSURE:
        mark_obj(SCM_CLOSURE_EXP(obj));
        obj = SCM_CLOSURE_ENV(obj);
        goto mark_loop;

    case SCM_PTAG_MISC:
        if (SYMBOLP(obj)) {
            obj = SCM_SYMBOL_VCELL(obj);
            goto mark_loop;
#if SCM_USE_HYGIENIC_MACRO
        } else if (SCM_WRAPPERP(obj)) { /* Macro-related wrapper. */
            obj = SCM_WRAPPER_OBJ(obj);
            goto mark_loop;
#endif /* SCM_USE_HYGIENIC_MACRO */
#if SCM_USE_VECTOR
        /* Alert: objects that store a non-ScmObj in obj_x must
         * explicitly drop the GC bit here.  This currently applies
         * only to vectors. */
        } else if (VECTORP(obj)) {
            len = SCM_VECTOR_LEN(obj);
            vec = SCM_VECTOR_VEC(obj);
            vec = (ScmObj *)SCM_DROP_GCBIT((scm_intobj_t)vec);
            for (i = 0; i < len; i++) {
                mark_obj(vec[i]);
            }
#endif /* SCM_USE_VECTOR */
        } else if (VALUEPACKETP(obj)) {
            obj = SCM_VALUEPACKET_VALUES(obj);
            goto mark_loop;
        }
        break;

    default:
        break;
    }
}