2 * Copyright (c) 1999-2007 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
24 #ifndef _OBJC_RUNTIME_H
25 #define _OBJC_RUNTIME_H
27 #include <objc/objc.h>
31 #include <Availability.h>
32 #include <AvailabilityMacros.h>
33 #include <TargetConditionals.h>
36 #include <sys/types.h>
42 typedef struct objc_method
*Method
;
43 typedef struct objc_ivar
*Ivar
;
44 typedef struct objc_category
*Category
;
45 typedef struct objc_property
*objc_property_t
;
51 Class super_class OBJC2_UNAVAILABLE
;
52 const char *name OBJC2_UNAVAILABLE
;
53 long version OBJC2_UNAVAILABLE
;
54 long info OBJC2_UNAVAILABLE
;
55 long instance_size OBJC2_UNAVAILABLE
;
56 struct objc_ivar_list
*ivars OBJC2_UNAVAILABLE
;
57 struct objc_method_list
**methodLists OBJC2_UNAVAILABLE
;
58 struct objc_cache
*cache OBJC2_UNAVAILABLE
;
59 struct objc_protocol_list
*protocols OBJC2_UNAVAILABLE
;
63 /* Use `Class` instead of `struct objc_class *` */
68 typedef struct objc_object Protocol
;
71 struct objc_method_description
{
79 } objc_property_attribute_t
;
84 OBJC_EXPORT id
object_copy(id obj
, size_t size
)
85 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
)
87 OBJC_EXPORT id
object_dispose(id obj
)
88 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
)
91 OBJC_EXPORT Class
object_getClass(id obj
)
92 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
93 OBJC_EXPORT Class
object_setClass(id obj
, Class cls
)
94 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
96 OBJC_EXPORT
const char *object_getClassName(id obj
)
97 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
98 OBJC_EXPORT
void *object_getIndexedIvars(id obj
)
99 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
)
100 OBJC_ARC_UNAVAILABLE
;
102 OBJC_EXPORT id
object_getIvar(id obj
, Ivar ivar
)
103 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
104 OBJC_EXPORT
void object_setIvar(id obj
, Ivar ivar
, id value
)
105 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
107 OBJC_EXPORT Ivar
object_setInstanceVariable(id obj
, const char *name
, void *value
)
108 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
)
109 OBJC_ARC_UNAVAILABLE
;
110 OBJC_EXPORT Ivar
object_getInstanceVariable(id obj
, const char *name
, void **outValue
)
111 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
)
112 OBJC_ARC_UNAVAILABLE
;
114 OBJC_EXPORT id
objc_getClass(const char *name
)
115 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
116 OBJC_EXPORT id
objc_getMetaClass(const char *name
)
117 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
118 OBJC_EXPORT id
objc_lookUpClass(const char *name
)
119 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
120 OBJC_EXPORT id
objc_getRequiredClass(const char *name
)
121 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
122 OBJC_EXPORT Class
objc_getFutureClass(const char *name
)
123 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
124 OBJC_EXPORT
void objc_setFutureClass(Class cls
, const char *name
)
125 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
126 OBJC_EXPORT
int objc_getClassList(Class
*buffer
, int bufferCount
)
127 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
128 OBJC_EXPORT Class
*objc_copyClassList(unsigned int *outCount
)
129 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_3_1
);
131 OBJC_EXPORT Protocol
*objc_getProtocol(const char *name
)
132 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
133 OBJC_EXPORT Protocol
* __unsafe_unretained
*objc_copyProtocolList(unsigned int *outCount
)
134 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
136 OBJC_EXPORT
const char *class_getName(Class cls
)
137 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
138 OBJC_EXPORT BOOL
class_isMetaClass(Class cls
)
139 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
140 OBJC_EXPORT Class
class_getSuperclass(Class cls
)
141 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
142 OBJC_EXPORT Class
class_setSuperclass(Class cls
, Class newSuper
)
143 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED
;
145 OBJC_EXPORT
int class_getVersion(Class cls
)
146 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
147 OBJC_EXPORT
void class_setVersion(Class cls
, int version
)
148 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
150 OBJC_EXPORT
size_t class_getInstanceSize(Class cls
)
151 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
153 OBJC_EXPORT Ivar
class_getInstanceVariable(Class cls
, const char *name
)
154 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
155 OBJC_EXPORT Ivar
class_getClassVariable(Class cls
, const char *name
)
156 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
157 OBJC_EXPORT Ivar
*class_copyIvarList(Class cls
, unsigned int *outCount
)
158 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
160 OBJC_EXPORT Method
class_getInstanceMethod(Class cls
, SEL name
)
161 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
162 OBJC_EXPORT Method
class_getClassMethod(Class cls
, SEL name
)
163 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
164 OBJC_EXPORT IMP
class_getMethodImplementation(Class cls
, SEL name
)
165 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
166 OBJC_EXPORT IMP
class_getMethodImplementation_stret(Class cls
, SEL name
)
167 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
168 OBJC_EXPORT BOOL
class_respondsToSelector(Class cls
, SEL sel
)
169 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
170 OBJC_EXPORT Method
*class_copyMethodList(Class cls
, unsigned int *outCount
)
171 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
173 OBJC_EXPORT BOOL
class_conformsToProtocol(Class cls
, Protocol
*protocol
)
174 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
175 OBJC_EXPORT Protocol
* __unsafe_unretained
*class_copyProtocolList(Class cls
, unsigned int *outCount
)
176 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
178 OBJC_EXPORT objc_property_t
class_getProperty(Class cls
, const char *name
)
179 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
180 OBJC_EXPORT objc_property_t
*class_copyPropertyList(Class cls
, unsigned int *outCount
)
181 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
183 OBJC_EXPORT
const uint8_t *class_getIvarLayout(Class cls
)
184 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
185 OBJC_EXPORT
const uint8_t *class_getWeakIvarLayout(Class cls
)
186 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
188 OBJC_EXPORT id
class_createInstance(Class cls
, size_t extraBytes
)
189 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
)
190 OBJC_ARC_UNAVAILABLE
;
191 OBJC_EXPORT id
objc_constructInstance(Class cls
, void *bytes
)
192 __OSX_AVAILABLE_STARTING(__MAC_10_6
, __IPHONE_3_0
)
193 OBJC_ARC_UNAVAILABLE
;
194 OBJC_EXPORT
void *objc_destructInstance(id obj
)
195 __OSX_AVAILABLE_STARTING(__MAC_10_6
, __IPHONE_3_0
)
196 OBJC_ARC_UNAVAILABLE
;
198 OBJC_EXPORT Class
objc_allocateClassPair(Class superclass
, const char *name
,
200 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
201 OBJC_EXPORT
void objc_registerClassPair(Class cls
)
202 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
203 OBJC_EXPORT Class
objc_duplicateClass(Class original
, const char *name
,
205 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
206 OBJC_EXPORT
void objc_disposeClassPair(Class cls
)
207 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
209 OBJC_EXPORT BOOL
class_addMethod(Class cls
, SEL name
, IMP imp
,
211 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
212 OBJC_EXPORT IMP
class_replaceMethod(Class cls
, SEL name
, IMP imp
,
214 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
215 OBJC_EXPORT BOOL
class_addIvar(Class cls
, const char *name
, size_t size
,
216 uint8_t alignment
, const char *types
)
217 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
218 OBJC_EXPORT BOOL
class_addProtocol(Class cls
, Protocol
*protocol
)
219 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
220 OBJC_EXPORT BOOL
class_addProperty(Class cls
, const char *name
, const objc_property_attribute_t
*attributes
, unsigned int attributeCount
)
221 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
222 OBJC_EXPORT
void class_replaceProperty(Class cls
, const char *name
, const objc_property_attribute_t
*attributes
, unsigned int attributeCount
)
223 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
224 OBJC_EXPORT
void class_setIvarLayout(Class cls
, const uint8_t *layout
)
225 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
226 OBJC_EXPORT
void class_setWeakIvarLayout(Class cls
, const uint8_t *layout
)
227 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
230 OBJC_EXPORT SEL
method_getName(Method m
)
231 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
232 OBJC_EXPORT IMP
method_getImplementation(Method m
)
233 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
234 OBJC_EXPORT
const char *method_getTypeEncoding(Method m
)
235 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
237 OBJC_EXPORT
unsigned int method_getNumberOfArguments(Method m
)
238 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
239 OBJC_EXPORT
char *method_copyReturnType(Method m
)
240 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
241 OBJC_EXPORT
char *method_copyArgumentType(Method m
, unsigned int index
)
242 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
243 OBJC_EXPORT
void method_getReturnType(Method m
, char *dst
, size_t dst_len
)
244 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
245 OBJC_EXPORT
void method_getArgumentType(Method m
, unsigned int index
,
246 char *dst
, size_t dst_len
)
247 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
248 OBJC_EXPORT
struct objc_method_description
*method_getDescription(Method m
)
249 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
251 OBJC_EXPORT IMP
method_setImplementation(Method m
, IMP imp
)
252 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
253 OBJC_EXPORT
void method_exchangeImplementations(Method m1
, Method m2
)
254 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
256 OBJC_EXPORT
const char *ivar_getName(Ivar v
)
257 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
258 OBJC_EXPORT
const char *ivar_getTypeEncoding(Ivar v
)
259 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
260 OBJC_EXPORT
ptrdiff_t ivar_getOffset(Ivar v
)
261 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
263 OBJC_EXPORT
const char *property_getName(objc_property_t property
)
264 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
265 OBJC_EXPORT
const char *property_getAttributes(objc_property_t property
)
266 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
267 OBJC_EXPORT objc_property_attribute_t
*property_copyAttributeList(objc_property_t property
, unsigned int *outCount
)
268 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
269 OBJC_EXPORT
char *property_copyAttributeValue(objc_property_t property
, const char *attributeName
)
270 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
272 OBJC_EXPORT BOOL
protocol_conformsToProtocol(Protocol
*proto
, Protocol
*other
)
273 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
274 OBJC_EXPORT BOOL
protocol_isEqual(Protocol
*proto
, Protocol
*other
)
275 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
276 OBJC_EXPORT
const char *protocol_getName(Protocol
*p
)
277 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
278 OBJC_EXPORT
struct objc_method_description
protocol_getMethodDescription(Protocol
*p
, SEL aSel
, BOOL isRequiredMethod
, BOOL isInstanceMethod
)
279 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
280 OBJC_EXPORT
struct objc_method_description
*protocol_copyMethodDescriptionList(Protocol
*p
, BOOL isRequiredMethod
, BOOL isInstanceMethod
, unsigned int *outCount
)
281 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
282 OBJC_EXPORT objc_property_t
protocol_getProperty(Protocol
*proto
, const char *name
, BOOL isRequiredProperty
, BOOL isInstanceProperty
)
283 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
284 OBJC_EXPORT objc_property_t
*protocol_copyPropertyList(Protocol
*proto
, unsigned int *outCount
)
285 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
286 OBJC_EXPORT Protocol
* __unsafe_unretained
*protocol_copyProtocolList(Protocol
*proto
, unsigned int *outCount
)
287 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
289 OBJC_EXPORT Protocol
*objc_allocateProtocol(const char *name
)
290 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
291 OBJC_EXPORT
void objc_registerProtocol(Protocol
*proto
)
292 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
293 OBJC_EXPORT
void protocol_addMethodDescription(Protocol
*proto
, SEL name
, const char *types
, BOOL isRequiredMethod
, BOOL isInstanceMethod
)
294 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
295 OBJC_EXPORT
void protocol_addProtocol(Protocol
*proto
, Protocol
*addition
)
296 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
297 OBJC_EXPORT
void protocol_addProperty(Protocol
*proto
, const char *name
, const objc_property_attribute_t
*attributes
, unsigned int attributeCount
, BOOL isRequiredProperty
, BOOL isInstanceProperty
)
298 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
300 OBJC_EXPORT
const char **objc_copyImageNames(unsigned int *outCount
)
301 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
302 OBJC_EXPORT
const char *class_getImageName(Class cls
)
303 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
304 OBJC_EXPORT
const char **objc_copyClassNamesForImage(const char *image
,
305 unsigned int *outCount
)
306 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
308 OBJC_EXPORT
const char *sel_getName(SEL sel
)
309 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
310 OBJC_EXPORT SEL
sel_getUid(const char *str
)
311 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
312 OBJC_EXPORT SEL
sel_registerName(const char *str
)
313 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
314 OBJC_EXPORT BOOL
sel_isEqual(SEL lhs
, SEL rhs
)
315 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
317 OBJC_EXPORT
void objc_enumerationMutation(id
)
318 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
319 OBJC_EXPORT
void objc_setEnumerationMutationHandler(void (*handler
)(id
))
320 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
322 OBJC_EXPORT
void objc_setForwardHandler(void *fwd
, void *fwd_stret
)
323 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
325 OBJC_EXPORT IMP
imp_implementationWithBlock(void *block
)
326 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
327 OBJC_EXPORT
void *imp_getBlock(IMP anImp
)
328 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
329 OBJC_EXPORT BOOL
imp_removeBlock(IMP anImp
)
330 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_4_3
);
333 /* Associated Object support. */
335 /* objc_setAssociatedObject() options */
337 OBJC_ASSOCIATION_ASSIGN
= 0,
338 OBJC_ASSOCIATION_RETAIN_NONATOMIC
= 1,
339 OBJC_ASSOCIATION_COPY_NONATOMIC
= 3,
340 OBJC_ASSOCIATION_RETAIN
= 01401,
341 OBJC_ASSOCIATION_COPY
= 01403
343 typedef uintptr_t objc_AssociationPolicy
;
345 OBJC_EXPORT
void objc_setAssociatedObject(id object
, const void *key
, id value
, objc_AssociationPolicy policy
)
346 __OSX_AVAILABLE_STARTING(__MAC_10_6
, __IPHONE_3_1
);
347 OBJC_EXPORT id
objc_getAssociatedObject(id object
, const void *key
)
348 __OSX_AVAILABLE_STARTING(__MAC_10_6
, __IPHONE_3_1
);
349 OBJC_EXPORT
void objc_removeAssociatedObjects(id object
)
350 __OSX_AVAILABLE_STARTING(__MAC_10_6
, __IPHONE_3_1
);
353 // API to be called by clients of objects
355 OBJC_EXPORT id
objc_loadWeak(id
*location
)
356 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
357 // returns value stored (either obj or NULL)
358 OBJC_EXPORT id
objc_storeWeak(id
*location
, id obj
)
359 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
373 #define _C_LNG_LNG 'q'
374 #define _C_ULNG_LNG 'Q'
382 #define _C_CHARPTR '*'
386 #define _C_UNION_B '('
387 #define _C_UNION_E ')'
388 #define _C_STRUCT_B '{'
389 #define _C_STRUCT_E '}'
390 #define _C_VECTOR '!'
398 #define CLS_GETINFO(cls,infomask) ((cls)->info & (infomask))
399 #define CLS_SETINFO(cls,infomask) ((cls)->info |= (infomask))
401 // class is not a metaclass
402 #define CLS_CLASS 0x1
403 // class is a metaclass
405 // class's +initialize method has completed
406 #define CLS_INITIALIZED 0x4
408 #define CLS_POSING 0x8
410 #define CLS_MAPPED 0x10
411 // class and subclasses need cache flush during image loading
412 #define CLS_FLUSH_CACHE 0x20
413 // method cache should grow when full
414 #define CLS_GROW_CACHE 0x40
416 #define CLS_NEED_BIND 0x80
417 // methodLists is array of method lists
418 #define CLS_METHOD_ARRAY 0x100
419 // the JavaBridge constructs classes with these markers
420 #define CLS_JAVA_HYBRID 0x200
421 #define CLS_JAVA_CLASS 0x400
422 // thread-safe +initialize
423 #define CLS_INITIALIZING 0x800
425 #define CLS_FROM_BUNDLE 0x1000
427 #define CLS_HAS_CXX_STRUCTORS 0x2000
428 // Lazy method list arrays
429 #define CLS_NO_METHOD_ARRAY 0x4000
430 // +load implementation
431 #define CLS_HAS_LOAD_METHOD 0x8000
432 // objc_allocateClassPair API
433 #define CLS_CONSTRUCTING 0x10000
434 // class compiled with bigger class structure
435 #define CLS_EXT 0x20000
438 struct objc_method_description_list
{
440 struct objc_method_description list
[1];
444 struct objc_protocol_list
{
445 struct objc_protocol_list
*next
;
451 struct objc_category
{
452 char *category_name OBJC2_UNAVAILABLE
;
453 char *class_name OBJC2_UNAVAILABLE
;
454 struct objc_method_list
*instance_methods OBJC2_UNAVAILABLE
;
455 struct objc_method_list
*class_methods OBJC2_UNAVAILABLE
;
456 struct objc_protocol_list
*protocols OBJC2_UNAVAILABLE
;
461 char *ivar_name OBJC2_UNAVAILABLE
;
462 char *ivar_type OBJC2_UNAVAILABLE
;
463 int ivar_offset OBJC2_UNAVAILABLE
;
465 int space OBJC2_UNAVAILABLE
;
469 struct objc_ivar_list
{
470 int ivar_count OBJC2_UNAVAILABLE
;
472 int space OBJC2_UNAVAILABLE
;
474 /* variable length structure */
475 struct objc_ivar ivar_list
[1] OBJC2_UNAVAILABLE
;
480 SEL method_name OBJC2_UNAVAILABLE
;
481 char *method_types OBJC2_UNAVAILABLE
;
482 IMP method_imp OBJC2_UNAVAILABLE
;
485 struct objc_method_list
{
486 struct objc_method_list
*obsolete OBJC2_UNAVAILABLE
;
488 int method_count OBJC2_UNAVAILABLE
;
490 int space OBJC2_UNAVAILABLE
;
492 /* variable length structure */
493 struct objc_method method_list
[1] OBJC2_UNAVAILABLE
;
497 typedef struct objc_symtab
*Symtab OBJC2_UNAVAILABLE
;
500 unsigned long sel_ref_cnt OBJC2_UNAVAILABLE
;
501 SEL
*refs OBJC2_UNAVAILABLE
;
502 unsigned short cls_def_cnt OBJC2_UNAVAILABLE
;
503 unsigned short cat_def_cnt OBJC2_UNAVAILABLE
;
504 void *defs
[1] /* variable size */ OBJC2_UNAVAILABLE
;
508 typedef struct objc_cache
*Cache OBJC2_UNAVAILABLE
;
510 #define CACHE_BUCKET_NAME(B) ((B)->method_name)
511 #define CACHE_BUCKET_IMP(B) ((B)->method_imp)
512 #define CACHE_BUCKET_VALID(B) (B)
514 #define CACHE_HASH(sel, mask) (((uintptr_t)(sel)>>2) & (mask))
516 #define CACHE_HASH(sel, mask) (((unsigned int)((uintptr_t)(sel)>>3)) & (mask))
519 unsigned int mask
/* total = mask + 1 */ OBJC2_UNAVAILABLE
;
520 unsigned int occupied OBJC2_UNAVAILABLE
;
521 Method buckets
[1] OBJC2_UNAVAILABLE
;
525 typedef struct objc_module
*Module OBJC2_UNAVAILABLE
;
528 unsigned long version OBJC2_UNAVAILABLE
;
529 unsigned long size OBJC2_UNAVAILABLE
;
530 const char *name OBJC2_UNAVAILABLE
;
531 Symtab symtab OBJC2_UNAVAILABLE
;
536 struct objc_method_list
;
541 /* Obsolete functions */
543 OBJC_EXPORT IMP
class_lookupMethod(Class cls
, SEL sel
)
544 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0
,__MAC_10_5
, __IPHONE_2_0
,__IPHONE_2_0
);
545 OBJC_EXPORT BOOL
class_respondsToMethod(Class cls
, SEL sel
)
546 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0
,__MAC_10_5
, __IPHONE_2_0
,__IPHONE_2_0
);
547 OBJC_EXPORT
void _objc_flush_caches(Class cls
)
548 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0
,__MAC_10_5
, __IPHONE_2_0
,__IPHONE_2_0
);
550 OBJC_EXPORT id
object_copyFromZone(id anObject
, size_t nBytes
, void *z
)
551 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0
,__MAC_10_5
, __IPHONE_NA
,__IPHONE_NA
)
552 OBJC_ARC_UNAVAILABLE
;
553 OBJC_EXPORT id
object_realloc(id anObject
, size_t nBytes
) OBJC2_UNAVAILABLE
;
554 OBJC_EXPORT id
object_reallocFromZone(id anObject
, size_t nBytes
, void *z
) OBJC2_UNAVAILABLE
;
556 #define OBSOLETE_OBJC_GETCLASSES 1
557 OBJC_EXPORT
void *objc_getClasses(void) OBJC2_UNAVAILABLE
;
558 OBJC_EXPORT
void objc_addClass(Class myClass
) OBJC2_UNAVAILABLE
;
559 OBJC_EXPORT
void objc_setClassHandler(int (*)(const char *)) OBJC2_UNAVAILABLE
;
560 OBJC_EXPORT
void objc_setMultithreaded (BOOL flag
) OBJC2_UNAVAILABLE
;
562 OBJC_EXPORT id
class_createInstanceFromZone(Class
, size_t idxIvars
, void *z
)
563 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0
,__MAC_10_5
, __IPHONE_NA
,__IPHONE_NA
)
564 OBJC_ARC_UNAVAILABLE
;
566 OBJC_EXPORT
void class_addMethods(Class
, struct objc_method_list
*) OBJC2_UNAVAILABLE
;
567 OBJC_EXPORT
void class_removeMethods(Class
, struct objc_method_list
*) OBJC2_UNAVAILABLE
;
568 OBJC_EXPORT
void _objc_resolve_categories_for_class(Class cls
) OBJC2_UNAVAILABLE
;
570 OBJC_EXPORT Class
class_poseAs(Class imposter
, Class original
) OBJC2_UNAVAILABLE
;
572 OBJC_EXPORT
unsigned int method_getSizeOfArguments(Method m
) OBJC2_UNAVAILABLE
;
573 OBJC_EXPORT
unsigned method_getArgumentInfo(struct objc_method
*m
, int arg
, const char **type
, int *offset
) OBJC2_UNAVAILABLE
;
575 OBJC_EXPORT BOOL
class_respondsToMethod(Class
, SEL
) OBJC2_UNAVAILABLE
;
576 OBJC_EXPORT IMP
class_lookupMethod(Class
, SEL
) OBJC2_UNAVAILABLE
;
577 OBJC_EXPORT Class
objc_getOrigClass(const char *name
) OBJC2_UNAVAILABLE
;
578 #define OBJC_NEXT_METHOD_LIST 1
579 OBJC_EXPORT
struct objc_method_list
*class_nextMethodList(Class
, void **) OBJC2_UNAVAILABLE
;
580 // usage for nextMethodList
582 // void *iterator = 0;
583 // struct objc_method_list *mlist;
584 // while ( mlist = class_nextMethodList( cls, &iterator ) )
587 OBJC_EXPORT
id (*_alloc
)(Class
, size_t) OBJC2_UNAVAILABLE
;
588 OBJC_EXPORT
id (*_copy
)(id
, size_t) OBJC2_UNAVAILABLE
;
589 OBJC_EXPORT
id (*_realloc
)(id
, size_t) OBJC2_UNAVAILABLE
;
590 OBJC_EXPORT
id (*_dealloc
)(id
) OBJC2_UNAVAILABLE
;
591 OBJC_EXPORT
id (*_zoneAlloc
)(Class
, size_t, void *) OBJC2_UNAVAILABLE
;
592 OBJC_EXPORT
id (*_zoneRealloc
)(id
, size_t, void *) OBJC2_UNAVAILABLE
;
593 OBJC_EXPORT
id (*_zoneCopy
)(id
, size_t, void *) OBJC2_UNAVAILABLE
;
594 OBJC_EXPORT
void (*_error
)(id
, const char *, va_list) OBJC2_UNAVAILABLE
;