diff options
Diffstat (limited to 'libguile/eval.i.c')
-rw-r--r-- | libguile/eval.i.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/libguile/eval.i.c b/libguile/eval.i.c index 407a64281..b208f01b0 100644 --- a/libguile/eval.i.c +++ b/libguile/eval.i.c @@ -856,8 +856,11 @@ dispatch: z = SCM_CDR (z); } /* Fewer arguments than specifiers => CAR != CLASS */ - if (!SCM_CLASSP (SCM_CAR (z))) - goto apply_cmethod; + if (!scm_is_pair (z)) + goto apply_vm_cmethod; + else if (!SCM_CLASSP (SCM_CAR (z)) + && !scm_is_symbol (SCM_CAR (z))) + goto apply_memoized_cmethod; next_method: hash_value = (hash_value + 1) & mask; } while (hash_value != cache_end_pos); @@ -865,19 +868,21 @@ dispatch: /* No appropriate method was found in the cache. */ z = scm_memoize_method (x, arg1); - apply_cmethod: /* inputs: z, arg1 */ - { - if (scm_is_pair (z)) { - SCM formals = SCM_CMETHOD_FORMALS (z); - env = SCM_EXTEND_ENV (formals, arg1, SCM_CMETHOD_ENV (z)); - x = SCM_CMETHOD_BODY (z); - goto nontoplevel_begin; - } else { - proc = z; - PREP_APPLY (proc, arg1); - goto apply_proc; - } - } + if (scm_is_pair (z)) + goto apply_memoized_cmethod; + + apply_vm_cmethod: + proc = z; + PREP_APPLY (proc, arg1); + goto apply_proc; + + apply_memoized_cmethod: /* inputs: z, arg1 */ + { + SCM formals = SCM_CMETHOD_FORMALS (z); + env = SCM_EXTEND_ENV (formals, arg1, SCM_CMETHOD_ENV (z)); + x = SCM_CMETHOD_BODY (z); + goto nontoplevel_begin; + } } } |