refactor(core): Use `~x` instead of `-x` which can result in `-0` (#39233)
`expandoInstructions` uses negative numbers by `-x`. This has lead to issues in the paste as `-0` is processed as float rather than integer leading to de-optimization. PR Close #39233
This commit is contained in:
parent
54303688fa
commit
2c31533f0a
|
@ -79,12 +79,7 @@ export function setHostBindingsByExecutingExpandoInstructions(tView: TView, lVie
|
||||||
if (instruction <= 0) {
|
if (instruction <= 0) {
|
||||||
// Negative numbers mean that we are starting new EXPANDO block and need to update
|
// Negative numbers mean that we are starting new EXPANDO block and need to update
|
||||||
// the current element and directive index.
|
// the current element and directive index.
|
||||||
// Important: In JS `-x` and `0-x` is not the same! If `x===0` then `-x` will produce
|
currentElementIndex = ~instruction;
|
||||||
// `-0` which requires non standard math arithmetic and it can prevent VM optimizations.
|
|
||||||
// `0-0` will always produce `0` and will not cause a potential deoptimization in VM.
|
|
||||||
// TODO(misko): PERF This should be refactored to use `~instruction` as that does not
|
|
||||||
// suffer from `-0` and it is faster/more compact.
|
|
||||||
currentElementIndex = 0 - instruction;
|
|
||||||
setSelectedIndex(currentElementIndex);
|
setSelectedIndex(currentElementIndex);
|
||||||
|
|
||||||
// Injector block and providers are taken into account.
|
// Injector block and providers are taken into account.
|
||||||
|
@ -1373,10 +1368,7 @@ export function generateExpandoInstructionBlock(
|
||||||
tView.firstCreatePass, true,
|
tView.firstCreatePass, true,
|
||||||
'Expando block should only be generated on first create pass.');
|
'Expando block should only be generated on first create pass.');
|
||||||
|
|
||||||
// Important: In JS `-x` and `0-x` is not the same! If `x===0` then `-x` will produce `-0` which
|
const elementIndex = ~tNode.index;
|
||||||
// requires non standard math arithmetic and it can prevent VM optimizations.
|
|
||||||
// `0-0` will always produce `0` and will not cause a potential deoptimization in VM.
|
|
||||||
const elementIndex = 0 - tNode.index;
|
|
||||||
const providerStartIndex = tNode.providerIndexes & TNodeProviderIndexes.ProvidersStartIndexMask;
|
const providerStartIndex = tNode.providerIndexes & TNodeProviderIndexes.ProvidersStartIndexMask;
|
||||||
const providerCount = tView.data.length - providerStartIndex;
|
const providerCount = tView.data.length - providerStartIndex;
|
||||||
(tView.expandoInstructions || (tView.expandoInstructions = []))
|
(tView.expandoInstructions || (tView.expandoInstructions = []))
|
||||||
|
|
Loading…
Reference in New Issue