diff --git a/Test/CMakeLists.txt b/Test/CMakeLists.txt index 8e253ae..caafefe 100644 --- a/Test/CMakeLists.txt +++ b/Test/CMakeLists.txt @@ -26,6 +26,7 @@ set(TESTS WeakReferences_arc.m objc_msgSend.m msgInterpose.m + MethodArguments.m ) # Function for adding a test. This takes the name of the test and the list of diff --git a/Test/MethodArguments.m b/Test/MethodArguments.m new file mode 100644 index 0000000..30dac38 --- /dev/null +++ b/Test/MethodArguments.m @@ -0,0 +1,91 @@ +#import "Test.h" +#include +#include +#include +#include + +#ifdef __has_attribute +#if __has_attribute(objc_root_class) +__attribute__((objc_root_class)) +#endif +#endif +@interface Foo +-(id)bar; +-(void)setBar:(id)b; +@end +@implementation Foo +- (id)bar +{ + return nil; +} + +- (void)setBar: (id)b +{ + return; +} +@end + +int main(void) +{ + Class foo = objc_getClass("Foo"); + Method barMethod = class_getInstanceMethod(foo, @selector(bar)); + Method setBarMethod = class_getInstanceMethod(foo,@selector(setBar:)); + char arg[16]; + + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getReturnType(barMethod, &arg[0], 16); + assert(0 == strcmp(&arg[0],"@")); + + char* expected[3] = {"@", ":", "" }; + for (int i = 0; i < 3; i++) + { + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getArgumentType(barMethod, i, &arg[0], 16); + assert(0 == strcmp(&arg[0],expected[i])); + } + + + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getReturnType(setBarMethod, &arg[0], 16); + assert(0 == strcmp(&arg[0],"v")); + + expected[2] = "@"; + + for (int i = 0; i < 3; i++) + { + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getArgumentType(setBarMethod, i, &arg[0], 16); + assert(0 == strcmp(&arg[0],expected[i])); + } + + char *arg_copied = method_copyReturnType(barMethod); + assert(0 == strcmp(arg_copied,"@")); + free(arg_copied); + arg_copied = NULL; + + for (int i = 0; i < 2; i++) + { + arg_copied = method_copyArgumentType(barMethod, i); + assert(0 == strcmp(arg_copied,expected[i])); + free(arg_copied); + } + + arg_copied = method_copyArgumentType(barMethod, 2); + assert(NULL == arg_copied); + + + + arg_copied = method_copyReturnType(setBarMethod); + assert(0 == strcmp(arg_copied,"v")); + free(arg_copied); + + for (int i = 0; i < 3; i++) + { + arg_copied = method_copyArgumentType(setBarMethod, i); + assert(0 == strcmp(arg_copied,expected[i])); + free(arg_copied); + } + + + return 0; +} diff --git a/encoding2.c b/encoding2.c index 439c5ac..5e73245 100644 --- a/encoding2.c +++ b/encoding2.c @@ -59,7 +59,9 @@ static char* copyTypeEncoding(const char *types) static const char * findParameterStart(const char *types, unsigned int index) { - for (unsigned int i=0 ; i