summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/vm-engine.c5
-rw-r--r--libguile/vm-i-system.c4
-rw-r--r--libguile/vm.h4
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);