summaryrefslogtreecommitdiff
path: root/libguile/debug.c
diff options
context:
space:
mode:
authorDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2004-06-06 07:46:18 +0000
committerDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2004-06-06 07:46:18 +0000
commit212e58ede8e7e7cc074eb90ba3eab03afdd2641c (patch)
treed58329084fdfb96ffc034a97777dcccafd0ccf7b /libguile/debug.c
parent9ccea3704316ac2bdb7e0450d162a3a7c3273d95 (diff)
downloadguile-212e58ede8e7e7cc074eb90ba3eab03afdd2641c.tar.gz
* list.[ch] (scm_i_finite_list_copy): New internal function to
copy lists that are known to be finite (though not necessarily proper). * debug.c (scm_procedure_source): Don't have scm_unmemocopy treat a closure's argument list like an expression of a body. * eval.c (unmemoize_expression, unmemoize_exprs, unmemoize_and, unmemoize_begin, unmemoize_case, unmemoize_cond, unmemoize_delay, unmemoize_do, unmemoize_if, unmemoize_lambda, unmemoize_let, unmemoize_letrec, unmemoize_letstar, unmemoize_or, unmemoize_set_x, unmemoize_apply, unmemoize_atcall_cc, unmemoize_at_call_with_values, unmemoize_future, sym_atslot_ref, unmemoize_atslot_ref, sym_atslot_set_x, unmemoize_atslot_set_x, unmemoize_builtin_macro): New static functions and symbols. (scm_unmemocopy): Rewritten in terms of the above. scm_unmemocopy now has a slightly different meaning: The memoized form that is receives as its argument is now interpreted as a sequence of expressions from a body. (unmemocar, scm_unmemocar): Since the whole functionality of unmemocar and scm_unmemocar is not needed any more, scm_unmemocar has its old content back and is deprecated, while unmemocar has been removed. (SCM_BIT7): Removed. (CEVAL): For unmemoizing a single expression, call unmemoize_expression instead of scm_unmemocopy, which now expects a sequence of body expressions. Eliminated unnecessary empty environment frame when executing let* forms. Eliminated unmemoization step from evaluator.
Diffstat (limited to 'libguile/debug.c')
-rw-r--r--libguile/debug.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/libguile/debug.c b/libguile/debug.c
index 01bf656eb..ac2c4fe43 100644
--- a/libguile/debug.c
+++ b/libguile/debug.c
@@ -329,15 +329,21 @@ SCM_DEFINE (scm_procedure_source, "procedure-source", 1, 0, 0,
switch (SCM_TYP7 (proc)) {
case scm_tcs_closures:
{
- SCM formals = SCM_CLOSURE_FORMALS (proc);
- SCM src = scm_source_property (SCM_CLOSURE_BODY (proc), scm_sym_copy);
+ const SCM formals = SCM_CLOSURE_FORMALS (proc);
+ const SCM body = SCM_CLOSURE_BODY (proc);
+ const SCM src = scm_source_property (body, scm_sym_copy);
+
if (!SCM_FALSEP (src))
- return scm_cons2 (scm_sym_lambda, formals, src);
- return scm_cons (scm_sym_lambda,
- scm_unmemocopy (SCM_CODE (proc),
- SCM_EXTEND_ENV (formals,
- SCM_EOL,
- SCM_ENV (proc))));
+ {
+ return scm_cons2 (scm_sym_lambda, formals, src);
+ }
+ else
+ {
+ const SCM env = SCM_EXTEND_ENV (formals, SCM_EOL, SCM_ENV (proc));
+ return scm_cons2 (scm_sym_lambda,
+ scm_i_finite_list_copy (formals),
+ scm_unmemocopy (body, env));
+ }
}
case scm_tcs_struct:
if (!SCM_I_OPERATORP (proc))