mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
27378b7f10
Summary: Same as D20969087 (https://github.com/facebook/react-native/commit/be7867375580ed391bb10c50b768d998087e848d) but a bit more sophisticated. We currently see a lot of errors happens because of division by zero in AnimatedDivision module. We already have a check for that in the module but it happens during the animation tick where the context of execution is already lost and it's hard to find why exactly it happens. Adding an additional check to the constructor should trigger an error right inside render function which should make the error actionable. Changelog: [Internal] Fabric-specific internal change. Reviewed By: fkgozali Differential Revision: D23908993 fbshipit-source-id: d21be9a72ec04fe4ff0740777d9ff49cf1bcde73
80 lines
2.1 KiB
JavaScript
80 lines
2.1 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const AnimatedInterpolation = require('./AnimatedInterpolation');
|
|
const AnimatedNode = require('./AnimatedNode');
|
|
const AnimatedValue = require('./AnimatedValue');
|
|
const AnimatedWithChildren = require('./AnimatedWithChildren');
|
|
|
|
import type {InterpolationConfigType} from './AnimatedInterpolation';
|
|
|
|
class AnimatedDivision extends AnimatedWithChildren {
|
|
_a: AnimatedNode;
|
|
_b: AnimatedNode;
|
|
_warnedAboutDivideByZero: boolean = false;
|
|
|
|
constructor(a: AnimatedNode | number, b: AnimatedNode | number) {
|
|
super();
|
|
if (b === 0 || (b instanceof AnimatedNode && b.__getValue() === 0)) {
|
|
console.error('Detected potential division by zero in AnimatedDivision');
|
|
}
|
|
this._a = typeof a === 'number' ? new AnimatedValue(a) : a;
|
|
this._b = typeof b === 'number' ? new AnimatedValue(b) : b;
|
|
}
|
|
|
|
__makeNative() {
|
|
this._a.__makeNative();
|
|
this._b.__makeNative();
|
|
super.__makeNative();
|
|
}
|
|
|
|
__getValue(): number {
|
|
const a = this._a.__getValue();
|
|
const b = this._b.__getValue();
|
|
if (b === 0) {
|
|
// Prevent spamming the console/LogBox
|
|
if (!this._warnedAboutDivideByZero) {
|
|
console.error('Detected division by zero in AnimatedDivision');
|
|
this._warnedAboutDivideByZero = true;
|
|
}
|
|
// Passing infinity/NaN to Fabric will cause a native crash
|
|
return 0;
|
|
}
|
|
this._warnedAboutDivideByZero = false;
|
|
return a / b;
|
|
}
|
|
|
|
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
|
return new AnimatedInterpolation(this, config);
|
|
}
|
|
|
|
__attach(): void {
|
|
this._a.__addChild(this);
|
|
this._b.__addChild(this);
|
|
}
|
|
|
|
__detach(): void {
|
|
this._a.__removeChild(this);
|
|
this._b.__removeChild(this);
|
|
super.__detach();
|
|
}
|
|
|
|
__getNativeConfig(): any {
|
|
return {
|
|
type: 'division',
|
|
input: [this._a.__getNativeTag(), this._b.__getNativeTag()],
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = AnimatedDivision;
|