fix bitmask overflow slot updates

pull/4078/head
Rich Harris 5 years ago
parent 41d955c23e
commit a7db99e2f6

@ -80,9 +80,17 @@ export function get_slot_changes(definition, $$scope, dirty, fn) {
if (definition[2] && fn) {
const lets = definition[2](fn(dirty));
return typeof $$scope.dirty === 'object'
? $$scope.dirty.map((n, i) => n | lets[i])
: $$scope.dirty | lets;
if (typeof $$scope.dirty === 'object') {
const merged = [];
const len = Math.max($$scope.dirty.length, lets.length);
for (let i = 0; i < len; i += 1) {
merged[i] = $$scope.dirty[i] | lets[i];
}
return merged;
}
return $$scope.dirty | lets;
}
return $$scope.dirty;

@ -0,0 +1,5 @@
<script>
export let dummy;
</script>
<slot dummy={dummy}></slot>

@ -0,0 +1,124 @@
export default {
html: `
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>30</p>
<p>31</p>
<p>32</p>
<p>33</p>
<p>34</p>
<p>35</p>
<p>36</p>
<p>37</p>
<p>38</p>
<p>39</p>
<p>40</p>
<p>5:36</p>
<p>6:37</p>
<p>38</p>
<p>0</p>
`,
test({ assert, component, target }) {
component.reads = {};
component._0 = 'a';
component._30 = 'b';
component._31 = 'c';
component._32 = 'd';
component._40 = 'e';
component._5 = 'f';
component._6 = 'g';
component._36 = 'h';
component._37 = 'i';
assert.htmlEqual(target.innerHTML, `
<p>a</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>f</p>
<p>g</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>b</p>
<p>c</p>
<p>d</p>
<p>33</p>
<p>34</p>
<p>35</p>
<p>h</p>
<p>i</p>
<p>38</p>
<p>39</p>
<p>e</p>
<p>f:h</p>
<p>g:i</p>
<p>38</p>
<p>a</p>
`);
assert.deepEqual(component.reads, {
_0: 1,
_5: 3,
_6: 3,
_30: 1,
_31: 1,
_32: 1,
_36: 3,
_37: 3,
_40: 1
});
}
};

@ -0,0 +1,107 @@
<script>
import Echo from './Echo.svelte';
export let reads = {};
export let _0 = '0';
export let _1 = '1';
export let _2 = '2';
export let _3 = '3';
export let _4 = '4';
export let _5 = '5';
export let _6 = '6';
export let _7 = '7';
export let _8 = '8';
export let _9 = '9';
export let _10 = '10';
export let _11 = '11';
export let _12 = '12';
export let _13 = '13';
export let _14 = '14';
export let _15 = '15';
export let _16 = '16';
export let _17 = '17';
export let _18 = '18';
export let _19 = '19';
export let _20 = '20';
export let _21 = '21';
export let _22 = '22';
export let _23 = '23';
export let _24 = '24';
export let _25 = '25';
export let _26 = '26';
export let _27 = '27';
export let _28 = '28';
export let _29 = '29';
export let _30 = '30';
export let _31 = '31';
export let _32 = '32';
export let _33 = '33';
export let _34 = '34';
export let _35 = '35';
export let _36 = '36';
export let _37 = '37';
export let _38 = '38';
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;
return value;
};
</script>
<Echo dummy={_0} let:dummy>
<p>{read(_0, '_0')}</p>
<p>{read(_1, '_1')}</p>
<p>{read(_2, '_2')}</p>
<p>{read(_3, '_3')}</p>
<p>{read(_4, '_4')}</p>
<p>{read(_5, '_5')}</p>
<p>{read(_6, '_6')}</p>
<p>{read(_7, '_7')}</p>
<p>{read(_8, '_8')}</p>
<p>{read(_9, '_9')}</p>
<p>{read(_10, '_10')}</p>
<p>{read(_11, '_11')}</p>
<p>{read(_12, '_12')}</p>
<p>{read(_13, '_13')}</p>
<p>{read(_14, '_14')}</p>
<p>{read(_15, '_15')}</p>
<p>{read(_16, '_16')}</p>
<p>{read(_17, '_17')}</p>
<p>{read(_18, '_18')}</p>
<p>{read(_19, '_19')}</p>
<p>{read(_20, '_20')}</p>
<p>{read(_21, '_21')}</p>
<p>{read(_22, '_22')}</p>
<p>{read(_23, '_23')}</p>
<p>{read(_24, '_24')}</p>
<p>{read(_25, '_25')}</p>
<p>{read(_26, '_26')}</p>
<p>{read(_27, '_27')}</p>
<p>{read(_28, '_28')}</p>
<p>{read(_29, '_29')}</p>
<p>{read(_30, '_30')}</p>
<p>{read(_31, '_31')}</p>
<p>{read(_32, '_32')}</p>
<p>{read(_33, '_33')}</p>
<p>{read(_34, '_34')}</p>
<p>{read(_35, '_35')}</p>
<p>{read(_36, '_36')}</p>
<p>{read(_37, '_37')}</p>
<p>{read(_38, '_38')}</p>
<p>{read(_39, '_39')}</p>
<p>{read(_40, '_40')}</p>
<p>{read(_5, '_5') + ':' + read(_36, '_36')}</p>
<p>{foo}</p>
<p>{bar}</p>
<p>{dummy}</p>
</Echo>
Loading…
Cancel
Save