summaryrefslogtreecommitdiff
path: root/libguile/procprop.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-01-09 14:12:47 +0100
committerAndy Wingo <wingo@pobox.com>2010-01-09 14:21:03 +0100
commit75c3ed282029f4d2a80adf75f52ec1b9b34edcb7 (patch)
tree1167bd621a5dda0a9466f4c0f51d6b363445d73d /libguile/procprop.c
parent9174596d5bfc456d06f4cf74a7a67e9b2b09aac3 (diff)
downloadguile-75c3ed282029f4d2a80adf75f52ec1b9b34edcb7.tar.gz
smobs are applied with vm trampoline procedures
* libguile/smob.c: Instead of having special evaluator support for applying smobs, we use the same strategy that gsubr uses, that smob application should happen via a trampoline VM procedure, which uses a special opcode (smob-apply). So statically allocate all of the desired trampoline procedures here. (scm_i_smob_apply_trampoline): Unfortunately there's no real place to put the trampoline, so instead use a weak-key hash. It's nasty, but I think the benefits of speeding up procedure calls in the general case are worth it. * libguile/smob.h (scm_smob_descriptor): Remove fields apply_0, apply_1, apply_2, and apply_3; these were never public. Also remove the gsubr_type field. Instead cache the trampoline objcode here. (SCM_SMOB_APPLY_0, SCM_SMOB_APPLY_1, SCM_SMOB_APPLY_2, SCM_SMOB_APPLY_3): Just go through scm_call_0, etc here. * libguile/vm-i-system.c (call, tail-call, mv-call): Simplify. All procedure calls are VM calls now. (smob-call): New instruction, used in smob trampoline procedures. * libguile/vm.c (apply_foreign): Remove. Yay! * libguile/procprop.c (scm_i_procedure_arity): Refactor a bit for the smob changes.
Diffstat (limited to 'libguile/procprop.c')
-rw-r--r--libguile/procprop.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/libguile/procprop.c b/libguile/procprop.c
index 641defc49..b3c6c864c 100644
--- a/libguile/procprop.c
+++ b/libguile/procprop.c
@@ -48,23 +48,27 @@ static scm_i_pthread_mutex_t props_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER;
int
scm_i_procedure_arity (SCM proc, int *req, int *opt, int *rest)
{
- if (SCM_IMP (proc))
- return 0;
- loop:
- switch (SCM_TYP7 (proc))
+ while (!SCM_PROGRAM_P (proc))
{
- case scm_tc7_program:
- return scm_i_program_arity (proc, req, opt, rest);
- case scm_tc7_smob:
- return scm_i_smob_arity (proc, req, opt, rest);
- case scm_tcs_struct:
- if (!SCM_STRUCT_APPLICABLE_P (proc))
+ if (SCM_IMP (proc))
return 0;
- proc = SCM_STRUCT_PROCEDURE (proc);
- goto loop;
- default:
- return 0;
+ switch (SCM_TYP7 (proc))
+ {
+ case scm_tc7_smob:
+ if (!SCM_SMOB_APPLICABLE_P (proc))
+ return 0;
+ proc = scm_i_smob_apply_trampoline (proc);
+ break;
+ case scm_tcs_struct:
+ if (!SCM_STRUCT_APPLICABLE_P (proc))
+ return 0;
+ proc = SCM_STRUCT_PROCEDURE (proc);
+ break;
+ default:
+ return 0;
+ }
}
+ return scm_i_program_arity (proc, req, opt, rest);
}
/* FIXME: instead of the weak hash, perhaps for some kinds of procedures, use