]> git.saurik.com Git - cycript.git/blob - sig/types.hpp
Make Functor/struct output fancy type definitions.
[cycript.git] / sig / types.hpp
1 /* Cycript - The Truly Universal Scripting Language
2 * Copyright (C) 2009-2016 Jay Freeman (saurik)
3 */
4
5 /* GNU Affero General Public License, Version 3 {{{ */
6 /*
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
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
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/>.
19 **/
20 /* }}} */
21
22 #ifndef SIG_TYPES_H
23 #define SIG_TYPES_H
24
25 #include <cstdlib>
26 #include <stdint.h>
27
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
36 #include "Standard.hpp"
37
38 class CYPool;
39 struct CYTypedIdentifier;
40 struct CYTypedParameter;
41
42 namespace sig {
43
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
60 virtual Type *Copy(CYPool &pool, const char *rename = NULL) const = 0;
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;
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;
85 };
86
87 struct Element {
88 const char *name;
89 Type *type;
90 size_t offset;
91 };
92
93 struct Signature {
94 Element *elements;
95 size_t count;
96 };
97
98 struct Void :
99 Type
100 {
101 Void *Copy(CYPool &pool, const char *rename = NULL) const override;
102
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 {
114 Unknown *Copy(CYPool &pool, const char *rename = NULL) const override;
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 {
127 String *Copy(CYPool &pool, const char *rename = NULL) const override;
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
137 #ifdef CY_OBJECTIVEC
138 struct Meta :
139 Type
140 {
141 Meta *Copy(CYPool &pool, const char *rename = NULL) const override;
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 {
154 Selector *Copy(CYPool &pool, const char *rename = NULL) const override;
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 };
163 #endif
164
165 struct Bits :
166 Type
167 {
168 size_t size;
169
170 Bits(size_t size) :
171 size(size)
172 {
173 }
174
175 Bits *Copy(CYPool &pool, const char *rename = NULL) const override;
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
195 Pointer *Copy(CYPool &pool, const char *rename = NULL) const override;
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
217 Array *Copy(CYPool &pool, const char *rename = NULL) const override;
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;
225 };
226
227 #ifdef CY_OBJECTIVEC
228 struct Object :
229 Type
230 {
231 const char *name;
232
233 Object(const char *name = NULL) :
234 name(name)
235 {
236 }
237
238 Object *Copy(CYPool &pool, const char *rename = NULL) const override;
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;
246 };
247 #endif
248
249 struct Aggregate :
250 Type
251 {
252 bool overlap;
253 const char *name;
254 Signature signature;
255
256 Aggregate(bool overlap, const char *name = NULL) :
257 overlap(overlap),
258 name(name)
259 {
260 }
261
262 Aggregate *Copy(CYPool &pool, const char *rename = NULL) const override;
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;
277
278 CYTypedIdentifier *Decode(CYPool &pool) const override;
279 virtual CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const = 0;
280 };
281
282 struct Function :
283 Callable
284 {
285 bool variadic;
286
287 Function(bool variadic) :
288 variadic(variadic)
289 {
290 }
291
292 Function *Copy(CYPool &pool, const char *rename = NULL) const override;
293
294 const char *Encode(CYPool &pool) const override;
295 CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const override;
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
302 #ifdef CY_OBJECTIVEC
303 struct Block :
304 Callable
305 {
306 Block *Copy(CYPool &pool, const char *rename = NULL) const override;
307
308 const char *Encode(CYPool &pool) const override;
309 CYTypedIdentifier *Decode(CYPool &pool) const override;
310 CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const override;
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 };
316 #endif
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);
320
321 }
322
323 #endif/*SIG_TYPES_H*/