0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-08 07:16:56 -05:00

fix: "cloneValue" should return a Set when given a Set (#7972)

This commit is contained in:
Anonymous 2020-11-21 08:29:18 -08:00 committed by GitHub
parent 692322cc28
commit 27dd786016
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 6 deletions

View file

@ -88,22 +88,26 @@
if (value instanceof Map) { if (value instanceof Map) {
const clonedMap = new Map(); const clonedMap = new Map();
objectCloneMemo.set(value, clonedMap); 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; return clonedMap;
} }
if (value instanceof Set) { 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); objectCloneMemo.set(value, clonedSet);
value.forEach((v, k) => clonedSet.set(k, cloneValue(v)));
return clonedSet; return clonedSet;
} }
// default for objects
const clonedObj = {}; const clonedObj = {};
objectCloneMemo.set(value, clonedObj); objectCloneMemo.set(value, clonedObj);
const sourceKeys = Object.getOwnPropertyNames(value); const sourceKeys = Object.getOwnPropertyNames(value);
for (const key of sourceKeys) { for (const key of sourceKeys) {
clonedObj[key] = cloneValue(value[key]); clonedObj[key] = cloneValue(value[key]);
} }
Reflect.setPrototypeOf(clonedObj, Reflect.getPrototypeOf(value));
return clonedObj; return clonedObj;
} }
case "symbol": case "symbol":

View file

@ -81,13 +81,14 @@
if (value instanceof Map) { if (value instanceof Map) {
const clonedMap = new Map(); const clonedMap = new Map();
objectCloneMemo.set(value, clonedMap); 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; return clonedMap;
} }
if (value instanceof Set) { if (value instanceof Set) {
const clonedSet = new Map(); const clonedSet = new Set([...value].map(cloneValue));
objectCloneMemo.set(value, clonedSet); objectCloneMemo.set(value, clonedSet);
value.forEach((v, k) => clonedSet.set(k, cloneValue(v)));
return clonedSet; return clonedSet;
} }
@ -97,6 +98,7 @@
for (const key of sourceKeys) { for (const key of sourceKeys) {
clonedObj[key] = cloneValue(value[key]); clonedObj[key] = cloneValue(value[key]);
} }
Reflect.setPrototypeOf(clonedObj, Reflect.getPrototypeOf(value));
return clonedObj; return clonedObj;
} }
case "symbol": case "symbol":