From dc6a8398d1612460ae670932364849d00c9243db Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 13 Apr 2024 14:31:10 -0400 Subject: [PATCH] Revert "fix: ensure deep mutation ownership widening" (#11155) * Revert "fix: ensure deep mutation ownership widening (#11094)" This reverts commit 8578857332c27005866661a22734b1bf2d83b69f. * don't delete the changeset, it's already merged --- .../src/internal/client/dev/ownership.js | 85 +++---------------- .../_config.js | 35 -------- .../main.svelte | 25 ------ .../sub.svelte | 11 --- 4 files changed, 13 insertions(+), 143 deletions(-) delete mode 100644 packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/_config.js delete mode 100644 packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/main.svelte delete mode 100644 packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/sub.svelte diff --git a/packages/svelte/src/internal/client/dev/ownership.js b/packages/svelte/src/internal/client/dev/ownership.js index fde316c840..358b56df22 100644 --- a/packages/svelte/src/internal/client/dev/ownership.js +++ b/packages/svelte/src/internal/client/dev/ownership.js @@ -2,7 +2,6 @@ import { STATE_SYMBOL } from '../constants.js'; import { untrack } from '../runtime.js'; -import { get_descriptors } from '../utils.js'; /** @type {Record>} */ const boundaries = {}; @@ -92,107 +91,49 @@ export function mark_module_end() { } } -let add_owner_visited = new Set(); - /** * * @param {any} object * @param {any} owner */ export function add_owner(object, owner) { - // Needed because ownership addition can invoke getters on a proxy, - // calling add_owner anew, so just keeping the set as part of - // add_owner_to_object would not be enough. - const prev = add_owner_visited; - try { - add_owner_visited = new Set(add_owner_visited); - untrack(() => { - add_owner_to_object(object, owner, add_owner_visited); - }); - } finally { - add_owner_visited = prev; - } + untrack(() => { + add_owner_to_object(object, owner); + }); } /** * @param {any} object * @param {Function} owner - * @param {Set} visited */ -function add_owner_to_object(object, owner, visited) { - if (visited.has(object)) return; - visited.add(object); - +function add_owner_to_object(object, owner) { if (object?.[STATE_SYMBOL]?.o && !object[STATE_SYMBOL].o.has(owner)) { object[STATE_SYMBOL].o.add(owner); + + for (const key in object) { + add_owner_to_object(object[key], owner); + } } - // Not inside previous if-block; there could be normal objects in-between - traverse_for_owners(object, (nested) => add_owner_to_object(nested, owner, visited)); } -let strip_owner_visited = new Set(); - /** * @param {any} object */ export function strip_owner(object) { - // Needed because ownership stripping can invoke getters on a proxy, - // calling strip_owner anew, so just keeping the set as part of - // strip_owner_from_object would not be enough. - const prev = strip_owner_visited; - try { - untrack(() => { - strip_owner_from_object(object, strip_owner_visited); - }); - } finally { - strip_owner_visited = prev; - } + untrack(() => { + strip_owner_from_object(object); + }); } /** * @param {any} object - * @param {Set} visited */ -function strip_owner_from_object(object, visited) { - if (visited.has(object)) return; - visited.add(object); - +function strip_owner_from_object(object) { if (object?.[STATE_SYMBOL]?.o) { object[STATE_SYMBOL].o = null; - } - // Not inside previous if-block; there could be normal objects in-between - traverse_for_owners(object, (nested) => strip_owner_from_object(nested, visited)); -} -/** - * @param {any} object - * @param {(obj: any) => void} cb - */ -function traverse_for_owners(object, cb) { - if (typeof object === 'object' && object !== null && !(object instanceof EventTarget)) { for (const key in object) { - cb(object[key]); - } - // deal with state on classes - const proto = Object.getPrototypeOf(object); - if ( - proto !== Object.prototype && - proto !== Array.prototype && - proto !== Map.prototype && - proto !== Set.prototype && - proto !== Date.prototype - ) { - const descriptors = get_descriptors(proto); - for (let key in descriptors) { - const get = descriptors[key].get; - if (get) { - try { - cb(object[key]); - } catch (e) { - // continue - } - } - } + strip_owner(object[key]); } } } diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/_config.js b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/_config.js deleted file mode 100644 index e2b31a2e64..0000000000 --- a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/_config.js +++ /dev/null @@ -1,35 +0,0 @@ -import { tick } from 'svelte'; -import { test } from '../../test'; - -/** @type {typeof console.warn} */ -let warn; - -/** @type {any[]} */ -let warnings = []; - -export default test({ - compileOptions: { - dev: true - }, - - before_test: () => { - warn = console.warn; - - console.warn = (...args) => { - warnings.push(...args); - }; - }, - - after_test: () => { - console.warn = warn; - warnings = []; - }, - - async test({ assert, target }) { - const btn = target.querySelector('button'); - - await btn?.click(); - await tick(); - assert.deepEqual(warnings.length, 0); - } -}); diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/main.svelte b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/main.svelte deleted file mode 100644 index ffe9735e21..0000000000 --- a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/main.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/sub.svelte b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/sub.svelte deleted file mode 100644 index 0f60a45845..0000000000 --- a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-inherited-owner-6/sub.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - -