From d3f14cf53cf857b90184900a726e3ee0875dea80 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sun, 14 Jul 2024 14:13:23 -0400 Subject: Support nested lambda closures --- environment.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'environment.c') diff --git a/environment.c b/environment.c index 65130c37..1fe698d2 100644 --- a/environment.c +++ b/environment.c @@ -372,11 +372,16 @@ env_t *namespace_env(env_t *env, const char *namespace_name) binding_t *get_binding(env_t *env, const char *name) { binding_t *b = Table$str_get(*env->locals, name); - if (!b && env->fn_ctx && env->fn_ctx->closure_scope) { - b = Table$str_get(*env->fn_ctx->closure_scope, name); - if (b) { - Table$str_set(env->fn_ctx->closed_vars, name, b); - return new(binding_t, .type=b->type, .code=CORD_all("userdata->", name)); + if (!b) { + for (fn_ctx_t *fn_ctx = env->fn_ctx; fn_ctx; fn_ctx = fn_ctx->parent) { + if (!fn_ctx->closure_scope) continue; + b = Table$str_get(*fn_ctx->closure_scope, name); + if (b) { + Table$str_set(env->fn_ctx->closed_vars, name, b); + binding_t *b2 = new(binding_t, .type=b->type, .code=CORD_all("userdata->", name)); + Table$str_set(env->locals, name, b2); + return b2; + } } } return b; -- cgit v1.2.3