core: Fixes for garbage collector/jam scraper.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 21 Apr 2018 11:31:12 +0000 (13:31 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 21 Apr 2018 11:31:12 +0000 (13:31 +0200)
* src/gc.c (gc_loop): Do not relocate car of TCLOSURE, TCONTINUATION.
  Check for TBROKEN_HEART.
* src/mes.c (make_closure_): Set car to 0.
  (check_apply): Check for TBROKEN_HEART.  Fixes reporting artificial
  out-of-memory error.
  (eval_apply): Likewise.
* src/vector.c (vector_entry): Only copy TCHAR and TNUMBER.

src/gc.c
src/mes.c
src/vector.c

index 9a78356f4ed5310b3d282cec55d4a35945ad5f32..e1600c4d020c24632ed42951e9afb16a069a4a73 100644 (file)
--- a/src/gc.c
+++ b/src/gc.c
@@ -96,9 +96,9 @@ gc_loop (SCM scan) ///((internal))
   SCM cdr;
   while (scan < g_free)
     {
-      if (NTYPE (scan) == TCLOSURE
-          || NTYPE (scan) == TCONTINUATION
-          || NTYPE (scan) == TFUNCTION
+      if (NTYPE (scan) == TBROKEN_HEART)
+        error (cell_symbol_system_error,  cell_gc);
+      if (NTYPE (scan) == TFUNCTION
           || NTYPE (scan) == TKEYWORD
           || NTYPE (scan) == TMACRO
           || NTYPE (scan) == TPAIR
index 35a0faf5776e20e76dd95f32c089ae2784497481..fa68ddeb25f0fa29c8129afa005ad8d625f39ea9 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -579,6 +579,8 @@ check_apply (SCM f, SCM e) ///((internal))
     type = "number";
   if (TYPE (f) == TSTRING)
     type = "string";
+  if (TYPE (f) == TBROKEN_HEART)
+    type = "<3";
 
   if (type)
     {
@@ -771,7 +773,7 @@ call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal))
 SCM
 make_closure_ (SCM args, SCM body, SCM a) ///((internal))
 {
-  return make_cell__ (TCLOSURE, cell_f, cons (cons (cell_circular, a), cons (args, body)));
+  return make_cell__ (TCLOSURE, 0, cons (cons (cell_circular, a), cons (args, body)));
 }
 
 SCM
@@ -1256,6 +1258,10 @@ eval_apply ()
         r1 = CDR (VARIABLE (r1));
         goto vm_return;
       }
+    case TBROKEN_HEART:
+      {
+        error (cell_symbol_system_error,  r1);
+      }
     default: goto vm_return;
     }
 
index 701fd6de7a472c0fae4f82ff3fcfbc0ffaf43719..b7dd25d920e489981b90cde6700f9a7d2c85e141 100644 (file)
@@ -59,7 +59,7 @@ vector_ref (SCM x, SCM i)
 SCM
 vector_entry (SCM x)
 {
-  if (TYPE (x) == TPAIR || TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL || TYPE (x) == TVECTOR)
+  if (TYPE (x) != TCHAR && TYPE (x) != TNUMBER)
     x = MAKE_REF (x);
   return x;
 }