diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm index 5deab25265a1ca..7df790a129e38a 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm @@ -178,18 +178,6 @@ - (void)hostDidStart:(RCTHost *)host { } -- (void)host:(RCTHost *)host - didReceiveJSErrorStack:(NSArray *> *)stack - message:(NSString *)message - originalMessage:(NSString *_Nullable)originalMessage - name:(NSString *_Nullable)name - componentStack:(NSString *_Nullable)componentStack - exceptionId:(NSUInteger)exceptionId - isFatal:(BOOL)isFatal - extraData:(NSDictionary *)extraData -{ -} - #pragma mark - Bridge and Bridge Adapter properties - (RCTBridge *)bridge diff --git a/packages/react-native/React/CoreModules/RCTExceptionsManager.h b/packages/react-native/React/CoreModules/RCTExceptionsManager.h index d4b350961c5abd..1116f4a13ae8b7 100644 --- a/packages/react-native/React/CoreModules/RCTExceptionsManager.h +++ b/packages/react-native/React/CoreModules/RCTExceptionsManager.h @@ -31,10 +31,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)reportFatalException:(nullable NSString *)message stack:(nullable NSArray *)stack exceptionId:(double)exceptionId; -- (void)reportJsException:(nullable NSString *)message - stack:(nullable NSArray *)stack - exceptionId:(double)exceptionId - isFatal:(bool)isFatal; @property (nonatomic, weak) id delegate; diff --git a/packages/react-native/React/CoreModules/RCTExceptionsManager.mm b/packages/react-native/React/CoreModules/RCTExceptionsManager.mm index d7f8f647604a90..8f615daaf93e95 100644 --- a/packages/react-native/React/CoreModules/RCTExceptionsManager.mm +++ b/packages/react-native/React/CoreModules/RCTExceptionsManager.mm @@ -136,18 +136,6 @@ - (void)reportFatal:(NSString *)message } } -- (void)reportJsException:(nullable NSString *)message - stack:(nullable NSArray *)stack - exceptionId:(double)exceptionId - isFatal:(bool)isFatal -{ - if (isFatal) { - [self reportFatalException:message stack:stack exceptionId:exceptionId]; - } else { - [self reportSoftException:message stack:stack exceptionId:exceptionId]; - } -} - - (std::shared_ptr)getTurboModule: (const facebook::react::ObjCTurboModule::InitParams &)params { diff --git a/packages/react-native/ReactCommon/react/runtime/iostests/RCTHostTests.mm b/packages/react-native/ReactCommon/react/runtime/iostests/RCTHostTests.mm index 2b007f02fdd807..dd3e3216106270 100644 --- a/packages/react-native/ReactCommon/react/runtime/iostests/RCTHostTests.mm +++ b/packages/react-native/ReactCommon/react/runtime/iostests/RCTHostTests.mm @@ -115,51 +115,6 @@ - (void)testCallFunctionOnJSModule XCTAssertEqualObjects(shimmedRCTInstance.args, args); } -- (void)testDidReceiveErrorStack -{ - id instanceDelegate = (id)_subject; - - NSMutableArray *> *stack = [NSMutableArray array]; - - NSMutableDictionary *stackFrame0 = [NSMutableDictionary dictionary]; - stackFrame0[@"linenumber"] = @(3); - stackFrame0[@"column"] = @(4); - stackFrame0[@"methodname"] = @"method1"; - stackFrame0[@"file"] = @"file1.js"; - [stack addObject:stackFrame0]; - - NSMutableDictionary *stackFrame1 = [NSMutableDictionary dictionary]; - stackFrame0[@"linenumber"] = @(63); - stackFrame0[@"column"] = @(44); - stackFrame0[@"methodname"] = @"method2"; - stackFrame0[@"file"] = @"file2.js"; - [stack addObject:stackFrame1]; - - id extraData = [NSDictionary dictionary]; - - [instanceDelegate instance:[OCMArg any] - didReceiveJSErrorStack:stack - message:@"message" - originalMessage:nil - name:nil - componentStack:nil - exceptionId:5 - isFatal:YES - extraData:extraData]; - - OCMVerify( - OCMTimes(1), - [_mockHostDelegate host:_subject - didReceiveJSErrorStack:stack - message:@"message" - originalMessage:nil - name:nil - componentStack:nil - exceptionId:5 - isFatal:YES - extraData:extraData]); -} - - (void)testDidInitializeRuntime { id mockRuntimeDelegate = OCMProtocolMock(@protocol(RCTHostRuntimeDelegate)); diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec b/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec index e14016ae6340b1..3cc0f51a90d712 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec @@ -22,7 +22,7 @@ folly_version = folly_config[:version] folly_dep_name = folly_config[:dep_name] boost_config = get_boost_config() -boost_compiler_flags = boost_config[:compiler_flags] +boost_compiler_flags = boost_config[:compiler_flags] header_search_paths = [ "$(PODS_ROOT)/boost", @@ -70,6 +70,8 @@ Pod::Spec.new do |s| s.dependency "React-jserrorhandler" s.dependency "React-jsinspector" + add_dependency(s, "ReactCodegen") + if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" s.dependency "hermes-engine" s.dependency "React-RuntimeHermes" diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.h b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.h index 25e213a11c27b5..69be42972ab951 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.h +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.h @@ -27,16 +27,6 @@ typedef NSURL *_Nullable (^RCTHostBundleURLProvider)(void); @protocol RCTHostDelegate -- (void)host:(RCTHost *)host - didReceiveJSErrorStack:(NSArray *> *)stack - message:(NSString *)message - originalMessage:(NSString *_Nullable)originalMessage - name:(NSString *_Nullable)name - componentStack:(NSString *_Nullable)componentStack - exceptionId:(NSUInteger)exceptionId - isFatal:(BOOL)isFatal - extraData:(NSDictionary *)extraData; - - (void)hostDidStart:(RCTHost *)host; @optional diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm index 75fe99c2353cbd..374fd62dc97f51 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm @@ -315,27 +315,6 @@ - (void)dealloc #pragma mark - RCTInstanceDelegate -- (void)instance:(RCTInstance *)instance - didReceiveJSErrorStack:(NSArray *> *)stack - message:(NSString *)message - originalMessage:(NSString *_Nullable)originalMessage - name:(NSString *_Nullable)name - componentStack:(NSString *_Nullable)componentStack - exceptionId:(NSUInteger)exceptionId - isFatal:(BOOL)isFatal - extraData:(NSDictionary *)extraData -{ - [_hostDelegate host:self - didReceiveJSErrorStack:stack - message:message - originalMessage:originalMessage - name:name - componentStack:componentStack - exceptionId:exceptionId - isFatal:isFatal - extraData:extraData]; -} - - (void)instance:(RCTInstance *)instance didInitializeRuntime:(facebook::jsi::Runtime &)runtime { [self.runtimeDelegate host:self didInitializeRuntime:runtime]; diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.h b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.h index b77c8994e35a2f..f6fa418c8cf761 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.h +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.h @@ -37,16 +37,6 @@ RCT_EXTERN void RCTInstanceSetRuntimeDiagnosticFlags(NSString *_Nullable flags); @protocol RCTInstanceDelegate -- (void)instance:(RCTInstance *)instance - didReceiveJSErrorStack:(NSArray *> *)stack - message:(NSString *)message - originalMessage:(NSString *_Nullable)originalMessage - name:(NSString *_Nullable)name - componentStack:(NSString *_Nullable)componentStack - exceptionId:(NSUInteger)exceptionId - isFatal:(BOOL)isFatal - extraData:(NSDictionary *)extraData; - - (void)instance:(RCTInstance *)instance didInitializeRuntime:(facebook::jsi::Runtime &)runtime; - (void)loadBundleAtURL:(NSURL *)sourceURL diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm index 09ee426ea0af80..6e7395748885b3 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm @@ -9,6 +9,7 @@ #import +#import #import #import #import @@ -467,32 +468,47 @@ - (void)_loadScriptFromSource:(RCTSource *)source - (void)_handleJSError:(const JsErrorHandler::ParsedError &)error withRuntime:(jsi::Runtime &)runtime { - NSString *message = @(error.message.c_str()); + NSMutableDictionary *errorData = [NSMutableDictionary new]; + errorData[@"message"] = @(error.message.c_str()); + if (error.originalMessage) { + errorData[@"originalMessage"] = @(error.originalMessage->c_str()); + } + if (error.name) { + errorData[@"name"] = @(error.name->c_str()); + } + if (error.componentStack) { + errorData[@"componentStack"] = @(error.componentStack->c_str()); + } + NSMutableArray *> *stack = [NSMutableArray new]; for (const JsErrorHandler::ParsedError::StackFrame &frame : error.stack) { - [stack addObject:@{ - @"file" : frame.file ? @((*frame.file).c_str()) : [NSNull null], - @"methodName" : @(frame.methodName.c_str()), - @"lineNumber" : frame.lineNumber ? @(*frame.lineNumber) : [NSNull null], - @"column" : frame.column ? @(*frame.column) : [NSNull null], - }]; + NSMutableDictionary *stackFrame = [NSMutableDictionary new]; + if (frame.file) { + stackFrame[@"file"] = @(frame.file->c_str()); + } + stackFrame[@"methodName"] = @(frame.methodName.c_str()); + if (frame.lineNumber) { + stackFrame[@"lineNumber"] = @(*frame.lineNumber); + } + if (frame.column) { + stackFrame[@"column"] = @(*frame.column); + } + [stack addObject:stackFrame]; } - NSString *originalMessage = error.originalMessage ? @(error.originalMessage->c_str()) : nil; - NSString *name = error.name ? @(error.name->c_str()) : nil; - NSString *componentStack = error.componentStack ? @(error.componentStack->c_str()) : nil; + errorData[@"stack"] = stack; + errorData[@"id"] = @(error.id); + errorData[@"isFatal"] = @(error.isFatal); + id extraData = TurboModuleConvertUtils::convertJSIValueToObjCObject(runtime, jsi::Value(runtime, error.extraData), nullptr); + if (extraData) { + errorData[@"extraData"] = extraData; + } - [_delegate instance:self - didReceiveJSErrorStack:stack - message:message - originalMessage:originalMessage - name:name - componentStack:componentStack - exceptionId:error.id - isFatal:error.isFatal - extraData:extraData]; + JS::NativeExceptionsManager::ExceptionData jsErrorData{errorData}; + id exceptionsManager = [_turboModuleManager moduleForName:"ExceptionsManager"]; + [exceptionsManager reportException:jsErrorData]; } @end