]> git.saurik.com Git - apple/objc4.git/blob - runtime/objc-abi.h
objc4-532.2.tar.gz
[apple/objc4.git] / runtime / objc-abi.h
1 /*
2 * Copyright (c) 2009 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
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
11 * file.
12 *
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.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25 #ifndef _OBJC_ABI_H
26 #define _OBJC_ABI_H
27
28 /*
29 * WARNING DANGER HAZARD BEWARE EEK
30 *
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.
34 */
35
36 /*
37 * objc-abi.h: Declarations for functions used by compiler codegen.
38 */
39
40 #include <malloc/malloc.h>
41 #include <objc/objc.h>
42 #include <objc/runtime.h>
43 #include <objc/message.h>
44
45 /* Runtime startup. */
46
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);
50
51
52 /* Properties */
53
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);
59
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)
62 OBJC_GC_UNAVAILABLE;
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)
65 OBJC_GC_UNAVAILABLE;
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)
68 OBJC_GC_UNAVAILABLE;
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)
71 OBJC_GC_UNAVAILABLE;
72
73
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);
78
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);
82
83 /* Classes. */
84 #if __OBJC2__
85 OBJC_EXPORT IMP _objc_empty_vtable
86 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
87 #endif
88 OBJC_EXPORT struct objc_cache _objc_empty_cache
89 __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
90
91
92 /* Messages */
93
94 #if __OBJC2__
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);
100
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);
104 #endif
105
106 #if __OBJC2__
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);
119
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);
129 # else
130 OBJC_EXPORT void objc_msgSend_fp2ret_debug(id self, SEL op, ...)
131 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
132 # endif
133 # endif
134
135 #endif
136
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);
152 # else
153 OBJC_EXPORT void objc_msgSend_fp2ret_fixup(id self, SEL op, ...)
154 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
155 # endif
156 #endif
157
158 /* C++-compatible exception handling. */
159 #if __OBJC2__
160
161 // fixme these conflict with C++ compiler's internal definitions
162 #if !defined(__cplusplus)
163
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);
167
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);
171
172 #endif
173
174 // Exception personality function for Objective-C and Objective-C++ code.
175 struct _Unwind_Exception;
176 struct _Unwind_Context;
177 OBJC_EXPORT int
178 __objc_personality_v0(int version,
179 int actions,
180 uint64_t exceptionClass,
181 struct _Unwind_Exception *exceptionObject,
182 struct _Unwind_Context *context)
183 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
184
185 #endif
186
187 /* ARR */
188
189 OBJC_EXPORT id objc_retainBlock(id)
190 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
191
192 #endif