From a16e0c105dd916e9113da634b20498c98146eba1 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 25 Jul 2024 17:16:59 -0400 Subject: [PATCH] improve code generation --- .../server/visitors/shared/utils.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js index 22d54d2735..b3d83e1c6d 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js @@ -245,17 +245,16 @@ export function serialize_set_binding(node, context, fallback) { node.left.type === 'ObjectPattern' || node.left.type === 'RestElement' ) { - // Turn assignment into an IIFE, so that `$.set` calls etc don't produce invalid code - const rhs = b.id('$$value'); + const value = /** @type {Expression} */ (context.visit(node.right)); + + const should_cache = value.type !== 'Identifier'; + const rhs = should_cache ? b.id('$$value') : value; /** @type {Expression[]} */ const assignments = []; - - const paths = extract_paths(node.left); - let should_transform = false; - for (const path of paths) { + for (const path of extract_paths(node.left)) { const assignment = b.assignment('=', path.node, path.expression?.(rhs)); let changed = true; @@ -274,10 +273,11 @@ export function serialize_set_binding(node, context, fallback) { return fallback(); } - return b.call( - b.arrow([rhs], b.sequence([...assignments, rhs])), - /** @type {Expression} */ (context.visit(node.right)) - ); + if (should_cache) { + return b.call(b.arrow([rhs], b.sequence([...assignments, rhs])), value); + } else { + return b.call(b.thunk(b.sequence([...assignments, rhs]))); + } } if (node.left.type !== 'Identifier' && node.left.type !== 'MemberExpression') {