diff options
author | Teddy <ted.sybil@gmail.com> | 2013-08-13 10:25:53 +0800 |
---|---|---|
committer | Teddy <ted.sybil@gmail.com> | 2013-08-13 10:25:53 +0800 |
commit | d6765d8d42bd543b414d6ae54392247dd26da649 (patch) | |
tree | d84ecd755a01c07a02d7e54cd339ec36e4931c2c /eval.cpp | |
parent | 79a2ecc929b30ae40f9324c258d8ded99ecde259 (diff) |
a little improvement (but it can't resolve the circular referencing problem)
Diffstat (limited to 'eval.cpp')
-rw-r--r-- | eval.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -149,6 +149,9 @@ EvalObj *Evaluator::run_expr(Pair *prog) { FrameObj **top_ptr = eval_stack; Pair *pc = prog; Continuation *cont = NULL; +#ifdef GC_DEBUG + fprintf(stderr, "Start the evaluation...\n"); +#endif // envt is this->envt push(pc, top_ptr, envt); gc.attach(prog); @@ -170,6 +173,7 @@ EvalObj *Evaluator::run_expr(Pair *prog) { } //< static_cast because the while condition RetAddr *ret_addr = static_cast<RetAddr*>(*top_ptr); + gc.attach(args); if (!ret_addr->addr) { Pair *nexp = TO_PAIR(cont->proc_body->cdr); @@ -189,11 +193,11 @@ EvalObj *Evaluator::run_expr(Pair *prog) { gc.attach(cont); } else pc = nexp; + gc.expose(args); top_ptr++; } else { - gc.attach(args); EvalObj *opt = args->car; if (opt->is_opt_obj()) pc = static_cast<OptObj*>(opt)-> |