Support calls through MessageQueue when interecting with JSValue directly

Reviewed By: yungsters

Differential Revision: D4756241

fbshipit-source-id: 5c7309a18ac476a620451bf471471596c9f82cf8
This commit is contained in:
Pieter De Baets 2017-03-28 07:11:45 -07:00 committed by Facebook Github Bot
parent ec5baf02bd
commit 7de59b102d
1 changed files with 19 additions and 14 deletions

View File

@ -41,20 +41,13 @@ const TRACE_TAG_REACT_APPS = 1 << 17;
const DEBUG_INFO_LIMIT = 32;
const guard = (fn) => {
try {
fn();
} catch (error) {
ErrorUtils.reportFatalError(error);
}
};
class MessageQueue {
_callableModules: {[key: string]: Object};
_queue: [Array<number>, Array<number>, Array<any>, number];
_callbacks: [];
_callbackID: number;
_callID: number;
_inCall: number;
_lastFlush: number;
_eventLoopStartTime: number;
@ -104,7 +97,7 @@ class MessageQueue {
}
callFunctionReturnFlushedQueue(module: string, method: string, args: Array<any>) {
guard(() => {
this.__guard(() => {
this.__callFunction(module, method, args);
this.__callImmediates();
});
@ -114,7 +107,7 @@ class MessageQueue {
callFunctionReturnResultAndFlushedQueue(module: string, method: string, args: Array<any>) {
let result;
guard(() => {
this.__guard(() => {
result = this.__callFunction(module, method, args);
this.__callImmediates();
});
@ -123,7 +116,7 @@ class MessageQueue {
}
invokeCallbackAndReturnFlushedQueue(cbID: number, args: Array<any>) {
guard(() => {
this.__guard(() => {
this.__invokeCallback(cbID, args);
this.__callImmediates();
});
@ -188,7 +181,8 @@ class MessageQueue {
const now = new Date().getTime();
if (global.nativeFlushQueueImmediate &&
now - this._lastFlush >= MIN_TIME_BETWEEN_FLUSHES_MS) {
(now - this._lastFlush >= MIN_TIME_BETWEEN_FLUSHES_MS ||
this._inCall === 0)) {
global.nativeFlushQueueImmediate(this._queue);
this._queue = [[], [], [], this._callID];
this._lastFlush = now;
@ -214,12 +208,23 @@ class MessageQueue {
}
/**
* "Private" methods
* Private methods
*/
__guard(fn: () => void) {
this._inCall++;
try {
fn();
} catch (error) {
ErrorUtils.reportFatalError(error);
} finally {
this._inCall--;
}
}
__callImmediates() {
Systrace.beginEvent('JSTimersExecution.callImmediates()');
guard(() => JSTimersExecution.callImmediates());
this.__guard(() => JSTimersExecution.callImmediates());
Systrace.endEvent();
}