Overview
Comment: | Implement forwarding target for the Apple runtime.
Only on x86_64 so far, others to follow. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
2b20e164d7df0a9d63d7890c8ad6d7a3 |
User & Date: | js on 2012-11-16 21:16:06 |
Other Links: | manifest | tags |
Context
2012-11-16
| ||
21:26 | Bridge: Fix some type inconsistencies. check-in: 4b6dc80314 user: js tags: trunk | |
21:16 | Implement forwarding target for the Apple runtime. check-in: 2b20e164d7 user: js tags: trunk | |
2012-11-14
| ||
15:39 | Initial -[forwarindTargetForSelector:]. check-in: d3a2e59414 user: js tags: trunk | |
Changes
Modified configure.ac from [c122098dec] to [d44f0940e1].
︙ | ︙ | |||
260 261 262 263 264 265 266 267 268 269 270 271 272 273 | [Whether we use the Apple ObjC runtime]) AC_CHECK_LIB(objc, objc_msgSend, [ LIBS="-lobjc $LIBS" ], [ AC_MSG_ERROR([libobjc not found!]) ]) ;; esac AC_CHECK_FUNC(objc_constructInstance, [], [ AC_SUBST(INSTANCE_M, "instance.m") ]) | > > | 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 | [Whether we use the Apple ObjC runtime]) AC_CHECK_LIB(objc, objc_msgSend, [ LIBS="-lobjc $LIBS" ], [ AC_MSG_ERROR([libobjc not found!]) ]) AC_SUBST(APPLE_FORWARDING_S, "apple-forwarding.S") ;; esac AC_CHECK_FUNC(objc_constructInstance, [], [ AC_SUBST(INSTANCE_M, "instance.m") ]) |
︙ | ︙ |
Modified extra.mk.in from [b4f940fa64] to [2ba1935cd7].
1 2 3 4 5 6 7 8 9 10 11 | OBJFW_SHARED_LIB = @OBJFW_SHARED_LIB@ OBJFW_STATIC_LIB = @OBJFW_STATIC_LIB@ # When changing: Be sure to also change these in the Xcode project! OBJFW_LIB_MAJOR = 7 OBJFW_LIB_MINOR = 0 OBJFW_LIB_MAJOR_MINOR = ${OBJFW_LIB_MAJOR}.${OBJFW_LIB_MINOR} OBJFW_BRIDGE_SHARED_LIB = @OBJFW_BRIDGE_SHARED_LIB@ OBJFW_BRIDGE_STATIC_LIB = @OBJFW_BRIDGE_STATIC_LIB@ ASPRINTF_M = @ASPRINTF_M@ | > < > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | OBJFW_SHARED_LIB = @OBJFW_SHARED_LIB@ OBJFW_STATIC_LIB = @OBJFW_STATIC_LIB@ # When changing: Be sure to also change these in the Xcode project! OBJFW_LIB_MAJOR = 7 OBJFW_LIB_MINOR = 0 OBJFW_LIB_MAJOR_MINOR = ${OBJFW_LIB_MAJOR}.${OBJFW_LIB_MINOR} OBJFW_BRIDGE_SHARED_LIB = @OBJFW_BRIDGE_SHARED_LIB@ OBJFW_BRIDGE_STATIC_LIB = @OBJFW_BRIDGE_STATIC_LIB@ APPLE_FORWARDING_S = @APPLE_FORWARDING_S@ ASPRINTF_M = @ASPRINTF_M@ ATOMIC_H = @ATOMIC_H@ AUTORELEASE_M = @AUTORELEASE_M@ BIN_PREFIX = @BIN_PREFIX@ BRIDGE = @BRIDGE@ EXCEPTIONS_A = @EXCEPTIONS_A@ EXCEPTIONS_EXCEPTIONS_A = @EXCEPTIONS_EXCEPTIONS_A@ EXCEPTIONS_EXCEPTIONS_LIB_A = @EXCEPTIONS_EXCEPTIONS_LIB_A@ EXCEPTIONS_LIB_A = @EXCEPTIONS_LIB_A@ FOUNDATION_COMPAT_M = @FOUNDATION_COMPAT_M@ |
︙ | ︙ |
Modified src/Makefile from [13bfd6fa59] to [aee11a3fa3].
︙ | ︙ | |||
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | OFMutableString_UTF8.m \ OFSet_hashtable.m \ ${OFSTREAMOBSERVER_KQUEUE_M} \ ${OFSTREAMOBSERVER_POLL_M} \ ${OFSTREAMOBSERVER_SELECT_M} \ OFString_UTF8.m \ OFTCPSocket+SOCKS5.m \ ${ASPRINTF_M} \ ${FOUNDATION_COMPAT_M} \ iso_8859_15.m \ windows_1252.m OBJS_EXTRA = ${EXCEPTIONS_EXCEPTIONS_A} ${RUNTIME_RUNTIME_A} LIB_OBJS_EXTRA = ${EXCEPTIONS_EXCEPTIONS_LIB_A} ${RUNTIME_RUNTIME_LIB_A} include ../buildsys.mk CPPFLAGS += -I. -I.. -Iexceptions -Iruntime LD = ${OBJC} LDFLAGS += ${REEXPORT_LIBOBJC} ${MACH_ALIAS_LIST} ${BRIDGE}: ${SHARED_LIB} | > > > > | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | OFMutableString_UTF8.m \ OFSet_hashtable.m \ ${OFSTREAMOBSERVER_KQUEUE_M} \ ${OFSTREAMOBSERVER_POLL_M} \ ${OFSTREAMOBSERVER_SELECT_M} \ OFString_UTF8.m \ OFTCPSocket+SOCKS5.m \ ${APPLE_FORWARDING_S} \ ${ASPRINTF_M} \ ${FOUNDATION_COMPAT_M} \ iso_8859_15.m \ windows_1252.m OBJS_EXTRA = ${EXCEPTIONS_EXCEPTIONS_A} ${RUNTIME_RUNTIME_A} LIB_OBJS_EXTRA = ${EXCEPTIONS_EXCEPTIONS_LIB_A} ${RUNTIME_RUNTIME_LIB_A} include ../buildsys.mk CPPFLAGS += -I. -I.. -Iexceptions -Iruntime AS = ${OBJC} ASFLAGS = ${CPPFLAGS} AS_DEPENDS = ${OBJC_DEPENDS} LD = ${OBJC} LDFLAGS += ${REEXPORT_LIBOBJC} ${MACH_ALIAS_LIST} ${BRIDGE}: ${SHARED_LIB} |
Modified src/OFObject.m from [4b4eff1419] to [43abec3b5d].
︙ | ︙ | |||
62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #import "instance.h" #if defined(OF_ATOMIC_OPS) # import "atomic.h" #elif defined(OF_THREADS) # import "threading.h" #endif struct pre_ivar { int32_t retainCount; struct pre_mem *firstMem, *lastMem; #if !defined(OF_ATOMIC_OPS) && defined(OF_THREADS) of_spinlock_t retainCountSpinlock; #endif | > > > > > | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #import "instance.h" #if defined(OF_ATOMIC_OPS) # import "atomic.h" #elif defined(OF_THREADS) # import "threading.h" #endif #if defined(OF_APPLE_RUNTIME) && defined(__x86_64__) extern id of_forward(id, SEL, ...); extern struct stret of_forward_stret(id, SEL, ...); #endif struct pre_ivar { int32_t retainCount; struct pre_mem *firstMem, *lastMem; #if !defined(OF_ATOMIC_OPS) && defined(OF_THREADS) of_spinlock_t retainCountSpinlock; #endif |
︙ | ︙ | |||
109 110 111 112 113 114 115 | enumeration_mutation_handler(id object) { @throw [OFEnumerationMutationException exceptionWithClass: [object class] object: object]; } | < | | > < < | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | enumeration_mutation_handler(id object) { @throw [OFEnumerationMutationException exceptionWithClass: [object class] object: object]; } void of_method_not_found(id obj, SEL sel) { fprintf(stderr, "Runtime error: Selector %s is not implemented in " "class %s!\n", sel_getName(sel), class_getName(object_getClass(obj))); abort(); } #ifdef OF_OBJFW_RUNTIME static IMP forward_handler(id obj, SEL sel) { /* Try resolveClassMethod:/resolveInstanceMethod: */ if (class_isMetaClass(object_getClass(obj))) { if ([obj respondsToSelector: @selector(resolveClassMethod:)] && [obj resolveClassMethod: sel]) { if (![obj respondsToSelector: sel]) { fprintf(stderr, "Runtime error: [%s " "resolveClassMethod: %s] returned YES " |
︙ | ︙ | |||
157 158 159 160 161 162 163 | } return objc_msg_lookup(obj, sel); } } /* Try forwardingTargetForSelector: */ | > > | | | | > | > | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | } return objc_msg_lookup(obj, sel); } } /* Try forwardingTargetForSelector: */ if (class_respondsToSelector(object_getClass(obj), @selector(forwardingTargetForSelector:))) { id target = [obj forwardingTargetForSelector: sel]; if (target != obj && target != nil) return objc_msg_lookup(target, sel); } of_method_not_found(obj, sel); return NULL; } #endif #ifndef HAVE_OBJC_ENUMERATIONMUTATION void objc_enumerationMutation(id object) { |
︙ | ︙ | |||
244 245 246 247 248 249 250 | @implementation OFObject + (void)load { #if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__) objc_setUncaughtExceptionHandler(uncaught_exception_handler); #endif | | > > > > | 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | @implementation OFObject + (void)load { #if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__) objc_setUncaughtExceptionHandler(uncaught_exception_handler); #endif #if defined(OF_OBJFW_RUNTIME) objc_forward_handler = forward_handler; #elif defined(OF_APPLE_RUNTIME) # ifdef __x86_64__ objc_setForwardHandler(of_forward, of_forward_stret); # endif #endif #ifdef HAVE_OBJC_ENUMERATIONMUTATION objc_setEnumerationMutationHandler(enumeration_mutation_handler); #endif #if defined(_WIN32) |
︙ | ︙ |
Added src/apple-forwarding-x86_64.S version [f7c3563b91].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012 * Jonathan Schleifer <js@webkeks.org> * * 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: .quad L_str_forwardingTargetForSelector .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions .macro forward dispatch_func push %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ movq %rax, 0xA8(%rsp) movq %rdi, 0xA0(%rsp) movq %rsi, 0x98(%rsp) movq %rdx, 0x90(%rsp) movq %rcx, 0x88(%rsp) movq %r8, 0x80(%rsp) movq %r9, 0x78(%rsp) movd %xmm0, 0x70(%rsp) movd %xmm1, 0x60(%rsp) movd %xmm2, 0x50(%rsp) movd %xmm3, 0x40(%rsp) movd %xmm4, 0x30(%rsp) movd %xmm5, 0x20(%rsp) movd %xmm6, 0x10(%rsp) movd %xmm7, (%rsp) call _object_getClass movq %rax, %rdi movq L_sel_forwardingTargetForSelector(%rip), %rsi call _class_respondsToSelector test %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 jz fail cmp 0xA0(%rsp), %rdi je fail /* Restore all arguments, except %rdi */ movd (%rsp), %xmm7 movd 0x10(%rsp), %xmm6 movd 0x20(%rsp), %xmm5 movd 0x30(%rsp), %xmm4 movd 0x40(%rsp), %xmm3 movd 0x50(%rsp), %xmm2 movd 0x60(%rsp), %xmm1 movd 0x70(%rsp), %xmm0 movq 0x78(%rsp), %r9 movq 0x80(%rsp), %r8 movq 0x88(%rsp), %rcx movq 0x90(%rsp), %rdx movq 0x98(%rsp), %rsi movq 0xA8(%rsp), %rax movq %rbp, %rsp pop %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 jmp _of_method_not_found |
Added src/apple-forwarding.S version [9e82925ad3].
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012 * Jonathan Schleifer <js@webkeks.org> * * 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. */ #include "config.h" #ifdef __x86_64__ # include "apple-forwarding-x86_64.S" #endif |
Modified src/runtime/Makefile from [e1f56f3c0c] to [a2f274f2c0].
︙ | ︙ | |||
21 22 23 24 25 26 27 28 | INCLUDES = runtime.h include ../../buildsys.mk CPPFLAGS += -I. -I.. -I../.. AS = ${OBJC} ASFLAGS = ${CPPFLAGS} LD = ${OBJC} | > | 21 22 23 24 25 26 27 28 29 | INCLUDES = runtime.h include ../../buildsys.mk CPPFLAGS += -I. -I.. -I../.. AS = ${OBJC} ASFLAGS = ${CPPFLAGS} AS_DEPENDS = ${OBJC_DEPENDS} LD = ${OBJC} |