Skip to content

Commit bf7eebb

Browse files
authored
Fix debug mode crash found internally (#3085)
1 parent e99d929 commit bf7eebb

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

GoogleUtilities/MethodSwizzler/GULSwizzler.m

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,17 @@ + (void)swizzleClass:(Class)aClass
5757
Class class = NSClassFromString(@"GULSwizzlingCache");
5858
if (class) {
5959
SEL cacheSelector = NSSelectorFromString(@"cacheCurrentIMP:forNewIMP:forClass:withSelector:");
60-
NSInvocation *inv = [NSInvocation
61-
invocationWithMethodSignature:[class methodSignatureForSelector:cacheSelector]];
62-
[inv setSelector:cacheSelector];
63-
[inv setTarget:class];
64-
[inv setArgument:&(currentImp) atIndex:2];
65-
[inv setArgument:&(newImp) atIndex:3];
66-
[inv setArgument:&(resolvedClass) atIndex:4];
67-
[inv setArgument:(void *_Nonnull) & (selector) atIndex:5];
68-
[inv invoke];
60+
NSMethodSignature *methodSignature = [class methodSignatureForSelector:cacheSelector];
61+
if (methodSignature != nil) {
62+
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSignature];
63+
[inv setSelector:cacheSelector];
64+
[inv setTarget:class];
65+
[inv setArgument:&(currentImp) atIndex:2];
66+
[inv setArgument:&(newImp) atIndex:3];
67+
[inv setArgument:&(resolvedClass) atIndex:4];
68+
[inv setArgument:(void *_Nonnull) & (selector) atIndex:5];
69+
[inv invoke];
70+
}
6971
}
7072
#endif
7173

@@ -77,20 +79,22 @@ + (void)swizzleClass:(Class)aClass
7779
// If !originalImpOfClass, then the IMP came from a superclass.
7880
if (originalImpOfClass) {
7981
SEL selector = NSSelectorFromString(@"originalIMPOfCurrentIMP:");
80-
NSInvocation *inv =
81-
[NSInvocation invocationWithMethodSignature:[class methodSignatureForSelector:selector]];
82-
[inv setSelector:selector];
83-
[inv setTarget:class];
84-
[inv setArgument:&(currentImp) atIndex:2];
85-
[inv invoke];
86-
IMP testOriginal;
87-
[inv getReturnValue:&testOriginal];
88-
if (originalImpOfClass != testOriginal) {
89-
GULLogWarning(kGULLoggerSwizzler, NO,
90-
[NSString stringWithFormat:@"I-SWZ%06ld",
91-
(long)kGULSwizzlerMessageCodeMethodSwizzling000],
92-
@"Swizzling class: %@ SEL:%@ after it has been previously been swizzled.",
93-
NSStringFromClass(resolvedClass), NSStringFromSelector(selector));
82+
NSMethodSignature *methodSignature = [class methodSignatureForSelector:selector];
83+
if (methodSignature != nil) {
84+
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSignature];
85+
[inv setSelector:selector];
86+
[inv setTarget:class];
87+
[inv setArgument:&(currentImp) atIndex:2];
88+
[inv invoke];
89+
IMP testOriginal;
90+
[inv getReturnValue:&testOriginal];
91+
if (originalImpOfClass != testOriginal) {
92+
GULLogWarning(kGULLoggerSwizzler, NO,
93+
[NSString stringWithFormat:@"I-SWZ%06ld",
94+
(long)kGULSwizzlerMessageCodeMethodSwizzling000],
95+
@"Swizzling class: %@ SEL:%@ after it has been previously been swizzled.",
96+
NSStringFromClass(resolvedClass), NSStringFromSelector(selector));
97+
}
9498
}
9599
}
96100
#endif

0 commit comments

Comments
 (0)