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:
Matthew Flatt 2018-11-23 09:55:46 -07:00
parent d6802444fa
commit 600a6b4c29
3 changed files with 57 additions and 10 deletions

View File

@ -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))))))

View File

@ -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)

View File

@ -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)))))"