From 600a6b4c29ed550179871d27b2102f4643bc46ea Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 23 Nov 2018 09:55:46 -0700 Subject: [PATCH] expander: fix `compiled-expression-recompile` Linklets other than the body linklet may need conversion from machine-independent form to machine-specific form. --- .../racket-test-core/tests/racket/module.rktl | 1 + racket/src/expander/compile/recompile.rkt | 16 ++++-- racket/src/racket/src/startup.inc | 50 +++++++++++++++++-- 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/module.rktl b/pkgs/racket-test-core/tests/racket/module.rktl index 080de3512d..07231614b9 100644 --- a/pkgs/racket-test-core/tests/racket/module.rktl +++ b/pkgs/racket-test-core/tests/racket/module.rktl @@ -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)))))) diff --git a/racket/src/expander/compile/recompile.rkt b/racket/src/expander/compile/recompile.rkt index 08e05f7015..1bbeeb2a17 100644 --- a/racket/src/expander/compile/recompile.rkt +++ b/racket/src/expander/compile/recompile.rkt @@ -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) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index 7106460727..82f5a49331 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -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)))))"