diff options
author | Anonymous <65428781+00ff0000red@users.noreply.github.com> | 2020-11-21 08:29:18 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-21 17:29:18 +0100 |
commit | 27dd78601669a92d0200ad197adcf0919fdc9e46 (patch) | |
tree | d58ad7dadc8ea39d3ececb64c64a57026320c92b | |
parent | 692322cc2818a7ee573aecff98f2e0f08972b389 (diff) |
fix: "cloneValue" should return a Set when given a Set (#7972)
-rw-r--r-- | cli/rt/01_web_util.js | 10 | ||||
-rw-r--r-- | op_crates/fetch/11_streams.js | 8 |
2 files changed, 12 insertions, 6 deletions
diff --git a/cli/rt/01_web_util.js b/cli/rt/01_web_util.js index c843ac086..3076993ff 100644 --- a/cli/rt/01_web_util.js +++ b/cli/rt/01_web_util.js @@ -88,22 +88,26 @@ if (value instanceof Map) { const clonedMap = new Map(); objectCloneMemo.set(value, clonedMap); - value.forEach((v, k) => clonedMap.set(k, cloneValue(v))); + value.forEach((v, k) => { + clonedMap.set(cloneValue(k), cloneValue(v)); + }); return clonedMap; } if (value instanceof Set) { - const clonedSet = new Map(); + // assumes that cloneValue still takes only one argument + const clonedSet = new Set([...value].map(cloneValue)); objectCloneMemo.set(value, clonedSet); - value.forEach((v, k) => clonedSet.set(k, cloneValue(v))); return clonedSet; } + // default for objects const clonedObj = {}; objectCloneMemo.set(value, clonedObj); const sourceKeys = Object.getOwnPropertyNames(value); for (const key of sourceKeys) { clonedObj[key] = cloneValue(value[key]); } + Reflect.setPrototypeOf(clonedObj, Reflect.getPrototypeOf(value)); return clonedObj; } case "symbol": diff --git a/op_crates/fetch/11_streams.js b/op_crates/fetch/11_streams.js index 549bc9922..c3fa6cb6f 100644 --- a/op_crates/fetch/11_streams.js +++ b/op_crates/fetch/11_streams.js @@ -81,13 +81,14 @@ if (value instanceof Map) { const clonedMap = new Map(); objectCloneMemo.set(value, clonedMap); - value.forEach((v, k) => clonedMap.set(k, cloneValue(v))); + value.forEach((v, k) => { + clonedMap.set(cloneValue(k), cloneValue(v)); + }); return clonedMap; } if (value instanceof Set) { - const clonedSet = new Map(); + const clonedSet = new Set([...value].map(cloneValue)); objectCloneMemo.set(value, clonedSet); - value.forEach((v, k) => clonedSet.set(k, cloneValue(v))); return clonedSet; } @@ -97,6 +98,7 @@ for (const key of sourceKeys) { clonedObj[key] = cloneValue(value[key]); } + Reflect.setPrototypeOf(clonedObj, Reflect.getPrototypeOf(value)); return clonedObj; } case "symbol": |