From d13e5898c8253825dd343b58d304063a10ef6d1f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 30 Jan 2020 17:46:30 -0700 Subject: [PATCH] add `enable-unsafe-variable-reference` original commit: 77a0ef249b6d419dcac7c8e1c28e710b30a7aa33 --- csug/system.stex | 11 +++++++++++ makefiles/Mf-install.in | 2 +- mats/misc.ms | 35 +++++++++++++++++++++++++++++++++++ s/cmacros.ss | 2 +- s/cpvalid.ss | 5 ++++- s/front.ss | 2 ++ s/primdata.ss | 1 + 7 files changed, 55 insertions(+), 3 deletions(-) diff --git a/csug/system.stex b/csug/system.stex index de4d5b9c2b..46f8cb74b0 100644 --- a/csug/system.stex +++ b/csug/system.stex @@ -2623,6 +2623,17 @@ unsafe (i.e., no check whether the target is a procedure), even when the value of \scheme{optimize-level} is less than \scheme{3}. The default is \scheme{#f}. +%---------------------------------------------------------------------------- +\entryheader +\formdef{enable-unsafe-variable-reference}{\categorythreadparameter}{enable-unsafe-variable-reference} +\listlibraries +\endentryheader + +This parameter controls whether references to \scheme{letrec}-bound +variables are compiled unsafe (i.e., no check whether the variable has +a value), even when the value of \scheme{optimize-level} is less than +\scheme{3}. The default is \scheme{#f}. + %---------------------------------------------------------------------------- \entryheader \formdef{generate-wpo-files}{\categorythreadparameter}{generate-wpo-files} diff --git a/makefiles/Mf-install.in b/makefiles/Mf-install.in index 3e876287c7..17489555e1 100644 --- a/makefiles/Mf-install.in +++ b/makefiles/Mf-install.in @@ -62,7 +62,7 @@ InstallLZ4Target= # no changes should be needed below this point # ############################################################################### -Version=csv9.5.3.15 +Version=csv9.5.3.16 Include=boot/$m PetiteBoot=boot/$m/petite.boot SchemeBoot=boot/$m/scheme.boot diff --git a/mats/misc.ms b/mats/misc.ms index 76f9bb73dc..7bc5ab8d94 100644 --- a/mats/misc.ms +++ b/mats/misc.ms @@ -5546,6 +5546,41 @@ '(lambda (x) (#3%$app x)))) ) +(mat enable-unsafe-variable-reference + (begin + (define (get-uncprep-form e) + (let ([r #f]) + (parameterize ([run-cp0 (lambda (cp0 e) + (set! r (#%$uncprep e)) + e)]) + (expand/optimize e)) + r)) + #t) + (equivalent-expansion? (get-uncprep-form '(lambda (x) (letrec ([y y]) (+ y x)))) + (if (= 3 (optimize-level)) + '(lambda (x) + (letrec ([y y]) + (#3%+ y x))) + '(lambda (x) + (let ([valid? #f]) + (letrec ([y (begin + (if valid? + (#2%void) + (#2%$source-violation #f #f #t "attempt to reference undefined variable ~s" 'y)) + y)]) + (set! valid? #t) + (#2%+ y x)))))) + (equivalent-expansion? (parameterize ([enable-unsafe-variable-reference #t]) + (get-uncprep-form '(lambda (x) (letrec ([y y]) (+ y x))))) + (if (= 3 (optimize-level)) + '(lambda (x) + (letrec ([y y]) + (#3%+ y x))) + '(lambda (x) + (letrec ([y y]) + (#2%+ y x))))) + ) + (mat phantom-bytevector (phantom-bytevector? (make-phantom-bytevector 0)) (not (phantom-bytevector? 10)) diff --git a/s/cmacros.ss b/s/cmacros.ss index ac21c185de..a3846d7a64 100644 --- a/s/cmacros.ss +++ b/s/cmacros.ss @@ -328,7 +328,7 @@ [(_ foo e1 e2) e1] ... [(_ bar e1 e2) e2]))))]))) -(define-constant scheme-version #x0905030F) +(define-constant scheme-version #x09050310) (define-syntax define-machine-types (lambda (x) diff --git a/s/cpvalid.ss b/s/cpvalid.ss index 35734dca0d..3b63f5cb54 100644 --- a/s/cpvalid.ss +++ b/s/cpvalid.ss @@ -568,4 +568,7 @@ (set! $cpvalid (lambda (x) - (if (= (optimize-level) 3) x (cpvalid x))))) + (if (or (= (optimize-level) 3) + (enable-unsafe-variable-reference)) + x + (cpvalid x))))) diff --git a/s/front.ss b/s/front.ss index d647b7a248..402973f8dc 100644 --- a/s/front.ss +++ b/s/front.ss @@ -108,6 +108,8 @@ (define enable-unsafe-application ($make-thread-parameter #f (lambda (x) (and x #t)))) +(define enable-unsafe-variable-reference ($make-thread-parameter #f (lambda (x) (and x #t)))) + (define-who current-generate-id ($make-thread-parameter (lambda (sym) diff --git a/s/primdata.ss b/s/primdata.ss index b280ee5cf1..bc41a5e55a 100644 --- a/s/primdata.ss +++ b/s/primdata.ss @@ -959,6 +959,7 @@ (enable-type-recovery [sig [() -> (boolean)] [(ptr) -> (void)]] [flags unrestricted]) (enable-error-source-expression [sig [() -> (boolean)] [(ptr) -> (void)]] [flags unrestricted]) (enable-unsafe-application [sig [() -> (boolean)] [(ptr) -> (void)]] [flags unrestricted]) + (enable-unsafe-variable-reference [sig [() -> (boolean)] [(ptr) -> (void)]] [flags unrestricted]) (eval-syntax-expanders-when [sig [() -> (list)] [(sub-list) -> (void)]] [flags]) (expand-omit-library-invocations [sig [() -> (boolean)] [(ptr) -> (void)]] [flags unrestricted]) (expand-output [sig [() -> (maybe-textual-output-port)] [(maybe-textual-output-port) -> (void)]] [flags])