Closures no longer appear in the environment, and can therefore be GCd
authorVincent St-Amour <stamourv@iro.umontreal.ca>
Sun, 10 Jan 2010 23:35:51 +0000 (10 18:35 -0500)
committerVincent St-Amour <stamourv@iro.umontreal.ca>
Sun, 10 Jan 2010 23:35:51 +0000 (10 18:35 -0500)
earlier. Short push instructions can also be used slightly more often.
Thanks to Chung-chieh Shan for the idea.

comp.scm
dispatch.c

index 250fe79..5a92c8d 100644 (file)
--- a/comp.scm
+++ b/comp.scm
       (if (>= i 0)
           (gen-push-stack i ctx)
           (gen-push-stack
-          ;; this +1 is needed because closures are in the environment, but
-          ;; don't contain a value, and must therefore be skipped
-          (+ 1
-             (- -1 i)
+          (+ (- -1 i)
              (length (stack-slots (env-local (context-env ctx))))) ctx)))))
 
 (define gen-push-stack
index 03b15d8..7fa01b6 100644 (file)
@@ -41,6 +41,9 @@ uint8 handle_arity_and_rest_param (uint8 na) {
 
   np = rom_get (entry++);
 
+  if (arg1 != OBJ_NULL)
+    arg1 = ram_get_cdr(arg1); // closed environment
+
   if ((np & 0x80) == 0) {
     if (na != np)
       ERROR("handle_arity_and_rest_param.0", "wrong number of arguments");