core: Remove local variables from gc.
[mes.git] / src / gc.c
index aa4eea44dcb1851a305d94b4245750e58015cb04..34e63c014747bda7f45c6bfde9b9768fdb90d6c6 100644 (file)
--- a/src/gc.c
+++ b/src/gc.c
@@ -1,6 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2016,2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
  *
  * This file is part of Mes.
  *
@@ -18,6 +18,8 @@
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <errno.h>
+
 SCM
 gc_up_arena () ///((internal))
 {
@@ -31,7 +33,8 @@ gc_up_arena () ///((internal))
 #endif
 
 #if _POSIX_SOURCE
-  if (!p) error (cell_symbol_system_error, cons (MAKE_STRING (cstring_to_list (strerror (errno))), MAKE_NUMBER (g_free)));
+  if (!p)
+    error (cell_symbol_system_error, cons (MAKE_STRING (cstring_to_list (strerror (errno))), MAKE_NUMBER (g_free)));
   g_cells = (struct scm*)p;
   g_cells++;
 #endif
@@ -45,7 +48,7 @@ gc_flip () ///((internal))
   struct scm *cells = g_cells;
   g_cells = g_news;
   g_news = cells;
-  if (g_debug > 1)
+  if (g_debug > 2)
     {
       eputs (";;;   => jam[");
       eputs (itoa (g_free));
@@ -57,7 +60,8 @@ gc_flip () ///((internal))
 SCM
 gc_copy (SCM old) ///((internal))
 {
-  if (TYPE (old) == TBROKEN_HEART) return g_cells[old].car;
+  if (TYPE (old) == TBROKEN_HEART)
+    return g_cells[old].car;
   SCM new = g_free++;
   g_news[new] = g_cells[old];
   if (NTYPE (new) == TVECTOR)
@@ -88,6 +92,8 @@ gc_relocate_cdr (SCM new, SCM cdr) ///((internal))
 SCM
 gc_loop (SCM scan) ///((internal))
 {
+  SCM car;
+  SCM cdr;
   while (scan < g_free)
     {
       if (NTYPE (scan) == TCLOSURE
@@ -100,19 +106,21 @@ 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);
+          car = gc_copy (g_news[scan].car);
           gc_relocate_car (scan, car);
         }
       if ((NTYPE (scan) == TCLOSURE
            || 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);
+          cdr = gc_copy (g_news[scan].cdr);
           gc_relocate_cdr (scan, cdr);
         }
       scan++;
@@ -131,8 +139,9 @@ gc_check ()
 SCM
 gc ()
 {
-  if (g_debug == 1) eputs (".");
-  if (g_debug > 1)
+  if (g_debug == 2)
+    eputs (".");
+  if (g_debug > 2)
     {
       eputs (";;; gc[");
       eputs (itoa (g_free));
@@ -141,13 +150,15 @@ 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);
+  g_macros = gc_copy (g_macros);
   SCM new = gc_copy (g_stack);
-  if (g_debug > 1)
+  if (g_debug > 3)
     {
       eputs ("new=");
       eputs (itoa (new));