Skip to content

Commit

Permalink
Merge pull request #10 from tokorom/t9-fix
Browse files Browse the repository at this point in the history
Fix #9 Support most return value type
  • Loading branch information
tokorom committed Apr 7, 2013
2 parents 7dd2bbb + 1236639 commit 6e5712b
Show file tree
Hide file tree
Showing 20 changed files with 552 additions and 88 deletions.
4 changes: 2 additions & 2 deletions BlockInjection.podspec
@@ -1,11 +1,11 @@
Pod::Spec.new do |s|
s.name = "BlockInjection"
s.version = "0.6.1"
s.version = "0.6.2"
s.summary = "You can insert some Blocks before and after the method."
s.homepage = "https://github.com/tokorom/BlockInjection"
s.license = 'MIT'
s.author = { "tokorom" => "tokorom@gmail.com" }
s.source = { :git => "https://github.com/tokorom/BlockInjection.git", :tag => "0.6.1" }
s.source = { :git => "https://github.com/tokorom/BlockInjection.git", :tag => "0.6.2" }
s.source_files = 'BlockInjection'
s.requires_arc = true

Expand Down
1 change: 0 additions & 1 deletion BlockInjection/BIItem.m
Expand Up @@ -90,7 +90,6 @@ - (void*)invokeWithTarget:(id)target args:(va_list*)args
[invocation setSelector:self.originalSel];
[invocation invoke];
// Get return value
NSUInteger returnLength = [[invocation methodSignature] methodReturnLength];
if (returnLength && result) {
[invocation getReturnValue:result];
}
Expand Down
126 changes: 118 additions & 8 deletions BlockInjection/BILib.m
Expand Up @@ -8,6 +8,54 @@
#import "BIItem.h"
#import "BIItemManager.h"
#import <objc/runtime.h>
#import "BILibDummyStruct.h"

#define REPLACEBLOCK_FOR_VOID \
^(id target, ...){ \
[[BIItemManager sharedInstance] setCurrentItem:item]; \
va_list argp; \
va_start(argp, target); \
[item invokeWithTarget:target args:&argp]; \
va_end(argp); \
}

#define REPLACEBLOCK_FOR(type) \
^(id target, ...){ \
[[BIItemManager sharedInstance] setCurrentItem:item]; \
va_list argp; \
va_start(argp, target); \
void* retp = [item invokeWithTarget:target args:&argp]; \
va_end(argp); \
return *(type*)retp; \
}

#define REPLACE_BLOCK_FOR_STRUCT_CASE(cas) case cas: return REPLACEBLOCK_FOR(BILibStruct##cas)

#define EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf) \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 0); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 1); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 2); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 3); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 4); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 5); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 6); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 7); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 8); \
REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 9)

#define EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf) \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 0); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 1); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 2); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 3); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 4); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 5); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 6); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 7); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 8); \
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(prf ## 9)

#pragma mark - BILib

@implementation BILib

Expand Down Expand Up @@ -236,18 +284,80 @@ + (void)savePreprocess:(id)preprocess andPostprocess:(id)postprocess withItem:(B
+ (void)replaceImplementationWithItem:(BIItem*)item
{
if (item.signature) {
id replaceBlock = ^(id target, ...){
[[BIItemManager sharedInstance] setCurrentItem:item];
va_list argp;
va_start(argp, target);
void* retp = [item invokeWithTarget:target args:&argp];
va_end(argp);
return retp ? *(void**)retp : NULL;
};
id replaceBlock;
NSUInteger returnLength = [item.signature methodReturnLength];
const char* returnType = [item.signature methodReturnType];
if (NULL == returnType || 0 == strlen(returnType)) {
replaceBlock = REPLACEBLOCK_FOR_VOID;
} else {
char prefix = returnType[0];
char type = returnType[strlen(returnType) - 1];
if ('^' == prefix || '{' == prefix) {
type = prefix;
}
switch (type) {
case 'v': { replaceBlock = REPLACEBLOCK_FOR_VOID; } break;
//case 'c': { replaceBlock = REPLACEBLOCK_FOR(char); } break;
//case 'i': { replaceBlock = REPLACEBLOCK_FOR(int); } break;
//case 's': { replaceBlock = REPLACEBLOCK_FOR(short); } break;
//case 'l': { replaceBlock = REPLACEBLOCK_FOR(long); } break;
//case 'q': { replaceBlock = REPLACEBLOCK_FOR(long long); } break;
//case 'C': { replaceBlock = REPLACEBLOCK_FOR(unsigned char); } break;
//case 'I': { replaceBlock = REPLACEBLOCK_FOR(unsigned int); } break;
//case 'S': { replaceBlock = REPLACEBLOCK_FOR(unsigned short); } break;
//case 'L': { replaceBlock = REPLACEBLOCK_FOR(unsigned long); } break;
//case 'Q': { replaceBlock = REPLACEBLOCK_FOR(unsigned long long); } break;
case 'f': { replaceBlock = REPLACEBLOCK_FOR(float); } break;
case 'd': { replaceBlock = REPLACEBLOCK_FOR(double); } break;
//case 'B': { replaceBlock = REPLACEBLOCK_FOR(bool); } break;
//case '*': { replaceBlock = REPLACEBLOCK_FOR(void*); } break;
//case '@': { replaceBlock = REPLACEBLOCK_FOR(void*); } break;
//case '#': { replaceBlock = REPLACEBLOCK_FOR(Class); } break;
//case ':': { replaceBlock = REPLACEBLOCK_FOR(SEL); } break;
case '{': { replaceBlock = [BILib replaceBlockForStructWithSize:returnLength withItem:item]; } break;
//case '^': { replaceBlock = REPLACEBLOCK_FOR(int*); } break;
default: { replaceBlock = REPLACEBLOCK_FOR(int); } break;
}
}
method_setImplementation(item.originalMethod, imp_implementationWithBlock(replaceBlock));
}
}

+ (id)replaceBlockForStructWithSize:(NSUInteger)size withItem:(BIItem*)item
{
switch (size) {
REPLACE_BLOCK_FOR_STRUCT_CASE(1);
REPLACE_BLOCK_FOR_STRUCT_CASE(2);
REPLACE_BLOCK_FOR_STRUCT_CASE(3);
REPLACE_BLOCK_FOR_STRUCT_CASE(4);
REPLACE_BLOCK_FOR_STRUCT_CASE(5);
REPLACE_BLOCK_FOR_STRUCT_CASE(6);
REPLACE_BLOCK_FOR_STRUCT_CASE(7);
REPLACE_BLOCK_FOR_STRUCT_CASE(8);
REPLACE_BLOCK_FOR_STRUCT_CASE(9);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(1);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(2);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(3);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(4);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(5);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(6);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(7);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(8);
EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(9);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(1);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(2);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(3);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(4);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(5);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(6);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(7);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(8);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(9);
EXPAND_EXPAND_REPLACE_BLOCK_FOR_STRUCT_CASE(10);
default: return REPLACEBLOCK_FOR(int);
}
}

+ (NSArray*)classesWithRegex:(NSRegularExpression*)regex
{
@autoreleasepool {
Expand Down
63 changes: 1 addition & 62 deletions BlockInjection/BILibArg.m
Expand Up @@ -5,68 +5,7 @@
//

#import "BILibArg.h"

#define BILIBARG_STRUCT(siz) struct bilib_struct_##siz { char buff[siz]; }

#define EXPAND_BITBARG_STRUCT(prf) \
BILIBARG_STRUCT(prf ## 00); \
BILIBARG_STRUCT(prf ## 04); \
BILIBARG_STRUCT(prf ## 08); \
BILIBARG_STRUCT(prf ## 12); \
BILIBARG_STRUCT(prf ## 16); \
BILIBARG_STRUCT(prf ## 20); \
BILIBARG_STRUCT(prf ## 24); \
BILIBARG_STRUCT(prf ## 28); \
BILIBARG_STRUCT(prf ## 32); \
BILIBARG_STRUCT(prf ## 36); \
BILIBARG_STRUCT(prf ## 40); \
BILIBARG_STRUCT(prf ## 44); \
BILIBARG_STRUCT(prf ## 48); \
BILIBARG_STRUCT(prf ## 52); \
BILIBARG_STRUCT(prf ## 56); \
BILIBARG_STRUCT(prf ## 60); \
BILIBARG_STRUCT(prf ## 64); \
BILIBARG_STRUCT(prf ## 68); \
BILIBARG_STRUCT(prf ## 72); \
BILIBARG_STRUCT(prf ## 76); \
BILIBARG_STRUCT(prf ## 80); \
BILIBARG_STRUCT(prf ## 84); \
BILIBARG_STRUCT(prf ## 88); \
BILIBARG_STRUCT(prf ## 92); \
BILIBARG_STRUCT(prf ## 96)

BILIBARG_STRUCT(12);
BILIBARG_STRUCT(16);
BILIBARG_STRUCT(20);
BILIBARG_STRUCT(24);
BILIBARG_STRUCT(28);
BILIBARG_STRUCT(32);
BILIBARG_STRUCT(36);
BILIBARG_STRUCT(40);
BILIBARG_STRUCT(44);
BILIBARG_STRUCT(48);
BILIBARG_STRUCT(52);
BILIBARG_STRUCT(56);
BILIBARG_STRUCT(60);
BILIBARG_STRUCT(64);
BILIBARG_STRUCT(68);
BILIBARG_STRUCT(72);
BILIBARG_STRUCT(76);
BILIBARG_STRUCT(80);
BILIBARG_STRUCT(84);
BILIBARG_STRUCT(88);
BILIBARG_STRUCT(92);
BILIBARG_STRUCT(96);
EXPAND_BITBARG_STRUCT(1);
EXPAND_BITBARG_STRUCT(2);
EXPAND_BITBARG_STRUCT(3);
EXPAND_BITBARG_STRUCT(4);
EXPAND_BITBARG_STRUCT(5);
EXPAND_BITBARG_STRUCT(6);
EXPAND_BITBARG_STRUCT(7);
EXPAND_BITBARG_STRUCT(8);
EXPAND_BITBARG_STRUCT(9);
EXPAND_BITBARG_STRUCT(10);
#import "BILibDummyStruct.h"

#define ELSE_BILIBARG(siz) } else if (siz >= size) { \
struct bilib_struct_##siz arg = va_arg(*pargp, struct bilib_struct_##siz); \
Expand Down
62 changes: 62 additions & 0 deletions BlockInjection/BILibDummyStruct.h
@@ -0,0 +1,62 @@
//
// BILibDummyStruct.h
//
// Created by ToKoRo on 2013-04-08.
//

#define BILIB_STRUCT_DECLARATION(siz) typedef struct bilib_struct_##siz { char buff[siz]; } BILibStruct##siz

#define EXPAND_BITBARG_STRUCT(prf) \
BILIB_STRUCT_DECLARATION(prf ## 0); \
BILIB_STRUCT_DECLARATION(prf ## 1); \
BILIB_STRUCT_DECLARATION(prf ## 2); \
BILIB_STRUCT_DECLARATION(prf ## 3); \
BILIB_STRUCT_DECLARATION(prf ## 4); \
BILIB_STRUCT_DECLARATION(prf ## 5); \
BILIB_STRUCT_DECLARATION(prf ## 6); \
BILIB_STRUCT_DECLARATION(prf ## 7); \
BILIB_STRUCT_DECLARATION(prf ## 8); \
BILIB_STRUCT_DECLARATION(prf ## 9)

#define EXPAND_EXPAND_BITBARG_STRUCT(prf) \
EXPAND_BITBARG_STRUCT(prf ## 0); \
EXPAND_BITBARG_STRUCT(prf ## 1); \
EXPAND_BITBARG_STRUCT(prf ## 2); \
EXPAND_BITBARG_STRUCT(prf ## 3); \
EXPAND_BITBARG_STRUCT(prf ## 4); \
EXPAND_BITBARG_STRUCT(prf ## 5); \
EXPAND_BITBARG_STRUCT(prf ## 6); \
EXPAND_BITBARG_STRUCT(prf ## 7); \
EXPAND_BITBARG_STRUCT(prf ## 8); \
EXPAND_BITBARG_STRUCT(prf ## 9)

BILIB_STRUCT_DECLARATION(1);
BILIB_STRUCT_DECLARATION(2);
BILIB_STRUCT_DECLARATION(3);
BILIB_STRUCT_DECLARATION(4);
BILIB_STRUCT_DECLARATION(5);
BILIB_STRUCT_DECLARATION(6);
BILIB_STRUCT_DECLARATION(7);
BILIB_STRUCT_DECLARATION(8);
BILIB_STRUCT_DECLARATION(9);

EXPAND_BITBARG_STRUCT(1);
EXPAND_BITBARG_STRUCT(2);
EXPAND_BITBARG_STRUCT(3);
EXPAND_BITBARG_STRUCT(4);
EXPAND_BITBARG_STRUCT(5);
EXPAND_BITBARG_STRUCT(6);
EXPAND_BITBARG_STRUCT(7);
EXPAND_BITBARG_STRUCT(8);
EXPAND_BITBARG_STRUCT(9);

EXPAND_EXPAND_BITBARG_STRUCT(1);
EXPAND_EXPAND_BITBARG_STRUCT(2);
EXPAND_EXPAND_BITBARG_STRUCT(3);
EXPAND_EXPAND_BITBARG_STRUCT(4);
EXPAND_EXPAND_BITBARG_STRUCT(5);
EXPAND_EXPAND_BITBARG_STRUCT(6);
EXPAND_EXPAND_BITBARG_STRUCT(7);
EXPAND_EXPAND_BITBARG_STRUCT(8);
EXPAND_EXPAND_BITBARG_STRUCT(9);
EXPAND_EXPAND_BITBARG_STRUCT(10);

0 comments on commit 6e5712b

Please sign in to comment.