mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-14 15:40:19 +02:00
refactor vm application of non-programs; boot continuation refactor
* libguile/frames.c (scm_frame_instruction_pointer): * module/system/vm/frame.scm (frame-bindings): (frame-next-source, frame-call-representation): Fix a few locations that thought that the frame-procedure will always be a VM procedure. This will not not be the case when traversing the stack of an application of a non-procedure. * libguile/vm-i-system.c (call, tail-call, mv-call): Instead of special-casing structs and smobs at these call sites, just set up the stack, and jump to a generic apply loop if the proc is not a program. * libguile/vm-engine.c: The generic apply loop is here. Also, the boot program is now simply a boot continuation, and can handle any number of arguments. * libguile/vm.c (make_boot_program): Update the code that makes the boot continuation.
This commit is contained in:
parent
0eba699d12
commit
67b699cc77
5 changed files with 139 additions and 197 deletions
|
@ -86,31 +86,55 @@ VM_NAME (SCM vm, SCM program, SCM *argv, int nargs)
|
|||
jump_table = jump_table_pointer;
|
||||
#endif
|
||||
|
||||
/* Initialization */
|
||||
{
|
||||
SCM prog = program;
|
||||
/* Initial frame */
|
||||
CACHE_REGISTER ();
|
||||
PUSH (SCM_PACK (fp)); /* dynamic link */
|
||||
PUSH (SCM_PACK (0)); /* mvra */
|
||||
PUSH (SCM_PACK (ip)); /* ra */
|
||||
PUSH (boot_continuation);
|
||||
fp = sp + 1;
|
||||
ip = SCM_C_OBJCODE_BASE (SCM_PROGRAM_DATA (boot_continuation));
|
||||
|
||||
/* Boot program */
|
||||
program = vm_make_boot_program (nargs);
|
||||
/* MV-call frame, function & arguments */
|
||||
PUSH (SCM_PACK (fp)); /* dynamic link */
|
||||
PUSH (SCM_PACK (ip + 1)); /* mvra */
|
||||
PUSH (SCM_PACK (ip)); /* ra */
|
||||
PUSH (program);
|
||||
fp = sp + 1;
|
||||
VM_ASSERT (sp + nargs < stack_limit, vm_error_too_many_args (nargs));
|
||||
while (nargs--)
|
||||
PUSH (*argv++);
|
||||
|
||||
/* Initial frame */
|
||||
CACHE_REGISTER ();
|
||||
PUSH (SCM_PACK (fp)); /* dynamic link */
|
||||
PUSH (SCM_PACK (0)); /* mvra */
|
||||
PUSH (SCM_PACK (ip)); /* ra */
|
||||
CACHE_PROGRAM ();
|
||||
PUSH (program);
|
||||
fp = sp + 1;
|
||||
ip = SCM_C_OBJCODE_BASE (bp);
|
||||
/* MV-call frame, function & arguments */
|
||||
PUSH (SCM_PACK (0)); /* dynamic link */
|
||||
PUSH (SCM_PACK (0)); /* mvra */
|
||||
PUSH (SCM_PACK (0)); /* ra */
|
||||
PUSH (prog);
|
||||
VM_ASSERT (sp + nargs < stack_limit, vm_error_too_many_args (nargs));
|
||||
while (nargs--)
|
||||
PUSH (*argv++);
|
||||
}
|
||||
PUSH_CONTINUATION_HOOK ();
|
||||
|
||||
apply:
|
||||
program = fp[-1];
|
||||
if (!SCM_PROGRAM_P (program))
|
||||
{
|
||||
if (SCM_STRUCTP (program) && SCM_STRUCT_APPLICABLE_P (program))
|
||||
fp[-1] = SCM_STRUCT_PROCEDURE (program);
|
||||
else if (SCM_NIMP (program) && SCM_TYP7 (program) == scm_tc7_smob
|
||||
&& SCM_SMOB_APPLICABLE_P (program))
|
||||
{
|
||||
/* (smob arg0 ... argN) => (apply-smob smob arg0 ... argN) */
|
||||
int i;
|
||||
PUSH (SCM_BOOL_F);
|
||||
for (i = sp - fp; i >= 0; i--)
|
||||
fp[i] = fp[i - 1];
|
||||
fp[-1] = SCM_SMOB_DESCRIPTOR (program).apply_trampoline_objcode;
|
||||
}
|
||||
else
|
||||
{
|
||||
SYNC_ALL();
|
||||
vm_error_wrong_type_apply (program);
|
||||
}
|
||||
goto apply;
|
||||
}
|
||||
|
||||
CACHE_PROGRAM ();
|
||||
ip = SCM_C_OBJCODE_BASE (bp);
|
||||
|
||||
APPLY_HOOK ();
|
||||
|
||||
/* Let's go! */
|
||||
NEXT;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue