diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index 0f3f70cdce..688191fd20 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -184,7 +184,9 @@ export function build_component(node, component_name, context) { ); }); - return should_wrap_in_derived ? b.call('$.get', memoizer.add(value, metadata)) : value; + return should_wrap_in_derived + ? b.call('$.get', memoizer.add(value, metadata, true)) + : value; } ); diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js index 8bde8832db..7e71244dd5 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js @@ -28,15 +28,19 @@ export class Memoizer { /** * @param {Expression} expression * @param {ExpressionMetadata} metadata + * @param {boolean} memoize_if_state */ - add(expression, metadata) { + add(expression, metadata, memoize_if_state = false) { for (const binding of metadata.dependencies) { if (binding.blocker) { this.#blockers.add(binding.blocker); } } - if (!metadata.has_call && !metadata.has_await) { + const should_memoize = + metadata.has_call || metadata.has_await || (memoize_if_state && metadata.has_state); + + if (!should_memoize) { // no memoization required return expression; }