diff --git a/src/compiler/compile/render_dom/Block.ts b/src/compiler/compile/render_dom/Block.ts index b69955abae..a074eacc66 100644 --- a/src/compiler/compile/render_dom/Block.ts +++ b/src/compiler/compile/render_dom/Block.ts @@ -1,7 +1,7 @@ import Renderer from './Renderer'; import Wrapper from './wrappers/shared/Wrapper'; import { b, x } from 'code-red'; -import { Node, Identifier } from 'estree'; +import { Node, Identifier, ArrayPattern } from 'estree'; import { is_head } from './wrappers/shared/is_head'; export interface BlockOptions { @@ -300,7 +300,13 @@ export default class Block { properties.update = noop; } else { const ctx = this.maintain_context ? x`#new_ctx` : x`#ctx`; - properties.update = x`function #update(${ctx}, #changed) { + + let changed: Identifier | ArrayPattern = { type: 'Identifier', name: '#changed' }; + if (!this.renderer.context_overflow && !this.parent) { + changed = { type: 'ArrayPattern', elements: [changed] } + } + + properties.update = x`function #update(${ctx}, ${changed}) { ${this.maintain_context && b`#ctx = ${ctx};`} ${this.chunks.update} }`; diff --git a/src/compiler/compile/render_dom/Renderer.ts b/src/compiler/compile/render_dom/Renderer.ts index 672eb3217d..44b9b1a8cb 100644 --- a/src/compiler/compile/render_dom/Renderer.ts +++ b/src/compiler/compile/render_dom/Renderer.ts @@ -3,7 +3,7 @@ import { CompileOptions, Var } from '../../interfaces'; import Component from '../Component'; import FragmentWrapper from './wrappers/Fragment'; import { x } from 'code-red'; -import { Node, Identifier, MemberExpression, Literal } from 'estree'; +import { Node, Identifier, MemberExpression, Literal, Expression, BinaryExpression } from 'estree'; import flatten_reference from '../utils/flatten_reference'; interface ContextMember { @@ -21,6 +21,7 @@ export default class Renderer { context: ContextMember[] = []; context_lookup: Map = new Map(); + context_overflow: boolean; blocks: Array = []; readonly: Set = new Set(); meta_bindings: Array = []; // initial values for e.g. window.innerWidth, if there's a meta tag @@ -80,6 +81,8 @@ export default class Renderer { null ); + this.context_overflow = this.context.length > 31; + // TODO messy this.blocks.forEach(block => { if (block instanceof Block) { @@ -189,50 +192,67 @@ export default class Renderer { .reduce((lhs, rhs) => x`${lhs}, ${rhs}}`); } - get_bitmask(names) { - const { context_lookup } = this; + changed(names, is_reactive_declaration = false): Expression { + const renderer = this; - // names.forEach(name => { - // if (!context_lookup.has(name)) { - // console.log({ names }); - // throw new Error(`wut ${name}`); - // } - // }); + let changed = (is_reactive_declaration + ? x`$$self.$$.dirty` + : x`#changed`) as Identifier | MemberExpression; - return { - type: 'Literal', + const get_bitmask = () => names.reduce((bits, name) => { + const member = renderer.context_lookup.get(name); - // we need to use a getter so that bitmasks can be determined - // lazily, once context has fully shaken out. TODO would be nice - // to do everything in a different order so that this isn't necessary - get value() { - return names.reduce((bits, name) => { - const member = context_lookup.get(name); + if (!member) return bits; - if (!member) return bits; + if (member.index.value === -1) { + throw new Error(`unset index`); + } - if (member.index.value === -1) { - throw new Error(`unset index`); - } + const value = member.index.value as number; + const i = (value / 31) | 0; + const j = 1 << (value % 31); - // if (!member) { - // console.log({ names }); - // throw new Error(`wut ${name}`); - // } + bits[i] |= j; - const bit = 1 << (member.index.value as number); - return bits | bit; - }, 0); - } - }; - } + return bits; + }, Array((this.context.length / 31) | 0).fill(0)); - changed(names, is_reactive_declaration = false) { - const bitmask = this.get_bitmask(names); + let operator; + let left; + let right; - return is_reactive_declaration - ? x`$$self.$$.dirty & ${bitmask}` - : x`#changed & ${bitmask}`; + return { + get type() { + // we make the type a getter, even though it's always + // a BinaryExpression, because it gives us an opportunity + // to lazily create the node + + const bitmask = get_bitmask(); + + if (renderer.context_overflow) { + const expression = bitmask + .map((bits, i) => ({ bits, i })) + .filter(({ bits }) => bits) + .map(({ bits, i }) => x`${changed}[${i}] & ${bits}`) + .reduce((lhs, rhs) => x`${lhs} || ${rhs}`); + + ({ operator, left, right } = expression); + } else { + ({ operator, left, right } = x`${changed} & ${bitmask[0] || 0}` as BinaryExpression); // TODO the `|| 0` case should never apply + } + + return 'BinaryExpression'; + }, + get operator() { + return operator; + }, + get left() { + return left; + }, + get right() { + return right; + } + } as Expression; } reference(node: string | Identifier | MemberExpression) { diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index f2b203a60b..c157077ef4 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -427,6 +427,14 @@ export default function dom( ${props.filter(v => v.export_name && !v.module).map(v => p`${v.export_name}: ${renderer.context_lookup.get(v.name).index}`)} }` as ObjectExpression; + let dirty; + if (renderer.context_overflow) { + dirty = x`[]`; + for (let i = 0; i < renderer.context.length; i += 31) { + dirty.elements.push(x`-1`); + } + } + if (options.customElement) { const declaration = b` class ${name} extends @SvelteElement { @@ -435,7 +443,7 @@ export default function dom( ${css.code && b`this.shadowRoot.innerHTML = \`\`;`} - @init(this, { target: this.shadowRoot }, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}); + @init(this, { target: this.shadowRoot }, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}, ${dirty}); ${dev_props_check} @@ -487,7 +495,7 @@ export default function dom( constructor(options) { super(${options.dev && `options`}); ${should_add_css && b`if (!@_document.getElementById("${component.stylesheet.id}-style")) ${add_css}();`} - @init(this, options, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}); + @init(this, options, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}, ${dirty}); ${options.dev && b`@dispatch_dev("SvelteRegisterComponent", { component: this, tagName: "${name.name}", options, id: create_fragment.name });`} ${dev_props_check} diff --git a/src/compiler/compile/render_dom/wrappers/Slot.ts b/src/compiler/compile/render_dom/wrappers/Slot.ts index a477c6c006..d3583f3a6c 100644 --- a/src/compiler/compile/render_dom/wrappers/Slot.ts +++ b/src/compiler/compile/render_dom/wrappers/Slot.ts @@ -119,13 +119,12 @@ export default class SlotWrapper extends Wrapper { }); if (dynamic_dependencies.length > 0) { - const bitmask = renderer.get_bitmask(dynamic_dependencies); - changes.properties.push(p`${attribute.name}: #changes & ${bitmask}`); + changes.properties.push(p`${attribute.name}: ${renderer.changed(dynamic_dependencies)}`); } }); renderer.blocks.push(b` - const ${get_slot_changes_fn} = #changes => ${changes}; + const ${get_slot_changes_fn} = #changed => ${changes}; const ${get_slot_context_fn} = #ctx => ${get_slot_data(block, this.node.values)}; `); } else { diff --git a/src/runtime/internal/Component.ts b/src/runtime/internal/Component.ts index 09368a4a2b..a36ac237e2 100644 --- a/src/runtime/internal/Component.ts +++ b/src/runtime/internal/Component.ts @@ -21,7 +21,7 @@ interface Fragment { } // eslint-disable-next-line @typescript-eslint/class-name-casing interface T$$ { - dirty: number; + dirty: number[]; ctx: null|any; bound: any; update: () => void; @@ -88,15 +88,15 @@ export function destroy_component(component, detaching) { } function make_dirty(component, i) { - if (component.$$.dirty === -1) { + if (component.$$.dirty[0] === -1) { dirty_components.push(component); schedule_update(); - component.$$.dirty = 0; + component.$$.dirty.fill(0); } - component.$$.dirty |= (1 << i); + component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); } -export function init(component, options, instance, create_fragment, not_equal, props) { +export function init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) { const parent_component = current_component; set_current_component(component); @@ -121,7 +121,7 @@ export function init(component, options, instance, create_fragment, not_equal, p // everything else callbacks: blank_object(), - dirty: -1 + dirty }; let ready = false; diff --git a/src/runtime/internal/scheduler.ts b/src/runtime/internal/scheduler.ts index 46b52e1d8a..2f864743a2 100644 --- a/src/runtime/internal/scheduler.ts +++ b/src/runtime/internal/scheduler.ts @@ -74,7 +74,7 @@ function update($$) { $$.update(); run_all($$.before_update); $$.fragment && $$.fragment.p($$.ctx, $$.dirty); - $$.dirty = -1; + $$.dirty = [-1]; $$.after_update.forEach(add_render_callback); } diff --git a/test/js/samples/action-custom-event-handler/expected.js b/test/js/samples/action-custom-event-handler/expected.js index f4120f5b50..00c4a1facc 100644 --- a/test/js/samples/action-custom-event-handler/expected.js +++ b/test/js/samples/action-custom-event-handler/expected.js @@ -23,7 +23,7 @@ function create_fragment(ctx) { insert(target, button, anchor); foo_action = foo.call(null, button, ctx[1]) || ({}); }, - p(ctx, changed) { + p(ctx, [changed]) { if (is_function(foo_action.update) && changed & 1) foo_action.update.call(null, ctx[1]); }, i: noop, @@ -40,7 +40,7 @@ function handleFoo(bar) { } function foo(node, callback) { - + } function instance($$self, $$props, $$invalidate) { diff --git a/test/js/samples/bind-open/expected.js b/test/js/samples/bind-open/expected.js index d5680c0aa7..11299362f9 100644 --- a/test/js/samples/bind-open/expected.js +++ b/test/js/samples/bind-open/expected.js @@ -27,7 +27,7 @@ function create_fragment(ctx) { insert(target, details, anchor); details.open = ctx[0]; }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { details.open = ctx[0]; } diff --git a/test/js/samples/capture-inject-dev-only/expected.js b/test/js/samples/capture-inject-dev-only/expected.js index c1c81a1c42..c001b97677 100644 --- a/test/js/samples/capture-inject-dev-only/expected.js +++ b/test/js/samples/capture-inject-dev-only/expected.js @@ -37,7 +37,7 @@ function create_fragment(ctx) { insert(target, input, anchor); set_input_value(input, ctx[0]); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) set_data(t0, ctx[0]); if (changed & 1 && input.value !== ctx[0]) { diff --git a/test/js/samples/collapses-text-around-comments/expected.js b/test/js/samples/collapses-text-around-comments/expected.js index 0819a0de01..8fd562b475 100644 --- a/test/js/samples/collapses-text-around-comments/expected.js +++ b/test/js/samples/collapses-text-around-comments/expected.js @@ -34,7 +34,7 @@ function create_fragment(ctx) { insert(target, p, anchor); append(p, t); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) set_data(t, ctx[0]); }, i: noop, diff --git a/test/js/samples/component-static-var/expected.js b/test/js/samples/component-static-var/expected.js index fcbc130676..c386604693 100644 --- a/test/js/samples/component-static-var/expected.js +++ b/test/js/samples/component-static-var/expected.js @@ -46,7 +46,7 @@ function create_fragment(ctx) { set_input_value(input, ctx[0]); current = true; }, - p(ctx, changed) { + p(ctx, [changed]) { const bar_changes = {}; if (changed & 1) bar_changes.x = ctx[0]; bar.$set(bar_changes); diff --git a/test/js/samples/component-store-access-invalidate/expected.js b/test/js/samples/component-store-access-invalidate/expected.js index 36952ab211..e84a0bc8fe 100644 --- a/test/js/samples/component-store-access-invalidate/expected.js +++ b/test/js/samples/component-store-access-invalidate/expected.js @@ -28,7 +28,7 @@ function create_fragment(ctx) { insert(target, h1, anchor); append(h1, t); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) set_data(t, ctx[0]); }, i: noop, diff --git a/test/js/samples/component-store-reassign-invalidate/expected.js b/test/js/samples/component-store-reassign-invalidate/expected.js index a36c37577d..c878b19cc2 100644 --- a/test/js/samples/component-store-reassign-invalidate/expected.js +++ b/test/js/samples/component-store-reassign-invalidate/expected.js @@ -39,7 +39,7 @@ function create_fragment(ctx) { insert(target, t1, anchor); insert(target, button, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 2) set_data(t0, ctx[1]); }, i: noop, diff --git a/test/js/samples/data-attribute/expected.js b/test/js/samples/data-attribute/expected.js index 86ecc37166..4a574b68ae 100644 --- a/test/js/samples/data-attribute/expected.js +++ b/test/js/samples/data-attribute/expected.js @@ -29,7 +29,7 @@ function create_fragment(ctx) { insert(target, t, anchor); insert(target, div1, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { attr(div1, "data-foo", ctx[0]); } diff --git a/test/js/samples/debug-empty/expected.js b/test/js/samples/debug-empty/expected.js index 572c33d732..ad9949fe2a 100644 --- a/test/js/samples/debug-empty/expected.js +++ b/test/js/samples/debug-empty/expected.js @@ -44,7 +44,7 @@ function create_fragment(ctx) { append_dev(h1, t2); insert_dev(target, t3, anchor); }, - p: function update(ctx, changed) { + p: function update(ctx, [changed]) { if (changed & 1) set_data_dev(t1, ctx[0]); debugger; }, diff --git a/test/js/samples/debug-foo-bar-baz-things/expected.js b/test/js/samples/debug-foo-bar-baz-things/expected.js index 11143ba909..d85fb1c0dc 100644 --- a/test/js/samples/debug-foo-bar-baz-things/expected.js +++ b/test/js/samples/debug-foo-bar-baz-things/expected.js @@ -119,7 +119,7 @@ function create_fragment(ctx) { append_dev(p, t1); append_dev(p, t2); }, - p: function update(ctx, changed) { + p: function update(ctx, [changed]) { if (changed & 1) { each_value = ctx[0]; let i; diff --git a/test/js/samples/debug-foo/expected.js b/test/js/samples/debug-foo/expected.js index 87e2927c06..2eeaf31736 100644 --- a/test/js/samples/debug-foo/expected.js +++ b/test/js/samples/debug-foo/expected.js @@ -113,7 +113,7 @@ function create_fragment(ctx) { append_dev(p, t1); append_dev(p, t2); }, - p: function update(ctx, changed) { + p: function update(ctx, [changed]) { if (changed & 1) { each_value = ctx[0]; let i; diff --git a/test/js/samples/debug-hoisted/expected.js b/test/js/samples/debug-hoisted/expected.js index 22a5d21cda..7115f75cdc 100644 --- a/test/js/samples/debug-hoisted/expected.js +++ b/test/js/samples/debug-hoisted/expected.js @@ -23,7 +23,7 @@ function create_fragment(ctx) { throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); }, m: noop, - p: function update(ctx, changed) { + p: function update(ctx, [changed]) { if (changed & 3) { const obj = ctx[0]; const kobzol = ctx[1]; diff --git a/test/js/samples/debug-no-dependencies/expected.js b/test/js/samples/debug-no-dependencies/expected.js index 247e3eabdb..1077683172 100644 --- a/test/js/samples/debug-no-dependencies/expected.js +++ b/test/js/samples/debug-no-dependencies/expected.js @@ -88,7 +88,7 @@ function create_fragment(ctx) { insert_dev(target, each_1_anchor, anchor); }, - p: function update(ctx, changed) { + p: function update(ctx, [changed]) { if (changed & 0) { each_value = things; let i; diff --git a/test/js/samples/deconflict-builtins/expected.js b/test/js/samples/deconflict-builtins/expected.js index 07295eefbe..2c64724ea1 100644 --- a/test/js/samples/deconflict-builtins/expected.js +++ b/test/js/samples/deconflict-builtins/expected.js @@ -68,7 +68,7 @@ function create_fragment(ctx) { insert(target, each_1_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { each_value = ctx[0]; let i; diff --git a/test/js/samples/dev-warning-missing-data-computed/expected.js b/test/js/samples/dev-warning-missing-data-computed/expected.js index 42c0f17a41..544759d9c7 100644 --- a/test/js/samples/dev-warning-missing-data-computed/expected.js +++ b/test/js/samples/dev-warning-missing-data-computed/expected.js @@ -41,7 +41,7 @@ function create_fragment(ctx) { append_dev(p, t1); append_dev(p, t2); }, - p: function update(ctx, changed) { + p: function update(ctx, [changed]) { if (changed & 1 && t0_value !== (t0_value = Math.max(0, ctx[0]) + "")) set_data_dev(t0, t0_value); if (changed & 2) set_data_dev(t2, ctx[1]); }, diff --git a/test/js/samples/each-block-array-literal/expected.js b/test/js/samples/each-block-array-literal/expected.js index 16f14910dc..e59a929b22 100644 --- a/test/js/samples/each-block-array-literal/expected.js +++ b/test/js/samples/each-block-array-literal/expected.js @@ -68,7 +68,7 @@ function create_fragment(ctx) { insert(target, each_1_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 31) { each_value = [ctx[0], ctx[1], ctx[2], ctx[3], ctx[4]]; let i; diff --git a/test/js/samples/each-block-changed-check/expected.js b/test/js/samples/each-block-changed-check/expected.js index 38e8396126..4c27763200 100644 --- a/test/js/samples/each-block-changed-check/expected.js +++ b/test/js/samples/each-block-changed-check/expected.js @@ -110,7 +110,7 @@ function create_fragment(ctx) { insert(target, p, anchor); append(p, t1); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 7) { each_value = ctx[0]; let i; diff --git a/test/js/samples/each-block-keyed-animated/expected.js b/test/js/samples/each-block-keyed-animated/expected.js index 463a63e88e..9033ead1c8 100644 --- a/test/js/samples/each-block-keyed-animated/expected.js +++ b/test/js/samples/each-block-keyed-animated/expected.js @@ -91,7 +91,7 @@ function create_fragment(ctx) { insert(target, each_1_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { const each_value = ctx[0]; for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); each_blocks = update_keyed_each(each_blocks, changed, get_key, 1, ctx, each_value, each_1_lookup, each_1_anchor.parentNode, fix_and_destroy_block, create_each_block, each_1_anchor, get_each_context); diff --git a/test/js/samples/each-block-keyed/expected.js b/test/js/samples/each-block-keyed/expected.js index 80369af9f0..6eb20971c3 100644 --- a/test/js/samples/each-block-keyed/expected.js +++ b/test/js/samples/each-block-keyed/expected.js @@ -76,7 +76,7 @@ function create_fragment(ctx) { insert(target, each_1_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { const each_value = ctx[0]; each_blocks = update_keyed_each(each_blocks, changed, get_key, 1, ctx, each_value, each_1_lookup, each_1_anchor.parentNode, destroy_block, create_each_block, each_1_anchor, get_each_context); }, diff --git a/test/js/samples/event-handler-dynamic/expected.js b/test/js/samples/event-handler-dynamic/expected.js index 7778616247..ea76b5d4dc 100644 --- a/test/js/samples/event-handler-dynamic/expected.js +++ b/test/js/samples/event-handler-dynamic/expected.js @@ -61,7 +61,7 @@ function create_fragment(ctx) { insert(target, t5, anchor); insert(target, button2, anchor); }, - p(new_ctx, changed) { + p(new_ctx, [changed]) { ctx = new_ctx; if (changed & 2) set_data(t4, ctx[1]); }, diff --git a/test/js/samples/if-block-no-update/expected.js b/test/js/samples/if-block-no-update/expected.js index a7982a1f7d..0db08dad9e 100644 --- a/test/js/samples/if-block-no-update/expected.js +++ b/test/js/samples/if-block-no-update/expected.js @@ -65,7 +65,7 @@ function create_fragment(ctx) { if_block.m(target, anchor); insert(target, if_block_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (current_block_type !== (current_block_type = select_block_type(ctx, changed))) { if_block.d(1); if_block = current_block_type(ctx); diff --git a/test/js/samples/if-block-simple/expected.js b/test/js/samples/if-block-simple/expected.js index af311c43fe..62e233f209 100644 --- a/test/js/samples/if-block-simple/expected.js +++ b/test/js/samples/if-block-simple/expected.js @@ -40,14 +40,14 @@ function create_fragment(ctx) { if (if_block) if_block.m(target, anchor); insert(target, if_block_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (ctx[0]) { if (!if_block) { if_block = create_if_block(ctx); if_block.c(); if_block.m(if_block_anchor.parentNode, if_block_anchor); } else { - + } } else if (if_block) { if_block.d(1); diff --git a/test/js/samples/inline-style-optimized-multiple/expected.js b/test/js/samples/inline-style-optimized-multiple/expected.js index efb3637297..5bfe824974 100644 --- a/test/js/samples/inline-style-optimized-multiple/expected.js +++ b/test/js/samples/inline-style-optimized-multiple/expected.js @@ -22,7 +22,7 @@ function create_fragment(ctx) { m(target, anchor) { insert(target, div, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { set_style(div, "color", ctx[0]); } diff --git a/test/js/samples/inline-style-optimized-url/expected.js b/test/js/samples/inline-style-optimized-url/expected.js index 9d11d96055..3710db9969 100644 --- a/test/js/samples/inline-style-optimized-url/expected.js +++ b/test/js/samples/inline-style-optimized-url/expected.js @@ -21,7 +21,7 @@ function create_fragment(ctx) { m(target, anchor) { insert(target, div, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { set_style(div, "background", "url(data:image/png;base64," + ctx[0] + ")"); } diff --git a/test/js/samples/inline-style-optimized/expected.js b/test/js/samples/inline-style-optimized/expected.js index f9def765d1..a5c160841c 100644 --- a/test/js/samples/inline-style-optimized/expected.js +++ b/test/js/samples/inline-style-optimized/expected.js @@ -21,7 +21,7 @@ function create_fragment(ctx) { m(target, anchor) { insert(target, div, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { set_style(div, "color", ctx[0]); } diff --git a/test/js/samples/inline-style-unoptimized/expected.js b/test/js/samples/inline-style-unoptimized/expected.js index a40e0e7e73..c244c332fa 100644 --- a/test/js/samples/inline-style-unoptimized/expected.js +++ b/test/js/samples/inline-style-unoptimized/expected.js @@ -30,7 +30,7 @@ function create_fragment(ctx) { insert(target, t, anchor); insert(target, div1, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { attr(div0, "style", ctx[0]); } diff --git a/test/js/samples/input-no-initial-value/expected.js b/test/js/samples/input-no-initial-value/expected.js index 15f87b1d81..0fe216292e 100644 --- a/test/js/samples/input-no-initial-value/expected.js +++ b/test/js/samples/input-no-initial-value/expected.js @@ -40,7 +40,7 @@ function create_fragment(ctx) { append(form, t0); append(form, button); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1 && input.value !== ctx[0]) { set_input_value(input, ctx[0]); } diff --git a/test/js/samples/input-range/expected.js b/test/js/samples/input-range/expected.js index ecf36ab2f6..db30d7c783 100644 --- a/test/js/samples/input-range/expected.js +++ b/test/js/samples/input-range/expected.js @@ -28,7 +28,7 @@ function create_fragment(ctx) { insert(target, input, anchor); set_input_value(input, ctx[0]); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { set_input_value(input, ctx[0]); } diff --git a/test/js/samples/input-without-blowback-guard/expected.js b/test/js/samples/input-without-blowback-guard/expected.js index aa52f72040..1a9459809c 100644 --- a/test/js/samples/input-without-blowback-guard/expected.js +++ b/test/js/samples/input-without-blowback-guard/expected.js @@ -25,7 +25,7 @@ function create_fragment(ctx) { insert(target, input, anchor); input.checked = ctx[0]; }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) { input.checked = ctx[0]; } diff --git a/test/js/samples/instrumentation-script-if-no-block/expected.js b/test/js/samples/instrumentation-script-if-no-block/expected.js index 70c5e25e8d..ca289069f9 100644 --- a/test/js/samples/instrumentation-script-if-no-block/expected.js +++ b/test/js/samples/instrumentation-script-if-no-block/expected.js @@ -39,7 +39,7 @@ function create_fragment(ctx) { append(p, t2); append(p, t3); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) set_data(t3, ctx[0]); }, i: noop, diff --git a/test/js/samples/instrumentation-script-x-equals-x/expected.js b/test/js/samples/instrumentation-script-x-equals-x/expected.js index 9b25a9c444..3d43d25700 100644 --- a/test/js/samples/instrumentation-script-x-equals-x/expected.js +++ b/test/js/samples/instrumentation-script-x-equals-x/expected.js @@ -40,7 +40,7 @@ function create_fragment(ctx) { append(p, t2); append(p, t3); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1 && t3_value !== (t3_value = ctx[0].length + "")) set_data(t3, t3_value); }, i: noop, diff --git a/test/js/samples/instrumentation-template-if-no-block/expected.js b/test/js/samples/instrumentation-template-if-no-block/expected.js index 18dc615adf..7ef6bd8c9a 100644 --- a/test/js/samples/instrumentation-template-if-no-block/expected.js +++ b/test/js/samples/instrumentation-template-if-no-block/expected.js @@ -39,7 +39,7 @@ function create_fragment(ctx) { append(p, t2); append(p, t3); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) set_data(t3, ctx[0]); }, i: noop, diff --git a/test/js/samples/instrumentation-template-x-equals-x/expected.js b/test/js/samples/instrumentation-template-x-equals-x/expected.js index 0b71f86a5b..bd5bf249fa 100644 --- a/test/js/samples/instrumentation-template-x-equals-x/expected.js +++ b/test/js/samples/instrumentation-template-x-equals-x/expected.js @@ -40,7 +40,7 @@ function create_fragment(ctx) { append(p, t2); append(p, t3); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1 && t3_value !== (t3_value = ctx[0].length + "")) set_data(t3, t3_value); }, i: noop, diff --git a/test/js/samples/loop-protect/expected.js b/test/js/samples/loop-protect/expected.js index e2df5820e1..093cccf63c 100644 --- a/test/js/samples/loop-protect/expected.js +++ b/test/js/samples/loop-protect/expected.js @@ -68,7 +68,7 @@ function instance($$self) { }; $$self.$inject_state = $$props => { - + }; $: { diff --git a/test/js/samples/media-bindings/expected.js b/test/js/samples/media-bindings/expected.js index 0ebd19b4da..6387e0ca31 100644 --- a/test/js/samples/media-bindings/expected.js +++ b/test/js/samples/media-bindings/expected.js @@ -67,7 +67,7 @@ function create_fragment(ctx) { audio.playbackRate = ctx[7]; } }, - p(ctx, changed) { + p(ctx, [changed]) { if (!audio_updating && changed & 8 && !isNaN(ctx[3])) { audio.currentTime = ctx[3]; } diff --git a/test/js/samples/select-dynamic-value/expected.js b/test/js/samples/select-dynamic-value/expected.js index efa4662297..03a7fc2b57 100644 --- a/test/js/samples/select-dynamic-value/expected.js +++ b/test/js/samples/select-dynamic-value/expected.js @@ -43,7 +43,7 @@ function create_fragment(ctx) { } } }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1 && select_value_value !== (select_value_value = ctx[0])) { for (var i = 0; i < select.options.length; i += 1) { var option = select.options[i]; diff --git a/test/js/samples/src-attribute-check/expected.js b/test/js/samples/src-attribute-check/expected.js index bf11b3821d..bfdf7a01c8 100644 --- a/test/js/samples/src-attribute-check/expected.js +++ b/test/js/samples/src-attribute-check/expected.js @@ -44,7 +44,7 @@ function create_fragment(ctx) { insert(target, t, anchor); insert(target, img1, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1 && img0.src !== (img0_src_value = ctx[0])) { attr(img0, "src", img0_src_value); } diff --git a/test/js/samples/title/expected.js b/test/js/samples/title/expected.js index b091b2a516..800bf9801a 100644 --- a/test/js/samples/title/expected.js +++ b/test/js/samples/title/expected.js @@ -8,7 +8,7 @@ function create_fragment(ctx) { return { c: noop, m: noop, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1 && title_value !== (title_value = "a " + ctx[0] + " title")) { document.title = title_value; } diff --git a/test/js/samples/transition-local/expected.js b/test/js/samples/transition-local/expected.js index 63f3ec4692..c93f66026b 100644 --- a/test/js/samples/transition-local/expected.js +++ b/test/js/samples/transition-local/expected.js @@ -91,7 +91,7 @@ function create_fragment(ctx) { if (if_block) if_block.m(target, anchor); insert(target, if_block_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (ctx[0]) { if (if_block) { if_block.p(ctx, changed); @@ -115,7 +115,7 @@ function create_fragment(ctx) { } function foo() { - + } function instance($$self, $$props, $$invalidate) { diff --git a/test/js/samples/transition-repeated-outro/expected.js b/test/js/samples/transition-repeated-outro/expected.js index 898bfb63a5..62f0e86bd8 100644 --- a/test/js/samples/transition-repeated-outro/expected.js +++ b/test/js/samples/transition-repeated-outro/expected.js @@ -61,7 +61,7 @@ function create_fragment(ctx) { insert(target, if_block_anchor, anchor); current = true; }, - p(ctx, changed) { + p(ctx, [changed]) { if (ctx[0] < 5) { if (!if_block) { if_block = create_if_block(ctx); diff --git a/test/js/samples/unchanged-expression/expected.js b/test/js/samples/unchanged-expression/expected.js index f726af14a1..9c4e31aa69 100644 --- a/test/js/samples/unchanged-expression/expected.js +++ b/test/js/samples/unchanged-expression/expected.js @@ -56,7 +56,7 @@ function create_fragment(ctx) { append(p3, t8); append(p3, t9); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) set_data(t9, ctx[0]); }, i: noop, diff --git a/test/js/samples/unreferenced-state-not-invalidated/expected.js b/test/js/samples/unreferenced-state-not-invalidated/expected.js index 0bd2531008..b4e74b1a85 100644 --- a/test/js/samples/unreferenced-state-not-invalidated/expected.js +++ b/test/js/samples/unreferenced-state-not-invalidated/expected.js @@ -27,7 +27,7 @@ function create_fragment(ctx) { insert(target, p, anchor); append(p, t); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1) set_data(t, ctx[0]); }, i: noop, diff --git a/test/js/samples/use-elements-as-anchors/expected.js b/test/js/samples/use-elements-as-anchors/expected.js index fc77218bf8..a5db96f4fe 100644 --- a/test/js/samples/use-elements-as-anchors/expected.js +++ b/test/js/samples/use-elements-as-anchors/expected.js @@ -155,14 +155,14 @@ function create_fragment(ctx) { if (if_block4) if_block4.m(target, anchor); insert(target, if_block4_anchor, anchor); }, - p(ctx, changed) { + p(ctx, [changed]) { if (ctx[0]) { if (!if_block0) { if_block0 = create_if_block_4(ctx); if_block0.c(); if_block0.m(div, t0); } else { - + } } else if (if_block0) { if_block0.d(1); @@ -175,7 +175,7 @@ function create_fragment(ctx) { if_block1.c(); if_block1.m(div, t3); } else { - + } } else if (if_block1) { if_block1.d(1); @@ -188,7 +188,7 @@ function create_fragment(ctx) { if_block2.c(); if_block2.m(div, t4); } else { - + } } else if (if_block2) { if_block2.d(1); @@ -201,7 +201,7 @@ function create_fragment(ctx) { if_block3.c(); if_block3.m(div, null); } else { - + } } else if (if_block3) { if_block3.d(1); @@ -214,7 +214,7 @@ function create_fragment(ctx) { if_block4.c(); if_block4.m(if_block4_anchor.parentNode, if_block4_anchor); } else { - + } } else if (if_block4) { if_block4.d(1); diff --git a/test/js/samples/video-bindings/expected.js b/test/js/samples/video-bindings/expected.js index 43241d51ff..6f19bc9d49 100644 --- a/test/js/samples/video-bindings/expected.js +++ b/test/js/samples/video-bindings/expected.js @@ -47,7 +47,7 @@ function create_fragment(ctx) { insert(target, video, anchor); video_resize_listener = add_resize_listener(video, ctx[4].bind(video)); }, - p(ctx, changed) { + p(ctx, [changed]) { if (!video_updating && changed & 1 && !isNaN(ctx[0])) { video.currentTime = ctx[0]; } diff --git a/test/js/samples/window-binding-scroll/expected.js b/test/js/samples/window-binding-scroll/expected.js index 254fb81966..09041d17b4 100644 --- a/test/js/samples/window-binding-scroll/expected.js +++ b/test/js/samples/window-binding-scroll/expected.js @@ -46,7 +46,7 @@ function create_fragment(ctx) { append(p, t0); append(p, t1); }, - p(ctx, changed) { + p(ctx, [changed]) { if (changed & 1 && !scrolling) { scrolling = true; clearTimeout(scrolling_timeout); diff --git a/test/runtime/samples/bitmask-overflow/_config.js b/test/runtime/samples/bitmask-overflow/_config.js index 7e9ad4d33b..fdd7bff813 100644 --- a/test/runtime/samples/bitmask-overflow/_config.js +++ b/test/runtime/samples/bitmask-overflow/_config.js @@ -41,6 +41,9 @@ export default {

38

39

40

+

5:36

+

6:37

+

38

`, test({ assert, component, target }) { @@ -52,14 +55,19 @@ export default { component._32 = 'd'; component._40 = 'e'; + component._5 = 'f'; + component._6 = 'g'; + component._36 = 'h'; + component._37 = 'i'; + assert.htmlEqual(target.innerHTML, `

a

1

2

3

4

-

5

-

6

+

f

+

g

7

8

9

@@ -89,18 +97,25 @@ export default {

33

34

35

-

36

-

37

+

h

+

i

38

39

e

+

f:h

+

g:i

+

38

`); assert.deepEqual(component.reads, { _0: 1, + _5: 2, + _6: 3, _30: 1, _31: 1, _32: 1, + _36: 2, + _37: 3, _40: 1 }); } diff --git a/test/runtime/samples/bitmask-overflow/main.svelte b/test/runtime/samples/bitmask-overflow/main.svelte index c40c45e749..32eb8802da 100644 --- a/test/runtime/samples/bitmask-overflow/main.svelte +++ b/test/runtime/samples/bitmask-overflow/main.svelte @@ -43,6 +43,9 @@ export let _39 = '39'; export let _40 = '40'; + $: foo = read(_6, '_6') + ':' + read(_37, '_37'); + $: bar = read(_38, '_38'); + const read = (value, label) => { if (!reads[label]) reads[label] = 0; reads[label] += 1; @@ -91,4 +94,8 @@

{read(_37, '_37')}

{read(_38, '_38')}

{read(_39, '_39')}

-

{read(_40, '_40')}

\ No newline at end of file +

{read(_40, '_40')}

+ +

{read(_5, '_5') + ':' + read(_36, '_36')}

+

{foo}

+

{bar}

\ No newline at end of file