summaryrefslogtreecommitdiff
path: root/libguile/procs.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2009-02-16 00:24:00 +0100
committerLudovic Courtès <ludo@gnu.org>2009-03-02 00:20:43 +0100
commite20d7001c3f7150400169fecb0bf0eefdf122fe2 (patch)
treec87cda61cb2fd5574aa8aceccd199d48736437c0 /libguile/procs.c
parentb786a5bbf825f61e04ccd9a54f93cb1e40ac67d9 (diff)
downloadguile-e20d7001c3f7150400169fecb0bf0eefdf122fe2.tar.gz
Remove "compiled closures" ("cclos") in favor of a simpler mechanism.
The idea is to introduce `gsubrs' whose arity is encoded in their type (more precisely in the sizeof (void *) - 8 MSBs). This removes the indirection introduced by cclos and simplifies the code. * libguile/__scm.h (CCLO): Remove. * libguile/debug.c (scm_procedure_source, scm_procedure_environment): Remove references to `scm_tc7_cclo'. * libguile/eval.c (scm_trampoline_0, scm_trampoline_1, scm_trampoline_2): Replace `scm_tc7_cclo' with `scm_tc7_gsubr'. * libguile/eval.i.c (CEVAL): Likewise. No longer make PROC the first argument. Directly invoke `scm_gsubr_apply ()' instead of jump to the `evap(N+1)' label or call to `SCM_APPLY ()'. * libguile/evalext.c (scm_self_evaluating_p): Remove reference to `scm_tc7_cclo'. * libguile/gc-card.c (scm_i_sweep_card, scm_i_tag_name): Likewise. * libguile/gc-mark.c (scm_gc_mark_dependencies): Likewise. * libguile/goops.c (scm_class_of): Likewise. * libguile/print.c (iprin1): Likewise. * libguile/gsubr.c (create_gsubr): Use `unsigned int's for REQ, OPT and RST. Use `scm_tc7_gsubr' instead of `scm_makcclo ()' in the default case. (scm_gsubr_apply): Remove calls to `SCM_GSUBR_PROC ()'. (scm_f_gsubr_apply): Remove. * libguile/gsubr.h (SCM_GSUBR_TYPE): New definition. (SCM_GSUBR_MAX): Changed to 33. (SCM_SET_GSUBR_TYPE, SCM_GSUBR_PROC, SCM_SET_GSUBR_PROC, scm_f_gsubr_apply): Remove. * libguile/procprop.c (scm_i_procedure_arity): Remove reference to `scm_tc7_cclo'; add proper handling of `scm_tc7_gsubr'. * libguile/procs.c (scm_makcclo, scm_make_cclo): Remove. (scm_procedure_p): Remove reference to `scm_tc7_cclo'. (scm_thunk_p): Likewise, plus add proper `scm_tc7_gsubr' handling. * libguile/procs.h (SCM_CCLO_LENGTH, SCM_MAKE_CCLO_TAG, SCM_SET_CCLO_LENGTH, SCM_CCLO_BASE, SCM_SET_CCLO_BASE, SCM_CCLO_REF, SCM_CCLO_SET, SCM_CCLO_SUBR, SCM_SET_CCLO_SUBR, scm_makcclo, scm_make_cclo): Remove. * libguile/stacks.c (read_frames): Remove reference to `scm_f_gsubr_apply'. * libguile/tags.h (scm_tc7_cclo): Remove. (scm_tc7_gsubr): New. (scm_tcs_subrs): Add `scm_tc7_gsubr'.
Diffstat (limited to 'libguile/procs.c')
-rw-r--r--libguile/procs.c47
1 files changed, 2 insertions, 45 deletions
diff --git a/libguile/procs.c b/libguile/procs.c
index af7f071f2..221514777 100644
--- a/libguile/procs.c
+++ b/libguile/procs.c
@@ -90,39 +90,6 @@ scm_c_define_subr_with_generic (const char *name,
}
-#ifdef CCLO
-SCM
-scm_makcclo (SCM proc, size_t len)
-{
- scm_t_bits *base = scm_gc_malloc (len * sizeof (scm_t_bits),
- "compiled closure");
- unsigned long i;
- SCM s;
-
- for (i = 0; i < len; ++i)
- base [i] = SCM_UNPACK (SCM_UNSPECIFIED);
-
- s = scm_cell (SCM_MAKE_CCLO_TAG (len), (scm_t_bits) base);
- SCM_SET_CCLO_SUBR (s, proc);
- return s;
-}
-
-/* Undocumented debugging procedure */
-#ifdef GUILE_DEBUG
-SCM_DEFINE (scm_make_cclo, "make-cclo", 2, 0, 0,
- (SCM proc, SCM len),
- "Create a compiled closure for @var{proc}, which reserves\n"
- "@var{len} objects for its usage.")
-#define FUNC_NAME s_scm_make_cclo
-{
- return scm_makcclo (proc, scm_to_size_t (len));
-}
-#undef FUNC_NAME
-#endif
-#endif
-
-
-
SCM_DEFINE (scm_procedure_p, "procedure?", 1, 0, 0,
(SCM obj),
"Return @code{#t} if @var{obj} is a procedure.")
@@ -136,9 +103,6 @@ SCM_DEFINE (scm_procedure_p, "procedure?", 1, 0, 0,
break;
case scm_tcs_closures:
case scm_tcs_subrs:
-#ifdef CCLO
- case scm_tc7_cclo:
-#endif
case scm_tc7_pws:
return SCM_BOOL_T;
case scm_tc7_smob:
@@ -176,10 +140,9 @@ SCM_DEFINE (scm_thunk_p, "thunk?", 1, 0, 0,
case scm_tc7_lsubr:
case scm_tc7_rpsubr:
case scm_tc7_asubr:
-#ifdef CCLO
- case scm_tc7_cclo:
-#endif
return SCM_BOOL_T;
+ case scm_tc7_gsubr:
+ return scm_from_bool (SCM_GSUBR_REQ (SCM_GSUBR_TYPE (obj)) == 0);
case scm_tc7_pws:
obj = SCM_PROCEDURE (obj);
goto again;
@@ -230,12 +193,6 @@ SCM_DEFINE (scm_procedure_documentation, "procedure-documentation", 1, 0, 0,
return SCM_BOOL_F;
default:
return SCM_BOOL_F;
-/*
- case scm_tcs_subrs:
-#ifdef CCLO
- case scm_tc7_cclo:
-#endif
-*/
}
}
#undef FUNC_NAME