aboutsummaryrefslogtreecommitdiff
path: root/eval.cpp
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2013-08-12 21:34:55 +0800
committerTeddy <ted.sybil@gmail.com>2013-08-12 21:34:55 +0800
commitd4d9eee6bef1bc9169e765c9bf3d2382a70198c2 (patch)
tree045c3eff6ab6a83554ee2cb46651a19b144ff868 /eval.cpp
parent55d1072441582936d119ed04fd8c532c2760b9d4 (diff)
...
Diffstat (limited to 'eval.cpp')
-rw-r--r--eval.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/eval.cpp b/eval.cpp
index e21ae7b..7370187 100644
--- a/eval.cpp
+++ b/eval.cpp
@@ -110,13 +110,11 @@ inline bool make_exec(Pair *ptr) {
}
inline void push(Pair * &pc, FrameObj ** &top_ptr, Environment *envt) {
- gc.attach(pc);
// if (pc->car == NULL)
// puts("oops");
if (pc->car->is_simple_obj()) // Not an opt invocation
{
- *top_ptr = envt->get_obj(pc->car); // Objectify the symbol
- top_ptr++;
+ *top_ptr++ = gc.attach(envt->get_obj(pc->car)); // Objectify the symbol
pc = pc->next; // Move to the next instruction
// if (pc == empty_list)
// puts("oops");
@@ -152,6 +150,7 @@ EvalObj *Evaluator::run_expr(Pair *prog) {
Continuation *cont = NULL;
// envt is this->envt
push(pc, top_ptr, envt);
+ gc.attach(prog);
while((*eval_stack)->is_ret_addr())
{
@@ -163,7 +162,11 @@ EvalObj *Evaluator::run_expr(Pair *prog) {
{
Pair *args = empty_list;
while (!(*(--top_ptr))->is_ret_addr())
- args = new Pair(static_cast<EvalObj*>(*top_ptr), args);
+ {
+ EvalObj* obj = static_cast<EvalObj*>(*top_ptr);
+ gc.expose(obj);
+ args = new Pair(obj, args);
+ }
//< static_cast because the while condition
RetAddr *ret_addr = static_cast<RetAddr*>(*top_ptr);
if (!ret_addr->addr)