Add JSCHelper function to easily install native hooks outside of JSCExecutor
Summary: JSCExecutor has something like this, but for methods on JSCExecutor itself. Open to better ideas around how to share code Reviewed By: lexs Differential Revision: D3516314 fbshipit-source-id: 4b1265916c52d582bb0b9348e9b4a099f566d6c9
This commit is contained in:
parent
10d41b50c2
commit
f5345601d9
|
@ -66,12 +66,7 @@ inline JSObjectCallAsFunctionCallback exceptionWrapMethod() {
|
|||
auto executor = static_cast<JSCExecutor*>(JSObjectGetPrivate(globalObj));
|
||||
return (executor->*method)(argumentCount, arguments);
|
||||
} catch (...) {
|
||||
try {
|
||||
auto functionName = Object(ctx, function).getProperty("name").toString().str();
|
||||
*exception = translatePendingCppExceptionToJSError(ctx, functionName.c_str());
|
||||
} catch (...) {
|
||||
*exception = makeJSError(ctx, "Failed to get function name while handling exception");
|
||||
}
|
||||
*exception = translatePendingCppExceptionToJSError(ctx, function);
|
||||
return JSValueMakeUndefined(ctx);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -113,4 +113,13 @@ JSValueRef translatePendingCppExceptionToJSError(JSContextRef ctx, const char *e
|
|||
}
|
||||
}
|
||||
|
||||
JSValueRef translatePendingCppExceptionToJSError(JSContextRef ctx, JSObjectRef jsFunctionCause) {
|
||||
try {
|
||||
auto functionName = Object(ctx, jsFunctionCause).getProperty("name").toString().str();
|
||||
return translatePendingCppExceptionToJSError(ctx, functionName.c_str());
|
||||
} catch (...) {
|
||||
return makeJSError(ctx, "Failed to get function name while handling exception");
|
||||
}
|
||||
}
|
||||
|
||||
} }
|
||||
|
|
|
@ -52,5 +52,33 @@ JSValueRef evaluateScript(
|
|||
JSValueRef makeJSError(JSContextRef ctx, const char *error);
|
||||
|
||||
JSValueRef translatePendingCppExceptionToJSError(JSContextRef ctx, const char *exceptionLocation);
|
||||
JSValueRef translatePendingCppExceptionToJSError(JSContextRef ctx, JSObjectRef jsFunctionCause);
|
||||
|
||||
template<JSValueRef (method)(JSContextRef ctx,
|
||||
JSObjectRef function,
|
||||
JSObjectRef thisObject,
|
||||
size_t argumentCount,
|
||||
const JSValueRef arguments[],
|
||||
JSValueRef *exception)>
|
||||
inline JSObjectCallAsFunctionCallback exceptionWrapMethod() {
|
||||
struct funcWrapper {
|
||||
static JSValueRef call(
|
||||
JSContextRef ctx,
|
||||
JSObjectRef function,
|
||||
JSObjectRef thisObject,
|
||||
size_t argumentCount,
|
||||
const JSValueRef arguments[],
|
||||
JSValueRef *exception) {
|
||||
try {
|
||||
return (*method)(ctx, function, thisObject, argumentCount, arguments, exception);
|
||||
} catch (...) {
|
||||
*exception = translatePendingCppExceptionToJSError(ctx, function);
|
||||
return JSValueMakeUndefined(ctx);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return &funcWrapper::call;
|
||||
}
|
||||
|
||||
} }
|
||||
|
|
Loading…
Reference in New Issue