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:
parent
8b15ad971c
commit
6f0748108c
|
@ -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))])
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue
Block a user