expander: fix compiled-expression-recompile
Linklets other than the body linklet may need conversion from machine-independent form to machine-specific form.
This commit is contained in:
parent
d6802444fa
commit
600a6b4c29
|
@ -2855,6 +2855,7 @@ case of module-leve bindings; it doesn't cover local bindings.
|
|||
(define x 1)
|
||||
(provide x))
|
||||
(require 'sub)
|
||||
(define y #'y)
|
||||
(define (f g)
|
||||
(map (lambda (y) x) g))))))
|
||||
|
||||
|
|
|
@ -101,15 +101,21 @@
|
|||
;; optimization while recompiling the per-phase body units, and then
|
||||
;; regenerate the data linklets because optimization can add new
|
||||
;; linklet import.s
|
||||
(define h (linklet-bundle->hash b))
|
||||
(define orig-h (linklet-bundle->hash b))
|
||||
|
||||
;; Force compilation of linklets that are not the module body:
|
||||
(define h (for/hasheq ([(k v) (in-hash orig-h)])
|
||||
(cond
|
||||
[(and (not (exact-integer? k))
|
||||
(correlated-linklet? v))
|
||||
(values k (force-compile-linklet v))]
|
||||
[else (values k v)])))
|
||||
|
||||
(define (eval-linklet* l)
|
||||
(eval-linklet (force-compile-linklet l)))
|
||||
(define data-instance
|
||||
(instantiate-linklet (eval-linklet* (hash-ref h 'data))
|
||||
(instantiate-linklet (eval-linklet (hash-ref h 'data))
|
||||
(list deserialize-instance)))
|
||||
(define declaration-instance
|
||||
(instantiate-linklet (eval-linklet* (hash-ref h 'decl))
|
||||
(instantiate-linklet (eval-linklet (hash-ref h 'decl))
|
||||
(list deserialize-instance
|
||||
data-instance)))
|
||||
(define (decl key)
|
||||
|
|
|
@ -40125,14 +40125,54 @@ static const char *startup_source =
|
|||
"(recompile-bundle)"
|
||||
"(lambda(b_0 get-submodule-recompiled_0 ns_0)"
|
||||
"(begin"
|
||||
"(let-values(((h_0)(linklet-bundle->hash b_0)))"
|
||||
"(let-values(((eval-linklet*_0)"
|
||||
"(lambda(l_0)(begin 'eval-linklet*(1/eval-linklet(force-compile-linklet l_0))))))"
|
||||
"(let-values(((orig-h_0)(linklet-bundle->hash b_0)))"
|
||||
"(let-values(((h_0)"
|
||||
"(let-values(((ht_0) orig-h_0))"
|
||||
"(begin"
|
||||
"(if(variable-reference-from-unsafe?(#%variable-reference))"
|
||||
"(void)"
|
||||
"(let-values()(check-in-hash ht_0)))"
|
||||
"((letrec-values(((for-loop_0)"
|
||||
"(lambda(table_0 i_0)"
|
||||
"(begin"
|
||||
" 'for-loop"
|
||||
"(if i_0"
|
||||
"(let-values(((k_0 v_0)(hash-iterate-key+value ht_0 i_0)))"
|
||||
"(let-values(((table_1)"
|
||||
"(let-values(((table_1) table_0))"
|
||||
"(let-values(((table_2)"
|
||||
"(let-values()"
|
||||
"(let-values(((key_0 val_0)"
|
||||
"(let-values()"
|
||||
"(if(if(not"
|
||||
"(exact-integer?"
|
||||
" k_0))"
|
||||
"(correlated-linklet?"
|
||||
" v_0)"
|
||||
" #f)"
|
||||
"(let-values()"
|
||||
"(values"
|
||||
" k_0"
|
||||
"(force-compile-linklet"
|
||||
" v_0)))"
|
||||
"(let-values()"
|
||||
"(values"
|
||||
" k_0"
|
||||
" v_0))))))"
|
||||
"(hash-set table_1 key_0 val_0)))))"
|
||||
"(values table_2)))))"
|
||||
"(if(not #f)"
|
||||
"(for-loop_0 table_1(hash-iterate-next ht_0 i_0))"
|
||||
" table_1)))"
|
||||
" table_0)))))"
|
||||
" for-loop_0)"
|
||||
" '#hasheq()"
|
||||
"(hash-iterate-first ht_0))))))"
|
||||
"(let-values(((data-instance_0)"
|
||||
"(1/instantiate-linklet(eval-linklet*_0(hash-ref h_0 'data))(list deserialize-instance))))"
|
||||
"(1/instantiate-linklet(1/eval-linklet(hash-ref h_0 'data))(list deserialize-instance))))"
|
||||
"(let-values(((declaration-instance_0)"
|
||||
"(1/instantiate-linklet"
|
||||
"(eval-linklet*_0(hash-ref h_0 'decl))"
|
||||
"(1/eval-linklet(hash-ref h_0 'decl))"
|
||||
"(list deserialize-instance data-instance_0))))"
|
||||
"(let-values(((decl_0)"
|
||||
"(lambda(key_0)(begin 'decl(1/instance-variable-value declaration-instance_0 key_0)))))"
|
||||
|
|
Loading…
Reference in New Issue
Block a user