js-on-sx: Map/Set prototype methods throw TypeError on non-Map/Set this
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 19s

This commit is contained in:
2026-05-10 09:31:52 +00:00
parent 237ea5ce84
commit 85414df868
2 changed files with 97 additions and 57 deletions

View File

@@ -6394,66 +6394,86 @@
(else nil)))
entries))))
(define
js-map-check!
(fn
(m method)
(cond
((or (not (dict? m)) (not (contains? (keys m) "__map_keys__")))
(raise
(js-new-call TypeError
(js-args (str "Map.prototype." method " called on non-Map object")))))
(else nil))))
(define
js-map-do-set
(fn
(m k v)
(let
((ks (get m "__map_keys__")) (vs (get m "__map_vals__")))
(begin
(js-map-check! m "set")
(let
((idx (js-list-find-index ks k 0 (len ks))))
(cond
((>= idx 0) (begin (set-nth! vs idx v) m))
(else
(begin
(append! ks k)
(append! vs v)
(dict-set! m "size" (len ks))
m)))))))
((ks (get m "__map_keys__")) (vs (get m "__map_vals__")))
(let
((idx (js-list-find-index ks k 0 (len ks))))
(cond
((>= idx 0) (begin (set-nth! vs idx v) m))
(else
(begin
(append! ks k)
(append! vs v)
(dict-set! m "size" (len ks))
m))))))))
(define
js-map-do-get
(fn
(m k)
(let
((ks (get m "__map_keys__")) (vs (get m "__map_vals__")))
(begin
(js-map-check! m "get")
(let
((idx (js-list-find-index ks k 0 (len ks))))
(cond ((>= idx 0) (nth vs idx)) (else js-undefined))))))
((ks (get m "__map_keys__")) (vs (get m "__map_vals__")))
(let
((idx (js-list-find-index ks k 0 (len ks))))
(cond ((>= idx 0) (nth vs idx)) (else js-undefined)))))))
(define
js-map-do-has
(fn
(m k)
(let
((ks (get m "__map_keys__")))
(>= (js-list-find-index ks k 0 (len ks)) 0))))
(begin
(js-map-check! m "has")
(let
((ks (get m "__map_keys__")))
(>= (js-list-find-index ks k 0 (len ks)) 0)))))
(define
js-map-do-delete
(fn
(m k)
(let
((ks (get m "__map_keys__")) (vs (get m "__map_vals__")))
(begin
(js-map-check! m "delete")
(let
((idx (js-list-find-index ks k 0 (len ks))))
(cond
((< idx 0) false)
(else
(let
((new-ks (js-list-remove-at! ks idx))
(new-vs (js-list-remove-at! vs idx)))
(begin
(dict-set! m "__map_keys__" new-ks)
(dict-set! m "__map_vals__" new-vs)
(dict-set! m "size" (len new-ks))
true))))))))
((ks (get m "__map_keys__")) (vs (get m "__map_vals__")))
(let
((idx (js-list-find-index ks k 0 (len ks))))
(cond
((< idx 0) false)
(else
(let
((new-ks (js-list-remove-at! ks idx))
(new-vs (js-list-remove-at! vs idx)))
(begin
(dict-set! m "__map_keys__" new-ks)
(dict-set! m "__map_vals__" new-vs)
(dict-set! m "size" (len new-ks))
true)))))))))
(define
js-map-do-clear
(fn
(m)
(begin
(js-map-check! m "clear")
(dict-set! m "__map_keys__" (list))
(dict-set! m "__map_vals__" (list))
(dict-set! m "size" 0)
@@ -6562,53 +6582,71 @@
((items (js-iterable-to-list iter)))
(for-each (fn (x) (js-set-do-add s x)) items))))
(define
js-set-check!
(fn
(s method)
(cond
((or (not (dict? s)) (not (contains? (keys s) "__set_items__")))
(raise
(js-new-call TypeError
(js-args (str "Set.prototype." method " called on non-Set object")))))
(else nil))))
(define
js-set-do-add
(fn
(s v)
(let
((items (get s "__set_items__")))
(begin
(js-set-check! s "add")
(let
((idx (js-list-find-index items v 0 (len items))))
(cond
((>= idx 0) s)
(else
(begin
(append! items v)
(dict-set! s "size" (len items))
s)))))))
((items (get s "__set_items__")))
(let
((idx (js-list-find-index items v 0 (len items))))
(cond
((>= idx 0) s)
(else
(begin
(append! items v)
(dict-set! s "size" (len items))
s))))))))
(define
js-set-do-has
(fn
(s v)
(let
((items (get s "__set_items__")))
(>= (js-list-find-index items v 0 (len items)) 0))))
(begin
(js-set-check! s "has")
(let
((items (get s "__set_items__")))
(>= (js-list-find-index items v 0 (len items)) 0)))))
(define
js-set-do-delete
(fn
(s v)
(let
((items (get s "__set_items__")))
(begin
(js-set-check! s "delete")
(let
((idx (js-list-find-index items v 0 (len items))))
(cond
((< idx 0) false)
(else
(let
((new-items (js-list-remove-at! items idx)))
(begin
(dict-set! s "__set_items__" new-items)
(dict-set! s "size" (len new-items))
true))))))))
((items (get s "__set_items__")))
(let
((idx (js-list-find-index items v 0 (len items))))
(cond
((< idx 0) false)
(else
(let
((new-items (js-list-remove-at! items idx)))
(begin
(dict-set! s "__set_items__" new-items)
(dict-set! s "size" (len new-items))
true)))))))))
(define
js-set-do-clear
(fn
(s)
(begin
(js-set-check! s "clear")
(dict-set! s "__set_items__" (list))
(dict-set! s "size" 0)
js-undefined)))