From fd49bf4ebfcc09f8d40bdfe01592e84dc7be2ebb Mon Sep 17 00:00:00 2001 From: Jinser Kafka Date: Wed, 5 Aug 2026 17:59:36 +0800 Subject: [PATCH] s7: thunk in recursion used stale opt1_lambda cache closure_is_* shortcut now also checks local_value == opt1_lambda, matching check_closure_sym, so a re-bound parameter no longer falls back to the first call's thunk. Fixes an infinite loop in ((lambda (recurse) (recurse)) (lambda () ...recursive...)). s7test passes. --- s7.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/s7.c b/s7.c index c2e500e..e3f1325 100644 --- a/s7.c +++ b/s7.c @@ -96890,10 +96890,18 @@ static bool closure_np_is_ok_1(s7_scheme *sc, s7_pointer code) so symbol_ctr==1 is valuable */ -#define closure_is_ok(Sc, Code, Type, Args) ((symbol_ctr(car(Code)) == 1) || (closure_is_ok_1(Sc, Code, Type, Args))) -#define closure_np_is_ok(Sc, Code) ((symbol_ctr(car(Code)) == 1) || (closure_np_is_ok_1(Sc, Code))) -#define closure_is_fine(Sc, Code, Type, Args) ((symbol_ctr(car(Code)) == 1) || (closure_is_fine_1(Sc, Code, Type, Args))) -#define closure_star_is_fine(Sc, Code, Type, Args) ((symbol_ctr(car(Code)) == 1) || (closure_star_is_fine_1(Sc, Code, Type, Args))) +#define closure_is_ok(Sc, Code, Type, Args) \ + (((symbol_ctr(car(Code)) == 1) && (local_value_unchecked(car(Code)) == opt1_lambda_unchecked(Code))) \ + || (closure_is_ok_1(Sc, Code, Type, Args))) +#define closure_np_is_ok(Sc, Code) \ + (((symbol_ctr(car(Code)) == 1) && (local_value_unchecked(car(Code)) == opt1_lambda_unchecked(Code))) \ + || (closure_np_is_ok_1(Sc, Code))) +#define closure_is_fine(Sc, Code, Type, Args) \ + (((symbol_ctr(car(Code)) == 1) && (local_value_unchecked(car(Code)) == opt1_lambda_unchecked(Code))) \ + || (closure_is_fine_1(Sc, Code, Type, Args))) +#define closure_star_is_fine(Sc, Code, Type, Args) \ + (((symbol_ctr(car(Code)) == 1) && (local_value_unchecked(car(Code)) == opt1_lambda_unchecked(Code))) \ + || (closure_star_is_fine_1(Sc, Code, Type, Args))) static /* inline */ bool closure_is_eq(s7_scheme *sc) { -- 2.55.0