commit eb5be949efeda606d06702034f6bccbebe55772b
parent 477ec83a948dc7fd495b6be0ef6b33e15be079fb
Author: Andres Navarro <canavarro82@gmail.com>
Date: Thu, 31 Mar 2011 16:05:02 -0300
Added bool_check flag to the continuations created by $if and $cond. These are not necessary for tail context bool checking in $and? & $or? but save one continuation in some common use cases.
Diffstat:
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/kgcontrol.c b/src/kgcontrol.c
@@ -38,7 +38,11 @@ void Sif(klisp_State *K, TValue *xparams, TValue ptree, TValue denv)
TValue new_cont =
kmake_continuation(K, kget_cc(K), KNIL, KNIL, select_clause,
3, denv, cons_c, alt_c);
-
+ /*
+ ** Mark as a bool checking cont, not necessary but avoids a continuation
+ ** in the last evaluation in the common use of ($if ($or?/$and? ...) ...)
+ */
+ kset_bool_check_cont(new_cont);
klispS_set_cc(K, new_cont);
ktail_eval(K, test, denv);
}
@@ -218,6 +222,12 @@ void do_cond(klisp_State *K, TValue *xparams, TValue obj)
kmake_continuation(K, kget_cc(K), KNIL, KNIL, do_cond, 4,
kcar(bodies), kcdr(tests), kcdr(bodies),
denv);
+ /*
+ ** Mark as a bool checking cont, not necessary but avoids a
+ ** continuation in the last evaluation in the common use of
+ ** ($cond ... (($or?/$and? ...) ...) ...)
+ */
+ kset_bool_check_cont(new_cont);
kset_cc(K, new_cont);
ktail_eval(K, kcar(tests), denv);
}
@@ -241,6 +251,9 @@ void Scond(klisp_State *K, TValue *xparams, TValue ptree, TValue denv)
TValue new_cont =
kmake_continuation(K, kget_cc(K), KNIL, KNIL, do_cond, 4,
KNIL, tests, bodies, denv);
+ /* there is no need to mark this continuation with bool check
+ because it is just a dummy, no evaluation happens in its
+ dynamic extent */
kset_cc(K, new_cont);
obj = KFALSE;
}