]>
Commit | Line | Data |
---|---|---|
7341eedb JF |
1 | /* Cycript - The Truly Universal Scripting Language |
2 | * Copyright (C) 2009-2016 Jay Freeman (saurik) | |
b4aa79af JF |
3 | */ |
4 | ||
f95d2598 | 5 | /* GNU Affero General Public License, Version 3 {{{ */ |
b4aa79af | 6 | /* |
f95d2598 JF |
7 | * This program is free software: you can redistribute it and/or modify |
8 | * it under the terms of the GNU Affero General Public License as published by | |
9 | * the Free Software Foundation, either version 3 of the License, or | |
10 | * (at your option) any later version. | |
11 | ||
12 | * This program is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
c15969fd | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
f95d2598 JF |
15 | * GNU Affero General Public License for more details. |
16 | ||
17 | * You should have received a copy of the GNU Affero General Public License | |
18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
b3378a02 | 19 | **/ |
b4aa79af JF |
20 | /* }}} */ |
21 | ||
ea2d184c JF |
22 | #ifndef SIG_TYPES_H |
23 | #define SIG_TYPES_H | |
24 | ||
b799113b JF |
25 | #include <cstdlib> |
26 | #include <stdint.h> | |
27 | ||
0559abf8 JF |
28 | #include <JavaScriptCore/JSBase.h> |
29 | ||
30 | #ifdef HAVE_FFI_FFI_H | |
31 | #include <ffi/ffi.h> | |
32 | #else | |
33 | #include <ffi.h> | |
34 | #endif | |
35 | ||
37954781 | 36 | #include "Standard.hpp" |
ea2d184c | 37 | |
0559abf8 JF |
38 | class CYPool; |
39 | struct CYTypedIdentifier; | |
574d4720 | 40 | struct CYTypedParameter; |
0559abf8 | 41 | |
ea2d184c JF |
42 | namespace sig { |
43 | ||
0559abf8 JF |
44 | #define JOC_TYPE_INOUT (1 << 0) |
45 | #define JOC_TYPE_IN (1 << 1) | |
46 | #define JOC_TYPE_BYCOPY (1 << 2) | |
47 | #define JOC_TYPE_OUT (1 << 3) | |
48 | #define JOC_TYPE_BYREF (1 << 4) | |
49 | #define JOC_TYPE_CONST (1 << 5) | |
50 | #define JOC_TYPE_ONEWAY (1 << 6) | |
51 | ||
52 | struct Type { | |
53 | uint8_t flags; | |
54 | ||
55 | Type() : | |
56 | flags(0) | |
57 | { | |
58 | } | |
59 | ||
a109809e | 60 | virtual Type *Copy(CYPool &pool, const char *rename = NULL) const = 0; |
0559abf8 JF |
61 | virtual const char *GetName() const; |
62 | ||
63 | virtual const char *Encode(CYPool &pool) const = 0; | |
64 | virtual CYTypedIdentifier *Decode(CYPool &pool) const = 0; | |
65 | ||
66 | virtual ffi_type *GetFFI(CYPool &pool) const = 0; | |
67 | virtual void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const = 0; | |
68 | virtual JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize = false, JSObjectRef owner = NULL) const = 0; | |
0559abf8 JF |
69 | }; |
70 | ||
71 | template <typename Type_> | |
72 | struct Primitive : | |
73 | Type | |
74 | { | |
75 | Primitive *Copy(CYPool &pool, const char *name) const { | |
76 | return new(pool) Primitive(); | |
77 | } | |
78 | ||
79 | const char *Encode(CYPool &pool) const override; | |
80 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
81 | ||
82 | ffi_type *GetFFI(CYPool &pool) const override; | |
83 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
84 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
ea2d184c JF |
85 | }; |
86 | ||
87 | struct Element { | |
b799113b | 88 | const char *name; |
0559abf8 | 89 | Type *type; |
ea2d184c JF |
90 | size_t offset; |
91 | }; | |
92 | ||
93 | struct Signature { | |
0559abf8 | 94 | Element *elements; |
ea2d184c JF |
95 | size_t count; |
96 | }; | |
97 | ||
0559abf8 JF |
98 | struct Void : |
99 | Type | |
100 | { | |
a109809e | 101 | Void *Copy(CYPool &pool, const char *rename = NULL) const override; |
ea2d184c | 102 | |
0559abf8 JF |
103 | const char *Encode(CYPool &pool) const override; |
104 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
105 | ||
106 | ffi_type *GetFFI(CYPool &pool) const override; | |
107 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
108 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
109 | }; | |
110 | ||
111 | struct Unknown : | |
112 | Type | |
113 | { | |
a109809e | 114 | Unknown *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
115 | |
116 | const char *Encode(CYPool &pool) const override; | |
117 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
118 | ||
119 | ffi_type *GetFFI(CYPool &pool) const override; | |
120 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
121 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
122 | }; | |
123 | ||
124 | struct String : | |
125 | Type | |
126 | { | |
a109809e | 127 | String *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
128 | |
129 | const char *Encode(CYPool &pool) const override; | |
130 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
131 | ||
132 | ffi_type *GetFFI(CYPool &pool) const override; | |
133 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
134 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
135 | }; | |
136 | ||
e2ce853b | 137 | #ifdef CY_OBJECTIVEC |
0559abf8 JF |
138 | struct Meta : |
139 | Type | |
140 | { | |
a109809e | 141 | Meta *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
142 | |
143 | const char *Encode(CYPool &pool) const override; | |
144 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
145 | ||
146 | ffi_type *GetFFI(CYPool &pool) const override; | |
147 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
148 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
149 | }; | |
150 | ||
151 | struct Selector : | |
152 | Type | |
153 | { | |
a109809e | 154 | Selector *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
155 | |
156 | const char *Encode(CYPool &pool) const override; | |
157 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
158 | ||
159 | ffi_type *GetFFI(CYPool &pool) const override; | |
160 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
161 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
162 | }; | |
e2ce853b | 163 | #endif |
0559abf8 JF |
164 | |
165 | struct Bits : | |
166 | Type | |
167 | { | |
168 | size_t size; | |
169 | ||
170 | Bits(size_t size) : | |
171 | size(size) | |
172 | { | |
173 | } | |
174 | ||
a109809e | 175 | Bits *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
176 | |
177 | const char *Encode(CYPool &pool) const override; | |
178 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
179 | ||
180 | ffi_type *GetFFI(CYPool &pool) const override; | |
181 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
182 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
183 | }; | |
184 | ||
185 | struct Pointer : | |
186 | Type | |
187 | { | |
188 | Type &type; | |
189 | ||
190 | Pointer(Type &type) : | |
191 | type(type) | |
192 | { | |
193 | } | |
194 | ||
a109809e | 195 | Pointer *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
196 | |
197 | const char *Encode(CYPool &pool) const override; | |
198 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
199 | ||
200 | ffi_type *GetFFI(CYPool &pool) const override; | |
201 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
202 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
203 | }; | |
204 | ||
205 | struct Array : | |
206 | Type | |
207 | { | |
208 | Type &type; | |
209 | size_t size; | |
210 | ||
211 | Array(Type &type, size_t size = _not(size_t)) : | |
212 | type(type), | |
213 | size(size) | |
214 | { | |
215 | } | |
216 | ||
a109809e | 217 | Array *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
218 | |
219 | const char *Encode(CYPool &pool) const override; | |
220 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
221 | ||
222 | ffi_type *GetFFI(CYPool &pool) const override; | |
223 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
224 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
0559abf8 JF |
225 | }; |
226 | ||
e2ce853b | 227 | #ifdef CY_OBJECTIVEC |
0559abf8 JF |
228 | struct Object : |
229 | Type | |
230 | { | |
21d5f610 | 231 | const char *name; |
ea2d184c | 232 | |
0559abf8 JF |
233 | Object(const char *name = NULL) : |
234 | name(name) | |
235 | { | |
236 | } | |
ea2d184c | 237 | |
a109809e | 238 | Object *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
239 | |
240 | const char *Encode(CYPool &pool) const override; | |
241 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
242 | ||
243 | ffi_type *GetFFI(CYPool &pool) const override; | |
244 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
245 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
ea2d184c | 246 | }; |
e2ce853b | 247 | #endif |
ea2d184c | 248 | |
0559abf8 JF |
249 | struct Aggregate : |
250 | Type | |
251 | { | |
252 | bool overlap; | |
253 | const char *name; | |
254 | Signature signature; | |
ea2d184c | 255 | |
0559abf8 JF |
256 | Aggregate(bool overlap, const char *name = NULL) : |
257 | overlap(overlap), | |
258 | name(name) | |
259 | { | |
260 | } | |
3fe16be7 | 261 | |
a109809e | 262 | Aggregate *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
263 | const char *GetName() const override; |
264 | ||
265 | const char *Encode(CYPool &pool) const override; | |
266 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
267 | ||
268 | ffi_type *GetFFI(CYPool &pool) const override; | |
269 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
270 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
271 | }; | |
272 | ||
273 | struct Callable : | |
274 | Type | |
275 | { | |
276 | Signature signature; | |
574d4720 JF |
277 | |
278 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
279 | virtual CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const = 0; | |
0559abf8 JF |
280 | }; |
281 | ||
282 | struct Function : | |
283 | Callable | |
284 | { | |
574d4720 JF |
285 | bool variadic; |
286 | ||
287 | Function(bool variadic) : | |
288 | variadic(variadic) | |
289 | { | |
290 | } | |
291 | ||
a109809e | 292 | Function *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
293 | |
294 | const char *Encode(CYPool &pool) const override; | |
574d4720 | 295 | CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const override; |
0559abf8 JF |
296 | |
297 | ffi_type *GetFFI(CYPool &pool) const override; | |
298 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
299 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
300 | }; | |
301 | ||
e2ce853b | 302 | #ifdef CY_OBJECTIVEC |
0559abf8 JF |
303 | struct Block : |
304 | Callable | |
305 | { | |
a109809e | 306 | Block *Copy(CYPool &pool, const char *rename = NULL) const override; |
0559abf8 JF |
307 | |
308 | const char *Encode(CYPool &pool) const override; | |
309 | CYTypedIdentifier *Decode(CYPool &pool) const override; | |
574d4720 | 310 | CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const override; |
0559abf8 JF |
311 | |
312 | ffi_type *GetFFI(CYPool &pool) const override; | |
313 | void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; | |
314 | JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; | |
315 | }; | |
e2ce853b | 316 | #endif |
0559abf8 JF |
317 | |
318 | Type *joc_parse_type(char **name, char eos, bool variable, bool signature); | |
319 | void joc_parse_signature(Signature *signature, char **name, char eos, bool variable); | |
bd17e6f3 | 320 | |
ea2d184c JF |
321 | } |
322 | ||
323 | #endif/*SIG_TYPES_H*/ |