From 415f030212812ff1c2bcf6256c360cfb07469c55 Mon Sep 17 00:00:00 2001 From: Alexis King Date: Sun, 8 Sep 2019 14:53:32 -0500 Subject: [PATCH] Fix `syntax-local-value[/immediate]` rename transformer context fixes #2815 --- pkgs/racket-test-core/tests/racket/macro.rktl | 27 +++++++++++++++++++ racket/src/expander/expand/syntax-local.rkt | 4 +-- racket/src/racket/src/startup.inc | 13 ++++++--- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/macro.rktl b/pkgs/racket-test-core/tests/racket/macro.rktl index be81438be4..eee5b21410 100644 --- a/pkgs/racket-test-core/tests/racket/macro.rktl +++ b/pkgs/racket-test-core/tests/racket/macro.rktl @@ -2415,6 +2415,33 @@ (test 11 dynamic-require ''syntax-local-bind-syntaxes-free-id-context 'result) +;; ---------------------------------------- +;; Related to the above, make sure `syntax-local-value/immediate` resolves rename +;; transformers in a context with first-class definition context bindings + +(module syntax-local-value-free-id-context racket/base + (require (for-syntax racket/base)) + (provide result) + (begin-for-syntax + (struct indirect-rename-transformer (target-holder) + #:property prop:rename-transformer + (lambda (self) (syntax-local-value (indirect-rename-transformer-target-holder self))))) + (define-syntax (m stx) + (define intdef (syntax-local-make-definition-context)) + (syntax-local-bind-syntaxes (list (syntax-local-introduce #'holder)) #'#'add1 intdef) + (syntax-local-bind-syntaxes (list (syntax-local-introduce #'add1-indirect)) + (syntax-local-introduce #'(indirect-rename-transformer #'holder)) + intdef) + (define-values [value target] + (syntax-local-value/immediate + (internal-definition-context-introduce intdef #'add1-indirect 'add) + #f + (list intdef))) + #`'#,(indirect-rename-transformer? value)) + (define result (m))) + +(test #t dynamic-require ''syntax-local-value-free-id-context 'result) + ;; ---------------------------------------- (report-errs) diff --git a/racket/src/expander/expand/syntax-local.rkt b/racket/src/expander/expand/syntax-local.rkt index 208286ae3e..c767c2a59d 100644 --- a/racket/src/expander/expand/syntax-local.rkt +++ b/racket/src/expander/expand/syntax-local.rkt @@ -199,8 +199,8 @@ (cond [(rename-transformer? v) (if immediate? - (values v (rename-transformer-target v)) - (loop (rename-transformer-target v)))] + (values v (rename-transformer-target-in-context v ctx)) + (loop (rename-transformer-target-in-context v ctx)))] [immediate? (values v #f)] [else v])])]))) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index b8714bd75a..93453666c4 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -46152,8 +46152,13 @@ static const char *startup_source = "(if immediate?_0" "(values" " v_0" -"(1/rename-transformer-target v_0))" -"(loop_0(1/rename-transformer-target v_0))))" +"(rename-transformer-target-in-context" +" v_0" +" ctx_0))" +"(loop_0" +"(rename-transformer-target-in-context" +" v_0" +" ctx_0))))" "(if immediate?_0" "(let-values()(values v_0 #f))" "(let-values() v_0)))))))))))))))" @@ -59741,7 +59746,7 @@ static const char *startup_source = "(let-values(((in_1) in_0)((source_0)(read-config-source config_0)))" "(read-char-or-special in_1 special1.1 source_0))))" "(begin" -"(if(char=? c_0 '#\\space)" +"(if(eqv? c_0 '#\\space)" "(void)" "(let-values()" "(let-values(((in70_0) in_0)" @@ -59788,7 +59793,7 @@ static const char *startup_source = "(let-values(((in_1) in_0)((source_0)(read-config-source config_0)))" "(read-char-or-special in_1 special1.1 source_0))))" "(begin" -"(if(char-lang-nonsep? c_0)" +"(if(if(char? c_0)(char-lang-nonsep? c_0) #f)" "(void)" "(let-values()" "(let-values(((in81_0) in_0)"