Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -65,15 +65,13 @@ # import "atomic.h" #elif defined(OF_THREADS) # import "threading.h" #endif -#ifdef OF_APPLE_RUNTIME -# if defined(__x86_64__) || defined(__i386__) || defined(__ppc__) +#if defined(OF_APPLE_RUNTIME) && !defined(__ppc64__) 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; @@ -257,14 +255,12 @@ objc_setUncaughtExceptionHandler(uncaught_exception_handler); #endif #if defined(OF_OBJFW_RUNTIME) objc_forward_handler = forward_handler; -#elif defined(OF_APPLE_RUNTIME) -# if defined(__x86_64__) || defined(__i386__) || defined(__ppc__) +#elif defined(OF_APPLE_RUNTIME) && !defined(__ppc64__) objc_setForwardHandler(of_forward, of_forward_stret); -# endif #endif #ifdef HAVE_OBJC_ENUMERATIONMUTATION objc_setEnumerationMutationHandler(enumeration_mutation_handler); #endif ADDED src/apple-forwarding-arm.S Index: src/apple-forwarding-arm.S ================================================================== --- src/apple-forwarding-arm.S +++ src/apple-forwarding-arm.S @@ -0,0 +1,120 @@ +/* + * 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, __objc_methname, cstring_literals +L_str_forwardingTargetForSelector: + .asciz "forwardingTargetForSelector:" + +.section __DATA, __objc_selrefs, literal_pointers, no_dead_strip +L_sel_forwardingTargetForSelector: + .long L_str_forwardingTargetForSelector + +.section __DATA, __objc_imageinfo, regular, no_dead_strip + .long 0, 0 + +.section __TEXT, __text, regular, pure_instructions +.arm +.align 2 +_of_forward: + stmfd sp!, {r0-r3, lr} + fstmfdd sp!, {d0-d7} + + blx _object_getClass + + ldr r1, L_sel_forwardingTargetForSelector_indirect_L0 +L0: + ldr r1, [pc, r1] + stmfd sp!, {r1} + blx _class_respondsToSelector + ldmfd sp!, {r1} + cmp r0, #0 + beq fail + + ldr r0, [sp, #64] + ldr r2, [sp, #68] + blx _objc_msgSend + + cmp r0, #0 + beq fail + + ldr r1, [sp, #64] + cmp r0, r1 + beq fail + + fldmfdd sp!, {d0-d7} + add sp, sp, #4 @ throw away r0 + ldmfd sp!, {r1-r3, lr} + + b _objc_msgSend + +fail: + fldmfdd sp!, {d0-d7} + ldmfd sp!, {r0-r3, lr} + b _of_method_not_found + +.align 2 +_of_forward_stret: + stmfd sp!, {r0-r3, lr} + fstmfdd sp!, {d0-d7} + + mov r0, r1 + blx _object_getClass + + ldr r1, L_sel_forwardingTargetForSelector_indirect_L1 +L1: + ldr r1, [pc, r1] + stmfd sp!, {r1} + blx _class_respondsToSelector + ldmfd sp!, {r1} + cmp r0, #0 + beq fail_stret + + ldr r0, [sp, #68] + ldr r2, [sp, #72] + blx _objc_msgSend + + cmp r0, #0 + beq fail_stret + + ldr r1, [sp, #68] + cmp r0, r1 + beq fail_stret + + mov r1, r0 + + fldmfdd sp!, {d0-d7} + ldmfd sp!, {r0} + add sp, sp, #4 @ throw away r1 + ldmfd sp!, {r2-r3, lr} + + b _objc_msgSend_stret + +fail_stret: + fldmfdd sp!, {d0-d7} + ldmfd sp!, {r0-r3, lr} + mov r0, r1 + mov r1, r2 + b _of_method_not_found + +.data_region +L_sel_forwardingTargetForSelector_indirect_L0: + .long L_sel_forwardingTargetForSelector-(L0+8) +L_sel_forwardingTargetForSelector_indirect_L1: + .long L_sel_forwardingTargetForSelector-(L1+8) +.end_data_region Index: src/apple-forwarding.S ================================================================== --- src/apple-forwarding.S +++ src/apple-forwarding.S @@ -18,8 +18,10 @@ #if defined(__x86_64__) # include "apple-forwarding-x86_64.S" #elif defined(__i386__) # include "apple-forwarding-i386.S" +#elif defined(__arm__) +# include "apple-forwarding-arm.S" #elif defined(__ppc__) # include "apple-forwarding-ppc.S" #endif