add GUI support for compile-enforce-module-constants to DrRacket

closes PR 13781
This commit is contained in:
Robby Findler 2013-05-26 22:36:00 -05:00
parent 5b09ea16fb
commit 404a314887
5 changed files with 63 additions and 19 deletions

View File

@ -33,7 +33,8 @@
collection-paths collection-paths
compilation-on? compilation-on?
full-trace? full-trace?
annotations) annotations
enforce-module-constants)
#:prefab) #:prefab)
(define orig-namespace (current-namespace)) (define orig-namespace (current-namespace))
@ -69,7 +70,7 @@
(current-library-collection-paths cpaths)) (current-library-collection-paths cpaths))
(compile-context-preservation-enabled (prefab-module-settings-full-trace? settings)) (compile-context-preservation-enabled (prefab-module-settings-full-trace? settings))
(compile-enforce-module-constants (prefab-module-settings-enforce-module-constants settings))
(when (prefab-module-settings-compilation-on? settings) (when (prefab-module-settings-compilation-on? settings)
(define open-pkgs (define open-pkgs
(for/fold ([s (set)]) ([path (in-list currently-open-files)]) (for/fold ([s (set)]) ([path (in-list currently-open-files)])

View File

@ -114,18 +114,21 @@
;; command-line-args : (vectorof string) ;; command-line-args : (vectorof string)
;; auto-text : string ;; auto-text : string
(define-struct (module-language-settings drracket:language:simple-settings) (define-struct (module-language-settings drracket:language:simple-settings)
(collection-paths command-line-args auto-text compilation-on? full-trace? submodules-to-run)) (collection-paths command-line-args auto-text compilation-on? full-trace? submodules-to-run
enforce-module-constants))
(define (module-language-settings->prefab-module-settings settings) (define (module-language-settings->prefab-module-settings settings)
(prefab-module-settings (module-language-settings-command-line-args settings) (prefab-module-settings (module-language-settings-command-line-args settings)
(module-language-settings-collection-paths settings) (module-language-settings-collection-paths settings)
(module-language-settings-compilation-on? settings) (module-language-settings-compilation-on? settings)
(module-language-settings-full-trace? settings) (module-language-settings-full-trace? settings)
(drracket:language:simple-settings-annotations settings))) (drracket:language:simple-settings-annotations settings)
(module-language-settings-enforce-module-constants settings)))
(define default-compilation-on? #t) (define default-compilation-on? #t)
(define default-full-trace? #t) (define default-full-trace? #t)
(define default-submodules-to-run (list '(main) '(test))) (define default-submodules-to-run (list '(main) '(test)))
(define default-enforce-module-constants #t)
(define (get-default-auto-text) (preferences:get 'drracket:module-language:auto-text)) (define (get-default-auto-text) (preferences:get 'drracket:module-language:auto-text))
;; module-mixin : (implements drracket:language:language<%>) ;; module-mixin : (implements drracket:language:language<%>)
@ -247,7 +250,8 @@
(get-default-auto-text) (get-default-auto-text)
default-compilation-on? default-compilation-on?
default-full-trace? default-full-trace?
default-submodules-to-run))) default-submodules-to-run
default-enforce-module-constants)))
;; default-settings? : -> boolean ;; default-settings? : -> boolean
(define/override (default-settings? settings) (define/override (default-settings? settings)
@ -267,7 +271,9 @@
(equal? (module-language-settings-full-trace? settings) (equal? (module-language-settings-full-trace? settings)
default-full-trace?) default-full-trace?)
(equal? (module-language-settings-submodules-to-run settings) (equal? (module-language-settings-submodules-to-run settings)
default-submodules-to-run))) default-submodules-to-run)
(equal? (module-language-settings-enforce-module-constants settings)
default-enforce-module-constants)))
(define/override (marshall-settings settings) (define/override (marshall-settings settings)
(let ([super-marshalled (super marshall-settings settings)]) (let ([super-marshalled (super marshall-settings settings)])
@ -277,7 +283,8 @@
(module-language-settings-auto-text settings) (module-language-settings-auto-text settings)
(module-language-settings-compilation-on? settings) (module-language-settings-compilation-on? settings)
(module-language-settings-full-trace? settings) (module-language-settings-full-trace? settings)
(module-language-settings-submodules-to-run settings)))) (module-language-settings-submodules-to-run settings)
(module-language-settings-enforce-module-constants settings))))
(define/override (unmarshall-settings marshalled) (define/override (unmarshall-settings marshalled)
(and (list? marshalled) (and (list? marshalled)
@ -297,7 +304,10 @@
(list-ref marshalled 5))] (list-ref marshalled 5))]
[submodules-to-run (if (<= marshalled-len 6) [submodules-to-run (if (<= marshalled-len 6)
default-submodules-to-run default-submodules-to-run
(list-ref marshalled 6))]) (list-ref marshalled 6))]
[enforce-module-constants (if (<= marshalled-len 7)
default-enforce-module-constants
(list-ref marshalled 7))])
(and (list? collection-paths) (and (list? collection-paths)
(andmap (λ (x) (or (string? x) (symbol? x))) (andmap (λ (x) (or (string? x) (symbol? x)))
collection-paths) collection-paths)
@ -306,6 +316,7 @@
(string? auto-text) (string? auto-text)
(boolean? compilation-on?) (boolean? compilation-on?)
((listof (listof symbol?)) submodules-to-run) ((listof (listof symbol?)) submodules-to-run)
(boolean? enforce-module-constants)
(let ([super (super unmarshall-settings (let ([super (super unmarshall-settings
(let ([p (car marshalled)]) (let ([p (car marshalled)])
;; Convert 'write to 'print: ;; Convert 'write to 'print:
@ -331,7 +342,8 @@
compilation-on?) compilation-on?)
full-trace? full-trace?
submodules-to-run))))))))))) submodules-to-run
enforce-module-constants)))))))))))
(define/override (on-execute settings run-in-user-thread) (define/override (on-execute settings run-in-user-thread)
(super on-execute settings run-in-user-thread) (super on-execute settings run-in-user-thread)
@ -612,6 +624,7 @@
[stretchable-height #f] [stretchable-height #f]
[stretchable-width #f])) [stretchable-width #f]))
(define compilation-on-check-box #f) (define compilation-on-check-box #f)
(define enforce-module-constants-checkbox #f)
(define compilation-on? #t) (define compilation-on? #t)
(define save-stacktrace-on-check-box #f) (define save-stacktrace-on-check-box #f)
(define run-submodules-choice #f) (define run-submodules-choice #f)
@ -652,6 +665,10 @@
(set! save-stacktrace-on-check-box (new check-box% (set! save-stacktrace-on-check-box (new check-box%
[label (string-constant preserve-stacktrace-information)] [label (string-constant preserve-stacktrace-information)]
[parent dynamic-panel])) [parent dynamic-panel]))
(set! enforce-module-constants-checkbox
(new check-box%
[label (string-constant enforce-module-constants-checkbox-label)]
[parent dynamic-panel]))
(set! run-submodules-choice (set! run-submodules-choice
(new (class name-message% (new (class name-message%
(define/override (fill-popup menu reset) (define/override (fill-popup menu reset)
@ -841,7 +858,7 @@
(update-buttons) (update-buttons)
(install-auto-text (get-default-auto-text)) (install-auto-text (get-default-auto-text))
(update-compilation-checkbox left-debugging-radio-box right-debugging-radio-box) (update-compilation-checkbox left-debugging-radio-box right-debugging-radio-box)
(case-lambda (case-lambda
[() [()
(let ([simple-settings (simple-case-lambda)]) (let ([simple-settings (simple-case-lambda)])
@ -855,7 +872,8 @@
[(0 1) compilation-on?] [(0 1) compilation-on?]
[(#f) #f]) [(#f) #f])
(send save-stacktrace-on-check-box get-value) (send save-stacktrace-on-check-box get-value)
submodules-to-run))))] submodules-to-run
(send enforce-module-constants-checkbox get-value)))))]
[(settings) [(settings)
(simple-case-lambda settings) (simple-case-lambda settings)
(install-collection-paths (module-language-settings-collection-paths settings)) (install-collection-paths (module-language-settings-collection-paths settings))
@ -866,6 +884,7 @@
(update-compilation-checkbox left-debugging-radio-box right-debugging-radio-box) (update-compilation-checkbox left-debugging-radio-box right-debugging-radio-box)
(send save-stacktrace-on-check-box set-value (module-language-settings-full-trace? settings)) (send save-stacktrace-on-check-box set-value (module-language-settings-full-trace? settings))
(set! submodules-to-run (module-language-settings-submodules-to-run settings)) (set! submodules-to-run (module-language-settings-submodules-to-run settings))
(send enforce-module-constants-checkbox set-value (module-language-settings-enforce-module-constants settings))
(update-buttons)])) (update-buttons)]))
(define (add-another-possible-submodule parent) (define (add-another-possible-submodule parent)

View File

@ -14,17 +14,17 @@ new languages can be added through DrRacket plug-ins.
@section[#:tag "module"]{Language Declared in Source} @section[#:tag "module"]{Language Declared in Source}
The @as-index{@drlang{Use the language declared in the source} mode} The @as-index{@drlang{The Racket Language} mode}
in DrRacket is a kind of meta-language, where the program itself in DrRacket is a kind of meta-language, where the program itself
specifies its language, usually through a @hash-lang[] line. specifies its language, usually through a @hash-lang[] line.
More generally, when using the declared-in-source mode, the More generally, when using this mode, the
@tech{definitions window} must contain a module in some form. Besides @tech{definitions window} must contain a module in some form. Besides
@hash-lang[], a Racket module can be written as @racket[(module @hash-lang[], a Racket module can be written as @racket[(module
...)]. In any case, aside from comments, the @tech{definitions window} ...)]; aside from comments, the @tech{definitions window}
must contain exactly one module. must contain exactly one module.
In the details pane of the module language, some of the configuration In the details pane of the language dialog, some of the configuration
options correspond to using various libraries and thus can be used options correspond to using various libraries and thus can be used
without DrRacket. Here's how, for the ones that are straightforward without DrRacket. Here's how, for the ones that are straightforward
(the ones not mentioned here require more sophisticated configuration (the ones not mentioned here require more sophisticated configuration
@ -45,7 +45,7 @@ of various libraries).
The @italic{Syntactic test suite coverage} option means to use @racket[test-coverage-enabled] The @italic{Syntactic test suite coverage} option means to use @racket[test-coverage-enabled]
in conjunction with @racket[current-eval]. in conjunction with @racket[current-eval].
The other two checkboxes save compiled @tt{.zo} files and adjust the JIT compiler. The other three checkboxes save compiled @tt{.zo} files and adjust the compiler.
The @italic{populate compiled/ directories} option corresponds to The @italic{populate compiled/ directories} option corresponds to
@racketblock[(current-load/use-compiled @racketblock[(current-load/use-compiled
@ -62,6 +62,10 @@ of various libraries).
The @italic{Preserve stacktrace} option corresponds to The @italic{Preserve stacktrace} option corresponds to
@racketblock[(compile-context-preservation-enabled #t)] @racketblock[(compile-context-preservation-enabled #t)]
The @italic{Enforce constant definitions (enables some inlining)} option
corresponds to calling @racket[compile-enforce-module-constants];
checking it passes @racket[#t] and leaving it unchecked passes @racket[#f].
} }
@item{@bold{Output Syntax}: The output syntax options correspond to settings in the @racketmodname[racket/pretty] library @item{@bold{Output Syntax}: The output syntax options correspond to settings in the @racketmodname[racket/pretty] library
and the @racketmodname[mzlib/pconvert] library.} and the @racketmodname[mzlib/pconvert] library.}

View File

@ -1160,6 +1160,7 @@ please adhere to these guidelines:
(enforce-primitives-check-box-label "Disallow redefinition of initial bindings") (enforce-primitives-check-box-label "Disallow redefinition of initial bindings")
(automatically-compile "Populate \"compiled\" directories (for faster loading)") (automatically-compile "Populate \"compiled\" directories (for faster loading)")
(preserve-stacktrace-information "Preserve stacktrace (disable some optimizations)") (preserve-stacktrace-information "Preserve stacktrace (disable some optimizations)")
(enforce-module-constants-checkbox-label "Enforce constant definitions (enables some inlining)")
(expression-level-stacktrace "Expression-level stacktrace") (expression-level-stacktrace "Expression-level stacktrace")
(function-level-stacktrace "Function-level stacktrace") (function-level-stacktrace "Function-level stacktrace")
(submodules-to-run "Submodules to Run") (submodules-to-run "Submodules to Run")

View File

@ -52,6 +52,19 @@ the settings above should match r5rs
[defs-prefix "#lang racket\n"]) [defs-prefix "#lang racket\n"])
(check-top-of-repl) (check-top-of-repl)
(test-setting
(lambda () (fw:test:set-check-box! "Enforce constant definitions (enables some inlining)" #f))
"enforce-module-constants -- #f"
"#lang racket/base\n(define x 1)\n"
#:interactions "(set! x 2)\n"
"> (set! x 2)")
(test-setting
(lambda () (fw:test:set-check-box! "Enforce constant definitions (enables some inlining)" #t))
"enforce-module-constants -- #t"
"#lang racket/base\n(define x 1)\n"
#:interactions "(set! x 2)\n"
#rx"cannot modify a constant")
(prepare-for-test-expression) (prepare-for-test-expression)
@ -1101,7 +1114,8 @@ the settings above should match r5rs
;; `result'. `set-setting' is expected to click around ;; `result'. `set-setting' is expected to click around
;; in the language dialog. ;; in the language dialog.
;; `setting-name' is used in the error message when the test fails. ;; `setting-name' is used in the error message when the test fails.
(define (test-setting set-setting setting-name expression result) (define (test-setting set-setting setting-name expression result
#:interactions [interactions-expr #f])
(set-language #f) (set-language #f)
(set-setting) (set-setting)
(let ([f (test:get-active-top-level-window)]) (let ([f (test:get-active-top-level-window)])
@ -1110,10 +1124,15 @@ the settings above should match r5rs
(let* ([drs (test:get-active-top-level-window)] (let* ([drs (test:get-active-top-level-window)]
[interactions (send drs get-interactions-text)]) [interactions (send drs get-interactions-text)])
(clear-definitions drs) (clear-definitions drs)
(type-in-definitions drs expression) (insert-in-definitions drs expression)
(do-execute drs) (do-execute drs)
(when interactions
(insert-in-interactions drs interactions-expr)
(wait-for-computation drs))
(let* ([got (fetch-output/should-be-tested drs)]) (let* ([got (fetch-output/should-be-tested drs)])
(unless (string=? result got) (unless (if (regexp? result)
(regexp-match? result got)
(string=? result got))
(eprintf "FAILED: ~s ~s ~s test\n expected: ~s\n got: ~s\n" (eprintf "FAILED: ~s ~s ~s test\n expected: ~s\n got: ~s\n"
(language) setting-name expression result got))))) (language) setting-name expression result got)))))