Add x86 (32-bit) sret trampoline.

main
theraven 14 years ago
parent 43ee8b9819
commit 0a7fdcb69e

@ -1,11 +1,18 @@
#include <objc/runtime.h>
#include <objc/blocks_runtime.h>
#include <assert.h>
#include <stdio.h>
struct big
{
int a, b, c, d, e;
};
@interface Foo @end
@implementation Foo @end
@interface Foo (Dynamic)
+(int)count: (int)i;
+(struct big)sret;
@end
int main(void)
@ -22,5 +29,16 @@ int main(void)
assert(6 == [Foo count: 2]);
assert(imp_getBlock(imp) == (blk));
imp_removeBlock(blk);
blk = ^(id self) {
struct big b = {1, 2, 3, 4, 5};
return b;
};
imp = imp_implementationWithBlock(blk);
char *type;
asprintf(&type, "%s@:", @encode(struct big));
class_addMethod((objc_getMetaClass("Foo")), @selector(sret), imp, type);
struct big s = [Foo sret];
fprintf(stderr, "%d %d %d %d %d\n", s.a, s.b, s.c, s.d, s.e);
return 0;
}

@ -40,6 +40,14 @@ next_line:
jmp *-13(%eax) # Call the block function
__objc_block_trampoline_end:
__objc_block_trampoline_sret:
call next_line2 # Store the instruction pointer on the stack
next_line2:
pop %eax # Load the old instruction pointer
mov 8(%esp), %ebx # Load the self parameter
mov %ebx, 12(%esp) # Store self as the second argument
mov -9(%eax), %ebx # Load the block pointer to %ebx
mov %ebx, 8(%esp) # Store the block pointer in the first argument
jmp *-13(%eax) # Call the block function
__objc_block_trampoline_end_sret:
#else
__objc_block_trampoline:

Loading…
Cancel
Save