aboutsummaryrefslogtreecommitdiff
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
parent79a2ecc929b30ae40f9324c258d8ded99ecde259 (diff)
a little improvement (but it can't resolve the circular referencing problem)
-rw-r--r--Makefile2
-rw-r--r--eval.cpp6
-rw-r--r--gc.cpp10
3 files changed, 12 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index 4d4db95..ee70498 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ sonsi: main.o parser.o builtin.o model.o eval.o exc.o consts.o types.o gc.o
g++ -o sonsi $^ -pg -lgmp
.cpp.o:
- g++ $< -c -pg -DGMP_SUPPORT -Wall -DGC_INFO -O2
+ g++ $< -c -g -DGMP_SUPPORT -Wall -DGC_INFO -O2
clean:
rm -f *.o
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)->
diff --git a/gc.cpp b/gc.cpp
index 3fa1402..6db85fa 100644
--- a/gc.cpp
+++ b/gc.cpp
@@ -48,7 +48,7 @@ void GarbageCollector::force() {
} // fetch the pending pointers in the list
// clear the list
pending_list = NULL; */
- fprintf(stderr, "%d\n", mapping.size());
+ fprintf(stderr, "%ld\n", mapping.size());
for (EvalObj2Int::iterator it = mapping.begin();
it != mapping.end(); it++)
if (it->second == 0) *r++ = it->first;
@@ -86,10 +86,12 @@ void GarbageCollector::force() {
fprintf(stderr, "GC: Forced clear, %lu objects are freed, "
"%lu remains\n"
"=============================\n", cnt, mapping.size());
-/* for (EvalObj2Int::iterator it = mapping.begin();
+
+#endif
+#ifdef GC_DEBUG
+ for (EvalObj2Int::iterator it = mapping.begin();
it != mapping.end(); it++)
- fprintf(stderr, "%llx => %lu\n", (ull)it->first, it->second);
- */
+ fprintf(stderr, "%llx => %s\n", (ull)it->first, it->first->ext_repr().c_str());
#endif
collecting = false;
}