mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-02-02 09:08:58 +08:00
Fixed bug where method calls containing struct arguments would fail silently
Summary: The arg block for handling structs did not return a value, which was being intepreted as failure. This diff returns YES for success, and also adds an error log for this case so future regressions won't fail silently.
This commit is contained in:
@@ -35,6 +35,9 @@ static BOOL RCTLogsError(void (^block)(void))
|
||||
@end
|
||||
|
||||
@implementation RCTModuleMethodTests
|
||||
{
|
||||
CGRect _s;
|
||||
}
|
||||
|
||||
- (void)doFooWithBar:(__unused NSString *)bar { }
|
||||
|
||||
@@ -56,6 +59,7 @@ static BOOL RCTLogsError(void (^block)(void))
|
||||
- (void)doFooWithNumber:(__unused NSNumber *)n { }
|
||||
- (void)doFooWithDouble:(__unused double)n { }
|
||||
- (void)doFooWithInteger:(__unused NSInteger)n { }
|
||||
- (void)doFooWithCGRect:(CGRect)s { _s = s; }
|
||||
|
||||
- (void)testNumbersNonnull
|
||||
{
|
||||
@@ -102,4 +106,16 @@ static BOOL RCTLogsError(void (^block)(void))
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testStructArgument
|
||||
{
|
||||
NSString *methodName = @"doFooWithCGRect:(CGRect)s";
|
||||
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
|
||||
JSMethodName:nil
|
||||
moduleClass:[self class]];
|
||||
|
||||
CGRect r = CGRectMake(10, 20, 30, 40);
|
||||
[method invokeWithBridge:nil module:self arguments:@[@[@10, @20, @30, @40]]];
|
||||
XCTAssertTrue(CGRectEqualToRect(r, _s));
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -237,17 +237,14 @@ void RCTParseObjCMethodName(NSString **objCMethodName, NSArray **arguments)
|
||||
[typeInvocation setSelector:selector];
|
||||
[typeInvocation setTarget:[RCTConvert class]];
|
||||
|
||||
[argumentBlocks addObject:
|
||||
^(__unused RCTBridge *bridge, NSUInteger index, id json) {
|
||||
|
||||
[argumentBlocks addObject:^(__unused RCTBridge *bridge, NSUInteger index, id json) {
|
||||
void *returnValue = malloc(typeSignature.methodReturnLength);
|
||||
[typeInvocation setArgument:&json atIndex:2];
|
||||
[typeInvocation invoke];
|
||||
[typeInvocation getReturnValue:returnValue];
|
||||
|
||||
[invocation setArgument:returnValue atIndex:index + 2];
|
||||
|
||||
free(returnValue);
|
||||
return YES;
|
||||
}];
|
||||
break;
|
||||
}
|
||||
@@ -411,6 +408,8 @@ void RCTParseObjCMethodName(NSString **objCMethodName, NSArray **arguments)
|
||||
RCTArgumentBlock block = _argumentBlocks[index];
|
||||
if (!block(bridge, index, RCTNilIfNull(json))) {
|
||||
// Invalid argument, abort
|
||||
RCTLogArgumentError(self, index, json,
|
||||
"could not be processed. Aborting method call.");
|
||||
return;
|
||||
}
|
||||
index++;
|
||||
|
||||
Reference in New Issue
Block a user