Overview
Comment: | Provide objc_constructInstance() when necessary.
OS X < 10.6 did not have it, so it is built regardless of the selected |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
16ba7ec4779e1e108f5aeebdf99906ff |
User & Date: | js on 2012-10-10 10:16:22 |
Other Links: | manifest | tags |
Context
2012-10-12
| ||
17:59 | Add __attribute__((sentinel)). check-in: c1b2e3e604 user: js tags: trunk | |
2012-10-10
| ||
10:16 | Provide objc_constructInstance() when necessary. check-in: 16ba7ec477 user: js tags: trunk | |
2012-10-09
| ||
22:02 | Silence warnings about implicit float to int casts check-in: a39a0d7bec user: js tags: trunk | |
Changes
Modified configure.ac from [cc4568e947] to [00551e1e1c].
︙ | ︙ | |||
261 262 263 264 265 266 267 268 269 270 271 272 273 274 | AC_CHECK_LIB(objc, objc_msgSend, [ LIBS="-lobjc $LIBS" ], [ AC_MSG_ERROR([libobjc not found!]) ]) ;; esac AC_CHECK_FUNC(objc_autoreleasePoolPush, [], [ AC_SUBST(AUTORELEASE_M, "autorelease.m") ]) AC_CHECK_FUNC(objc_enumerationMutation, [ AC_DEFINE(HAVE_OBJC_ENUMERATIONMUTATION, 1, | > > > > | 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 | 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") ]) AC_CHECK_FUNC(objc_autoreleasePoolPush, [], [ AC_SUBST(AUTORELEASE_M, "autorelease.m") ]) AC_CHECK_FUNC(objc_enumerationMutation, [ AC_DEFINE(HAVE_OBJC_ENUMERATIONMUTATION, 1, |
︙ | ︙ |
Modified extra.mk.in from [3fe6be4b5d] to [09b4d1b91a].
︙ | ︙ | |||
9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ATOMIC_H = @ATOMIC_H@ BIN_PREFIX = @BIN_PREFIX@ 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@ LOOKUP_S = @LOOKUP_S@ MACH_ALIAS_LIST = @MACH_ALIAS_LIST@ OFBLOCKTESTS_M = @OFBLOCKTESTS_M@ OBJC_PROPERTIES_M = @OBJC_PROPERTIES_M@ OBJC_SYNC_M = @OBJC_SYNC_M@ OFHTTPREQUESTTESTS_M = @OFHTTPREQUESTTESTS_M@ OFPLUGIN_M = @OFPLUGIN_M@ | > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ATOMIC_H = @ATOMIC_H@ BIN_PREFIX = @BIN_PREFIX@ 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@ INSTANCE_M = @INSTANCE_M@ LOOKUP_S = @LOOKUP_S@ MACH_ALIAS_LIST = @MACH_ALIAS_LIST@ OFBLOCKTESTS_M = @OFBLOCKTESTS_M@ OBJC_PROPERTIES_M = @OBJC_PROPERTIES_M@ OBJC_SYNC_M = @OBJC_SYNC_M@ OFHTTPREQUESTTESTS_M = @OFHTTPREQUESTTESTS_M@ OFPLUGIN_M = @OFPLUGIN_M@ |
︙ | ︙ |
Modified src/Makefile from [69b9e00272] to [2695ae7f64].
︙ | ︙ | |||
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | OFJSONRepresentation.h \ OFSerialization.h \ OFTLSSocket.h \ ObjFW.h \ asprintf.h \ autorelease.h \ ${ATOMIC_H} \ macros.h \ objfw-defs.h \ ${THREADING_H} SRCS += OFArray_adjacent.m \ OFArray_adjacentSubarray.m \ ${AUTORELEASE_M} \ OFCountedSet_hashtable.m \ OFDictionary_hashtable.m \ OFMutableArray_adjacent.m \ OFMutableDictionary_hashtable.m \ OFMutableSet_hashtable.m \ OFMutableString_UTF8.m \ OFSet_hashtable.m \ | > > | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | OFJSONRepresentation.h \ OFSerialization.h \ OFTLSSocket.h \ ObjFW.h \ asprintf.h \ autorelease.h \ ${ATOMIC_H} \ instance.h \ macros.h \ objfw-defs.h \ ${THREADING_H} SRCS += OFArray_adjacent.m \ OFArray_adjacentSubarray.m \ ${AUTORELEASE_M} \ ${INSTANCE_M} \ OFCountedSet_hashtable.m \ OFDictionary_hashtable.m \ OFMutableArray_adjacent.m \ OFMutableDictionary_hashtable.m \ OFMutableSet_hashtable.m \ OFMutableString_UTF8.m \ OFSet_hashtable.m \ |
︙ | ︙ |
Modified src/OFObject.m from [36829d1a67] to [b2fb1a5ccb].
︙ | ︙ | |||
56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #ifdef _WIN32 # include <windows.h> #endif #import "OFString.h" #if defined(OF_ATOMIC_OPS) # import "atomic.h" #elif defined(OF_THREADS) # import "threading.h" #endif struct pre_ivar { | > | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #ifdef _WIN32 # include <windows.h> #endif #import "OFString.h" #import "instance.h" #if defined(OF_ATOMIC_OPS) # import "atomic.h" #elif defined(OF_THREADS) # import "threading.h" #endif struct pre_ivar { |
︙ | ︙ |
Added src/instance.h version [bb544f5a22].
> > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /* * 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. */ #ifdef __cplusplus extern "C" { #endif extern id objc_constructInstance(Class, void*); extern void* objc_destructInstance(id); #ifdef __cplusplus } #endif |
Added src/instance.m version [36eb4908b4].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | /* * 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" #import "OFObject.h" static SEL cxx_construct = NULL; static SEL cxx_destruct = NULL; static void __attribute__((constructor)) init(void) { if (cxx_construct == NULL) cxx_construct = sel_registerName(".cxx_construct"); if (cxx_destruct == NULL) cxx_destruct = sel_registerName(".cxx_destruct"); } id objc_constructInstance(Class cls, void *bytes) { id obj = (id)bytes; BOOL (*last)(id, SEL) = NULL; if (cls == Nil || bytes == NULL) return nil; object_setClass(obj, cls); /* FIXME: Constructors of superclasses should be called first */ for (; cls != Nil; cls = class_getSuperclass(cls)) { BOOL (*ctor)(id, SEL); if (class_respondsToSelector(cls, cxx_construct)) { if ((ctor = (BOOL(*)(id, SEL)) class_getMethodImplementation(cls, cxx_construct)) != last) if (!ctor(obj, cxx_construct)) return nil; last = ctor; } else break; } return obj; } void* objc_destructInstance(id obj) { Class cls; void (*last)(id, SEL) = NULL; for (cls = object_getClass(obj); cls != Nil; cls = class_getSuperclass(cls)) { void (*dtor)(id, SEL); if (class_respondsToSelector(cls, cxx_destruct)) { if ((dtor = (void(*)(id, SEL)) class_getMethodImplementation(cls, cxx_destruct)) != last) dtor(obj, cxx_destruct); last = dtor; } else break; } return obj; } |
Modified src/runtime/class.m from [d471bf4a2f] to [cde4d41e21].
︙ | ︙ | |||
26 27 28 29 30 31 32 | #import "runtime-private.h" static struct objc_hashtable *classes = NULL; static Class *load_queue = NULL; static size_t load_queue_cnt = 0; static struct objc_sparsearray *empty_dtable = NULL; | < < < | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #import "runtime-private.h" static struct objc_hashtable *classes = NULL; static Class *load_queue = NULL; static size_t load_queue_cnt = 0; static struct objc_sparsearray *empty_dtable = NULL; static void register_class(struct objc_abi_class *cls) { if (classes == NULL) classes = objc_hashtable_new(2); objc_hashtable_set(classes, cls->name, cls); |
︙ | ︙ | |||
292 293 294 295 296 297 298 | } void objc_register_all_classes(struct objc_abi_symtab *symtab) { uint_fast32_t i; | < < < < < | 289 290 291 292 293 294 295 296 297 298 299 300 301 302 | } void objc_register_all_classes(struct objc_abi_symtab *symtab) { uint_fast32_t i; for (i = 0; i < symtab->cls_def_cnt; i++) { struct objc_abi_class *cls = (struct objc_abi_class*)symtab->defs[i]; register_class(cls); register_selectors(cls); register_selectors(cls->metaclass); |
︙ | ︙ | |||
538 539 540 541 542 543 544 | objc_update_dtable(cls); objc_global_mutex_unlock(); return (IMP)nil; } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 530 531 532 533 534 535 536 537 538 539 540 541 542 543 | objc_update_dtable(cls); objc_global_mutex_unlock(); return (IMP)nil; } static void free_class(Class rcls) { struct objc_abi_class *cls = (struct objc_abi_class*)rcls; if (rcls->subclass_list != NULL) { free(rcls->subclass_list); |
︙ | ︙ |