HS: string template \${x} (+2 tests)
`\$window.foo` / `\${window.foo}` couldn't resolve. Two fixes:
(a) compiler.sx: in a dot-chain base position, known globals (window,
document, navigator, location, history, screen, localStorage,
sessionStorage, console) emit `(host-global "name")` instead of a
bare unbound symbol.
(b) generator: `eval-hs-locals` now also sets each binding on
`window.<name>` via `host-set!`, so tests that translated
`window.X = Y` as a local pair still see `window.X` at eval time.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -918,7 +918,8 @@
|
|||||||
((= head (quote event)) (quote event))
|
((= head (quote event)) (quote event))
|
||||||
((= head dot-sym)
|
((= head dot-sym)
|
||||||
(let
|
(let
|
||||||
((target (hs-to-sx (nth ast 1))) (prop (nth ast 2)))
|
((target (let ((t (hs-to-sx (nth ast 1)))) (if (and (symbol? t) (or (= (str t) "window") (= (str t) "document") (= (str t) "navigator") (= (str t) "location") (= (str t) "history") (= (str t) "screen") (= (str t) "localStorage") (= (str t) "sessionStorage") (= (str t) "console"))) (list (quote host-global) (str t)) t)))
|
||||||
|
(prop (nth ast 2)))
|
||||||
(cond
|
(cond
|
||||||
((= prop "first") (list (quote hs-first) target))
|
((= prop "first") (list (quote hs-first) target))
|
||||||
((= prop "last") (list (quote hs-last) target))
|
((= prop "last") (list (quote hs-last) target))
|
||||||
|
|||||||
@@ -918,7 +918,8 @@
|
|||||||
((= head (quote event)) (quote event))
|
((= head (quote event)) (quote event))
|
||||||
((= head dot-sym)
|
((= head dot-sym)
|
||||||
(let
|
(let
|
||||||
((target (hs-to-sx (nth ast 1))) (prop (nth ast 2)))
|
((target (let ((t (hs-to-sx (nth ast 1)))) (if (and (symbol? t) (or (= (str t) "window") (= (str t) "document") (= (str t) "navigator") (= (str t) "location") (= (str t) "history") (= (str t) "screen") (= (str t) "localStorage") (= (str t) "sessionStorage") (= (str t) "console"))) (list (quote host-global) (str t)) t)))
|
||||||
|
(prop (nth ast 2)))
|
||||||
(cond
|
(cond
|
||||||
((= prop "first") (list (quote hs-first) target))
|
((= prop "first") (list (quote hs-first) target))
|
||||||
((= prop "last") (list (quote hs-last) target))
|
((= prop "last") (list (quote hs-last) target))
|
||||||
|
|||||||
@@ -53,6 +53,9 @@
|
|||||||
;; in a fresh CEK env. Avoids `apply` (whose JIT path can loop on some forms).
|
;; in a fresh CEK env. Avoids `apply` (whose JIT path can loop on some forms).
|
||||||
(define eval-hs-locals
|
(define eval-hs-locals
|
||||||
(fn (src bindings)
|
(fn (src bindings)
|
||||||
|
;; Also expose bindings on the `window` global so tests that reference
|
||||||
|
;; window.X (common in upstream tests) can resolve them.
|
||||||
|
(for-each (fn (b) (host-set! (host-global "window") (str (first b)) (nth b 1))) bindings)
|
||||||
(let ((sx (hs-to-sx (hs-compile src))))
|
(let ((sx (hs-to-sx (hs-compile src))))
|
||||||
;; Build (let ((name1 (quote val1)) ...) <wrap-body>)
|
;; Build (let ((name1 (quote val1)) ...) <wrap-body>)
|
||||||
(let ((let-binds (map (fn (b) (list (first b) (list (quote quote) (nth b 1)))) bindings)))
|
(let ((let-binds (map (fn (b) (list (first b) (list (quote quote) (nth b 1)))) bindings)))
|
||||||
|
|||||||
@@ -2339,6 +2339,9 @@ output.append(';; Locals are injected as a `let` wrapping the compiled body, the
|
|||||||
output.append(';; in a fresh CEK env. Avoids `apply` (whose JIT path can loop on some forms).')
|
output.append(';; in a fresh CEK env. Avoids `apply` (whose JIT path can loop on some forms).')
|
||||||
output.append('(define eval-hs-locals')
|
output.append('(define eval-hs-locals')
|
||||||
output.append(' (fn (src bindings)')
|
output.append(' (fn (src bindings)')
|
||||||
|
output.append(' ;; Also expose bindings on the `window` global so tests that reference')
|
||||||
|
output.append(' ;; window.X (common in upstream tests) can resolve them.')
|
||||||
|
output.append(' (for-each (fn (b) (host-set! (host-global "window") (str (first b)) (nth b 1))) bindings)')
|
||||||
output.append(' (let ((sx (hs-to-sx (hs-compile src))))')
|
output.append(' (let ((sx (hs-to-sx (hs-compile src))))')
|
||||||
output.append(' ;; Build (let ((name1 (quote val1)) ...) <wrap-body>)')
|
output.append(' ;; Build (let ((name1 (quote val1)) ...) <wrap-body>)')
|
||||||
output.append(' (let ((let-binds (map (fn (b) (list (first b) (list (quote quote) (nth b 1)))) bindings)))')
|
output.append(' (let ((let-binds (map (fn (b) (list (first b) (list (quote quote) (nth b 1)))) bindings)))')
|
||||||
|
|||||||
Reference in New Issue
Block a user