mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-31 09:20:23 +02:00
save vm's state before calling out to c procedures
* .gitignore: Ignore .go files. * src/vm_loader.c: * src/vm_scheme.c: * src/vm_system.c: Sync the VM's state before calling out to C procedures that might cons or cause a nonlocal exit.
This commit is contained in:
parent
d507b25f1f
commit
6287726adc
4 changed files with 22 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -68,3 +68,4 @@ guile-procedures.txt
|
||||||
guile-config/guile-config
|
guile-config/guile-config
|
||||||
guile-readline/guile-readline-config.h
|
guile-readline/guile-readline-config.h
|
||||||
guile-readline/guile-readline-config.h.in
|
guile-readline/guile-readline-config.h.in
|
||||||
|
*.go
|
||||||
|
|
|
@ -51,6 +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 ();
|
||||||
PUSH (scm_from_ulong (val));
|
PUSH (scm_from_ulong (val));
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
@ -63,6 +64,7 @@ VM_DEFINE_LOADER (load_number, "load-number")
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
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)); */
|
||||||
|
@ -74,6 +76,7 @@ VM_DEFINE_LOADER (load_string, "load-string")
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
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;
|
||||||
|
@ -84,6 +87,7 @@ VM_DEFINE_LOADER (load_symbol, "load-symbol")
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
PUSH (scm_from_locale_symboln ((char *)ip, len));
|
PUSH (scm_from_locale_symboln ((char *)ip, len));
|
||||||
ip += len;
|
ip += len;
|
||||||
NEXT;
|
NEXT;
|
||||||
|
@ -93,6 +97,7 @@ VM_DEFINE_LOADER (load_keyword, "load-keyword")
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
PUSH (scm_from_locale_keywordn ((char *)ip, len));
|
PUSH (scm_from_locale_keywordn ((char *)ip, len));
|
||||||
ip += len;
|
ip += len;
|
||||||
NEXT;
|
NEXT;
|
||||||
|
@ -102,6 +107,7 @@ VM_DEFINE_LOADER (load_module, "load-module")
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
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;
|
||||||
|
@ -114,6 +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 ();
|
||||||
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;
|
||||||
|
@ -181,6 +188,7 @@ VM_DEFINE_INSTRUCTION (link_now, "link-now", 0, 1, 1)
|
||||||
{
|
{
|
||||||
SCM sym;
|
SCM sym;
|
||||||
POP (sym);
|
POP (sym);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
PUSH (scm_lookup (sym)); /* might longjmp */
|
PUSH (scm_lookup (sym)); /* might longjmp */
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
@ -190,6 +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 ();
|
||||||
PUSH (scm_cons (modname, sym));
|
PUSH (scm_cons (modname, sym));
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
@ -200,9 +209,11 @@ VM_DEFINE_LOADER (define, "define")
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
sym = scm_from_locale_symboln ((char *)ip, len);
|
sym = scm_from_locale_symboln ((char *)ip, len);
|
||||||
ip += len;
|
ip += len;
|
||||||
|
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
@ -213,6 +224,7 @@ VM_DEFINE_LOADER (late_bind, "late-bind")
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
sym = scm_from_locale_symboln ((char *)ip, len);
|
sym = scm_from_locale_symboln ((char *)ip, len);
|
||||||
ip += len;
|
ip += len;
|
||||||
|
|
||||||
|
|
|
@ -212,6 +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 (); \
|
||||||
RETURN (SEXP); \
|
RETURN (SEXP); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,6 +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 (); \
|
||||||
RETURN (SFUNC (x, y)); \
|
RETURN (SFUNC (x, y)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,30 +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 ();
|
||||||
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 ();
|
||||||
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 ();
|
||||||
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 ();
|
||||||
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 ();
|
||||||
RETURN (scm_modulo (x, y));
|
RETURN (scm_modulo (x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -266,6 +266,7 @@ VM_DEFINE_INSTRUCTION (late_variable_ref, "late-variable-ref", 1, 0, 1)
|
||||||
|
|
||||||
if (!SCM_VARIABLEP (pair_or_var))
|
if (!SCM_VARIABLEP (pair_or_var))
|
||||||
{
|
{
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
SCM mod = scm_resolve_module (SCM_CAR (pair_or_var));
|
SCM mod = scm_resolve_module (SCM_CAR (pair_or_var));
|
||||||
/* module_lookup might longjmp */
|
/* module_lookup might longjmp */
|
||||||
pair_or_var = scm_module_lookup (mod, SCM_CDR (pair_or_var));
|
pair_or_var = scm_module_lookup (mod, SCM_CDR (pair_or_var));
|
||||||
|
@ -322,6 +323,7 @@ VM_DEFINE_INSTRUCTION (late_variable_set, "late-variable-set", 1, 1, 0)
|
||||||
|
|
||||||
if (!SCM_VARIABLEP (pair_or_var))
|
if (!SCM_VARIABLEP (pair_or_var))
|
||||||
{
|
{
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
SCM mod = scm_resolve_module (SCM_CAR (pair_or_var));
|
SCM mod = scm_resolve_module (SCM_CAR (pair_or_var));
|
||||||
/* module_lookup might longjmp */
|
/* module_lookup might longjmp */
|
||||||
pair_or_var = scm_module_lookup (mod, SCM_CDR (pair_or_var));
|
pair_or_var = scm_module_lookup (mod, SCM_CDR (pair_or_var));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue