blob: 68c8c3ada4d6f4399056bf785a5ee323d0f2c5d2 [file] [log] [blame]
//
// WXDebuggerUtility.m
// Pods
//
// Created by yangshengtao on 16/12/30.
//
//
#import "WXDebuggerUtility.h"
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
@implementation WXDebuggerUtility
+ (id)switchInvocationReture:(NSInvocation *)invocation {
if (!invocation) {
return nil;
}
const char * returnType = [invocation.methodSignature methodReturnType];
id returnValue;
switch (returnType[0] == _C_CONST ? returnType[1] : returnType[0]) {
case _C_ID: {
// 1.id
void *value;
[invocation getReturnValue:&value];
id object = (__bridge id)value;
returnValue = object;
break;
}
#define WXDEVTOOL_ID_RET_CASE(typeString, type) \
case typeString: { \
type value; \
[invocation getReturnValue:&value]; \
returnValue = @(value); \
break; \
}
// 2.number
WXDEVTOOL_ID_RET_CASE(_C_CHR, char)
WXDEVTOOL_ID_RET_CASE(_C_UCHR, unsigned char)
WXDEVTOOL_ID_RET_CASE(_C_SHT, short)
WXDEVTOOL_ID_RET_CASE(_C_USHT, unsigned short)
WXDEVTOOL_ID_RET_CASE(_C_INT, int)
WXDEVTOOL_ID_RET_CASE(_C_UINT, unsigned int)
WXDEVTOOL_ID_RET_CASE(_C_LNG, long)
WXDEVTOOL_ID_RET_CASE(_C_ULNG, unsigned long)
WXDEVTOOL_ID_RET_CASE(_C_LNG_LNG, long long)
WXDEVTOOL_ID_RET_CASE(_C_ULNG_LNG, unsigned long long)
WXDEVTOOL_ID_RET_CASE(_C_FLT, float)
WXDEVTOOL_ID_RET_CASE(_C_DBL, double)
WXDEVTOOL_ID_RET_CASE(_C_BOOL, BOOL)
case _C_STRUCT_B: {
NSString *typeString = [NSString stringWithUTF8String:returnType];
if ([typeString rangeOfString:@"NSRange"].location != NSNotFound) {
NSRange range;
[invocation getReturnValue:&range];
returnValue = NSStringFromRange(range);
break;
}
#define WXDEVTOOL_STRUCT_FUNCTION(_type) NSStringFrom ## _type
#define WXDEVTOOL_STRUCT_RET_CASE(_type) \
if ([typeString rangeOfString:@#_type].location != NSNotFound) { \
_type value; \
[invocation getReturnValue:&value]; \
returnValue = WXDEVTOOL_STRUCT_FUNCTION(_type)(value); \
break; \
}
// 4.struct
WXDEVTOOL_STRUCT_RET_CASE(CGRect)
WXDEVTOOL_STRUCT_RET_CASE(CGPoint)
WXDEVTOOL_STRUCT_RET_CASE(CGSize)
}
case _C_CHARPTR:
case _C_PTR:
case _C_VOID:
case _C_CLASS: {
returnValue = nil;
break;
}
}
return returnValue;
}
@end