2 * Copyright (c) 2009 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@
29 * WARNING DANGER HAZARD BEWARE EEK
31 * Everything in this file is for Apple Internal use only.
32 * These will change in arbitrary OS updates and in unpredictable ways.
33 * When your program breaks, you get to keep both pieces.
37 * objc-abi.h: Declarations for functions used by compiler codegen.
40 #include <malloc/malloc.h>
41 #include <objc/objc.h>
42 #include <objc/runtime.h>
43 #include <objc/message.h>
45 /* Runtime startup. */
47 // Old static initializer. Used by old crt1.o and old bug workarounds.
48 OBJC_EXPORT
void _objcInit(void)
49 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
54 // Read or write an object property. Not all object properties use these.
55 OBJC_EXPORT id
objc_getProperty(id self
, SEL _cmd
, ptrdiff_t offset
, BOOL atomic
)
56 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
57 OBJC_EXPORT
void objc_setProperty(id self
, SEL _cmd
, ptrdiff_t offset
, id newValue
, BOOL atomic
, signed char shouldCopy
)
58 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
60 OBJC_EXPORT
void objc_setProperty_atomic(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
61 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
63 OBJC_EXPORT
void objc_setProperty_nonatomic(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
64 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
66 OBJC_EXPORT
void objc_setProperty_atomic_copy(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
67 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
69 OBJC_EXPORT
void objc_setProperty_nonatomic_copy(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
70 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
74 // Read or write a non-object property. Not all uses are C structs,
75 // and not all C struct properties use this.
76 OBJC_EXPORT
void objc_copyStruct(void *dest
, const void *src
, ptrdiff_t size
, BOOL atomic
, BOOL hasStrong
)
77 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
79 // Perform a copy of a C++ object using striped locks. Used by non-POD C++ typed atomic properties.
80 OBJC_EXPORT
void objc_copyCppObjectAtomic(void *dest
, const void *src
, void (*copyHelper
) (void *dest
, const void *source
))
81 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
);
85 OBJC_EXPORT IMP _objc_empty_vtable
86 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
88 OBJC_EXPORT
struct objc_cache _objc_empty_cache
89 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
95 // objc_msgSendSuper2() takes the current search class, not its superclass.
96 OBJC_EXPORT id
objc_msgSendSuper2(struct objc_super
*super
, SEL op
, ...)
97 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
98 OBJC_EXPORT
void objc_msgSendSuper2_stret(struct objc_super
*super
, SEL op
,...)
99 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
101 // objc_msgSend_noarg() may be faster for methods with no additional arguments.
102 OBJC_EXPORT id
objc_msgSend_noarg(id self
, SEL _cmd
)
103 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
107 // Debug messengers. Messengers used by the compiler have a debug flavor that
108 // may perform extra sanity checking.
109 // Old objc_msgSendSuper() does not have a debug version; this is OBJC2 only.
110 // *_fixup() do not have debug versions; use non-fixup only for debug mode.
111 OBJC_EXPORT id
objc_msgSend_debug(id self
, SEL op
, ...)
112 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
113 OBJC_EXPORT id
objc_msgSendSuper2_debug(struct objc_super
*super
, SEL op
, ...)
114 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
115 OBJC_EXPORT
void objc_msgSend_stret_debug(id self
, SEL op
, ...)
116 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
117 OBJC_EXPORT
void objc_msgSendSuper2_stret_debug(struct objc_super
*super
, SEL op
,...)
118 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
120 # if defined(__i386__)
121 OBJC_EXPORT
double objc_msgSend_fpret_debug(id self
, SEL op
, ...)
122 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
123 # elif defined(__x86_64__)
124 OBJC_EXPORT
long double objc_msgSend_fpret_debug(id self
, SEL op
, ...)
125 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
126 # if __STDC_VERSION__ >= 199901L
127 OBJC_EXPORT _Complex
long double objc_msgSend_fp2ret_debug(id self
, SEL op
, ...)
128 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
130 OBJC_EXPORT
void objc_msgSend_fp2ret_debug(id self
, SEL op
, ...)
131 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
137 #if __OBJC2__ && defined(__x86_64__)
138 // objc_msgSend_fixup() is used for vtable-dispatchable call sites.
139 OBJC_EXPORT id
objc_msgSend_fixup(id self
, SEL op
, ...)
140 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
);
141 OBJC_EXPORT
void objc_msgSend_stret_fixup(id self
, SEL op
, ...)
142 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
);
143 OBJC_EXPORT id
objc_msgSendSuper2_fixup(struct objc_super
*super
, SEL op
, ...)
144 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
);
145 OBJC_EXPORT
void objc_msgSendSuper2_stret_fixup(struct objc_super
*super
, SEL op
,...)
146 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
);
147 OBJC_EXPORT
long double objc_msgSend_fpret_fixup(id self
, SEL op
, ...)
148 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
);
149 # if __STDC_VERSION__ >= 199901L
150 OBJC_EXPORT _Complex
long double objc_msgSend_fp2ret_fixup(id self
, SEL op
, ...)
151 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
);
153 OBJC_EXPORT
void objc_msgSend_fp2ret_fixup(id self
, SEL op
, ...)
154 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
);
158 /* C++-compatible exception handling. */
161 // fixme these conflict with C++ compiler's internal definitions
162 #if !defined(__cplusplus)
164 // Vtable for C++ exception typeinfo for Objective-C types.
165 OBJC_EXPORT
const void *objc_ehtype_vtable
[]
166 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
168 // C++ exception typeinfo for type `id`.
169 OBJC_EXPORT
struct objc_typeinfo OBJC_EHTYPE_id
170 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
174 // Exception personality function for Objective-C and Objective-C++ code.
175 struct _Unwind_Exception
;
176 struct _Unwind_Context
;
178 __objc_personality_v0(int version
,
180 uint64_t exceptionClass
,
181 struct _Unwind_Exception
*exceptionObject
,
182 struct _Unwind_Context
*context
)
183 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
189 OBJC_EXPORT id
objc_retainBlock(id
)
190 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);