cs: fix module-variable initialization order

Similar to a255def019, but for side effects potentially
exposed by definition RHS expressions, instead of
expressions not in a definition. Improve that commit and
this one by only forcing variable assignments at non-simple
expressions.
This commit is contained in:
Matthew Flatt 2018-11-29 16:42:19 -07:00
parent 8b15ad971c
commit 6f0748108c
2 changed files with 23 additions and 13 deletions

View File

@ -80,7 +80,8 @@
environment-variables-ref
current-environment-variables
find-system-path
build-path)
build-path
format)
(only (thread)
current-process-milliseconds)
(regexp)
@ -643,8 +644,8 @@
" reference to a variable that " why ";\n"
" possibly, bytecode file needs re-compile because dependencies changed")
"name" (unquoted-printing-string (symbol->string sym))
"exporting instance" (unquoted-printing-string (instance-name inst))
"importing instance" (unquoted-printing-string (instance-name target-inst))))
"exporting instance" (unquoted-printing-string (format "~a" (instance-name inst)))
"importing instance" (unquoted-printing-string (format "~a" (instance-name target-inst)))))
(define (identify-module var)
(let ([i (car (variable-inst-box var))])

View File

@ -211,14 +211,19 @@
for-cify? for-jitify?
unsafe-mode?))
(match form
[`(define-values ,ids ,_)
[`(define-values ,ids ,rhs)
(define simple-rhs? (simple? rhs prim-knowns knowns imports mutated))
(append
(let ([accum-exprs (if simple-rhs?
accum-exprs
(append (make-set-variables)
accum-exprs))])
(if (or for-jitify? for-cify?)
(reverse accum-exprs)
(make-expr-defns accum-exprs))
(make-expr-defns accum-exprs)))
(cons
schemified
(let id-loop ([ids ids] [accum-exprs null] [accum-ids accum-ids])
(let id-loop ([ids ids] [accum-exprs null] [accum-ids (if simple-rhs? accum-ids null)])
(cond
[(wrap-null? ids) (loop (wrap-cdr l) mut-l accum-exprs accum-ids)]
[(or (or for-jitify? for-cify?)
@ -235,13 +240,17 @@
[else
(id-loop (wrap-cdr ids) accum-exprs (cons (unwrap (wrap-car ids)) accum-ids))]))))]
[`,_
(cond
[(simple? form prim-knowns knowns imports mutated)
(loop (wrap-cdr l) mut-l (cons schemified accum-exprs) accum-ids)]
[else
;; In case `schemified` triggers an error, sync exported variables
(define set-vars (make-set-variables))
(cond
[(null? set-vars)
(loop (wrap-cdr l) mut-l (cons schemified accum-exprs) null)]
[else
(loop (wrap-cdr l) mut-l (cons schemified (append (reverse set-vars) accum-exprs)) null)])])])))
(loop (wrap-cdr l) mut-l (cons schemified (append (reverse set-vars) accum-exprs)) null)])])])])))
;; Return both schemified and known-binding information, where
;; the later is used for cross-linklet optimization
(values schemified knowns mutated))