mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-28 16:00:22 +02:00
* eval.c (scm_trampoline_0, scm_trampoline_1, scm_trampoline_2):
Make sure that error checking in debug mode is not worse than in standard mode.
This commit is contained in:
parent
34adf7eaf2
commit
2510c81061
2 changed files with 95 additions and 36 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2003-11-02 Dirk Herrmann <D.Herrmann@tu-bs.de>
|
||||||
|
|
||||||
|
* eval.c (scm_trampoline_0, scm_trampoline_1, scm_trampoline_2):
|
||||||
|
Make sure that error checking in debug mode is not worse than in
|
||||||
|
standard mode.
|
||||||
|
|
||||||
2003-11-01 Dirk Herrmann <D.Herrmann@tu-bs.de>
|
2003-11-01 Dirk Herrmann <D.Herrmann@tu-bs.de>
|
||||||
|
|
||||||
* eval.c (scm_m_body, scm_m_lambda): Documentation strings are not
|
* eval.c (scm_m_body, scm_m_lambda): Documentation strings are not
|
||||||
|
|
125
libguile/eval.c
125
libguile/eval.c
|
@ -4486,45 +4486,62 @@ scm_i_call_closure_0 (SCM proc)
|
||||||
scm_t_trampoline_0
|
scm_t_trampoline_0
|
||||||
scm_trampoline_0 (SCM proc)
|
scm_trampoline_0 (SCM proc)
|
||||||
{
|
{
|
||||||
|
scm_t_trampoline_0 trampoline;
|
||||||
|
|
||||||
if (SCM_IMP (proc))
|
if (SCM_IMP (proc))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (SCM_DEBUGGINGP)
|
|
||||||
return scm_call_0;
|
|
||||||
switch (SCM_TYP7 (proc))
|
switch (SCM_TYP7 (proc))
|
||||||
{
|
{
|
||||||
case scm_tc7_subr_0:
|
case scm_tc7_subr_0:
|
||||||
return call_subr0_0;
|
trampoline = call_subr0_0;
|
||||||
|
break;
|
||||||
case scm_tc7_subr_1o:
|
case scm_tc7_subr_1o:
|
||||||
return call_subr1o_0;
|
trampoline = call_subr1o_0;
|
||||||
|
break;
|
||||||
case scm_tc7_lsubr:
|
case scm_tc7_lsubr:
|
||||||
return call_lsubr_0;
|
trampoline = call_lsubr_0;
|
||||||
|
break;
|
||||||
case scm_tcs_closures:
|
case scm_tcs_closures:
|
||||||
{
|
{
|
||||||
SCM formals = SCM_CLOSURE_FORMALS (proc);
|
SCM formals = SCM_CLOSURE_FORMALS (proc);
|
||||||
if (SCM_NULLP (formals) || !SCM_CONSP (formals))
|
if (SCM_NULLP (formals) || !SCM_CONSP (formals))
|
||||||
return scm_i_call_closure_0;
|
trampoline = scm_i_call_closure_0;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case scm_tcs_struct:
|
case scm_tcs_struct:
|
||||||
if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
|
if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
|
||||||
return scm_call_generic_0;
|
trampoline = scm_call_generic_0;
|
||||||
else if (SCM_I_OPERATORP (proc))
|
else if (SCM_I_OPERATORP (proc))
|
||||||
return scm_call_0;
|
trampoline = scm_call_0;
|
||||||
return NULL;
|
else
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
case scm_tc7_smob:
|
case scm_tc7_smob:
|
||||||
if (SCM_SMOB_APPLICABLE_P (proc))
|
if (SCM_SMOB_APPLICABLE_P (proc))
|
||||||
return SCM_SMOB_DESCRIPTOR (proc).apply_0;
|
trampoline = SCM_SMOB_DESCRIPTOR (proc).apply_0;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
break;
|
||||||
case scm_tc7_asubr:
|
case scm_tc7_asubr:
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
case scm_tc7_cclo:
|
case scm_tc7_cclo:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
return scm_call_0;
|
trampoline = scm_call_0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return NULL; /* not applicable on one arg */
|
return NULL; /* not applicable on zero arguments */
|
||||||
}
|
}
|
||||||
|
/* We only reach this point if a valid trampoline was determined. */
|
||||||
|
|
||||||
|
/* If debugging is enabled, we want to see all calls to proc on the stack.
|
||||||
|
* Thus, we replace the trampoline shortcut with scm_call_0. */
|
||||||
|
if (SCM_DEBUGGINGP)
|
||||||
|
return scm_call_0;
|
||||||
|
else
|
||||||
|
return trampoline;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SCM
|
static SCM
|
||||||
|
@ -4589,51 +4606,70 @@ call_closure_1 (SCM proc, SCM arg1)
|
||||||
scm_t_trampoline_1
|
scm_t_trampoline_1
|
||||||
scm_trampoline_1 (SCM proc)
|
scm_trampoline_1 (SCM proc)
|
||||||
{
|
{
|
||||||
|
scm_t_trampoline_1 trampoline;
|
||||||
|
|
||||||
if (SCM_IMP (proc))
|
if (SCM_IMP (proc))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (SCM_DEBUGGINGP)
|
|
||||||
return scm_call_1;
|
|
||||||
switch (SCM_TYP7 (proc))
|
switch (SCM_TYP7 (proc))
|
||||||
{
|
{
|
||||||
case scm_tc7_subr_1:
|
case scm_tc7_subr_1:
|
||||||
case scm_tc7_subr_1o:
|
case scm_tc7_subr_1o:
|
||||||
return call_subr1_1;
|
trampoline = call_subr1_1;
|
||||||
|
break;
|
||||||
case scm_tc7_subr_2o:
|
case scm_tc7_subr_2o:
|
||||||
return call_subr2o_1;
|
trampoline = call_subr2o_1;
|
||||||
|
break;
|
||||||
case scm_tc7_lsubr:
|
case scm_tc7_lsubr:
|
||||||
return call_lsubr_1;
|
trampoline = call_lsubr_1;
|
||||||
|
break;
|
||||||
case scm_tc7_dsubr:
|
case scm_tc7_dsubr:
|
||||||
return call_dsubr_1;
|
trampoline = call_dsubr_1;
|
||||||
|
break;
|
||||||
case scm_tc7_cxr:
|
case scm_tc7_cxr:
|
||||||
return call_cxr_1;
|
trampoline = call_cxr_1;
|
||||||
|
break;
|
||||||
case scm_tcs_closures:
|
case scm_tcs_closures:
|
||||||
{
|
{
|
||||||
SCM formals = SCM_CLOSURE_FORMALS (proc);
|
SCM formals = SCM_CLOSURE_FORMALS (proc);
|
||||||
if (!SCM_NULLP (formals)
|
if (!SCM_NULLP (formals)
|
||||||
&& (!SCM_CONSP (formals) || !SCM_CONSP (SCM_CDR (formals))))
|
&& (!SCM_CONSP (formals) || !SCM_CONSP (SCM_CDR (formals))))
|
||||||
return call_closure_1;
|
trampoline = call_closure_1;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case scm_tcs_struct:
|
case scm_tcs_struct:
|
||||||
if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
|
if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
|
||||||
return scm_call_generic_1;
|
trampoline = scm_call_generic_1;
|
||||||
else if (SCM_I_OPERATORP (proc))
|
else if (SCM_I_OPERATORP (proc))
|
||||||
return scm_call_1;
|
trampoline = scm_call_1;
|
||||||
return NULL;
|
else
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
case scm_tc7_smob:
|
case scm_tc7_smob:
|
||||||
if (SCM_SMOB_APPLICABLE_P (proc))
|
if (SCM_SMOB_APPLICABLE_P (proc))
|
||||||
return SCM_SMOB_DESCRIPTOR (proc).apply_1;
|
trampoline = SCM_SMOB_DESCRIPTOR (proc).apply_1;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
break;
|
||||||
case scm_tc7_asubr:
|
case scm_tc7_asubr:
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
case scm_tc7_cclo:
|
case scm_tc7_cclo:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
return scm_call_1;
|
trampoline = scm_call_1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return NULL; /* not applicable on one arg */
|
return NULL; /* not applicable on one arg */
|
||||||
}
|
}
|
||||||
|
/* We only reach this point if a valid trampoline was determined. */
|
||||||
|
|
||||||
|
/* If debugging is enabled, we want to see all calls to proc on the stack.
|
||||||
|
* Thus, we replace the trampoline shortcut with scm_call_1. */
|
||||||
|
if (SCM_DEBUGGINGP)
|
||||||
|
return scm_call_1;
|
||||||
|
else
|
||||||
|
return trampoline;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SCM
|
static SCM
|
||||||
|
@ -4667,21 +4703,25 @@ call_closure_2 (SCM proc, SCM arg1, SCM arg2)
|
||||||
scm_t_trampoline_2
|
scm_t_trampoline_2
|
||||||
scm_trampoline_2 (SCM proc)
|
scm_trampoline_2 (SCM proc)
|
||||||
{
|
{
|
||||||
|
scm_t_trampoline_2 trampoline;
|
||||||
|
|
||||||
if (SCM_IMP (proc))
|
if (SCM_IMP (proc))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (SCM_DEBUGGINGP)
|
|
||||||
return scm_call_2;
|
|
||||||
switch (SCM_TYP7 (proc))
|
switch (SCM_TYP7 (proc))
|
||||||
{
|
{
|
||||||
case scm_tc7_subr_2:
|
case scm_tc7_subr_2:
|
||||||
case scm_tc7_subr_2o:
|
case scm_tc7_subr_2o:
|
||||||
case scm_tc7_rpsubr:
|
case scm_tc7_rpsubr:
|
||||||
case scm_tc7_asubr:
|
case scm_tc7_asubr:
|
||||||
return call_subr2_2;
|
trampoline = call_subr2_2;
|
||||||
|
break;
|
||||||
case scm_tc7_lsubr_2:
|
case scm_tc7_lsubr_2:
|
||||||
return call_lsubr2_2;
|
trampoline = call_lsubr2_2;
|
||||||
|
break;
|
||||||
case scm_tc7_lsubr:
|
case scm_tc7_lsubr:
|
||||||
return call_lsubr_2;
|
trampoline = call_lsubr_2;
|
||||||
|
break;
|
||||||
case scm_tcs_closures:
|
case scm_tcs_closures:
|
||||||
{
|
{
|
||||||
SCM formals = SCM_CLOSURE_FORMALS (proc);
|
SCM formals = SCM_CLOSURE_FORMALS (proc);
|
||||||
|
@ -4690,27 +4730,40 @@ scm_trampoline_2 (SCM proc)
|
||||||
|| (!SCM_NULLP (SCM_CDR (formals))
|
|| (!SCM_NULLP (SCM_CDR (formals))
|
||||||
&& (!SCM_CONSP (SCM_CDR (formals))
|
&& (!SCM_CONSP (SCM_CDR (formals))
|
||||||
|| !SCM_CONSP (SCM_CDDR (formals))))))
|
|| !SCM_CONSP (SCM_CDDR (formals))))))
|
||||||
return call_closure_2;
|
trampoline = call_closure_2;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case scm_tcs_struct:
|
case scm_tcs_struct:
|
||||||
if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
|
if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
|
||||||
return scm_call_generic_2;
|
trampoline = scm_call_generic_2;
|
||||||
else if (SCM_I_OPERATORP (proc))
|
else if (SCM_I_OPERATORP (proc))
|
||||||
return scm_call_2;
|
trampoline = scm_call_2;
|
||||||
return NULL;
|
else
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
case scm_tc7_smob:
|
case scm_tc7_smob:
|
||||||
if (SCM_SMOB_APPLICABLE_P (proc))
|
if (SCM_SMOB_APPLICABLE_P (proc))
|
||||||
return SCM_SMOB_DESCRIPTOR (proc).apply_2;
|
trampoline = SCM_SMOB_DESCRIPTOR (proc).apply_2;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
break;
|
||||||
case scm_tc7_cclo:
|
case scm_tc7_cclo:
|
||||||
case scm_tc7_pws:
|
case scm_tc7_pws:
|
||||||
return scm_call_2;
|
trampoline = scm_call_2;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return NULL; /* not applicable on two args */
|
return NULL; /* not applicable on two args */
|
||||||
}
|
}
|
||||||
|
/* We only reach this point if a valid trampoline was determined. */
|
||||||
|
|
||||||
|
/* If debugging is enabled, we want to see all calls to proc on the stack.
|
||||||
|
* Thus, we replace the trampoline shortcut with scm_call_2. */
|
||||||
|
if (SCM_DEBUGGINGP)
|
||||||
|
return scm_call_2;
|
||||||
|
else
|
||||||
|
return trampoline;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Typechecking for multi-argument MAP and FOR-EACH.
|
/* Typechecking for multi-argument MAP and FOR-EACH.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue