From 664bec20404260f6a98469840130814ff3222df3 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 10 Aug 2017 17:55:56 -0600 Subject: [PATCH] repair a problem with `module->namespace` Fix a problem with compile-time bindings added to a namespace created by `module->namespace` for a module that does not have a source file. Possibly, there's a different fault that should be fixed that caused a binding to use the module's instantiation-time module path index instead of its compile-time module path index (which is what happens when a file is involved). This repair fixes the problem in a general way, though, and leaves further improvement to the reimplementation of the expander in Racket (which already does not suffer from the bug). Thanks to Alexis for providing the example. --- .../racket-test-core/tests/racket/module.rktl | 19 +++++++++++++++++++ racket/src/racket/src/compenv.c | 10 ++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/module.rktl b/pkgs/racket-test-core/tests/racket/module.rktl index 25d4b2f3f0..a84f8bba65 100644 --- a/pkgs/racket-test-core/tests/racket/module.rktl +++ b/pkgs/racket-test-core/tests/racket/module.rktl @@ -2048,6 +2048,25 @@ case of module-leve bindings; it doesn't cover local bindings. (test 1 dynamic-require '(submod 'uses-own-namespace-for-eval-from-submodule main) 'v) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Make sure a module that isn't in a file +;; correctly introduces and references compile-time +;; top-level definitions + +(parameterize ([current-namespace (make-base-namespace)]) + (eval '(module m racket + + (require syntax/parse/define) + + (define-simple-macro (f m:id) + (begin + (define-for-syntax x "prop value") + (define-syntax (m stx) x #'(void)))))) + (eval '(dynamic-require ''m #f)) + (let ([ns (module->namespace ''m)]) + (eval '(f m) ns) + (eval '(m) ns))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/compenv.c b/racket/src/racket/src/compenv.c index e79cd67780..53c6dc3303 100644 --- a/racket/src/racket/src/compenv.c +++ b/racket/src/racket/src/compenv.c @@ -1869,10 +1869,12 @@ static Scheme_Object *select_binding_name(Scheme_Object *sym, Scheme_Env *env, static int binding_matches_env(Scheme_Object *binding, Scheme_Env *env, Scheme_Object *phase) { return (SCHEME_VECTORP(binding) - && SAME_OBJ(SCHEME_VEC_ELS(binding)[0], - (env->module - ? env->module->self_modidx - : scheme_false)) + && (SAME_OBJ(SCHEME_VEC_ELS(binding)[0], + (env->module + ? env->module->self_modidx + : scheme_false)) + || SAME_OBJ(SCHEME_VEC_ELS(binding)[0], + env->link_midx)) && SAME_OBJ(SCHEME_VEC_ELS(binding)[2], phase)); }