mes: Single environment lookup for variables, SICP chapter 3.
[mes.git] / src / gc.c
index 0b102f1d5dc0269d2e999f59e34ed0ececb5db02..c9539b95e0fad0677981d86b4e6f23de2dd9fb52 100644 (file)
--- a/src/gc.c
+++ b/src/gc.c
@@ -102,7 +102,8 @@ gc_loop (SCM scan) ///((internal))
           || scan == 1 // null
           || NTYPE (scan) == TSPECIAL
           || NTYPE (scan) == TSTRING
-          || NTYPE (scan) == TSYMBOL)
+          || NTYPE (scan) == TSYMBOL
+          || NTYPE (scan) == TVARIABLE)
         {
           SCM car = gc_copy (g_news[scan].car);
           gc_relocate_car (scan, car);
@@ -111,7 +112,8 @@ gc_loop (SCM scan) ///((internal))
            || NTYPE (scan) == TCONTINUATION
            || NTYPE (scan) == TMACRO
            || NTYPE (scan) == TPAIR
-           || NTYPE (scan) == TVALUES)
+           || NTYPE (scan) == TVALUES
+           || NTYPE (scan) == TVARIABLE)
           && g_news[scan].cdr) // allow for 0 terminated list of symbols
         {
           SCM cdr = gc_copy (g_news[scan].cdr);
@@ -125,22 +127,16 @@ gc_loop (SCM scan) ///((internal))
 SCM
 gc_check ()
 {
-#if !MES_ARRAY_STACK
   if (g_free + GC_SAFETY > ARENA_SIZE)
     gc_pop_frame (gc (gc_push_frame ()));
-#else
-#endif
-  if (g_free + GC_SAFETY > ARENA_SIZE)
-    {
-      gc ();
-    }
   return cell_unspecified;
 }
 
 SCM
 gc ()
 {
-  if (g_debug == 1) eputs (".");
+  if (g_debug == 1)
+    eputs (".");
   if (g_debug > 1)
     {
       eputs (";;; gc[");
@@ -150,13 +146,13 @@ gc ()
       eputs ("]...");
     }
   g_free = 1;
-  if (g_cells < g_news && ARENA_SIZE < MAX_ARENA_SIZE) gc_up_arena ();
+  if (g_cells < g_news && ARENA_SIZE < MAX_ARENA_SIZE)
+    gc_up_arena ();
   for (int i=g_free; i<g_symbol_max; i++)
     gc_copy (i);
   make_tmps (g_news);
   g_symbols = gc_copy (g_symbols);
-
-#if !MES_ARRAY_STACK
+  g_macros = gc_copy (g_macros);
   SCM new = gc_copy (g_stack);
   if (g_debug > 1)
     {
@@ -165,8 +161,5 @@ gc ()
       eputs ("\n");
     }
   g_stack = new;
-#else
-#endif
-
   return gc_loop (1);
 }