js-on-sx: for-in walks proto chain with shadowing, stops at native prototypes
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 41s

This commit is contained in:
2026-05-09 17:01:31 +00:00
parent 3d821d1290
commit 8ae7187c55
3 changed files with 39 additions and 1 deletions

View File

@@ -3844,6 +3844,42 @@
(k)
(or (= k "__js_order__") (= k "__proto__"))))
(define
js-for-in-keys
(fn
(o)
(let
((result (list)))
(begin (js-for-in-walk o result) result))))
(define
js-for-in-walk
(fn
(o acc)
(cond
((not (dict? o)) nil)
((= o (get Object "prototype")) nil)
((= o (get Array "prototype")) nil)
((= o (get Number "prototype")) nil)
((= o (get String "prototype")) nil)
((= o (get Boolean "prototype")) nil)
((= o (get Date "prototype")) nil)
((= o (get RegExp "prototype")) nil)
((= o (get Map "prototype")) nil)
((= o (get Set "prototype")) nil)
((= o (get js-function-global "prototype")) nil)
(else
(let
((own (js-object-keys o)))
(begin
(for-each
(fn (k) (if (contains? acc k) nil (append! acc k)))
own)
(cond
((contains? (keys o) "__proto__")
(js-for-in-walk (get o "__proto__") acc))
(else nil))))))))
(define
js-object-keys
(fn