diff options
Diffstat (limited to 'libguile/vm-i-system.c')
-rw-r--r-- | libguile/vm-i-system.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index df8424c3e..59a5520f7 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -761,6 +761,11 @@ VM_DEFINE_INSTRUCTION (53, call, "call", 1, -1, 1) APPLY_HOOK (); NEXT; } + if (SCM_STRUCTP (x) && SCM_STRUCT_APPLICABLE_P (x)) + { + sp[-nargs] = SCM_STRUCT_PROCEDURE (x); + goto vm_call; + } if (SCM_STRUCTP (x) && SCM_OBJ_CLASS_FLAGS (x) & SCM_CLASSF_PURE_GENERIC) { SCM args = SCM_EOL; @@ -845,6 +850,11 @@ VM_DEFINE_INSTRUCTION (54, goto_args, "goto/args", 1, -1, 1) APPLY_HOOK (); NEXT; } + if (SCM_STRUCTP (x) && SCM_STRUCT_APPLICABLE_P (x)) + { + sp[-nargs] = SCM_STRUCT_PROCEDURE (x); + goto vm_goto_args; + } if (SCM_STRUCTP (x) && SCM_OBJ_CLASS_FLAGS (x) & SCM_CLASSF_PURE_GENERIC) { SCM args = SCM_EOL; @@ -937,6 +947,11 @@ VM_DEFINE_INSTRUCTION (57, mv_call, "mv-call", 4, -1, 1) APPLY_HOOK (); NEXT; } + if (SCM_STRUCTP (x) && SCM_STRUCT_APPLICABLE_P (x)) + { + sp[-nargs] = SCM_STRUCT_PROCEDURE (x); + goto vm_mv_call; + } if (SCM_STRUCTP (x) && SCM_OBJ_CLASS_FLAGS (x) & SCM_CLASSF_PURE_GENERIC) { SCM args = SCM_EOL; |