From 27dd78601669a92d0200ad197adcf0919fdc9e46 Mon Sep 17 00:00:00 2001 From: Anonymous <65428781+00ff0000red@users.noreply.github.com> Date: Sat, 21 Nov 2020 08:29:18 -0800 Subject: [PATCH] fix: "cloneValue" should return a Set when given a Set (#7972) --- cli/rt/01_web_util.js | 10 +++++++--- 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 c843ac086b..3076993ff3 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 549bc99224..c3fa6cb6f0 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":