Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -65,13 +65,15 @@ # import "atomic.h" #elif defined(OF_THREADS) # import "threading.h" #endif -#if defined(OF_APPLE_RUNTIME) && defined(__x86_64__) +#ifdef OF_APPLE_RUNTIME +# if defined(__x86_64__) || defined(__i386__) extern id of_forward(id, SEL, ...); extern struct stret of_forward_stret(id, SEL, ...); +# endif #endif struct pre_ivar { int32_t retainCount; struct pre_mem *firstMem, *lastMem; @@ -256,11 +258,11 @@ #endif #if defined(OF_OBJFW_RUNTIME) objc_forward_handler = forward_handler; #elif defined(OF_APPLE_RUNTIME) -# ifdef __x86_64__ +# if defined(__x86_64__) || defined(__i386__) objc_setForwardHandler(of_forward, of_forward_stret); # endif #endif #ifdef HAVE_OBJC_ENUMERATIONMUTATION ADDED src/apple-forwarding-i386.S Index: src/apple-forwarding-i386.S ================================================================== --- src/apple-forwarding-i386.S +++ src/apple-forwarding-i386.S @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +.globl _of_forward +.globl _of_forward_stret + +.section __TEXT, __cstring, cstring_literals +L_str_forwardingTargetForSelector: + .asciz "forwardingTargetForSelector:" + +.section __OBJC, __message_refs, literal_pointers, no_dead_strip +L_sel_forwardingTargetForSelector: + .long L_str_forwardingTargetForSelector + +.section __OBJC, __image_info + .long 0, 0 + +.section __TEXT, __text, regular, pure_instructions +.macro forward dispatch_func + pushl %ebp + movl %esp, %ebp + + pushl 8(%ebp) + call _object_getClass + addl $4, %esp + movl %eax, %edx + + call get_eip +L0_\dispatch_func: + pushl L_sel_forwardingTargetForSelector-L0_\dispatch_func(%eax) + pushl %edx + call _class_respondsToSelector + addl $8, %esp + testl %eax, %eax + jz fail + + pushl 12(%ebp) + call get_eip +L1_\dispatch_func: + pushl L_sel_forwardingTargetForSelector-L1_\dispatch_func(%eax) + pushl 8(%ebp) + call _objc_msgSend + + testl %eax, %eax + jz fail + + cmpl 8(%ebp), %eax + je fail + + movl %eax, 8(%ebp) + + movl %ebp, %esp + popl %ebp + + jmp \dispatch_func +.endmacro + +_of_forward: + forward _objc_msgSend + +_of_forward_stret: + forward _objc_msgSend_stret + +fail: + movl %ebp, %esp + popl %ebp + + jmp _of_method_not_found + +get_eip: + movl (%esp), %eax + ret Index: src/apple-forwarding-x86_64.S ================================================================== --- src/apple-forwarding-x86_64.S +++ src/apple-forwarding-x86_64.S @@ -28,11 +28,11 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions .macro forward dispatch_func - push %rbp + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ movq %rax, 0xA8(%rsp) @@ -53,23 +53,23 @@ call _object_getClass movq %rax, %rdi movq L_sel_forwardingTargetForSelector(%rip), %rsi call _class_respondsToSelector - test %rax, %rax + testq %rax, %rax jz fail movq 0xA0(%rsp), %rdi movq L_sel_forwardingTargetForSelector(%rip), %rsi movq 0x98(%rsp), %rdx call \dispatch_func movq %rax, %rdi - test %rdi, %rdi + testq %rdi, %rdi jz fail - cmp 0xA0(%rsp), %rdi + cmpq 0xA0(%rsp), %rdi je fail /* Restore all arguments, except %rdi */ movd (%rsp), %xmm7 movd 0x10(%rsp), %xmm6 @@ -85,23 +85,24 @@ movq 0x90(%rsp), %rdx movq 0x98(%rsp), %rsi movq 0xA8(%rsp), %rax movq %rbp, %rsp - pop %rbp + popq %rbp jmp \dispatch_func .endmacro _of_forward: forward _objc_msgSend + _of_forward_stret: forward _objc_msgSend_stret fail: movq 0xA0(%rsp), %rdi movq 0x98(%rsp), %rsi movq %rbp, %rsp - pop %rbp + popq %rbp jmp _of_method_not_found Index: src/apple-forwarding.S ================================================================== --- src/apple-forwarding.S +++ src/apple-forwarding.S @@ -14,8 +14,10 @@ * file. */ #include "config.h" -#ifdef __x86_64__ +#if defined(__x86_64__) # include "apple-forwarding-x86_64.S" +#elif defined(__i386__) +# include "apple-forwarding-i386.S" #endif