void mark_from_env(Env *env, Obj *root) { Env *frame = env; for (; frame; frame = frame->next) { mark_obj(frame->vars); } }
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; } } }
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(); }
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]); } } */ }
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(); }
inline bool ParMarkBitMap::mark_obj(oop obj) { return mark_obj(obj, obj->size()); }
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; } }
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; } }