summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnonymous <65428781+00ff0000red@users.noreply.github.com>2020-11-21 08:29:18 -0800
committerGitHub <noreply@github.com>2020-11-21 17:29:18 +0100
commit27dd78601669a92d0200ad197adcf0919fdc9e46 (patch)
treed58ad7dadc8ea39d3ececb64c64a57026320c92b
parent692322cc2818a7ee573aecff98f2e0f08972b389 (diff)
fix: "cloneValue" should return a Set when given a Set (#7972)
-rw-r--r--cli/rt/01_web_util.js10
-rw-r--r--op_crates/fetch/11_streams.js8
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":