diff --git a/libguile/ChangeLog b/libguile/ChangeLog index d1fbc14bd..f24abe03b 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,25 @@ +2000-12-06 Keisuke Nishida + + * smob.h (scm_smob_descriptor): New fields `apply_0', `apply_1', + `apply_2', and `apply_3'. + * smob.c (scm_make_smob_type): Init new fields. + (SCM_SMOB_APPLY0, SCM_SMOB_APPLY1, SCM_SMOB_APPLY2, SCM_SMOB_APPLY3): + New macros. + (scm_smob_apply_0_000, scm_smob_apply_0_010, scm_smob_apply_0_020, + scm_smob_apply_0_030, scm_smob_apply_0_001, scm_smob_apply_0_011, + scm_smob_apply_0_021, scm_smob_apply_0_error, + scm_smob_apply_1_010, scm_smob_apply_1_020, scm_smob_apply_1_030, + scm_smob_apply_1_001, scm_smob_apply_1_011, scm_smob_apply_1_021, + scm_smob_apply_1_error, + scm_smob_apply_2_020, scm_smob_apply_2_030, scm_smob_apply_2_001, + scm_smob_apply_2_011, scm_smob_apply_2_021, scm_smob_apply_2_error, + scm_smob_apply_3_030, scm_smob_apply_3_001, scm_smob_apply_3_011, + scm_smob_apply_3_021, scm_smob_apply_3_error): New functions. + (scm_set_smob_apply): Set new fields to the above functions. + (scm_smob_apply_0, scm_smob_apply_1, scm_smob_apply_2, + scm_smob_apply_3): Removed. + * eval.c (SCM_CEVAL, SCM_APPLY): Rewrote smob calls. + 2000-12-06 Dirk Herrmann * gc.c (scm_init_gc): gc_async must be protected from gc. I diff --git a/libguile/eval.c b/libguile/eval.c index 7ba7e5a06..dc1f0905a 100644 --- a/libguile/eval.c +++ b/libguile/eval.c @@ -2580,7 +2580,7 @@ evapply: case scm_tc7_smob: if (!SCM_SMOB_DESCRIPTOR (proc).apply) goto badfun; - RETURN (scm_smob_apply_0 (proc)); + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_0 (proc)); case scm_tc7_cclo: t.arg1 = proc; proc = SCM_CCLO_SUBR (proc); @@ -2729,7 +2729,7 @@ evapply: case scm_tc7_smob: if (!SCM_SMOB_DESCRIPTOR (proc).apply) goto badfun; - RETURN (scm_smob_apply_1 (proc, t.arg1)); + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_1 (proc, t.arg1)); case scm_tc7_cclo: arg2 = t.arg1; t.arg1 = proc; @@ -2845,7 +2845,7 @@ evapply: case scm_tc7_smob: if (!SCM_SMOB_DESCRIPTOR (proc).apply) goto badfun; - RETURN (scm_smob_apply_2 (proc, t.arg1, arg2)); + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_2 (proc, t.arg1, arg2)); cclon: case scm_tc7_cclo: #ifdef DEVAL @@ -2984,8 +2984,8 @@ evapply: case scm_tc7_smob: if (!SCM_SMOB_DESCRIPTOR (proc).apply) goto badfun; - RETURN (scm_smob_apply_3 (proc, t.arg1, arg2, - SCM_CDDR (debug.info->a.args))); + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_3 + (proc, t.arg1, arg2, SCM_CDDR (debug.info->a.args))); case scm_tc7_cclo: goto cclon; case scm_tc7_pws: @@ -3046,8 +3046,8 @@ evapply: case scm_tc7_smob: if (!SCM_SMOB_DESCRIPTOR (proc).apply) goto badfun; - RETURN (scm_smob_apply_3 (proc, t.arg1, arg2, - scm_eval_args (x, env, proc))); + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_3 + (proc, t.arg1, arg2, scm_eval_args (x, env, proc))); case scm_tc7_cclo: goto cclon; case scm_tc7_pws: @@ -3412,13 +3412,15 @@ tail: if (!SCM_SMOB_DESCRIPTOR (proc).apply) goto badproc; if (SCM_UNBNDP (arg1)) - RETURN (scm_smob_apply_0 (proc)) + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_0 (proc)) else if (SCM_NULLP (args)) - RETURN (scm_smob_apply_1 (proc, arg1)) + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_1 (proc, arg1)) else if (SCM_NULLP (SCM_CDR (args))) - RETURN (scm_smob_apply_2 (proc, arg1, SCM_CAR (args))) + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_2 + (proc, arg1, SCM_CAR (args))) else - RETURN (scm_smob_apply_3 (proc, arg1, SCM_CAR (args), SCM_CDR (args))); + RETURN (SCM_SMOB_DESCRIPTOR (proc).apply_3 + (proc, arg1, SCM_CAR (args), SCM_CDR (args))); case scm_tc7_cclo: #ifdef DEVAL args = (SCM_UNBNDP(arg1) ? SCM_EOL : debug.vect[0].a.args); diff --git a/libguile/smob.c b/libguile/smob.c index 1be908356..9475542fd 100644 --- a/libguile/smob.c +++ b/libguile/smob.c @@ -125,169 +125,174 @@ scm_smob_print (SCM exp, SCM port, scm_print_state *pstate) /* {Apply} */ -/* - * A possible future optimization: - * - * Let's call each of the forms of call below a "trampoline". - * - * We could make a function out of each trampoline and store four - * pointers to trampolines in the descriptor, one corresponding to - * each arity of call (apply_0, apply_1 etc.) - * - * Which trampoline to store in which field is chosen in scm_set_smob_apply. - */ +#define SCM_SMOB_APPLY0(SMOB) \ + SCM_SMOB_DESCRIPTOR (SMOB).apply (SMOB) +#define SCM_SMOB_APPLY1(SMOB,A1) \ + SCM_SMOB_DESCRIPTOR (SMOB).apply (SMOB, A1) +#define SCM_SMOB_APPLY2(SMOB,A1,A2) \ + SCM_SMOB_DESCRIPTOR (SMOB).apply (SMOB, A1, A2) +#define SCM_SMOB_APPLY3(SMOB,A1,A2,A3) \ + SCM_SMOB_DESCRIPTOR (SMOB).apply (SMOB, A1, A2, A3) -SCM -scm_smob_apply_0 (SCM smob) +static SCM +scm_smob_apply_0_000 (SCM smob) { - int type = SCM_SMOB_DESCRIPTOR (smob).gsubr_type; - switch (type) - { - case SCM_GSUBR_MAKTYPE (0, 0, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (); - case SCM_GSUBR_MAKTYPE (0, 1, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, SCM_UNDEFINED); - case SCM_GSUBR_MAKTYPE (0, 0, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, SCM_EOL); - case SCM_GSUBR_MAKTYPE (0, 2, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, - SCM_UNDEFINED, - SCM_UNDEFINED); - case SCM_GSUBR_MAKTYPE (0, 1, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, - SCM_UNDEFINED, - SCM_EOL); - case SCM_GSUBR_MAKTYPE (0, 3, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, - SCM_UNDEFINED, - SCM_UNDEFINED, - SCM_UNDEFINED); - case SCM_GSUBR_MAKTYPE (0, 2, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, - SCM_UNDEFINED, - SCM_UNDEFINED, - SCM_EOL); - default: - if (SCM_GSUBR_REQ (type) > 0) - scm_wrong_num_args (smob); - scm_misc_error ("scm_smob_apply_0", - "Unsupported smob application: ~S", - SCM_LIST1 (smob)); - } + return SCM_SMOB_APPLY0 (smob); } -SCM -scm_smob_apply_1 (SCM smob, SCM a1) +static SCM +scm_smob_apply_0_010 (SCM smob) { - int type = SCM_SMOB_DESCRIPTOR (smob).gsubr_type; - switch (type) - { - case SCM_GSUBR_MAKTYPE (0, 0, 0): - scm_wrong_num_args (smob); - case SCM_GSUBR_MAKTYPE (1, 0, 0): - case SCM_GSUBR_MAKTYPE (0, 1, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1); - case SCM_GSUBR_MAKTYPE (0, 0, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, SCM_LIST1 (a1)); - case SCM_GSUBR_MAKTYPE (1, 1, 0): - case SCM_GSUBR_MAKTYPE (0, 2, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, SCM_UNDEFINED); - case SCM_GSUBR_MAKTYPE (1, 0, 1): - case SCM_GSUBR_MAKTYPE (0, 1, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, SCM_EOL); - case SCM_GSUBR_MAKTYPE (1, 2, 0): - case SCM_GSUBR_MAKTYPE (0, 3, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, - SCM_UNDEFINED, - SCM_UNDEFINED); - case SCM_GSUBR_MAKTYPE (1, 1, 1): - case SCM_GSUBR_MAKTYPE (0, 2, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, - SCM_UNDEFINED, - SCM_EOL); - default: - if (SCM_GSUBR_REQ (type) > 1) - scm_wrong_num_args (smob); - scm_misc_error ("scm_smob_apply_1", - "Unsupported smob application: ~S", - SCM_LIST1 (smob)); - } + return SCM_SMOB_APPLY1 (smob, SCM_UNDEFINED); } -SCM -scm_smob_apply_2 (SCM smob, SCM a1, SCM a2) +static SCM +scm_smob_apply_0_020 (SCM smob) { - int type = SCM_SMOB_DESCRIPTOR (smob).gsubr_type; - switch (type) - { - case SCM_GSUBR_MAKTYPE (0, 0, 0): - case SCM_GSUBR_MAKTYPE (1, 0, 0): - case SCM_GSUBR_MAKTYPE (0, 1, 0): - scm_wrong_num_args (smob); - case SCM_GSUBR_MAKTYPE (0, 0, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, SCM_LIST2 (a1, a2)); - case SCM_GSUBR_MAKTYPE (2, 0, 0): - case SCM_GSUBR_MAKTYPE (1, 1, 0): - case SCM_GSUBR_MAKTYPE (0, 2, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, a2); - case SCM_GSUBR_MAKTYPE (1, 0, 1): - case SCM_GSUBR_MAKTYPE (0, 1, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, SCM_LIST1 (a2)); - case SCM_GSUBR_MAKTYPE (2, 1, 0): - case SCM_GSUBR_MAKTYPE (1, 2, 0): - case SCM_GSUBR_MAKTYPE (0, 3, 0): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, a2, SCM_UNDEFINED); - case SCM_GSUBR_MAKTYPE (2, 0, 1): - case SCM_GSUBR_MAKTYPE (1, 1, 1): - case SCM_GSUBR_MAKTYPE (0, 2, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, a2, SCM_EOL); - default: - if (SCM_GSUBR_REQ (type) > 2) - scm_wrong_num_args (smob); - scm_misc_error ("scm_smob_apply_2", - "Unsupported smob application: ~S", - SCM_LIST1 (smob)); - } + return SCM_SMOB_APPLY2 (smob, SCM_UNDEFINED, SCM_UNDEFINED); } -SCM -scm_smob_apply_3 (SCM smob, SCM a1, SCM a2, SCM rest) +static SCM +scm_smob_apply_0_030 (SCM smob) { - int type = SCM_SMOB_DESCRIPTOR (smob).gsubr_type; - switch (type) - { - case SCM_GSUBR_MAKTYPE (0, 0, 0): - case SCM_GSUBR_MAKTYPE (1, 0, 0): - case SCM_GSUBR_MAKTYPE (0, 1, 0): - case SCM_GSUBR_MAKTYPE (2, 0, 0): - case SCM_GSUBR_MAKTYPE (1, 1, 0): - case SCM_GSUBR_MAKTYPE (0, 2, 0): - scm_wrong_num_args (smob); - case SCM_GSUBR_MAKTYPE (0, 0, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, scm_cons (a1, scm_cons (a2, rest))); - case SCM_GSUBR_MAKTYPE (1, 0, 1): - case SCM_GSUBR_MAKTYPE (0, 1, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, scm_cons (a2, rest)); - case SCM_GSUBR_MAKTYPE (3, 0, 0): - case SCM_GSUBR_MAKTYPE (2, 1, 0): - case SCM_GSUBR_MAKTYPE (1, 2, 0): - case SCM_GSUBR_MAKTYPE (0, 3, 0): - if (!SCM_NULLP (SCM_CDR (rest))) - scm_wrong_num_args (smob); - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, a2, SCM_CAR (rest)); - case SCM_GSUBR_MAKTYPE (2, 0, 1): - case SCM_GSUBR_MAKTYPE (1, 1, 1): - case SCM_GSUBR_MAKTYPE (0, 2, 1): - return SCM_SMOB_DESCRIPTOR (smob).apply (smob, a1, a2, rest); - default: - if (SCM_GSUBR_REQ (type) > 3) - scm_wrong_num_args (smob); - scm_misc_error ("scm_smob_apply_3", - "Unsupported smob application: ~S", - SCM_LIST1 (smob)); - } + return SCM_SMOB_APPLY3 (smob, SCM_UNDEFINED, SCM_UNDEFINED, SCM_UNDEFINED); } +static SCM +scm_smob_apply_0_001 (SCM smob) +{ + return SCM_SMOB_APPLY1 (smob, SCM_EOL); +} + +static SCM +scm_smob_apply_0_011 (SCM smob) +{ + return SCM_SMOB_APPLY2 (smob, SCM_UNDEFINED, SCM_EOL); +} + +static SCM +scm_smob_apply_0_021 (SCM smob) +{ + return SCM_SMOB_APPLY3 (smob, SCM_UNDEFINED, SCM_UNDEFINED, SCM_EOL); +} + +static SCM +scm_smob_apply_0_error (SCM smob) +{ + scm_wrong_num_args (smob); +} + +static SCM +scm_smob_apply_1_010 (SCM smob, SCM a1) +{ + return SCM_SMOB_APPLY1 (smob, a1); +} + +static SCM +scm_smob_apply_1_020 (SCM smob, SCM a1) +{ + return SCM_SMOB_APPLY2 (smob, a1, SCM_UNDEFINED); +} + +static SCM +scm_smob_apply_1_030 (SCM smob, SCM a1) +{ + return SCM_SMOB_APPLY3 (smob, a1, SCM_UNDEFINED, SCM_UNDEFINED); +} + +static SCM +scm_smob_apply_1_001 (SCM smob, SCM a1) +{ + return SCM_SMOB_APPLY1 (smob, SCM_LIST1 (a1)); +} + +static SCM +scm_smob_apply_1_011 (SCM smob, SCM a1) +{ + return SCM_SMOB_APPLY2 (smob, a1, SCM_EOL); +} + +static SCM +scm_smob_apply_1_021 (SCM smob, SCM a1) +{ + return SCM_SMOB_APPLY3 (smob, a1, SCM_UNDEFINED, SCM_EOL); +} + +static SCM +scm_smob_apply_1_error (SCM smob, SCM a1) +{ + scm_wrong_num_args (smob); +} + +static SCM +scm_smob_apply_2_020 (SCM smob, SCM a1, SCM a2) +{ + return SCM_SMOB_APPLY2 (smob, a1, a2); +} + +static SCM +scm_smob_apply_2_030 (SCM smob, SCM a1, SCM a2) +{ + return SCM_SMOB_APPLY3 (smob, a1, a2, SCM_UNDEFINED); +} + +static SCM +scm_smob_apply_2_001 (SCM smob, SCM a1, SCM a2) +{ + return SCM_SMOB_APPLY1 (smob, SCM_LIST2 (a1, a2)); + } + +static SCM +scm_smob_apply_2_011 (SCM smob, SCM a1, SCM a2) +{ + return SCM_SMOB_APPLY2 (smob, a1, SCM_LIST1 (a2)); +} + +static SCM +scm_smob_apply_2_021 (SCM smob, SCM a1, SCM a2) +{ + return SCM_SMOB_APPLY3 (smob, a1, a2, SCM_EOL); +} + +static SCM +scm_smob_apply_2_error (SCM smob, SCM a1, SCM a2) +{ + scm_wrong_num_args (smob); +} + +static SCM +scm_smob_apply_3_030 (SCM smob, SCM a1, SCM a2, SCM rst) +{ + if (!SCM_NULLP (SCM_CDR (rst))) + scm_wrong_num_args (smob); + return SCM_SMOB_APPLY3 (smob, a1, a2, SCM_CAR (rst)); +} + +static SCM +scm_smob_apply_3_001 (SCM smob, SCM a1, SCM a2, SCM rst) +{ + return SCM_SMOB_APPLY1 (smob, scm_cons2 (a1, a2, rst)); +} + +static SCM +scm_smob_apply_3_011 (SCM smob, SCM a1, SCM a2, SCM rst) +{ + return SCM_SMOB_APPLY2 (smob, a1, scm_cons (a2, rst)); +} + +static SCM +scm_smob_apply_3_021 (SCM smob, SCM a1, SCM a2, SCM rst) +{ + return SCM_SMOB_APPLY3 (smob, a1, a2, rst); +} + +static SCM +scm_smob_apply_3_error (SCM smob, SCM a1, SCM a2, SCM rst) +{ + scm_wrong_num_args (smob); +} + + long scm_make_smob_type (char *name, scm_sizet size) { @@ -308,7 +313,10 @@ scm_make_smob_type (char *name, scm_sizet size) scm_smobs[scm_numsmob].print = scm_smob_print; scm_smobs[scm_numsmob].equalp = 0; scm_smobs[scm_numsmob].apply = 0; - scm_smobs[scm_numsmob].gsubr_type = 0; + scm_smobs[scm_numsmob].apply_0 = 0; + scm_smobs[scm_numsmob].apply_1 = 0; + scm_smobs[scm_numsmob].apply_2 = 0; + scm_smobs[scm_numsmob].apply_3 = 0; scm_numsmob++; } SCM_ALLOW_INTS; @@ -363,8 +371,111 @@ scm_set_smob_equalp (long tc, SCM (*equalp) (SCM, SCM)) void scm_set_smob_apply (long tc, SCM (*apply) (), int req, int opt, int rst) { + SCM (*apply_0) (SCM); + SCM (*apply_1) (SCM, SCM); + SCM (*apply_2) (SCM, SCM, SCM); + SCM (*apply_3) (SCM, SCM, SCM, SCM); + int type = SCM_GSUBR_MAKTYPE (req, opt, rst); + + if (!(req >= 0 && opt >= 0 && (rst == 0 || rst == 1) + && req + opt + rst <= 3)) + { + puts ("Unsupported smob application type"); + abort (); + } + + switch (type) + { + case SCM_GSUBR_MAKTYPE (0, 0, 0): + apply_0 = scm_smob_apply_0_000; break; + case SCM_GSUBR_MAKTYPE (0, 1, 0): + apply_0 = scm_smob_apply_0_010; break; + case SCM_GSUBR_MAKTYPE (0, 2, 0): + apply_0 = scm_smob_apply_0_020; break; + case SCM_GSUBR_MAKTYPE (0, 3, 0): + apply_0 = scm_smob_apply_0_030; break; + case SCM_GSUBR_MAKTYPE (0, 0, 1): + apply_0 = scm_smob_apply_0_001; break; + case SCM_GSUBR_MAKTYPE (0, 1, 1): + apply_0 = scm_smob_apply_0_011; break; + case SCM_GSUBR_MAKTYPE (0, 2, 1): + apply_0 = scm_smob_apply_0_021; break; + default: + apply_0 = scm_smob_apply_0_error; break; + } + + switch (type) + { + case SCM_GSUBR_MAKTYPE (1, 0, 0): + case SCM_GSUBR_MAKTYPE (0, 1, 0): + apply_1 = scm_smob_apply_1_010; break; + case SCM_GSUBR_MAKTYPE (1, 1, 0): + case SCM_GSUBR_MAKTYPE (0, 2, 0): + apply_1 = scm_smob_apply_1_020; break; + case SCM_GSUBR_MAKTYPE (1, 2, 0): + case SCM_GSUBR_MAKTYPE (0, 3, 0): + apply_1 = scm_smob_apply_1_030; break; + case SCM_GSUBR_MAKTYPE (0, 0, 1): + apply_1 = scm_smob_apply_1_001; break; + case SCM_GSUBR_MAKTYPE (1, 0, 1): + case SCM_GSUBR_MAKTYPE (0, 1, 1): + apply_1 = scm_smob_apply_1_011; break; + case SCM_GSUBR_MAKTYPE (1, 1, 1): + case SCM_GSUBR_MAKTYPE (0, 2, 1): + apply_1 = scm_smob_apply_1_021; break; + default: + apply_1 = scm_smob_apply_1_error; break; + } + + switch (type) + { + case SCM_GSUBR_MAKTYPE (2, 0, 0): + case SCM_GSUBR_MAKTYPE (1, 1, 0): + case SCM_GSUBR_MAKTYPE (0, 2, 0): + apply_2 = scm_smob_apply_2_020; break; + case SCM_GSUBR_MAKTYPE (2, 1, 0): + case SCM_GSUBR_MAKTYPE (1, 2, 0): + case SCM_GSUBR_MAKTYPE (0, 3, 0): + apply_2 = scm_smob_apply_2_030; break; + case SCM_GSUBR_MAKTYPE (0, 0, 1): + apply_2 = scm_smob_apply_2_001; break; + case SCM_GSUBR_MAKTYPE (1, 0, 1): + case SCM_GSUBR_MAKTYPE (0, 1, 1): + apply_2 = scm_smob_apply_2_011; break; + case SCM_GSUBR_MAKTYPE (2, 0, 1): + case SCM_GSUBR_MAKTYPE (1, 1, 1): + case SCM_GSUBR_MAKTYPE (0, 2, 1): + apply_2 = scm_smob_apply_2_021; break; + default: + apply_2 = scm_smob_apply_2_error; break; + } + + switch (type) + { + case SCM_GSUBR_MAKTYPE (3, 0, 0): + case SCM_GSUBR_MAKTYPE (2, 1, 0): + case SCM_GSUBR_MAKTYPE (1, 2, 0): + case SCM_GSUBR_MAKTYPE (0, 3, 0): + apply_3 = scm_smob_apply_3_030; break; + case SCM_GSUBR_MAKTYPE (0, 0, 1): + apply_3 = scm_smob_apply_3_001; break; + case SCM_GSUBR_MAKTYPE (1, 0, 1): + case SCM_GSUBR_MAKTYPE (0, 1, 1): + apply_3 = scm_smob_apply_3_011; break; + case SCM_GSUBR_MAKTYPE (2, 0, 1): + case SCM_GSUBR_MAKTYPE (1, 1, 1): + case SCM_GSUBR_MAKTYPE (0, 2, 1): + apply_3 = scm_smob_apply_3_021; break; + default: + apply_3 = scm_smob_apply_3_error; break; + } + + scm_smobs[SCM_TC2SMOBNUM (tc)].gsubr_type = type; /* Used in procprop.c */ scm_smobs[SCM_TC2SMOBNUM (tc)].apply = apply; - scm_smobs[SCM_TC2SMOBNUM (tc)].gsubr_type = SCM_GSUBR_MAKTYPE (req, opt, rst); + scm_smobs[SCM_TC2SMOBNUM (tc)].apply_0 = apply_0; + scm_smobs[SCM_TC2SMOBNUM (tc)].apply_1 = apply_1; + scm_smobs[SCM_TC2SMOBNUM (tc)].apply_2 = apply_2; + scm_smobs[SCM_TC2SMOBNUM (tc)].apply_3 = apply_3; } void diff --git a/libguile/smob.h b/libguile/smob.h index b6de488b6..96589fb63 100644 --- a/libguile/smob.h +++ b/libguile/smob.h @@ -57,8 +57,12 @@ typedef struct scm_smob_descriptor scm_sizet (*free) (SCM); int (*print) (SCM exp, SCM port, scm_print_state *pstate); SCM (*equalp) (SCM, SCM); - SCM (*apply) (); int gsubr_type; + SCM (*apply) (); + SCM (*apply_0) (SCM); + SCM (*apply_1) (SCM, SCM); + SCM (*apply_2) (SCM, SCM, SCM); + SCM (*apply_3) (SCM, SCM, SCM, SCM); } scm_smob_descriptor;