diff --git a/Classes/Utility/Runtime/FLEXRuntimeUtility.m b/Classes/Utility/Runtime/FLEXRuntimeUtility.m index 31a03b3474..b9cd77c777 100644 --- a/Classes/Utility/Runtime/FLEXRuntimeUtility.m +++ b/Classes/Utility/Runtime/FLEXRuntimeUtility.m @@ -10,6 +10,7 @@ #import "FLEXRuntimeUtility.h" #import "FLEXObjcInternal.h" #import "FLEXTypeEncodingParser.h" +#import "FLEXMethod.h" NSString * const FLEXRuntimeUtilityErrorDomain = @"FLEXRuntimeUtilityErrorDomain"; @@ -332,15 +333,14 @@ + (id)performSelector:(SEL)selector return nil; } - NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:({ - Method method; - if (object_isClass(object)) { - method = class_getClassMethod(object, selector); - } else { - method = class_getInstanceMethod(object_getClass(object), selector); - } - method_getTypeEncoding(method); - })]; + // It is important to use object_getClass and not -class here, as + // object_getClass will return a different result for class objects + Class cls = object_getClass(object); + NSMethodSignature *methodSignature = [FLEXMethod selector:selector class:cls].signature; + if (!methodSignature) { + // Unsupported type encoding + return nil; + } // Probably an unsupported type encoding, like bitfields. // In the future, we could calculate the return length @@ -362,7 +362,7 @@ + (id)performSelector:(SEL)selector [invocation retainArguments]; // Always self and _cmd - NSUInteger numberOfArguments = [methodSignature numberOfArguments]; + NSUInteger numberOfArguments = methodSignature.numberOfArguments; for (NSUInteger argumentIndex = kFLEXNumberOfImplicitArgs; argumentIndex < numberOfArguments; argumentIndex++) { NSUInteger argumentsArrayIndex = argumentIndex - kFLEXNumberOfImplicitArgs; id argumentObject = arguments.count > argumentsArrayIndex ? arguments[argumentsArrayIndex] : nil;