diff options
-rw-r--r-- | libguile/vm-engine.c | 5 | ||||
-rw-r--r-- | libguile/vm-i-system.c | 4 | ||||
-rw-r--r-- | libguile/vm.h | 4 |
3 files changed, 11 insertions, 2 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 8c188d33d..1976f7107 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -233,6 +233,11 @@ VM_NAME (SCM vm, SCM program, SCM *argv, int nargs) finish_args = SCM_EOL; goto vm_error; + vm_error_continuation_not_rewindable: + err_msg = scm_from_locale_string ("Unrewindable partial continuation"); + finish_args = scm_cons (finish_args, SCM_EOL); + goto vm_error; + vm_error_bad_wide_string_length: err_msg = scm_from_locale_string ("VM: Bad wide string length: ~S"); goto vm_error; diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index 04ef9516b..56df7274e 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -999,6 +999,10 @@ VM_DEFINE_INSTRUCTION (94, partial_cont_call, "partial-cont-call", 0, -1, 0) POP (intwinds); POP (vmcont); SYNC_REGISTER (); + if (SCM_UNLIKELY (!SCM_VM_CONT_REWINDABLE_P (vmcont))) + { finish_args = vmcont; + goto vm_error_continuation_not_rewindable; + } vm_reinstate_partial_continuation (vm, vmcont, intwinds, sp + 1 - fp, fp); CACHE_REGISTER (); program = SCM_FRAME_PROGRAM (fp); diff --git a/libguile/vm.h b/libguile/vm.h index 48e0bb627..ade4bb667 100644 --- a/libguile/vm.h +++ b/libguile/vm.h @@ -102,8 +102,8 @@ struct scm_vm_cont { #define SCM_VM_CONT_P(OBJ) (SCM_NIMP (OBJ) && SCM_TYP7 (OBJ) == scm_tc7_vm_cont) #define SCM_VM_CONT_DATA(CONT) ((struct scm_vm_cont *) SCM_CELL_WORD_1 (CONT)) -#define SCM_VM_CONT_PARTIAL_P(CONT) (SCM_VM_CONT_DATA (CONT) & SCM_F_VM_CONT_PARTIAL) -#define SCM_VM_CONT_REWINDABLE_P(CONT) (SCM_VM_CONT_DATA (CONT) & SCM_F_VM_CONT_REWINDABLE) +#define SCM_VM_CONT_PARTIAL_P(CONT) (SCM_VM_CONT_DATA (CONT)->flags & SCM_F_VM_CONT_PARTIAL) +#define SCM_VM_CONT_REWINDABLE_P(CONT) (SCM_VM_CONT_DATA (CONT)->flags & SCM_F_VM_CONT_REWINDABLE) SCM_API SCM scm_load_compiled_with_vm (SCM file); |