1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-15 02:00:22 +02:00

sync registers before calling c functions, really

* src/vm_loader.c:
* src/vm_scheme.c: Use SYNC_REGISTER, although it's the same as
  SYNC_BEFORE_GC. A style issue?

* src/vm_system.c (call, tail-call): Explicitly do a SYNC_REGISTER, not
  relying on POP_LIST to do it for us, because POP_LIST won't do it if
  there are 0 arguments. The way that this manifested itself to me was
  badness after the second (read) call in a repl session. I wish I
  understood more about this problem.
This commit is contained in:
Andy Wingo 2008-08-06 00:13:31 +02:00
parent 6287726adc
commit 1865ad5680
3 changed files with 23 additions and 21 deletions

View file

@ -51,7 +51,7 @@ VM_DEFINE_LOADER (load_integer, "load-integer")
long val = 0; long val = 0;
while (len-- > 0) while (len-- > 0)
val = (val << 8) + FETCH (); val = (val << 8) + FETCH ();
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_from_ulong (val)); PUSH (scm_from_ulong (val));
NEXT; NEXT;
} }
@ -64,7 +64,7 @@ VM_DEFINE_LOADER (load_number, "load-number")
size_t len; size_t len;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_string_to_number (scm_from_locale_stringn ((char *)ip, len), PUSH (scm_string_to_number (scm_from_locale_stringn ((char *)ip, len),
SCM_UNDEFINED /* radix = 10 */)); SCM_UNDEFINED /* radix = 10 */));
/* Was: scm_istring2number (ip, len, 10)); */ /* Was: scm_istring2number (ip, len, 10)); */
@ -76,7 +76,7 @@ VM_DEFINE_LOADER (load_string, "load-string")
{ {
size_t len; size_t len;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_from_locale_stringn ((char *)ip, len)); PUSH (scm_from_locale_stringn ((char *)ip, len));
/* Was: scm_makfromstr (ip, len, 0) */ /* Was: scm_makfromstr (ip, len, 0) */
ip += len; ip += len;
@ -87,7 +87,7 @@ VM_DEFINE_LOADER (load_symbol, "load-symbol")
{ {
size_t len; size_t len;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_from_locale_symboln ((char *)ip, len)); PUSH (scm_from_locale_symboln ((char *)ip, len));
ip += len; ip += len;
NEXT; NEXT;
@ -97,7 +97,7 @@ VM_DEFINE_LOADER (load_keyword, "load-keyword")
{ {
size_t len; size_t len;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_from_locale_keywordn ((char *)ip, len)); PUSH (scm_from_locale_keywordn ((char *)ip, len));
ip += len; ip += len;
NEXT; NEXT;
@ -107,7 +107,7 @@ VM_DEFINE_LOADER (load_module, "load-module")
{ {
size_t len; size_t len;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_c_lookup_env (scm_from_locale_symboln ((char *)ip, len))); PUSH (scm_c_lookup_env (scm_from_locale_symboln ((char *)ip, len)));
ip += len; ip += len;
NEXT; NEXT;
@ -120,7 +120,7 @@ VM_DEFINE_LOADER (load_program, "load-program")
struct scm_program *p; struct scm_program *p;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
prog = scm_c_make_program (ip, len, program); prog = scm_c_make_program (ip, len, program);
p = SCM_PROGRAM_DATA (prog); p = SCM_PROGRAM_DATA (prog);
ip += len; ip += len;
@ -188,7 +188,7 @@ VM_DEFINE_INSTRUCTION (link_now, "link-now", 0, 1, 1)
{ {
SCM sym; SCM sym;
POP (sym); POP (sym);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_lookup (sym)); /* might longjmp */ PUSH (scm_lookup (sym)); /* might longjmp */
NEXT; NEXT;
} }
@ -198,7 +198,7 @@ VM_DEFINE_INSTRUCTION (link_later, "link-later", 0, 2, 1)
SCM modname, sym; SCM modname, sym;
POP (sym); POP (sym);
POP (modname); POP (modname);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_cons (modname, sym)); PUSH (scm_cons (modname, sym));
NEXT; NEXT;
} }
@ -209,11 +209,11 @@ VM_DEFINE_LOADER (define, "define")
size_t len; size_t len;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
sym = scm_from_locale_symboln ((char *)ip, len); sym = scm_from_locale_symboln ((char *)ip, len);
ip += len; ip += len;
SYNC_BEFORE_GC (); SYNC_REGISTER ();
PUSH (scm_sym2var (sym, scm_current_module_lookup_closure (), SCM_BOOL_T)); PUSH (scm_sym2var (sym, scm_current_module_lookup_closure (), SCM_BOOL_T));
NEXT; NEXT;
} }
@ -224,7 +224,7 @@ VM_DEFINE_LOADER (late_bind, "late-bind")
size_t len; size_t len;
FETCH_LENGTH (len); FETCH_LENGTH (len);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
sym = scm_from_locale_symboln ((char *)ip, len); sym = scm_from_locale_symboln ((char *)ip, len);
ip += len; ip += len;

View file

@ -89,7 +89,7 @@ VM_DEFINE_FUNCTION (eqv, "eqv?", 2)
RETURN (SCM_BOOL_T); RETURN (SCM_BOOL_T);
if (SCM_IMP (x) || SCM_IMP (y)) if (SCM_IMP (x) || SCM_IMP (y))
RETURN (SCM_BOOL_F); RETURN (SCM_BOOL_F);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
RETURN (scm_eqv_p (x, y)); RETURN (scm_eqv_p (x, y));
} }
@ -100,7 +100,7 @@ VM_DEFINE_FUNCTION (equal, "equal?", 2)
RETURN (SCM_BOOL_T); RETURN (SCM_BOOL_T);
if (SCM_IMP (x) || SCM_IMP (y)) if (SCM_IMP (x) || SCM_IMP (y))
RETURN (SCM_BOOL_F); RETURN (SCM_BOOL_F);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
RETURN (scm_equal_p (x, y)); RETURN (scm_equal_p (x, y));
} }
@ -212,7 +212,7 @@ VM_DEFINE_FUNCTION (ge, "ge?", 2)
if (SCM_FIXABLE (n)) \ if (SCM_FIXABLE (n)) \
RETURN (SCM_I_MAKINUM (n)); \ RETURN (SCM_I_MAKINUM (n)); \
} \ } \
SYNC_BEFORE_GC (); \ SYNC_REGISTER (); \
RETURN (SEXP); \ RETURN (SEXP); \
} }
@ -226,7 +226,7 @@ VM_DEFINE_FUNCTION (ge, "ge?", 2)
if (SCM_FIXABLE (n)) \ if (SCM_FIXABLE (n)) \
RETURN (SCM_I_MAKINUM (n)); \ RETURN (SCM_I_MAKINUM (n)); \
} \ } \
SYNC_BEFORE_GC (); \ SYNC_REGISTER (); \
RETURN (SFUNC (x, y)); \ RETURN (SFUNC (x, y)); \
} }
@ -243,35 +243,35 @@ VM_DEFINE_FUNCTION (sub, "sub", 2)
VM_DEFINE_FUNCTION (mul, "mul", 2) VM_DEFINE_FUNCTION (mul, "mul", 2)
{ {
ARGS2 (x, y); ARGS2 (x, y);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
RETURN (scm_product (x, y)); RETURN (scm_product (x, y));
} }
VM_DEFINE_FUNCTION (div, "div", 2) VM_DEFINE_FUNCTION (div, "div", 2)
{ {
ARGS2 (x, y); ARGS2 (x, y);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
RETURN (scm_divide (x, y)); RETURN (scm_divide (x, y));
} }
VM_DEFINE_FUNCTION (quo, "quo", 2) VM_DEFINE_FUNCTION (quo, "quo", 2)
{ {
ARGS2 (x, y); ARGS2 (x, y);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
RETURN (scm_quotient (x, y)); RETURN (scm_quotient (x, y));
} }
VM_DEFINE_FUNCTION (rem, "rem", 2) VM_DEFINE_FUNCTION (rem, "rem", 2)
{ {
ARGS2 (x, y); ARGS2 (x, y);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
RETURN (scm_remainder (x, y)); RETURN (scm_remainder (x, y));
} }
VM_DEFINE_FUNCTION (mod, "mod", 2) VM_DEFINE_FUNCTION (mod, "mod", 2)
{ {
ARGS2 (x, y); ARGS2 (x, y);
SYNC_BEFORE_GC (); SYNC_REGISTER ();
RETURN (scm_modulo (x, y)); RETURN (scm_modulo (x, y));
} }

View file

@ -480,6 +480,7 @@ VM_DEFINE_INSTRUCTION (call, "call", 1, -1, 1)
SCM args; SCM args;
POP_LIST (nargs); POP_LIST (nargs);
POP (args); POP (args);
SYNC_REGISTER ();
*sp = scm_apply (x, args, SCM_EOL); *sp = scm_apply (x, args, SCM_EOL);
NEXT; NEXT;
} }
@ -601,6 +602,7 @@ VM_DEFINE_INSTRUCTION (tail_call, "tail-call", 1, -1, 1)
SCM args; SCM args;
POP_LIST (nargs); POP_LIST (nargs);
POP (args); POP (args);
SYNC_REGISTER ();
*sp = scm_apply (x, args, SCM_EOL); *sp = scm_apply (x, args, SCM_EOL);
goto vm_return; goto vm_return;
} }