eval/inject improved; testing won t fail on non existing javascript engine

This commit is contained in:
2026-05-28 00:07:21 +02:00
parent 8fe47a7ed4
commit e89ab88670
6 changed files with 185 additions and 66 deletions
+47
View File
@@ -21,6 +21,48 @@
(unless (regexp-match? #rx"__cmp" effectful-chain)
(error 'jsmaker-regression "effectful chained comparison should use temporaries, got: ~a" effectful-chain))
(define-syntax with-id->el
(syntax-rules ()
((_ id el expr)
(js (let ((el (send document getElementById (eval id))))
expr)))))
(define (runtime-eval-macro-function id html)
(with-id->el id el
(begin
(set! (js-dot el innerHTML) (eval html))
#t)))
(define runtime-eval-macro-program
(runtime-eval-macro-function 't "BEE"))
(unless (and (regexp-match? #rx"getElementById\\(\"t\"\\)" runtime-eval-macro-program)
(regexp-match? #rx"innerHTML = \"BEE\"" runtime-eval-macro-program)
(regexp-match? #rx"return true;" runtime-eval-macro-program))
(error 'jsmaker-regression
"runtime eval inside a user macro should keep use-site lexical bindings, got: ~a"
runtime-eval-macro-program))
(define-syntax with-id->el/inject
(syntax-rules ()
((_ id el expr)
(js (let ((el (send document getElementById (inject id))))
expr)))))
(define (runtime-inject-macro-function id html)
(with-id->el/inject id el
(begin
(set! (js-dot el innerHTML) (inject html))
#t)))
(define runtime-inject-macro-program
(runtime-inject-macro-function 't "BEE"))
(unless (and (regexp-match? #rx"getElementById\\(\"t\"\\)" runtime-inject-macro-program)
(regexp-match? #rx"innerHTML = \"BEE\"" runtime-inject-macro-program)
(regexp-match? #rx"return true;" runtime-inject-macro-program))
(error 'jsmaker-regression
"runtime inject inside a user macro should keep use-site lexical bindings, got: ~a"
runtime-inject-macro-program))
(define simple-let-star
(js (let* ((x 10)
(y (+ x x)))
@@ -75,6 +117,11 @@
(js-expression-test 'runtime-eval-lexical-let
(js/expression (let ([a (eval (* x y))]) (* a a)))
"40000"))
(let ([x 10]
[y 20])
(js-expression-test 'runtime-inject-lexical-let
(js/expression (let ([a (inject (* x y))]) (* a a)))
"40000"))
(js-expression-test 'substring (js/expression (substring "abcdef" 1 4)) "\"bcd\"")
(js-expression-test 'equal-list (js/expression (equal? (list 1 2) (list 1 2))) "true")
(js-expression-test 'cond-test-only (js/expression (cond [0] [else 2])) "0")