From ef9e9e3f7eb672988d1c3e55a1d041af6e4897c7 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 17 Nov 2018 16:44:08 -0700 Subject: [PATCH] cs: check initialization of variables on instance linking --- .../racket-test-core/tests/racket/module.rktl | 8 ++++ racket/src/cs/linklet.sls | 37 ++++++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/module.rktl b/pkgs/racket-test-core/tests/racket/module.rktl index af438f2d76..ab755f62fe 100644 --- a/pkgs/racket-test-core/tests/racket/module.rktl +++ b/pkgs/racket-test-core/tests/racket/module.rktl @@ -2801,6 +2801,14 @@ case of module-leve bindings; it doesn't cover local bindings. (regexp-match? #rx"boom" (exn-message x))))) (test #t procedure? (eval 'f (module->namespace ''fails-after-f-and-before-g))) +(module uses-fails-after-f-and-before-g racket/base + (require 'fails-after-f-and-before-g) + g) + +(err/rt-test (dynamic-require ''uses-fails-after-f-and-before-g #f) + (lambda (x) (and (exn:fail? x) + (regexp-match? #rx"uninitialized" (exn-message x))))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/cs/linklet.sls b/racket/src/cs/linklet.sls index 62f1350b3b..008bb298d1 100644 --- a/racket/src/cs/linklet.sls +++ b/racket/src/cs/linklet.sls @@ -565,7 +565,7 @@ (eval-from-bytevector (linklet-code linklet) (linklet-format linklet))) (make-variable-reference target-instance #f) (append (apply append - (map extract-variables + (map (make-extract-variables target-instance) import-instances (linklet-importss linklet) (linklet-importss-abi linklet))) @@ -626,19 +626,28 @@ ;; Find variables or values needed from an instance for a linklet's ;; imports - (define (extract-variables inst syms imports-abi) - (let ([ht (instance-hash inst)]) - (map (lambda (sym import-abi) - (let ([var (or (hash-ref ht sym #f) - (raise-arguments-error 'instantiate-linklet - "variable not found in imported instance" - "instance" inst - "name" sym))]) - (if import-abi - (variable-val var) - var))) - syms - imports-abi))) + (define (make-extract-variables target-inst) + (lambda (inst syms imports-abi) + (let ([ht (instance-hash inst)]) + (map (lambda (sym import-abi) + (let ([var (or (hash-ref ht sym #f) + (raise-linking-failure "is not exported" target-inst inst sym))]) + (when (eq? (variable-val var) unsafe-undefined) + (raise-linking-failure "is uninitialized" target-inst inst sym)) + (if import-abi + (variable-val var) + var))) + syms + imports-abi)))) + + (define (raise-linking-failure why target-inst inst sym) + (raise-arguments-error 'instantiate-linklet + (string-append "mismatch;\n" + " 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)))) (define (identify-module var) (let ([i (car (variable-inst-box var))])