aboutsummaryrefslogtreecommitdiff
path: root/eval.cpp
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2013-08-13 10:25:53 +0800
committerTeddy <ted.sybil@gmail.com>2013-08-13 10:25:53 +0800
commitd6765d8d42bd543b414d6ae54392247dd26da649 (patch)
treed84ecd755a01c07a02d7e54cd339ec36e4931c2c /eval.cpp
parent79a2ecc929b30ae40f9324c258d8ded99ecde259 (diff)
a little improvement (but it can't resolve the circular referencing problem)
Diffstat (limited to 'eval.cpp')
-rw-r--r--eval.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/eval.cpp b/eval.cpp
index 5112232..73c2120 100644
--- a/eval.cpp
+++ b/eval.cpp
@@ -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)->