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
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 19s
This commit is contained in:
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user