Overview
Comment: | Work around objc_setFutureClass suddenly not working anymore on i386. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
41fbb8c0a8b0ee05b8cf5a870795a8f5 |
User & Date: | js on 2012-01-04 23:30:14 |
Other Links: | manifest | tags |
Context
2012-01-05
| ||
00:56 | Update copyright. check-in: ce70e17b38 user: js tags: trunk | |
2012-01-04
| ||
23:30 | Work around objc_setFutureClass suddenly not working anymore on i386. check-in: 41fbb8c0a8 user: js tags: trunk | |
2012-01-03
| ||
20:46 | Work around a stupid gcc warning. check-in: d78526559e user: js tags: trunk | |
Changes
Modified src/OFConstantString.h from [854ec046f1] to [5cbd30ca48].
︙ | ︙ | |||
12 13 14 15 16 17 18 | * 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. */ #import "OFString.h" | > | | | | 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 | * 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. */ #import "OFString.h" #if !defined(OF_CONSTANT_STRING_M) && \ defined(OF_APPLE_RUNTIME) && !defined(__OBJC2__) # ifdef __cplusplus extern "C" { # endif extern void *_OFConstantStringClassReference; # ifdef __cplusplus } # endif #endif /** * \brief A class for storing constant strings using the \@"" literal. */ @interface OFConstantString: OFString { char *cString; size_t cStringLength; } @end |
Modified src/OFConstantString.m from [916899ab02] to [4bd82e6f82].
︙ | ︙ | |||
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | * 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" #include <stdlib.h> #include <string.h> #import "OFConstantString.h" #import "OFString_UTF8.h" #import "OFInvalidEncodingException.h" #import "OFNotImplementedException.h" #import "OFOutOfMemoryException.h" | > > > | > > > > > > > > > > | | 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 | * 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" #define OF_CONSTANT_STRING_M #include <stdlib.h> #include <string.h> #import "OFConstantString.h" #import "OFString_UTF8.h" #import "OFInitializationFailedException.h" #import "OFInvalidEncodingException.h" #import "OFNotImplementedException.h" #import "OFOutOfMemoryException.h" #if defined(OF_APPLE_RUNTIME) && !defined(__OBJC2__) # import <objc/runtime.h> struct { struct class *isa, *super_class; const char *name; long version, info, instance_size; struct ivar_list *ivars; struct method_list **methodLists; struct cache *cache; struct protocol_list *protocols; const char *ivar_layout; struct class_ext *ext; } _OFConstantStringClassReference; #endif @interface OFString_const: OFString_UTF8 @end @implementation OFString_const + alloc |
︙ | ︙ | |||
106 107 108 109 110 111 112 113 114 | @throw [OFNotImplementedException exceptionWithClass: isa selector: _cmd]; [super dealloc]; /* Get rid of a stupid warning */ } @end @implementation OFConstantString + (void)load { | > > > > > > > > > > > | > > > > | | | > > | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | @throw [OFNotImplementedException exceptionWithClass: isa selector: _cmd]; [super dealloc]; /* Get rid of a stupid warning */ } @end @implementation OFConstantString #if defined(OF_APPLE_RUNTIME) && !defined(__OBJC2__) + (void)load { /* * objc_setFutureClass suddenly stopped working as OFConstantString * became more complex. So the only solution is to make * _OFConstantStringClassRerence the actual class, but there is no * objc_initializeClassPair in 10.5. However, objc_allocateClassPair * does not register the new class with the subclass in the ObjC1 * runtime like the ObjC2 runtime does, so this workaround should be * fine. */ Class class; if ((class = objc_allocateClassPair(self, "OFConstantString_hack", 0)) == NULL) @throw [OFInitializationFailedException exceptionWithClass: self]; memcpy(&_OFConstantStringClassReference, class, sizeof(_OFConstantStringClassReference)); free(class); objc_registerClassPair((Class)&_OFConstantStringClassReference); } #endif - (void)finishInitialization { struct of_string_utf8_ivars *ivars; if ((ivars = malloc(sizeof(*ivars))) == NULL) @throw [OFOutOfMemoryException |
︙ | ︙ |