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'.
This commit is contained in:
parent
b786a5bbf8
commit
e20d7001c3
16 changed files with 84 additions and 238 deletions
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1995-1999,2000,2001, 2002, 2003, 2004, 2006, 2008 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995-1999,2000,2001, 2002, 2003, 2004, 2006, 2008, 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
|
@ -657,30 +657,7 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate)
|
|||
scm_puts (scm_i_symbol_chars (SCM_SNAME (exp)), port);
|
||||
scm_putc ('>', port);
|
||||
break;
|
||||
#ifdef CCLO
|
||||
case scm_tc7_cclo:
|
||||
{
|
||||
SCM proc = SCM_CCLO_SUBR (exp);
|
||||
if (scm_is_eq (proc, scm_f_gsubr_apply))
|
||||
{
|
||||
/* Print gsubrs as primitives */
|
||||
SCM name = scm_procedure_name (exp);
|
||||
scm_puts ("#<primitive-procedure", port);
|
||||
if (scm_is_true (name))
|
||||
{
|
||||
scm_putc (' ', port);
|
||||
scm_puts (scm_i_symbol_chars (name), port);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
scm_puts ("#<compiled-closure ", port);
|
||||
scm_iprin1 (proc, port, pstate);
|
||||
}
|
||||
scm_putc ('>', port);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case scm_tc7_pws:
|
||||
scm_puts ("#<procedure-with-setter", port);
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue