fix: do not trust spoofable Symbol.toStringTag in type dispatch

Every mode (src/index.js, src/full.js, src/lite.js, src/json.js)
picked its clone strategy from Object.prototype.toString.call(x),
which reads a user-settable Symbol.toStringTag. A plain object
declaring a recognized tag (eg "Map") was routed into that type's
clone branch and crashed on methods it doesn't have; one with an
unrecognized tag fell through every branch and was returned by
reference instead of cloned.

Also check the object's real constructor, which Symbol.toStringTag
cannot affect, so a plain object (or one with no prototype) is still
deep-cloned as a plain object no matter what tag it claims.

Fixes #54
This commit is contained in:
dualfroz committed 2026-09-06 01:13:20 +02:00
1 parent 2460d7b6ef
commit e65d94875e
10 files changed
+51 -4

No files matched your search

+1
View File
@@ -13,6 +13,7 @@ suites.RegExps(klona);
suites.Objects(klona);
suites.Arrays(klona);
suites.ToStringTag(klona);
suites.Functions(klona);
suites.Pollutions(klona);