diff --git a/libguile/programs.c b/libguile/programs.c index 666b94fbf..122c1b776 100644 --- a/libguile/programs.c +++ b/libguile/programs.c @@ -90,6 +90,8 @@ SCM scm_c_make_closure (SCM program, SCM external) { SCM prog = scm_c_make_program (0, 0, program); + if (!SCM_PROGRAM_P (program)) + abort (); *SCM_PROGRAM_DATA (prog) = *SCM_PROGRAM_DATA (program); SCM_PROGRAM_DATA (prog)->external = external; return prog; diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index 20a0b980d..16899cc59 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -64,6 +64,7 @@ VM_DEFINE_INSTRUCTION (halt, "halt", 0, 0, 0) { POP_LIST (nvalues); POP (ret); + SYNC_REGISTER (); ret = scm_values (ret); } @@ -186,6 +187,7 @@ VM_DEFINE_INSTRUCTION (vector, "vector", 2, -1, 1) unsigned l = FETCH (); unsigned len = ((h << 8) + l); POP_LIST (len); + SYNC_REGISTER (); *sp = scm_vector (*sp); NEXT; } @@ -199,6 +201,7 @@ VM_DEFINE_INSTRUCTION (list_mark, "list-mark", 0, 0, 0) VM_DEFINE_INSTRUCTION (vector_mark, "vector-mark", 0, 0, 0) { POP_LIST_MARK (); + SYNC_REGISTER (); *sp = scm_vector (*sp); NEXT; } diff --git a/libguile/vm.c b/libguile/vm.c index c14fb3b45..b93d7125e 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -331,7 +331,7 @@ vm_mark (SCM obj) /* mark the stack conservatively */ scm_mark_locations ((SCM_STACKITEM *) vp->stack_base, - vp->sp - vp->stack_base + 1); + sizeof (SCM)*(vp->sp + 1 - vp->stack_base)); /* mark other objects */ for (i = 0; i < SCM_VM_NUM_HOOKS; i++)