X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/1af772303bf4eafb632a95bf4015a7736275e9e7..b2b33168b18c6c4fd65b0e77becba1a66a00dae1:/libguile/vm-i-system.c diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index 958f8b9c3..1b4136f3f 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001,2008,2009,2010 Free Software Foundation, Inc. +/* Copyright (C) 2001,2008,2009,2010,2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -31,7 +31,6 @@ VM_DEFINE_INSTRUCTION (0, nop, "nop", 0, 0, 0) VM_DEFINE_INSTRUCTION (1, halt, "halt", 0, 0, 0) { - HALT_HOOK (); nvalues = SCM_I_INUM (*sp--); NULLSTACK (1); if (nvalues == 1) @@ -62,19 +61,13 @@ VM_DEFINE_INSTRUCTION (1, halt, "halt", 0, 0, 0) goto vm_done; } -VM_DEFINE_INSTRUCTION (2, break, "break", 0, 0, 0) -{ - BREAK_HOOK (); - NEXT; -} - -VM_DEFINE_INSTRUCTION (3, drop, "drop", 0, 1, 0) +VM_DEFINE_INSTRUCTION (2, drop, "drop", 0, 1, 0) { DROP (); NEXT; } -VM_DEFINE_INSTRUCTION (4, dup, "dup", 0, 0, 1) +VM_DEFINE_INSTRUCTION (3, dup, "dup", 0, 0, 1) { SCM x = *sp; PUSH (x); @@ -86,55 +79,55 @@ VM_DEFINE_INSTRUCTION (4, dup, "dup", 0, 0, 1) * Object creation */ -VM_DEFINE_INSTRUCTION (5, void, "void", 0, 0, 1) +VM_DEFINE_INSTRUCTION (4, void, "void", 0, 0, 1) { PUSH (SCM_UNSPECIFIED); NEXT; } -VM_DEFINE_INSTRUCTION (6, make_true, "make-true", 0, 0, 1) +VM_DEFINE_INSTRUCTION (5, make_true, "make-true", 0, 0, 1) { PUSH (SCM_BOOL_T); NEXT; } -VM_DEFINE_INSTRUCTION (7, make_false, "make-false", 0, 0, 1) +VM_DEFINE_INSTRUCTION (6, make_false, "make-false", 0, 0, 1) { PUSH (SCM_BOOL_F); NEXT; } -VM_DEFINE_INSTRUCTION (8, make_nil, "make-nil", 0, 0, 1) +VM_DEFINE_INSTRUCTION (7, make_nil, "make-nil", 0, 0, 1) { PUSH (SCM_ELISP_NIL); NEXT; } -VM_DEFINE_INSTRUCTION (9, make_eol, "make-eol", 0, 0, 1) +VM_DEFINE_INSTRUCTION (8, make_eol, "make-eol", 0, 0, 1) { PUSH (SCM_EOL); NEXT; } -VM_DEFINE_INSTRUCTION (10, make_int8, "make-int8", 1, 0, 1) +VM_DEFINE_INSTRUCTION (9, make_int8, "make-int8", 1, 0, 1) { PUSH (SCM_I_MAKINUM ((signed char) FETCH ())); NEXT; } -VM_DEFINE_INSTRUCTION (11, make_int8_0, "make-int8:0", 0, 0, 1) +VM_DEFINE_INSTRUCTION (10, make_int8_0, "make-int8:0", 0, 0, 1) { PUSH (SCM_INUM0); NEXT; } -VM_DEFINE_INSTRUCTION (12, make_int8_1, "make-int8:1", 0, 0, 1) +VM_DEFINE_INSTRUCTION (11, make_int8_1, "make-int8:1", 0, 0, 1) { PUSH (SCM_I_MAKINUM (1)); NEXT; } -VM_DEFINE_INSTRUCTION (13, make_int16, "make-int16", 2, 0, 1) +VM_DEFINE_INSTRUCTION (12, make_int16, "make-int16", 2, 0, 1) { int h = FETCH (); int l = FETCH (); @@ -142,7 +135,7 @@ VM_DEFINE_INSTRUCTION (13, make_int16, "make-int16", 2, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (14, make_int64, "make-int64", 8, 0, 1) +VM_DEFINE_INSTRUCTION (13, make_int64, "make-int64", 8, 0, 1) { scm_t_uint64 v = 0; v += FETCH (); @@ -157,7 +150,7 @@ VM_DEFINE_INSTRUCTION (14, make_int64, "make-int64", 8, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (15, make_uint64, "make-uint64", 8, 0, 1) +VM_DEFINE_INSTRUCTION (14, make_uint64, "make-uint64", 8, 0, 1) { scm_t_uint64 v = 0; v += FETCH (); @@ -172,7 +165,7 @@ VM_DEFINE_INSTRUCTION (15, make_uint64, "make-uint64", 8, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (16, make_char8, "make-char8", 1, 0, 1) +VM_DEFINE_INSTRUCTION (15, make_char8, "make-char8", 1, 0, 1) { scm_t_uint8 v = 0; v = FETCH (); @@ -184,7 +177,7 @@ VM_DEFINE_INSTRUCTION (16, make_char8, "make-char8", 1, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (17, make_char32, "make-char32", 4, 0, 1) +VM_DEFINE_INSTRUCTION (16, make_char32, "make-char32", 4, 0, 1) { scm_t_wchar v = 0; v += FETCH (); @@ -197,7 +190,7 @@ VM_DEFINE_INSTRUCTION (17, make_char32, "make-char32", 4, 0, 1) -VM_DEFINE_INSTRUCTION (18, list, "list", 2, -1, 1) +VM_DEFINE_INSTRUCTION (17, list, "list", 2, -1, 1) { unsigned h = FETCH (); unsigned l = FETCH (); @@ -206,7 +199,7 @@ VM_DEFINE_INSTRUCTION (18, list, "list", 2, -1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (19, vector, "vector", 2, -1, 1) +VM_DEFINE_INSTRUCTION (18, vector, "vector", 2, -1, 1) { unsigned h = FETCH (); unsigned l = FETCH (); @@ -240,13 +233,13 @@ VM_DEFINE_INSTRUCTION (19, vector, "vector", 2, -1, 1) nothing more than the corresponding macros. */ #define VARIABLE_REF(v) SCM_VARIABLE_REF (v) #define VARIABLE_SET(v,o) SCM_VARIABLE_SET (v, o) -#define VARIABLE_BOUNDP(v) (VARIABLE_REF (v) != SCM_UNDEFINED) +#define VARIABLE_BOUNDP(v) (!scm_is_eq (VARIABLE_REF (v), SCM_UNDEFINED)) #define FREE_VARIABLE_REF(i) SCM_PROGRAM_FREE_VARIABLE_REF (program, i) /* ref */ -VM_DEFINE_INSTRUCTION (20, object_ref, "object-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (19, object_ref, "object-ref", 1, 0, 1) { register unsigned objnum = FETCH (); CHECK_OBJECT (objnum); @@ -255,7 +248,7 @@ VM_DEFINE_INSTRUCTION (20, object_ref, "object-ref", 1, 0, 1) } /* FIXME: necessary? elt 255 of the vector could be a vector... */ -VM_DEFINE_INSTRUCTION (21, long_object_ref, "long-object-ref", 2, 0, 1) +VM_DEFINE_INSTRUCTION (20, long_object_ref, "long-object-ref", 2, 0, 1) { unsigned int objnum = FETCH (); objnum <<= 8; @@ -265,14 +258,14 @@ VM_DEFINE_INSTRUCTION (21, long_object_ref, "long-object-ref", 2, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (22, local_ref, "local-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (21, local_ref, "local-ref", 1, 0, 1) { PUSH (LOCAL_REF (FETCH ())); ASSERT_BOUND (*sp); NEXT; } -VM_DEFINE_INSTRUCTION (23, long_local_ref, "long-local-ref", 2, 0, 1) +VM_DEFINE_INSTRUCTION (22, long_local_ref, "long-local-ref", 2, 0, 1) { unsigned int i = FETCH (); i <<= 8; @@ -282,38 +275,42 @@ VM_DEFINE_INSTRUCTION (23, long_local_ref, "long-local-ref", 2, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (24, local_bound, "local-bound?", 1, 0, 1) +VM_DEFINE_INSTRUCTION (23, local_bound, "local-bound?", 1, 0, 1) { - if (LOCAL_REF (FETCH ()) == SCM_UNDEFINED) - PUSH (SCM_BOOL_F); - else - PUSH (SCM_BOOL_T); + PUSH (scm_from_bool (!scm_is_eq (LOCAL_REF (FETCH ()), SCM_UNDEFINED))); NEXT; } -VM_DEFINE_INSTRUCTION (25, long_local_bound, "long-local-bound?", 2, 0, 1) +VM_DEFINE_INSTRUCTION (24, long_local_bound, "long-local-bound?", 2, 0, 1) { unsigned int i = FETCH (); i <<= 8; i += FETCH (); - if (LOCAL_REF (i) == SCM_UNDEFINED) - PUSH (SCM_BOOL_F); - else - PUSH (SCM_BOOL_T); + PUSH (scm_from_bool (!scm_is_eq (LOCAL_REF (i), SCM_UNDEFINED))); NEXT; } -VM_DEFINE_INSTRUCTION (26, variable_ref, "variable-ref", 0, 1, 1) +VM_DEFINE_INSTRUCTION (25, variable_ref, "variable-ref", 0, 1, 1) { SCM x = *sp; - if (SCM_UNLIKELY (!VARIABLE_BOUNDP (x))) + /* We don't use ASSERT_VARIABLE or ASSERT_BOUND_VARIABLE here because, + unlike in top-variable-ref, it really isn't an internal assertion + that can be optimized out -- the variable could be coming directly + from the user. */ + if (SCM_UNLIKELY (!SCM_VARIABLEP (x))) + { + func_name = "variable-ref"; + finish_args = x; + goto vm_error_not_a_variable; + } + else if (SCM_UNLIKELY (!VARIABLE_BOUNDP (x))) { SCM var_name; /* Attempt to provide the variable name in the error message. */ var_name = scm_module_reverse_lookup (scm_current_module (), x); - finish_args = scm_list_1 (scm_is_true (var_name) ? var_name : x); + finish_args = scm_is_true (var_name) ? var_name : x; goto vm_error_unbound; } else @@ -325,31 +322,38 @@ VM_DEFINE_INSTRUCTION (26, variable_ref, "variable-ref", 0, 1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (27, variable_bound, "variable-bound?", 0, 1, 1) +VM_DEFINE_INSTRUCTION (26, variable_bound, "variable-bound?", 0, 1, 1) { - if (VARIABLE_BOUNDP (*sp)) - *sp = SCM_BOOL_T; + SCM x = *sp; + + if (SCM_UNLIKELY (!SCM_VARIABLEP (x))) + { + func_name = "variable-bound?"; + finish_args = x; + goto vm_error_not_a_variable; + } else - *sp = SCM_BOOL_F; + *sp = scm_from_bool (VARIABLE_BOUNDP (x)); NEXT; } -VM_DEFINE_INSTRUCTION (28, toplevel_ref, "toplevel-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (27, toplevel_ref, "toplevel-ref", 1, 0, 1) { unsigned objnum = FETCH (); - SCM what; + SCM what, resolved; CHECK_OBJECT (objnum); what = OBJECT_REF (objnum); - if (!SCM_VARIABLEP (what)) + if (!SCM_VARIABLEP (what)) { SYNC_REGISTER (); - what = resolve_variable (what, scm_program_module (program)); - if (!VARIABLE_BOUNDP (what)) + resolved = resolve_variable (what, scm_program_module (program)); + if (!VARIABLE_BOUNDP (resolved)) { - finish_args = scm_list_1 (what); + finish_args = what; goto vm_error_unbound; } + what = resolved; OBJECT_SET (objnum, what); } @@ -357,24 +361,25 @@ VM_DEFINE_INSTRUCTION (28, toplevel_ref, "toplevel-ref", 1, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (29, long_toplevel_ref, "long-toplevel-ref", 2, 0, 1) +VM_DEFINE_INSTRUCTION (28, long_toplevel_ref, "long-toplevel-ref", 2, 0, 1) { - SCM what; + SCM what, resolved; unsigned int objnum = FETCH (); objnum <<= 8; objnum += FETCH (); CHECK_OBJECT (objnum); what = OBJECT_REF (objnum); - if (!SCM_VARIABLEP (what)) + if (!SCM_VARIABLEP (what)) { SYNC_REGISTER (); - what = resolve_variable (what, scm_program_module (program)); - if (!VARIABLE_BOUNDP (what)) + resolved = resolve_variable (what, scm_program_module (program)); + if (!VARIABLE_BOUNDP (resolved)) { - finish_args = scm_list_1 (what); + finish_args = what; goto vm_error_unbound; } + what = resolved; OBJECT_SET (objnum, what); } @@ -384,31 +389,39 @@ VM_DEFINE_INSTRUCTION (29, long_toplevel_ref, "long-toplevel-ref", 2, 0, 1) /* set */ -VM_DEFINE_INSTRUCTION (30, local_set, "local-set", 1, 1, 0) +VM_DEFINE_INSTRUCTION (29, local_set, "local-set", 1, 1, 0) { - LOCAL_SET (FETCH (), *sp); - DROP (); + SCM x; + POP (x); + LOCAL_SET (FETCH (), x); NEXT; } -VM_DEFINE_INSTRUCTION (31, long_local_set, "long-local-set", 2, 1, 0) +VM_DEFINE_INSTRUCTION (30, long_local_set, "long-local-set", 2, 1, 0) { + SCM x; unsigned int i = FETCH (); i <<= 8; i += FETCH (); - LOCAL_SET (i, *sp); - DROP (); + POP (x); + LOCAL_SET (i, x); NEXT; } -VM_DEFINE_INSTRUCTION (32, variable_set, "variable-set", 0, 2, 0) +VM_DEFINE_INSTRUCTION (31, variable_set, "variable-set", 0, 2, 0) { + if (SCM_UNLIKELY (!SCM_VARIABLEP (sp[0]))) + { + func_name = "variable-set!"; + finish_args = sp[0]; + goto vm_error_not_a_variable; + } VARIABLE_SET (sp[0], sp[-1]); DROPN (2); NEXT; } -VM_DEFINE_INSTRUCTION (33, toplevel_set, "toplevel-set", 1, 1, 0) +VM_DEFINE_INSTRUCTION (32, toplevel_set, "toplevel-set", 1, 1, 0) { unsigned objnum = FETCH (); SCM what; @@ -427,7 +440,7 @@ VM_DEFINE_INSTRUCTION (33, toplevel_set, "toplevel-set", 1, 1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (34, long_toplevel_set, "long-toplevel-set", 2, 1, 0) +VM_DEFINE_INSTRUCTION (33, long_toplevel_set, "long-toplevel-set", 2, 1, 0) { SCM what; unsigned int objnum = FETCH (); @@ -462,7 +475,7 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set, "long-toplevel-set", 2, 1, 0) offset -= (offset & (1<<23)) << 1; \ } -#define BR(p) \ +#define BR(p) \ { \ scm_t_int32 offset; \ FETCH_OFFSET (offset); \ @@ -470,12 +483,10 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set, "long-toplevel-set", 2, 1, 0) ip += offset; \ if (offset < 0) \ VM_HANDLE_INTERRUPTS; \ - NULLSTACK (1); \ - DROP (); \ NEXT; \ } -VM_DEFINE_INSTRUCTION (35, br, "br", 3, 0, 0) +VM_DEFINE_INSTRUCTION (34, br, "br", 3, 0, 0) { scm_t_int32 offset; FETCH_OFFSET (offset); @@ -485,36 +496,46 @@ VM_DEFINE_INSTRUCTION (35, br, "br", 3, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (36, br_if, "br-if", 3, 0, 0) +VM_DEFINE_INSTRUCTION (35, br_if, "br-if", 3, 0, 0) { - BR (scm_is_true (*sp)); + SCM x; + POP (x); + BR (scm_is_true (x)); } -VM_DEFINE_INSTRUCTION (37, br_if_not, "br-if-not", 3, 0, 0) +VM_DEFINE_INSTRUCTION (36, br_if_not, "br-if-not", 3, 0, 0) { - BR (scm_is_false (*sp)); + SCM x; + POP (x); + BR (scm_is_false (x)); } -VM_DEFINE_INSTRUCTION (38, br_if_eq, "br-if-eq", 3, 0, 0) +VM_DEFINE_INSTRUCTION (37, br_if_eq, "br-if-eq", 3, 0, 0) { - sp--; /* underflow? */ - BR (scm_is_eq (sp[0], sp[1])); + SCM x, y; + POP2 (y, x); + BR (scm_is_eq (x, y)); } -VM_DEFINE_INSTRUCTION (39, br_if_not_eq, "br-if-not-eq", 3, 0, 0) +VM_DEFINE_INSTRUCTION (38, br_if_not_eq, "br-if-not-eq", 3, 0, 0) { - sp--; /* underflow? */ - BR (!scm_is_eq (sp[0], sp[1])); + SCM x, y; + POP2 (y, x); + BR (!scm_is_eq (x, y)); } -VM_DEFINE_INSTRUCTION (40, br_if_null, "br-if-null", 3, 0, 0) +VM_DEFINE_INSTRUCTION (39, br_if_null, "br-if-null", 3, 0, 0) { - BR (scm_is_null (*sp)); + SCM x; + POP (x); + BR (scm_is_null (x)); } -VM_DEFINE_INSTRUCTION (41, br_if_not_null, "br-if-not-null", 3, 0, 0) +VM_DEFINE_INSTRUCTION (40, br_if_not_null, "br-if-not-null", 3, 0, 0) { - BR (!scm_is_null (*sp)); + SCM x; + POP (x); + BR (!scm_is_null (x)); } @@ -522,7 +543,7 @@ VM_DEFINE_INSTRUCTION (41, br_if_not_null, "br-if-not-null", 3, 0, 0) * Subprogram call */ -VM_DEFINE_INSTRUCTION (42, br_if_nargs_ne, "br-if-nargs-ne", 5, 0, 0) +VM_DEFINE_INSTRUCTION (41, br_if_nargs_ne, "br-if-nargs-ne", 5, 0, 0) { scm_t_ptrdiff n; scm_t_int32 offset; @@ -534,7 +555,7 @@ VM_DEFINE_INSTRUCTION (42, br_if_nargs_ne, "br-if-nargs-ne", 5, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (43, br_if_nargs_lt, "br-if-nargs-lt", 5, 0, 0) +VM_DEFINE_INSTRUCTION (42, br_if_nargs_lt, "br-if-nargs-lt", 5, 0, 0) { scm_t_ptrdiff n; scm_t_int32 offset; @@ -546,7 +567,7 @@ VM_DEFINE_INSTRUCTION (43, br_if_nargs_lt, "br-if-nargs-lt", 5, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (44, br_if_nargs_gt, "br-if-nargs-gt", 5, 0, 0) +VM_DEFINE_INSTRUCTION (43, br_if_nargs_gt, "br-if-nargs-gt", 5, 0, 0) { scm_t_ptrdiff n; scm_t_int32 offset; @@ -559,7 +580,7 @@ VM_DEFINE_INSTRUCTION (44, br_if_nargs_gt, "br-if-nargs-gt", 5, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (45, assert_nargs_ee, "assert-nargs-ee", 2, 0, 0) +VM_DEFINE_INSTRUCTION (44, assert_nargs_ee, "assert-nargs-ee", 2, 0, 0) { scm_t_ptrdiff n; n = FETCH () << 8; @@ -569,7 +590,7 @@ VM_DEFINE_INSTRUCTION (45, assert_nargs_ee, "assert-nargs-ee", 2, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (46, assert_nargs_ge, "assert-nargs-ge", 2, 0, 0) +VM_DEFINE_INSTRUCTION (45, assert_nargs_ge, "assert-nargs-ge", 2, 0, 0) { scm_t_ptrdiff n; n = FETCH () << 8; @@ -579,7 +600,7 @@ VM_DEFINE_INSTRUCTION (46, assert_nargs_ge, "assert-nargs-ge", 2, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (47, bind_optionals, "bind-optionals", 2, -1, -1) +VM_DEFINE_INSTRUCTION (46, bind_optionals, "bind-optionals", 2, -1, -1) { scm_t_ptrdiff n; n = FETCH () << 8; @@ -589,7 +610,7 @@ VM_DEFINE_INSTRUCTION (47, bind_optionals, "bind-optionals", 2, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (48, bind_optionals_shuffle, "bind-optionals/shuffle", 6, -1, -1) +VM_DEFINE_INSTRUCTION (47, bind_optionals_shuffle, "bind-optionals/shuffle", 6, -1, -1) { SCM *walk; scm_t_ptrdiff nreq, nreq_and_opt, ntotal; @@ -632,7 +653,7 @@ VM_DEFINE_INSTRUCTION (48, bind_optionals_shuffle, "bind-optionals/shuffle", 6, #define F_ALLOW_OTHER_KEYS 1 #define F_REST 2 -VM_DEFINE_INSTRUCTION (49, bind_kwargs, "bind-kwargs", 5, 0, 0) +VM_DEFINE_INSTRUCTION (48, bind_kwargs, "bind-kwargs", 5, 0, 0) { scm_t_uint16 idx; scm_t_ptrdiff nkw; @@ -685,7 +706,7 @@ VM_DEFINE_INSTRUCTION (49, bind_kwargs, "bind-kwargs", 5, 0, 0) #undef F_REST -VM_DEFINE_INSTRUCTION (50, push_rest, "push-rest", 2, -1, -1) +VM_DEFINE_INSTRUCTION (49, push_rest, "push-rest", 2, -1, -1) { scm_t_ptrdiff n; SCM rest = SCM_EOL; @@ -698,7 +719,7 @@ VM_DEFINE_INSTRUCTION (50, push_rest, "push-rest", 2, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (51, bind_rest, "bind-rest", 4, -1, -1) +VM_DEFINE_INSTRUCTION (50, bind_rest, "bind-rest", 4, -1, -1) { scm_t_ptrdiff n; scm_t_uint32 i; @@ -714,7 +735,7 @@ VM_DEFINE_INSTRUCTION (51, bind_rest, "bind-rest", 4, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (52, reserve_locals, "reserve-locals", 2, -1, -1) +VM_DEFINE_INSTRUCTION (51, reserve_locals, "reserve-locals", 2, -1, -1) { SCM *old_sp; scm_t_int32 n; @@ -735,17 +756,22 @@ VM_DEFINE_INSTRUCTION (52, reserve_locals, "reserve-locals", 2, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (53, new_frame, "new-frame", 0, 0, 3) +VM_DEFINE_INSTRUCTION (52, new_frame, "new-frame", 0, 0, 3) { /* NB: if you change this, see frames.c:vm-frame-num-locals */ /* and frames.h, vm-engine.c, etc of course */ - PUSH ((SCM)fp); /* dynamic link */ - PUSH (0); /* mvra */ - PUSH (0); /* ra */ + + /* We don't initialize the dynamic link here because we don't actually + know that this frame will point to the current fp: it could be + placed elsewhere on the stack if captured in a partial + continuation, and invoked from some other context. */ + PUSH (SCM_PACK (0)); /* dynamic link */ + PUSH (SCM_PACK (0)); /* mvra */ + PUSH (SCM_PACK (0)); /* ra */ NEXT; } -VM_DEFINE_INSTRUCTION (54, call, "call", 1, -1, 1) +VM_DEFINE_INSTRUCTION (53, call, "call", 1, -1, 1) { nargs = FETCH (); @@ -773,18 +799,27 @@ VM_DEFINE_INSTRUCTION (54, call, "call", 1, -1, 1) } CACHE_PROGRAM (); - fp = sp - nargs + 1; - ASSERT (SCM_FRAME_RETURN_ADDRESS (fp) == 0); - ASSERT (SCM_FRAME_MV_RETURN_ADDRESS (fp) == 0); - SCM_FRAME_SET_RETURN_ADDRESS (fp, ip); - SCM_FRAME_SET_MV_RETURN_ADDRESS (fp, 0); + + { + SCM *old_fp = fp; + + fp = sp - nargs + 1; + + ASSERT (SCM_FRAME_DYNAMIC_LINK (fp) == 0); + ASSERT (SCM_FRAME_RETURN_ADDRESS (fp) == 0); + ASSERT (SCM_FRAME_MV_RETURN_ADDRESS (fp) == 0); + SCM_FRAME_SET_DYNAMIC_LINK (fp, old_fp); + SCM_FRAME_SET_RETURN_ADDRESS (fp, ip); + SCM_FRAME_SET_MV_RETURN_ADDRESS (fp, 0); + } + ip = SCM_C_OBJCODE_BASE (bp); - ENTER_HOOK (); + PUSH_CONTINUATION_HOOK (); APPLY_HOOK (); NEXT; } -VM_DEFINE_INSTRUCTION (55, tail_call, "tail-call", 1, -1, 1) +VM_DEFINE_INSTRUCTION (54, tail_call, "tail-call", 1, -1, 1) { nargs = FETCH (); @@ -818,8 +853,6 @@ VM_DEFINE_INSTRUCTION (55, tail_call, "tail-call", 1, -1, 1) CHECK_STACK_LEAK (); #endif - EXIT_HOOK (); - /* switch programs */ CACHE_PROGRAM (); /* shuffle down the program and the arguments */ @@ -832,20 +865,20 @@ VM_DEFINE_INSTRUCTION (55, tail_call, "tail-call", 1, -1, 1) ip = SCM_C_OBJCODE_BASE (bp); - ENTER_HOOK (); APPLY_HOOK (); NEXT; } } -VM_DEFINE_INSTRUCTION (56, subr_call, "subr-call", 1, -1, -1) +VM_DEFINE_INSTRUCTION (55, subr_call, "subr-call", 1, -1, -1) { - SCM foreign, ret; + SCM pointer, ret; SCM (*subr)(); + nargs = FETCH (); - POP (foreign); + POP (pointer); - subr = SCM_FOREIGN_POINTER (foreign, void); + subr = SCM_POINTER_VALUE (pointer); VM_HANDLE_INTERRUPTS; SYNC_REGISTER (); @@ -906,7 +939,7 @@ VM_DEFINE_INSTRUCTION (56, subr_call, "subr-call", 1, -1, -1) } } -VM_DEFINE_INSTRUCTION (57, smob_call, "smob-call", 1, -1, -1) +VM_DEFINE_INSTRUCTION (56, smob_call, "smob-call", 1, -1, -1) { SCM smob, ret; SCM (*subr)(); @@ -953,7 +986,7 @@ VM_DEFINE_INSTRUCTION (57, smob_call, "smob-call", 1, -1, -1) } } -VM_DEFINE_INSTRUCTION (58, foreign_call, "foreign-call", 1, -1, -1) +VM_DEFINE_INSTRUCTION (57, foreign_call, "foreign-call", 1, -1, -1) { SCM foreign, ret; nargs = FETCH (); @@ -981,7 +1014,7 @@ VM_DEFINE_INSTRUCTION (58, foreign_call, "foreign-call", 1, -1, -1) } } -VM_DEFINE_INSTRUCTION (89, continuation_call, "continuation-call", 0, -1, 0) +VM_DEFINE_INSTRUCTION (58, continuation_call, "continuation-call", 0, -1, 0) { SCM contregs; POP (contregs); @@ -997,11 +1030,10 @@ VM_DEFINE_INSTRUCTION (89, continuation_call, "continuation-call", 0, -1, 0) abort (); } -VM_DEFINE_INSTRUCTION (94, partial_cont_call, "partial-cont-call", 0, -1, 0) +VM_DEFINE_INSTRUCTION (59, partial_cont_call, "partial-cont-call", 0, -1, 0) { SCM vmcont, intwinds, prevwinds; - POP (intwinds); - POP (vmcont); + POP2 (intwinds, vmcont); SYNC_REGISTER (); if (SCM_UNLIKELY (!SCM_VM_CONT_REWINDABLE_P (vmcont))) { finish_args = vmcont; @@ -1025,7 +1057,7 @@ VM_DEFINE_INSTRUCTION (94, partial_cont_call, "partial-cont-call", 0, -1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (59, tail_call_nargs, "tail-call/nargs", 0, 0, 1) +VM_DEFINE_INSTRUCTION (60, tail_call_nargs, "tail-call/nargs", 0, 0, 1) { SCM x; POP (x); @@ -1034,7 +1066,7 @@ VM_DEFINE_INSTRUCTION (59, tail_call_nargs, "tail-call/nargs", 0, 0, 1) goto vm_tail_call; } -VM_DEFINE_INSTRUCTION (60, call_nargs, "call/nargs", 0, 0, 1) +VM_DEFINE_INSTRUCTION (61, call_nargs, "call/nargs", 0, 0, 1) { SCM x; POP (x); @@ -1043,7 +1075,7 @@ VM_DEFINE_INSTRUCTION (60, call_nargs, "call/nargs", 0, 0, 1) goto vm_call; } -VM_DEFINE_INSTRUCTION (61, mv_call, "mv-call", 4, -1, 1) +VM_DEFINE_INSTRUCTION (62, mv_call, "mv-call", 4, -1, 1) { scm_t_int32 offset; scm_t_uint8 *mvra; @@ -1076,18 +1108,27 @@ VM_DEFINE_INSTRUCTION (61, mv_call, "mv-call", 4, -1, 1) } CACHE_PROGRAM (); - fp = sp - nargs + 1; - ASSERT (SCM_FRAME_RETURN_ADDRESS (fp) == 0); - ASSERT (SCM_FRAME_MV_RETURN_ADDRESS (fp) == 0); - SCM_FRAME_SET_RETURN_ADDRESS (fp, ip); - SCM_FRAME_SET_MV_RETURN_ADDRESS (fp, mvra); + + { + SCM *old_fp = fp; + + fp = sp - nargs + 1; + + ASSERT (SCM_FRAME_DYNAMIC_LINK (fp) == 0); + ASSERT (SCM_FRAME_RETURN_ADDRESS (fp) == 0); + ASSERT (SCM_FRAME_MV_RETURN_ADDRESS (fp) == 0); + SCM_FRAME_SET_DYNAMIC_LINK (fp, old_fp); + SCM_FRAME_SET_RETURN_ADDRESS (fp, ip); + SCM_FRAME_SET_MV_RETURN_ADDRESS (fp, mvra); + } + ip = SCM_C_OBJCODE_BASE (bp); - ENTER_HOOK (); + PUSH_CONTINUATION_HOOK (); APPLY_HOOK (); NEXT; } -VM_DEFINE_INSTRUCTION (62, apply, "apply", 1, -1, 1) +VM_DEFINE_INSTRUCTION (63, apply, "apply", 1, -1, 1) { int len; SCM ls; @@ -1109,7 +1150,7 @@ VM_DEFINE_INSTRUCTION (62, apply, "apply", 1, -1, 1) goto vm_call; } -VM_DEFINE_INSTRUCTION (63, tail_apply, "tail-apply", 1, -1, 1) +VM_DEFINE_INSTRUCTION (64, tail_apply, "tail-apply", 1, -1, 1) { int len; SCM ls; @@ -1131,7 +1172,7 @@ VM_DEFINE_INSTRUCTION (63, tail_apply, "tail-apply", 1, -1, 1) goto vm_tail_call; } -VM_DEFINE_INSTRUCTION (64, call_cc, "call/cc", 0, 1, 1) +VM_DEFINE_INSTRUCTION (65, call_cc, "call/cc", 0, 1, 1) { int first; SCM proc, vm_cont, cont; @@ -1141,9 +1182,9 @@ VM_DEFINE_INSTRUCTION (64, call_cc, "call/cc", 0, 1, 1) cont = scm_i_make_continuation (&first, vm, vm_cont); if (first) { - PUSH ((SCM)fp); /* dynamic link */ - PUSH (0); /* mvra */ - PUSH (0); /* ra */ + PUSH (SCM_PACK (0)); /* dynamic link */ + PUSH (SCM_PACK (0)); /* mvra */ + PUSH (SCM_PACK (0)); /* ra */ PUSH (proc); PUSH (cont); nargs = 1; @@ -1151,17 +1192,22 @@ VM_DEFINE_INSTRUCTION (64, call_cc, "call/cc", 0, 1, 1) } else { - /* otherwise, the vm continuation was reinstated, and - scm_i_vm_return_to_continuation pushed on one value. So pull our regs - back down from the vp, and march on to the next instruction. */ + /* Otherwise, the vm continuation was reinstated, and + vm_return_to_continuation pushed on one value. We know only one + value was returned because we are in value context -- the + previous block jumped to vm_call, not vm_mv_call, after all. + + So, pull our regs back down from the vp, and march on to the + next instruction. */ CACHE_REGISTER (); program = SCM_FRAME_PROGRAM (fp); CACHE_PROGRAM (); + RESTORE_CONTINUATION_HOOK (); NEXT; } } -VM_DEFINE_INSTRUCTION (65, tail_call_cc, "tail-call/cc", 0, 1, 1) +VM_DEFINE_INSTRUCTION (66, tail_call_cc, "tail-call/cc", 0, 1, 1) { int first; SCM proc, vm_cont, cont; @@ -1186,19 +1232,25 @@ VM_DEFINE_INSTRUCTION (65, tail_call_cc, "tail-call/cc", 0, 1, 1) else { /* Otherwise, cache regs and NEXT, as above. Invoking the continuation - does a return from the frame, either to the RA or MVRA. */ + does a return from the frame, either to the RA or + MVRA. */ CACHE_REGISTER (); program = SCM_FRAME_PROGRAM (fp); CACHE_PROGRAM (); + /* Unfortunately we don't know whether we are at the RA, and thus + have one value without an nvalues marker, or we are at the + MVRA and thus have multiple values and the nvalues + marker. Instead of adding heuristics here, we will let hook + client code do that. */ + RESTORE_CONTINUATION_HOOK (); NEXT; } } -VM_DEFINE_INSTRUCTION (66, return, "return", 0, 1, 1) +VM_DEFINE_INSTRUCTION (67, return, "return", 0, 1, 1) { vm_return: - EXIT_HOOK (); - RETURN_HOOK (1); + POP_CONTINUATION_HOOK (1); VM_HANDLE_INTERRUPTS; @@ -1231,14 +1283,13 @@ VM_DEFINE_INSTRUCTION (66, return, "return", 0, 1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (67, return_values, "return/values", 1, -1, -1) +VM_DEFINE_INSTRUCTION (68, return_values, "return/values", 1, -1, -1) { /* nvalues declared at top level, because for some reason gcc seems to think that perhaps it might be used without declaration. Fooey to that, I say. */ nvalues = FETCH (); vm_return_values: - EXIT_HOOK (); - RETURN_HOOK (nvalues); + POP_CONTINUATION_HOOK (nvalues); VM_HANDLE_INTERRUPTS; @@ -1288,7 +1339,7 @@ VM_DEFINE_INSTRUCTION (67, return_values, "return/values", 1, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (68, return_values_star, "return/values*", 1, -1, -1) +VM_DEFINE_INSTRUCTION (69, return_values_star, "return/values*", 1, -1, -1) { SCM l; @@ -1311,7 +1362,7 @@ VM_DEFINE_INSTRUCTION (68, return_values_star, "return/values*", 1, -1, -1) goto vm_return_values; } -VM_DEFINE_INSTRUCTION (88, return_nvalues, "return/nvalues", 0, 1, -1) +VM_DEFINE_INSTRUCTION (70, return_nvalues, "return/nvalues", 0, 1, -1) { SCM n; POP (n); @@ -1320,7 +1371,7 @@ VM_DEFINE_INSTRUCTION (88, return_nvalues, "return/nvalues", 0, 1, -1) goto vm_return_values; } -VM_DEFINE_INSTRUCTION (69, truncate_values, "truncate-values", 2, -1, -1) +VM_DEFINE_INSTRUCTION (71, truncate_values, "truncate-values", 2, -1, -1) { SCM x; int nbinds, rest; @@ -1343,7 +1394,7 @@ VM_DEFINE_INSTRUCTION (69, truncate_values, "truncate-values", 2, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (70, box, "box", 1, 1, 0) +VM_DEFINE_INSTRUCTION (72, box, "box", 1, 1, 0) { SCM val; POP (val); @@ -1357,7 +1408,7 @@ VM_DEFINE_INSTRUCTION (70, box, "box", 1, 1, 0) (set! a (lambda () (b ...))) ...) */ -VM_DEFINE_INSTRUCTION (71, empty_box, "empty-box", 1, 0, 0) +VM_DEFINE_INSTRUCTION (73, empty_box, "empty-box", 1, 0, 0) { SYNC_BEFORE_GC (); LOCAL_SET (FETCH (), @@ -1365,7 +1416,7 @@ VM_DEFINE_INSTRUCTION (71, empty_box, "empty-box", 1, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (72, local_boxed_ref, "local-boxed-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (74, local_boxed_ref, "local-boxed-ref", 1, 0, 1) { SCM v = LOCAL_REF (FETCH ()); ASSERT_BOUND_VARIABLE (v); @@ -1373,7 +1424,7 @@ VM_DEFINE_INSTRUCTION (72, local_boxed_ref, "local-boxed-ref", 1, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (73, local_boxed_set, "local-boxed-set", 1, 1, 0) +VM_DEFINE_INSTRUCTION (75, local_boxed_set, "local-boxed-set", 1, 1, 0) { SCM v, val; v = LOCAL_REF (FETCH ()); @@ -1383,7 +1434,7 @@ VM_DEFINE_INSTRUCTION (73, local_boxed_set, "local-boxed-set", 1, 1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (74, free_ref, "free-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (76, free_ref, "free-ref", 1, 0, 1) { scm_t_uint8 idx = FETCH (); @@ -1394,7 +1445,7 @@ VM_DEFINE_INSTRUCTION (74, free_ref, "free-ref", 1, 0, 1) /* no free-set -- if a var is assigned, it should be in a box */ -VM_DEFINE_INSTRUCTION (75, free_boxed_ref, "free-boxed-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (77, free_boxed_ref, "free-boxed-ref", 1, 0, 1) { SCM v; scm_t_uint8 idx = FETCH (); @@ -1405,7 +1456,7 @@ VM_DEFINE_INSTRUCTION (75, free_boxed_ref, "free-boxed-ref", 1, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (76, free_boxed_set, "free-boxed-set", 1, 1, 0) +VM_DEFINE_INSTRUCTION (78, free_boxed_set, "free-boxed-set", 1, 1, 0) { SCM v, val; scm_t_uint8 idx = FETCH (); @@ -1417,7 +1468,7 @@ VM_DEFINE_INSTRUCTION (76, free_boxed_set, "free-boxed-set", 1, 1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (77, make_closure, "make-closure", 2, -1, 1) +VM_DEFINE_INSTRUCTION (79, make_closure, "make-closure", 2, -1, 1) { size_t n, len; SCM closure; @@ -1436,7 +1487,7 @@ VM_DEFINE_INSTRUCTION (77, make_closure, "make-closure", 2, -1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (78, make_variable, "make-variable", 0, 0, 1) +VM_DEFINE_INSTRUCTION (80, make_variable, "make-variable", 0, 0, 1) { SYNC_BEFORE_GC (); /* fixme underflow */ @@ -1444,7 +1495,7 @@ VM_DEFINE_INSTRUCTION (78, make_variable, "make-variable", 0, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (79, fix_closure, "fix-closure", 2, -1, 0) +VM_DEFINE_INSTRUCTION (81, fix_closure, "fix-closure", 2, -1, 0) { SCM x; unsigned int i = FETCH (); @@ -1461,11 +1512,10 @@ VM_DEFINE_INSTRUCTION (79, fix_closure, "fix-closure", 2, -1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (80, define, "define", 0, 0, 2) +VM_DEFINE_INSTRUCTION (82, define, "define", 0, 0, 2) { SCM sym, val; - POP (sym); - POP (val); + POP2 (sym, val); SYNC_REGISTER (); VARIABLE_SET (scm_sym2var (sym, scm_current_module_lookup_closure (), SCM_BOOL_T), @@ -1473,7 +1523,7 @@ VM_DEFINE_INSTRUCTION (80, define, "define", 0, 0, 2) NEXT; } -VM_DEFINE_INSTRUCTION (81, make_keyword, "make-keyword", 0, 1, 1) +VM_DEFINE_INSTRUCTION (83, make_keyword, "make-keyword", 0, 1, 1) { CHECK_UNDERFLOW (); SYNC_REGISTER (); @@ -1481,7 +1531,7 @@ VM_DEFINE_INSTRUCTION (81, make_keyword, "make-keyword", 0, 1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (82, make_symbol, "make-symbol", 0, 1, 1) +VM_DEFINE_INSTRUCTION (84, make_symbol, "make-symbol", 0, 1, 1) { CHECK_UNDERFLOW (); SYNC_REGISTER (); @@ -1489,7 +1539,7 @@ VM_DEFINE_INSTRUCTION (82, make_symbol, "make-symbol", 0, 1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (83, prompt, "prompt", 4, 2, 0) +VM_DEFINE_INSTRUCTION (85, prompt, "prompt", 4, 2, 0) { scm_t_int32 offset; scm_t_uint8 escape_only_p; @@ -1516,6 +1566,9 @@ VM_DEFINE_INSTRUCTION (83, prompt, "prompt", 4, 2, 0) CACHE_REGISTER (); program = SCM_FRAME_PROGRAM (fp); CACHE_PROGRAM (); + /* The stack contains the values returned to this prompt, along + with a number-of-values marker -- like an MV return. */ + ABORT_CONTINUATION_HOOK (); NEXT; } @@ -1524,11 +1577,10 @@ VM_DEFINE_INSTRUCTION (83, prompt, "prompt", 4, 2, 0) NEXT; } -VM_DEFINE_INSTRUCTION (85, wind, "wind", 0, 2, 0) +VM_DEFINE_INSTRUCTION (86, wind, "wind", 0, 2, 0) { SCM wind, unwind; - POP (unwind); - POP (wind); + POP2 (unwind, wind); SYNC_REGISTER (); /* Push wind and unwind procedures onto the dynamic stack. Note that neither are actually called; the compiler should emit calls to wind and unwind for @@ -1547,7 +1599,7 @@ VM_DEFINE_INSTRUCTION (85, wind, "wind", 0, 2, 0) NEXT; } -VM_DEFINE_INSTRUCTION (86, abort, "abort", 1, -1, -1) +VM_DEFINE_INSTRUCTION (87, abort, "abort", 1, -1, -1) { unsigned n = FETCH (); SYNC_REGISTER (); @@ -1558,7 +1610,7 @@ VM_DEFINE_INSTRUCTION (86, abort, "abort", 1, -1, -1) abort (); } -VM_DEFINE_INSTRUCTION (87, unwind, "unwind", 0, 0, 0) +VM_DEFINE_INSTRUCTION (88, unwind, "unwind", 0, 0, 0) { /* A normal exit from the dynamic extent of an expression. Pop the top entry off of the dynamic stack. */ @@ -1566,37 +1618,38 @@ VM_DEFINE_INSTRUCTION (87, unwind, "unwind", 0, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (90, wind_fluids, "wind-fluids", 1, -1, 0) +VM_DEFINE_INSTRUCTION (89, wind_fluids, "wind-fluids", 1, -1, 0) { unsigned n = FETCH (); SCM wf; - if (sp - 2*n < SCM_FRAME_UPPER_ADDRESS (fp)) - goto vm_error_stack_underflow; - SYNC_REGISTER (); - wf = scm_i_make_with_fluids (n, sp + 1 - 2*n, sp + 1 - n); - scm_i_swap_with_fluids (wf, dynstate); + sp -= 2 * n; + CHECK_UNDERFLOW (); + wf = scm_i_make_with_fluids (n, sp + 1, sp + 1 + n); + NULLSTACK (2 * n); + + scm_i_swap_with_fluids (wf, current_thread->dynamic_state); scm_i_set_dynwinds (scm_cons (wf, scm_i_dynwinds ())); NEXT; } -VM_DEFINE_INSTRUCTION (91, unwind_fluids, "unwind-fluids", 0, 0, 0) +VM_DEFINE_INSTRUCTION (90, unwind_fluids, "unwind-fluids", 0, 0, 0) { SCM wf; wf = scm_car (scm_i_dynwinds ()); scm_i_set_dynwinds (scm_cdr (scm_i_dynwinds ())); - scm_i_swap_with_fluids (wf, dynstate); + scm_i_swap_with_fluids (wf, current_thread->dynamic_state); NEXT; } -VM_DEFINE_INSTRUCTION (92, fluid_ref, "fluid-ref", 0, 1, 1) +VM_DEFINE_INSTRUCTION (91, fluid_ref, "fluid-ref", 0, 1, 1) { size_t num; SCM fluids; CHECK_UNDERFLOW (); - fluids = SCM_I_DYNAMIC_STATE_FLUIDS (dynstate); + fluids = SCM_I_DYNAMIC_STATE_FLUIDS (current_thread->dynamic_state); if (SCM_UNLIKELY (!SCM_FLUID_P (*sp)) || ((num = SCM_I_FLUID_NUM (*sp)) >= SCM_SIMPLE_VECTOR_LENGTH (fluids))) { @@ -1605,19 +1658,26 @@ VM_DEFINE_INSTRUCTION (92, fluid_ref, "fluid-ref", 0, 1, 1) *sp = scm_fluid_ref (*sp); } else - *sp = SCM_SIMPLE_VECTOR_REF (fluids, num); + { + SCM val = SCM_SIMPLE_VECTOR_REF (fluids, num); + if (SCM_UNLIKELY (scm_is_eq (val, SCM_UNDEFINED))) + { + finish_args = *sp; + goto vm_error_unbound_fluid; + } + *sp = val; + } NEXT; } -VM_DEFINE_INSTRUCTION (93, fluid_set, "fluid-set", 0, 2, 0) +VM_DEFINE_INSTRUCTION (92, fluid_set, "fluid-set", 0, 2, 0) { size_t num; SCM val, fluid, fluids; - POP (val); - POP (fluid); - fluids = SCM_I_DYNAMIC_STATE_FLUIDS (dynstate); + POP2 (val, fluid); + fluids = SCM_I_DYNAMIC_STATE_FLUIDS (current_thread->dynamic_state); if (SCM_UNLIKELY (!SCM_FLUID_P (fluid)) || ((num = SCM_I_FLUID_NUM (fluid)) >= SCM_SIMPLE_VECTOR_LENGTH (fluids))) { @@ -1631,7 +1691,7 @@ VM_DEFINE_INSTRUCTION (93, fluid_set, "fluid-set", 0, 2, 0) NEXT; } -VM_DEFINE_INSTRUCTION (95, assert_nargs_ee_locals, "assert-nargs-ee/locals", 1, 0, 0) +VM_DEFINE_INSTRUCTION (93, assert_nargs_ee_locals, "assert-nargs-ee/locals", 1, 0, 0) { scm_t_ptrdiff n; SCM *old_sp;