microcode: Do not save history_register locally.
authorMatt Birkholz <matt@birchwood-abbey.net>
Sat, 16 Sep 2017 21:38:27 +0000 (14:38 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Sat, 16 Sep 2017 22:36:53 +0000 (15:36 -0700)
The required change to C_call_scheme is described but not implemented.
C_call_scheme has other problems(?).  Preferring a rotated history to
a broken history (broken by a GC during a callback) for now.

src/microcode/interp.h

index 2253554f1579b4b04901b52e84edcd9a50083c2a..163a4ec497d4f3406115b33a05355abc1d9a6ccc 100644 (file)
@@ -63,6 +63,7 @@ USA.
 #define CHECK_RETURN_CODE(code, offset)                                        \
   ((CONT_RET (offset)) == (MAKE_RETURN_CODE (code)))
 
+#if 0
 /* Saving history is required for C_call_scheme to work correctly
    because the recursive call to Interpret() can rotate the history.  */
 
@@ -72,6 +73,15 @@ USA.
   PRIMITIVE_APPLY (primitive);                                         \
   history_register = APFI_saved_history;                               \
 } while (0)
+
+#else
+/* C_call_scheme must save/restore history_register on/from the stack
+   so that it will be relocated if the call to Interpret() causes a
+   garbage collection. */
+
+#define APPLY_PRIMITIVE_FROM_INTERPRETER PRIMITIVE_APPLY
+
+#endif
 \f
 /* Stack manipulation */