From 060ea96bccec1926aa0b91357191734d1a5cc738 Mon Sep 17 00:00:00 2001 From: comex Date: Fri, 16 Jan 2015 07:46:57 -0500 Subject: this is all wrong. since we don't know whether it's stret, we don't mark the block stret. thus imp_implementationWithBlock doesn't do the stret/block swap, even though it would for a real block, so we can and must always assume the block is first --- test/test-imp-forwarding.m | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'test') diff --git a/test/test-imp-forwarding.m b/test/test-imp-forwarding.m index da2ece2..e7bff27 100644 --- a/test/test-imp-forwarding.m +++ b/test/test-imp-forwarding.m @@ -1,9 +1,10 @@ #include "../lib/objc.c" #include #include +#import static void imp1(id self, SEL sel, int a, int b) { - printf("imp1: self=%p sel=%s a=%d b=%d\n", self, sel_getName(sel), a, b); + NSLog(@"imp1: self=%@ sel=%s a=%d b=%d\n", self, sel_getName(sel), a, b); } struct big { @@ -11,16 +12,24 @@ struct big { }; static struct big imp2(id self, SEL sel, int a, int b) { - printf("imp2: self=%p sel=%s a=%d b=%d\n", self, sel_getName(sel), a, b); + NSLog(@"imp2: self=%@ sel=%s a=%d b=%d\n", self, sel_getName(sel), a, b); return (struct big) {{0}}; } +struct big (^test)(id, int) = ^(id self, int a) { + NSLog(@"self=%@ a=%d", self, a); + return (struct big) {{0}}; +}; + int main() { + IMP testi = imp_implementationWithBlock(test); + ((struct big (*)(id, SEL, int)) testi)(@"test", @selector(dumb), 5); IMP old = (IMP) imp1; SEL sel = @selector(some); struct temp_block_literal temp_block = get_temp_block(&old, sel); IMP new = imp_implementationWithBlock((id) &temp_block); ((void (*)(id, SEL, int, int)) new)(@"foo", sel, 1, 2); old = (IMP) imp2; - ((struct big (*)(id, SEL, int, int)) new)(@"bar", sel, 1, 2); + struct big big = ((struct big (*)(id, SEL, int, int)) new)(@"bar", sel, 1, 2); + printf("out? %d\n", big.x[0]); } -- cgit v1.2.3