Skip to content

Commit 905c19a

Browse files
RSNarafacebook-github-bot
authored andcommitted
earlyjs: Integrate c++ pipeline with all ios apps (facebook#47168)
Summary: Pull Request resolved: facebook#47168 Now, all ios apps will just be integrated with the c++ error reporting pipeline, with zero configuration. Changelog: [Internal] Reviewed By: javache, philIip Differential Revision: D64615457
1 parent 49a6a1b commit 905c19a

File tree

7 files changed

+76
-51
lines changed

7 files changed

+76
-51
lines changed

packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,18 +181,6 @@ - (void)hostDidStart:(RCTHost *)host
181181
{
182182
}
183183

184-
- (void)host:(RCTHost *)host
185-
didReceiveJSErrorStack:(NSArray<NSDictionary<NSString *, id> *> *)stack
186-
message:(NSString *)message
187-
originalMessage:(NSString *_Nullable)originalMessage
188-
name:(NSString *_Nullable)name
189-
componentStack:(NSString *_Nullable)componentStack
190-
exceptionId:(NSUInteger)exceptionId
191-
isFatal:(BOOL)isFatal
192-
extraData:(NSDictionary<NSString *, id> *)extraData
193-
{
194-
}
195-
196184
#pragma mark - Bridge and Bridge Adapter properties
197185

198186
- (RCTBridge *)bridge

packages/react-native/React/CoreModules/RCTExceptionsManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN
3434
- (void)reportJsException:(nullable NSString *)message
3535
stack:(nullable NSArray<NSDictionary *> *)stack
3636
exceptionId:(double)exceptionId
37-
isFatal:(bool)isFatal;
37+
isFatal:(bool)isFatal __attribute__((deprecated));
3838

3939
@property (nonatomic, weak) id<RCTExceptionsManagerDelegate> delegate;
4040

packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ Pod::Spec.new do |s|
7171
s.dependency "React-jsinspector"
7272
s.dependency "React-featureflags"
7373

74+
add_dependency(s, "ReactCodegen")
75+
7476
if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
7577
s.dependency "hermes-engine"
7678
s.dependency "React-RuntimeHermes"

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ typedef NSURL *_Nullable (^RCTHostBundleURLProvider)(void);
2727

2828
@protocol RCTHostDelegate <NSObject>
2929

30+
- (void)hostDidStart:(RCTHost *)host;
31+
32+
@optional
33+
- (void)loadBundleAtURL:(NSURL *)sourceURL
34+
onProgress:(RCTSourceLoadProgressBlock)onProgress
35+
onComplete:(RCTSourceLoadBlock)loadCallback;
36+
37+
// TODO(T205780509): Remove this api in react native v0.78
38+
// The bridgeless js error handling api will just call into exceptionsmanager directly
3039
- (void)host:(RCTHost *)host
3140
didReceiveJSErrorStack:(NSArray<NSDictionary<NSString *, id> *> *)stack
3241
message:(NSString *)message
@@ -35,15 +44,7 @@ typedef NSURL *_Nullable (^RCTHostBundleURLProvider)(void);
3544
componentStack:(NSString *_Nullable)componentStack
3645
exceptionId:(NSUInteger)exceptionId
3746
isFatal:(BOOL)isFatal
38-
extraData:(NSDictionary<NSString *, id> *)extraData;
39-
40-
- (void)hostDidStart:(RCTHost *)host;
41-
42-
@optional
43-
- (void)loadBundleAtURL:(NSURL *)sourceURL
44-
onProgress:(RCTSourceLoadProgressBlock)onProgress
45-
onComplete:(RCTSourceLoadBlock)loadCallback;
46-
47+
extraData:(NSDictionary<NSString *, id> *)extraData __attribute__((deprecated));
4748
@end
4849

4950
@protocol RCTHostRuntimeDelegate <NSObject>

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ - (void)dealloc
315315

316316
#pragma mark - RCTInstanceDelegate
317317

318-
- (void)instance:(RCTInstance *)instance
318+
- (BOOL)instance:(RCTInstance *)instance
319319
didReceiveJSErrorStack:(NSArray<NSDictionary<NSString *, id> *> *)stack
320320
message:(NSString *)message
321321
originalMessage:(NSString *_Nullable)originalMessage
@@ -325,6 +325,12 @@ - (void)instance:(RCTInstance *)instance
325325
isFatal:(BOOL)isFatal
326326
extraData:(NSDictionary<NSString *, id> *)extraData
327327
{
328+
if (![_hostDelegate respondsToSelector:@selector(host:
329+
didReceiveJSErrorStack:message:originalMessage:name:componentStack
330+
:exceptionId:isFatal:extraData:)]) {
331+
return NO;
332+
}
333+
328334
[_hostDelegate host:self
329335
didReceiveJSErrorStack:stack
330336
message:message
@@ -334,6 +340,7 @@ - (void)instance:(RCTInstance *)instance
334340
exceptionId:exceptionId
335341
isFatal:isFatal
336342
extraData:extraData];
343+
return YES;
337344
}
338345

339346
- (void)instance:(RCTInstance *)instance didInitializeRuntime:(facebook::jsi::Runtime &)runtime

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,23 @@ RCT_EXTERN void RCTInstanceSetRuntimeDiagnosticFlags(NSString *_Nullable flags);
3737

3838
@protocol RCTInstanceDelegate <RCTContextContainerHandling>
3939

40-
- (void)instance:(RCTInstance *)instance
40+
- (void)instance:(RCTInstance *)instance didInitializeRuntime:(facebook::jsi::Runtime &)runtime;
41+
42+
- (void)loadBundleAtURL:(NSURL *)sourceURL
43+
onProgress:(RCTSourceLoadProgressBlock)onProgress
44+
onComplete:(RCTSourceLoadBlock)loadCallback;
45+
46+
// TODO(T205780509): Remove this api in react native v0.78
47+
// The bridgeless js error handling api will just call into exceptionsmanager directly
48+
- (BOOL)instance:(RCTInstance *)instance
4149
didReceiveJSErrorStack:(NSArray<NSDictionary<NSString *, id> *> *)stack
4250
message:(NSString *)message
4351
originalMessage:(NSString *_Nullable)originalMessage
4452
name:(NSString *_Nullable)name
4553
componentStack:(NSString *_Nullable)componentStack
4654
exceptionId:(NSUInteger)exceptionId
4755
isFatal:(BOOL)isFatal
48-
extraData:(NSDictionary<NSString *, id> *)extraData;
49-
50-
- (void)instance:(RCTInstance *)instance didInitializeRuntime:(facebook::jsi::Runtime &)runtime;
51-
52-
- (void)loadBundleAtURL:(NSURL *)sourceURL
53-
onProgress:(RCTSourceLoadProgressBlock)onProgress
54-
onComplete:(RCTSourceLoadBlock)loadCallback;
55-
56+
extraData:(NSDictionary<NSString *, id> *)extraData __attribute__((deprecated));
5657
@end
5758

5859
/**

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#import <memory>
1111

12+
#import <FBReactNativeSpec/FBReactNativeSpec.h>
1213
#import <React/NSDataBigString.h>
1314
#import <React/RCTAssert.h>
1415
#import <React/RCTBridge+Inspector.h>
@@ -468,32 +469,57 @@ - (void)_loadScriptFromSource:(RCTSource *)source
468469

469470
- (void)_handleJSError:(const JsErrorHandler::ParsedError &)error withRuntime:(jsi::Runtime &)runtime
470471
{
471-
NSString *message = @(error.message.c_str());
472+
NSMutableDictionary<NSString *, id> *errorData = [NSMutableDictionary new];
473+
errorData[@"message"] = @(error.message.c_str());
474+
if (error.originalMessage) {
475+
errorData[@"originalMessage"] = @(error.originalMessage->c_str());
476+
}
477+
if (error.name) {
478+
errorData[@"name"] = @(error.name->c_str());
479+
}
480+
if (error.componentStack) {
481+
errorData[@"componentStack"] = @(error.componentStack->c_str());
482+
}
483+
472484
NSMutableArray<NSDictionary<NSString *, id> *> *stack = [NSMutableArray new];
473485
for (const JsErrorHandler::ParsedError::StackFrame &frame : error.stack) {
474-
[stack addObject:@{
475-
@"file" : frame.file ? @((*frame.file).c_str()) : [NSNull null],
476-
@"methodName" : @(frame.methodName.c_str()),
477-
@"lineNumber" : frame.lineNumber ? @(*frame.lineNumber) : [NSNull null],
478-
@"column" : frame.column ? @(*frame.column) : [NSNull null],
479-
}];
486+
NSMutableDictionary<NSString *, id> *stackFrame = [NSMutableDictionary new];
487+
if (frame.file) {
488+
stackFrame[@"file"] = @(frame.file->c_str());
489+
}
490+
stackFrame[@"methodName"] = @(frame.methodName.c_str());
491+
if (frame.lineNumber) {
492+
stackFrame[@"lineNumber"] = @(*frame.lineNumber);
493+
}
494+
if (frame.column) {
495+
stackFrame[@"column"] = @(*frame.column);
496+
}
497+
[stack addObject:stackFrame];
480498
}
481499

482-
NSString *originalMessage = error.originalMessage ? @(error.originalMessage->c_str()) : nil;
483-
NSString *name = error.name ? @(error.name->c_str()) : nil;
484-
NSString *componentStack = error.componentStack ? @(error.componentStack->c_str()) : nil;
500+
errorData[@"stack"] = stack;
501+
errorData[@"id"] = @(error.id);
502+
errorData[@"isFatal"] = @(error.isFatal);
503+
485504
id extraData =
486505
TurboModuleConvertUtils::convertJSIValueToObjCObject(runtime, jsi::Value(runtime, error.extraData), nullptr);
506+
if (extraData) {
507+
errorData[@"extraData"] = extraData;
508+
}
487509

488-
[_delegate instance:self
489-
didReceiveJSErrorStack:stack
490-
message:message
491-
originalMessage:originalMessage
492-
name:name
493-
componentStack:componentStack
494-
exceptionId:error.id
495-
isFatal:error.isFatal
496-
extraData:extraData];
510+
if (![_delegate instance:self
511+
didReceiveJSErrorStack:errorData[@"stack"]
512+
message:errorData[@"message"]
513+
originalMessage:errorData[@"originalMessage"]
514+
name:errorData[@"name"]
515+
componentStack:errorData[@"componentStack"]
516+
exceptionId:error.id
517+
isFatal:errorData[@"isFatal"]
518+
extraData:errorData[@"extraData"]]) {
519+
JS::NativeExceptionsManager::ExceptionData jsErrorData{errorData};
520+
id<NativeExceptionsManagerSpec> exceptionsManager = [_turboModuleManager moduleForName:"ExceptionsManager"];
521+
[exceptionsManager reportException:jsErrorData];
522+
}
497523
}
498524

499525
@end

0 commit comments

Comments
 (0)