perf(ivy): improve NaN checks in change detection (#32212)

This commit drops our custom, change-detection specific, equality comparison util
in favour of the standard Object.is which has desired semantics.

There are multiple advantages of this approach:
- less code to maintain on our end;
- avoid NaN checks if both values are equal;
- re-write NaN checks so we don't trigger V8 deoptimizations.

PR Close #32212
This commit is contained in:
Pawel Kozlowski
2019-08-20 11:06:59 +02:00
committed by Andrew Kushnir
parent 53f33c1cec
commit 53bfa7c6d6
5 changed files with 5 additions and 91 deletions

View File

@ -12,8 +12,6 @@ import {throwErrorIfNoChangesMode} from './errors';
import {LView} from './interfaces/view';
import {getCheckNoChangesMode} from './state';
import {NO_CHANGE} from './tokens';
import {isDifferent} from './util/misc_utils';
// TODO(misko): consider inlining
@ -36,9 +34,11 @@ export function bindingUpdated(lView: LView, bindingIndex: number, value: any):
ngDevMode && assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
ngDevMode &&
assertLessThan(bindingIndex, lView.length, `Slot should have been initialized to NO_CHANGE`);
const oldValue = lView[bindingIndex];
if (isDifferent(oldValue, value)) {
if (Object.is(oldValue, value)) {
return false;
} else {
if (ngDevMode && getCheckNoChangesMode()) {
// View engine didn't report undefined values as changed on the first checkNoChanges pass
// (before the change detection was run).
@ -50,8 +50,6 @@ export function bindingUpdated(lView: LView, bindingIndex: number, value: any):
lView[bindingIndex] = value;
return true;
}
return false;
}
/** Updates 2 bindings if changed, then returns whether either was updated. */