From bf16bb89c341740b6ddff25ae1affc28404ad729 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 7 Feb 2019 11:43:34 -0500 Subject: [PATCH] only do dirty check for writable values - fixes #2052 --- src/compile/render-dom/index.ts | 8 +++- .../expected.js | 40 +++++++++++++++++++ .../input.html | 7 ++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 test/js/samples/reactive-values-non-writable-dependencies/expected.js create mode 100644 test/js/samples/reactive-values-non-writable-dependencies/input.html diff --git a/src/compile/render-dom/index.ts b/src/compile/render-dom/index.ts index 310800c197..e4a623f8c7 100644 --- a/src/compile/render-dom/index.ts +++ b/src/compile/render-dom/index.ts @@ -314,7 +314,13 @@ export default function dom( if (has_definition) { const reactive_declarations = component.reactive_declarations.map(d => { - const condition = Array.from(d.dependencies).map(n => `$$dirty.${n}`).join(' || '); + const condition = Array.from(d.dependencies) + .filter(n => { + const variable = component.var_lookup.get(n); + return variable && variable.writable; + }) + .map(n => `$$dirty.${n}`).join(' || '); + const snippet = d.node.body.type === 'BlockStatement' ? `[✂${d.node.body.start}-${d.node.end}✂]` : deindent` diff --git a/test/js/samples/reactive-values-non-writable-dependencies/expected.js b/test/js/samples/reactive-values-non-writable-dependencies/expected.js new file mode 100644 index 0000000000..fc2ca37d31 --- /dev/null +++ b/test/js/samples/reactive-values-non-writable-dependencies/expected.js @@ -0,0 +1,40 @@ +/* generated by Svelte vX.Y.Z */ +import { SvelteComponent as SvelteComponent_1, init, noop, safe_not_equal } from "svelte/internal"; + +function create_fragment(ctx) { + return { + c: noop, + m: noop, + p: noop, + i: noop, + o: noop, + d: noop + }; +} + +let a = 1; + +let b = 2; + +function instance($$self, $$props, $$invalidate) { + + + let max; + + $$self.$$.update = ($$dirty = { max: 1, Math: 1, a: 1, b: 1 }) => { + if ($$dirty.max || $$dirty.a || $$dirty.b) { + max = Math.max(a, b); $$invalidate('max', max); + } + }; + + return {}; +} + +class SvelteComponent extends SvelteComponent_1 { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal); + } +} + +export default SvelteComponent; \ No newline at end of file diff --git a/test/js/samples/reactive-values-non-writable-dependencies/input.html b/test/js/samples/reactive-values-non-writable-dependencies/input.html new file mode 100644 index 0000000000..8e3397e40d --- /dev/null +++ b/test/js/samples/reactive-values-non-writable-dependencies/input.html @@ -0,0 +1,7 @@ + \ No newline at end of file