From a130b66588bb48a7b6300828878cc0da57b1eaa7 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 13 Apr 2014 18:56:01 -0600 Subject: [PATCH] fix problem with `syntax-local-lift-require` Closes PR 13797 Merge to v6.0.1 (cherry picked from commit 414507699ba8f71a7b3630b833a4b4582a49dd57) --- .../racket-test/tests/racket/module.rktl | 19 +++++++++++++++++++ racket/src/racket/src/compenv.c | 7 +++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/module.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/module.rktl index c35256dde4..b5f6a94f19 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/module.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/module.rktl @@ -1087,6 +1087,25 @@ (err/rt-test (dynamic-require ''disallowed-definition-avoider #f) exn:fail:contract:variable?) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check that `syntax-local-lift-require` works interactively +;; with a namespace from `module->namespace`: +(let () + (define ns (make-base-namespace)) + (parameterize ([current-namespace ns]) + (eval '(module m racket/base + (require (for-syntax racket/base)) + (define-syntax (m stx) + (syntax-case stx () + [(_) + (syntax-local-introduce + (syntax-local-lift-require + 'racket/list + (datum->syntax stx 'empty)))])))) + (eval '(require 'm)) + (parameterize ([current-namespace (module->namespace ''m)]) + (eval '(m))))) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/racket/src/racket/src/compenv.c b/racket/src/racket/src/compenv.c index ac9493145b..5a7d838d5c 100644 --- a/racket/src/racket/src/compenv.c +++ b/racket/src/racket/src/compenv.c @@ -2337,6 +2337,7 @@ Scheme_Object *scheme_local_lift_require(Scheme_Object *form, Scheme_Object *ori { Scheme_Object *mark, *data, *pr; Scheme_Object *req_form; + int need_prepare = 0; data = NULL; @@ -2363,8 +2364,10 @@ Scheme_Object *scheme_local_lift_require(Scheme_Object *form, Scheme_Object *ori if (SCHEME_RPAIRP(data)) form = scheme_parse_lifted_require(form, phase, mark, SCHEME_CAR(data)); - else + else { form = scheme_toplevel_require_for_expand(form, phase, env, mark); + need_prepare = 1; + } pr = scheme_make_pair(form, SCHEME_VEC_ELS(COMPILE_DATA(env)->lifts)[6]); SCHEME_VEC_ELS(COMPILE_DATA(env)->lifts)[6] = pr; @@ -2379,7 +2382,7 @@ Scheme_Object *scheme_local_lift_require(Scheme_Object *form, Scheme_Object *ori SCHEME_EXPAND_OBSERVE_LIFT_REQUIRE(scheme_get_expand_observe(), req_form, orig_form, form); /* In a top-level context, may need to force compile-time evaluation: */ - if (!env->genv->module) + if (need_prepare) scheme_prepare_compile_env(env->genv); return form;