From a6231d88e9e0f79f5399cfc5d5278f04f4b844b6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 19 Jan 2010 08:00:50 +0000 Subject: [PATCH] fix (#%variable-reference) in let-syntax RHS (PR 10696) svn: r17745 --- src/mzscheme/src/eval.c | 9 +++++---- src/mzscheme/src/module.c | 5 +++-- src/mzscheme/src/schpriv.h | 3 ++- src/mzscheme/src/syntax.c | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 71f314cc91..0c3fb115a4 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -9723,7 +9723,7 @@ static void *eval_k(void) v = scheme_eval_clone(v); rp = scheme_prefix_eval_clone(top->prefix); - save_runstack = scheme_push_prefix(env, top->prefix, NULL, NULL, 0, env->phase); + save_runstack = scheme_push_prefix(env, top->prefix, NULL, NULL, 0, env->phase, NULL); if (as_tail) { /* Cons up a closure to capture the prefix */ @@ -11031,7 +11031,8 @@ int scheme_prefix_depth(Resolve_Prefix *rp) Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp, Scheme_Object *src_modidx, Scheme_Object *now_modidx, - int src_phase, int now_phase) + int src_phase, int now_phase, + Scheme_Env *dummy_env) { Scheme_Object **rs_save, **rs, *v, **a; int i, j; @@ -11056,8 +11057,8 @@ Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp, for (i = 0; i < rp->num_toplevels; i++) { v = rp->toplevels[i]; - if (genv) - v = link_toplevel(rp->toplevels, i, genv, src_modidx, now_modidx); + if (genv || SCHEME_FALSEP(v)) + v = link_toplevel(rp->toplevels, i, genv ? genv : dummy_env, src_modidx, now_modidx); a[i] = v; } diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index 292cce7c68..119ec66cbb 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -4399,7 +4399,7 @@ void *scheme_module_run_finish(Scheme_Env *menv, Scheme_Env *env) save_runstack = scheme_push_prefix(menv, m->prefix, m->me->src_modidx, menv->link_midx, - 0, menv->phase); + 0, menv->phase, NULL); p = scheme_current_thread; save_phase_shift = p->current_phase_shift; @@ -4782,7 +4782,8 @@ static void eval_exptime(Scheme_Object *names, int count, save_runstack = scheme_push_prefix(genv, rp, (shift ? genv->module->me->src_modidx : NULL), (shift ? genv->link_midx : NULL), - 1, genv->phase); + 1, genv->phase, + NULL); if (is_simple_expr(expr)) { vals = _scheme_eval_linked_expr_multi_wp(expr, scheme_current_thread); diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 661b4f4709..7558bb6cba 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -2584,7 +2584,8 @@ void scheme_shadow(Scheme_Env *env, Scheme_Object *n, int stxtoo); int scheme_prefix_depth(Resolve_Prefix *rp); Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp, Scheme_Object *src_modix, Scheme_Object *now_modix, - int src_phase, int now_phase); + int src_phase, int now_phase, + Scheme_Env *dummy_env); void scheme_pop_prefix(Scheme_Object **rs); Scheme_Object *scheme_eval_clone(Scheme_Object *expr); diff --git a/src/mzscheme/src/syntax.c b/src/mzscheme/src/syntax.c index e401745dd1..53f4c9f491 100644 --- a/src/mzscheme/src/syntax.c +++ b/src/mzscheme/src/syntax.c @@ -700,7 +700,7 @@ define_execute_with_dynamic_state(Scheme_Object *vec, int delta, int defmacro, if (dm_env) { scheme_prepare_exp_env(dm_env); - save_runstack = scheme_push_prefix(dm_env->exp_env, rp, NULL, NULL, 1, 1); + save_runstack = scheme_push_prefix(dm_env->exp_env, rp, NULL, NULL, 1, 1, NULL); vals = scheme_eval_linked_expr_multi_with_dynamic_state(vals_expr, dyn_state); if (defmacro == 2) dm_env = NULL; @@ -5850,7 +5850,7 @@ static Scheme_Object *eval_letmacro_rhs(Scheme_Object *a, Scheme_Comp_Env *rhs_e return (Scheme_Object *)scheme_enlarge_runstack(depth, eval_letmacro_rhs_k); } - save_runstack = scheme_push_prefix(NULL, rp, NULL, NULL, phase, phase); + save_runstack = scheme_push_prefix(NULL, rp, NULL, NULL, phase, phase, rhs_env->genv); if (scheme_omittable_expr(a, 1, -1, 0, NULL)) { /* short cut */