diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 351622f00d..05cd6df987 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -7843,7 +7843,16 @@ do_local_expand(const char *name, int for_stx, int catch_lifts, int for_expr, in orig_l = l; observer = scheme_get_expand_observe(); - SCHEME_EXPAND_OBSERVE_ENTER_LOCAL(observer, l); + if (observer) { + if (for_expr) { + SCHEME_EXPAND_OBSERVE_ENTER_LOCAL_EXPR(observer, l); + } else { + SCHEME_EXPAND_OBSERVE_ENTER_LOCAL(observer, l); + } + if (for_stx) { + SCHEME_EXPAND_OBSERVE_PHASE_UP(observer); + } + } if (local_mark) { /* Since we have an expression from local context, @@ -7904,14 +7913,14 @@ do_local_expand(const char *name, int for_stx, int catch_lifts, int for_expr, in l = scheme_add_remove_mark(l, local_mark); } - SCHEME_EXPAND_OBSERVE_EXIT_LOCAL(observer, l); - if (for_expr) { Scheme_Object *a[2]; + SCHEME_EXPAND_OBSERVE_EXIT_LOCAL_EXPR(observer, l, exp_expr); a[0] = l; a[1] = exp_expr; return scheme_values(2, a); } else + SCHEME_EXPAND_OBSERVE_EXIT_LOCAL(observer, l); return l; } diff --git a/src/mzscheme/src/schexpobs.h b/src/mzscheme/src/schexpobs.h index d6dc3b90f4..9308200f90 100644 --- a/src/mzscheme/src/schexpobs.h +++ b/src/mzscheme/src/schexpobs.h @@ -106,6 +106,8 @@ extern Scheme_Object *scheme_get_expand_observe(); _SCHEME_EXPOBS(observer,123,NULL) #define SCHEME_EXPAND_OBSERVE_PRIM_LETSTAR_VALUES(observer) \ _SCHEME_EXPOBS(observer,124,NULL) +#define SCHEME_EXPAND_OBSERVE_PRIM_EXPRESSION(obs) \ + _SCHEME_EXPOBS(obs,138,scheme_false) #define SCHEME_EXPAND_OBSERVE_VARIABLE(observer,e1,e2) \ _SCHEME_EXPOBS(observer,125,scheme_make_pair(e1, e2)) @@ -137,4 +139,9 @@ extern Scheme_Object *scheme_get_expand_observe(); #define SCHEME_EXPAND_OBSERVE_LOCAL_POST(obs,stx) \ _SCHEME_EXPOBS(obs,133,stx) +#define SCHEME_EXPAND_OBSERVE_ENTER_LOCAL_EXPR(obs,stx) \ + _SCHEME_EXPOBS(obs,139,stx) +#define SCHEME_EXPAND_OBSERVE_EXIT_LOCAL_EXPR(obs,stx,opaque) \ + _SCHEME_EXPOBS(obs,140,scheme_make_pair(stx,opaque)) + #endif diff --git a/src/mzscheme/src/syntax.c b/src/mzscheme/src/syntax.c index 4de050d09c..9ae1191995 100644 --- a/src/mzscheme/src/syntax.c +++ b/src/mzscheme/src/syntax.c @@ -4463,6 +4463,7 @@ static Scheme_Object *expression_syntax(Scheme_Object *form, Scheme_Comp_Env *en static Scheme_Object *expression_expand(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Expand_Info *erec, int drec) { + SCHEME_EXPAND_OBSERVE_PRIM_EXPRESSION(erec[drec].observer); return single_expand(form, scheme_no_defines(env), erec, drec, 0, !(env->flags & SCHEME_TOPLEVEL_FRAME)); } @@ -4986,10 +4987,19 @@ void scheme_bind_syntaxes(const char *where, Scheme_Object *names, Scheme_Object Resolve_Info *ri; Optimize_Info *oi; int vc, nc, j, i; - Scheme_Compile_Info mrec; - - certs = rec[drec].certs; + Scheme_Compile_Expand_Info mrec; + certs = rec[drec].certs; + eenv = scheme_new_comp_env(exp_env, insp, 0); + + /* First expand for expansion-observation */ + { + scheme_init_expand_recs(rec, drec, &mrec, 1); + SCHEME_EXPAND_OBSERVE_PHASE_UP(mrec.observer); + a = scheme_expand_expr_lift_to_let(a, eenv, &mrec, 0); + } + + /* Then compile */ mrec.comp = 1; mrec.dont_mark_local_use = 0; mrec.resolve_module_ids = 1; @@ -4997,19 +5007,8 @@ void scheme_bind_syntaxes(const char *where, Scheme_Object *names, Scheme_Object mrec.certs = certs; mrec.observer = NULL; - eenv = scheme_new_comp_env(exp_env, insp, 0); - - { - mrec.comp = 0; - mrec.observer = rec[drec].observer; - SCHEME_EXPAND_OBSERVE_PHASE_UP(mrec.observer); - a = scheme_expand_expr_lift_to_let(a, eenv, &mrec, 0); - mrec.comp = 1; - mrec.observer = NULL; - } - a = scheme_compile_expr_lift_to_let(a, eenv, &mrec, 0); - + /* For internal defn, don't simplify as resolving, because the expression may have syntax objects with a lexical rename that is still being extended.