diff options
author | Andy Wingo <wingo@pobox.com> | 2008-08-05 23:08:58 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2008-08-05 23:08:58 +0200 |
commit | 6287726adc8cb0f667657e2af757c95c072023e4 (patch) | |
tree | 689fb916f3874be9fdfa6e6114529e13847255aa /src | |
parent | d507b25f1f9a3368026c6cd50565e6bbca3fc46f (diff) | |
download | guile-6287726adc8cb0f667657e2af757c95c072023e4.tar.gz |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/vm_loader.c | 12 | ||||
-rw-r--r-- | src/vm_scheme.c | 7 | ||||
-rw-r--r-- | src/vm_system.c | 2 |
3 files changed, 21 insertions, 0 deletions
diff --git a/src/vm_loader.c b/src/vm_loader.c index f91627856..0fd8b6b33 100644 --- a/src/vm_loader.c +++ b/src/vm_loader.c @@ -51,6 +51,7 @@ VM_DEFINE_LOADER (load_integer, "load-integer") long val = 0; while (len-- > 0) val = (val << 8) + FETCH (); + SYNC_BEFORE_GC (); PUSH (scm_from_ulong (val)); NEXT; } @@ -63,6 +64,7 @@ VM_DEFINE_LOADER (load_number, "load-number") size_t len; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); PUSH (scm_string_to_number (scm_from_locale_stringn ((char *)ip, len), SCM_UNDEFINED /* radix = 10 */)); /* Was: scm_istring2number (ip, len, 10)); */ @@ -74,6 +76,7 @@ VM_DEFINE_LOADER (load_string, "load-string") { size_t len; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); PUSH (scm_from_locale_stringn ((char *)ip, len)); /* Was: scm_makfromstr (ip, len, 0) */ ip += len; @@ -84,6 +87,7 @@ VM_DEFINE_LOADER (load_symbol, "load-symbol") { size_t len; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); PUSH (scm_from_locale_symboln ((char *)ip, len)); ip += len; NEXT; @@ -93,6 +97,7 @@ VM_DEFINE_LOADER (load_keyword, "load-keyword") { size_t len; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); PUSH (scm_from_locale_keywordn ((char *)ip, len)); ip += len; NEXT; @@ -102,6 +107,7 @@ VM_DEFINE_LOADER (load_module, "load-module") { size_t len; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); PUSH (scm_c_lookup_env (scm_from_locale_symboln ((char *)ip, len))); ip += len; NEXT; @@ -114,6 +120,7 @@ VM_DEFINE_LOADER (load_program, "load-program") struct scm_program *p; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); prog = scm_c_make_program (ip, len, program); p = SCM_PROGRAM_DATA (prog); ip += len; @@ -181,6 +188,7 @@ VM_DEFINE_INSTRUCTION (link_now, "link-now", 0, 1, 1) { SCM sym; POP (sym); + SYNC_BEFORE_GC (); PUSH (scm_lookup (sym)); /* might longjmp */ NEXT; } @@ -190,6 +198,7 @@ VM_DEFINE_INSTRUCTION (link_later, "link-later", 0, 2, 1) SCM modname, sym; POP (sym); POP (modname); + SYNC_BEFORE_GC (); PUSH (scm_cons (modname, sym)); NEXT; } @@ -200,9 +209,11 @@ VM_DEFINE_LOADER (define, "define") size_t len; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); sym = scm_from_locale_symboln ((char *)ip, len); ip += len; + SYNC_BEFORE_GC (); PUSH (scm_sym2var (sym, scm_current_module_lookup_closure (), SCM_BOOL_T)); NEXT; } @@ -213,6 +224,7 @@ VM_DEFINE_LOADER (late_bind, "late-bind") size_t len; FETCH_LENGTH (len); + SYNC_BEFORE_GC (); sym = scm_from_locale_symboln ((char *)ip, len); ip += len; diff --git a/src/vm_scheme.c b/src/vm_scheme.c index 99568cc1c..2408f6415 100644 --- a/src/vm_scheme.c +++ b/src/vm_scheme.c @@ -212,6 +212,7 @@ VM_DEFINE_FUNCTION (ge, "ge?", 2) if (SCM_FIXABLE (n)) \ RETURN (SCM_I_MAKINUM (n)); \ } \ + SYNC_BEFORE_GC (); \ RETURN (SEXP); \ } @@ -225,6 +226,7 @@ VM_DEFINE_FUNCTION (ge, "ge?", 2) if (SCM_FIXABLE (n)) \ RETURN (SCM_I_MAKINUM (n)); \ } \ + SYNC_BEFORE_GC (); \ RETURN (SFUNC (x, y)); \ } @@ -241,30 +243,35 @@ VM_DEFINE_FUNCTION (sub, "sub", 2) VM_DEFINE_FUNCTION (mul, "mul", 2) { ARGS2 (x, y); + SYNC_BEFORE_GC (); RETURN (scm_product (x, y)); } VM_DEFINE_FUNCTION (div, "div", 2) { ARGS2 (x, y); + SYNC_BEFORE_GC (); RETURN (scm_divide (x, y)); } VM_DEFINE_FUNCTION (quo, "quo", 2) { ARGS2 (x, y); + SYNC_BEFORE_GC (); RETURN (scm_quotient (x, y)); } VM_DEFINE_FUNCTION (rem, "rem", 2) { ARGS2 (x, y); + SYNC_BEFORE_GC (); RETURN (scm_remainder (x, y)); } VM_DEFINE_FUNCTION (mod, "mod", 2) { ARGS2 (x, y); + SYNC_BEFORE_GC (); RETURN (scm_modulo (x, y)); } diff --git a/src/vm_system.c b/src/vm_system.c index 9876cb65a..d1b9f61aa 100644 --- a/src/vm_system.c +++ b/src/vm_system.c @@ -266,6 +266,7 @@ VM_DEFINE_INSTRUCTION (late_variable_ref, "late-variable-ref", 1, 0, 1) if (!SCM_VARIABLEP (pair_or_var)) { + SYNC_BEFORE_GC (); SCM mod = scm_resolve_module (SCM_CAR (pair_or_var)); /* module_lookup might longjmp */ 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)) { + SYNC_BEFORE_GC (); SCM mod = scm_resolve_module (SCM_CAR (pair_or_var)); /* module_lookup might longjmp */ pair_or_var = scm_module_lookup (mod, SCM_CDR (pair_or_var)); |