1 /*
2 * Copyright (c) 2022-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef CONVERTORS_JSC_H
17 #define CONVERTORS_JSC_H
18
19 #if defined(linux)
20 #include <JavaScriptCore/JavaScript.h> // For IDE completion
21 #else
22 #include <JavaScriptCore/JavaScriptCore.h>
23 #endif
24 #include <_types/_uint8_t.h>
25 #include <vector>
26 #include <string>
27 #include <iostream>
28
29 #include "koala-types.h"
30 #include "interop-logging.h"
31
32 template <typename ElemType>
getTypedElements(JSContextRef context,const JSValueRef arguments)33 inline ElemType* getTypedElements(JSContextRef context, const JSValueRef arguments) {
34 if (JSValueIsNull(context, arguments)) {
35 return nullptr;
36 }
37 if (JSValueIsUndefined(context, arguments)) {
38 ASSERT(false);
39 return nullptr;
40 }
41 JSValueRef exception {};
42 ElemType* data = reinterpret_cast<ElemType*>(JSObjectGetTypedArrayBytesPtr(context,
43 JSValueToObject(context, arguments, &exception), &exception));
44 return data;
45 }
46
47 template <typename ElemType>
getTypedElements(JSContextRef context,size_t argumentCount,const JSValueRef arguments[],int index)48 inline ElemType* getTypedElements(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
49 ASSERT(index < argumentCount);
50 return getTypedElements<ElemType>(context, arguments[index]);
51 }
52
53 uint8_t* getUInt8Elements(JSContextRef context, const JSValueRef arguments);
54 int32_t* getInt32Elements(JSContextRef context, const JSValueRef arguments);
55 uint32_t* getUInt32Elements(JSContextRef context, const JSValueRef arguments);
56 float* getFloat32Elements(JSContextRef context, const JSValueRef arguments);
57 KByte* getByteElements(JSContextRef context, const JSValueRef arguments);
58 KUShort* getUShortElements(JSContextRef context, const JSValueRef arguments);
59 KShort* getShortElements(JSContextRef context, const JSValueRef arguments);
60 KNativePointerArray getPointerElements(JSContextRef context, const JSValueRef arguments);
61 KStringArray getKStringArray(JSContextRef context, const JSValueRef arguments);
62
63 uint8_t getUInt8(JSContextRef context, JSValueRef value);
64 int32_t getInt32(JSContextRef context, JSValueRef value);
65 uint32_t getUInt32(JSContextRef context, JSValueRef value);
66 KNativePointer getPointer(JSContextRef context, JSValueRef value);
67 KFloat getFloat(JSContextRef context, JSValueRef value);
68 KStringPtr getString(JSContextRef context, JSValueRef value);
69 KBoolean getBoolean(JSContextRef context, JSValueRef value);
70 KStringPtr getString(JSContextRef context, JSValueRef value);
71
72 template <typename Type>
73 inline Type getArgument(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) = delete;
74
75 template <>
76 inline int32_t getArgument<int32_t>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
77 ASSERT(index < argumentCount);
78 return getInt32(context, arguments[index]);
79 }
80
81 template <>
82 inline uint32_t getArgument<uint32_t>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
83 ASSERT(index < argumentCount);
84 return getUInt32(context, arguments[index]);
85 }
86
87 template <>
88 inline uint8_t getArgument<uint8_t>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
89 ASSERT(index < argumentCount);
90 return getUInt8(context, arguments[index]);
91 }
92
93 template <>
94 inline KNativePointer getArgument<KNativePointer>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
95 ASSERT(index < argumentCount);
96 return getPointer(context, arguments[index]);
97 }
98
99 template <>
100 inline KFloat getArgument<KFloat>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
101 ASSERT(index < argumentCount);
102 return getFloat(context, arguments[index]);
103 }
104
105 template <>
106 inline KStringPtr getArgument<KStringPtr>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
107 ASSERT(index < argumentCount);
108 return getString(context, arguments[index]);
109 }
110
111 template <>
112 inline KBoolean getArgument<KBoolean>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
113 ASSERT(index < argumentCount);
114 return getBoolean(context, arguments[index]);
115 }
116
117 template <>
118 inline KInt* getArgument<KInt*>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
119 ASSERT(index < argumentCount);
120 return getInt32Elements(context, arguments[index]);
121 }
122
123 template <>
124 inline float* getArgument<float*>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
125 ASSERT(index < argumentCount);
126 return getFloat32Elements(context, arguments[index]);
127 }
128
129 template <>
130 inline KByte* getArgument<KByte*>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
131 ASSERT(index < argumentCount);
132 return getByteElements(context, arguments[index]);
133 }
134
135 template <>
136 inline KStringArray getArgument<KStringArray>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
137 ASSERT(index < argumentCount);
138 return getKStringArray(context, arguments[index]);
139 }
140
141 template <>
142 inline KUShort* getArgument<KUShort*>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
143 ASSERT(index < argumentCount);
144 return getUShortElements(context, arguments[index]);
145 }
146
147 template <>
148 inline KNativePointerArray getArgument<KNativePointerArray>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
149 ASSERT(index < argumentCount);
150 return getPointerElements(context, arguments[index]);
151 }
152
153 template <>
154 inline KShort* getArgument<KShort*>(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], int index) {
155 ASSERT(index < argumentCount);
156 return getShortElements(context, arguments[index]);
157 }
158
159 JSValueRef makeInt32(JSContextRef context, int32_t value);
160 JSValueRef makeUInt32(JSContextRef context, uint32_t value);
161 JSValueRef makePointer(JSContextRef context, KNativePointer value);
162 JSValueRef makeFloat(JSContextRef context, KFloat value);
163 JSValueRef makeBoolean(JSContextRef context, KBoolean value);
164 JSValueRef makeVoid(JSContextRef context);
165
166 template <typename Type>
167 inline JSValueRef makeResult(JSContextRef context, Type value) = delete;
168
169 template <>
170 inline JSValueRef makeResult<int32_t>(JSContextRef context, int32_t value) {
171 return makeInt32(context, value);
172 }
173
174 template <>
175 inline JSValueRef makeResult<uint32_t>(JSContextRef context, uint32_t value) {
176 return makeUInt32(context, value);
177 }
178
179 template <>
180 inline JSValueRef makeResult<KNativePointer>(JSContextRef context, KNativePointer value) {
181 return makePointer(context, value);
182 }
183
184 template <>
185 inline JSValueRef makeResult<KFloat>(JSContextRef context, KFloat value) {
186 return makeFloat(context, value);
187 }
188
189 template <>
190 inline JSValueRef makeResult<KBoolean>(JSContextRef context, KBoolean value) {
191 return makeBoolean(context, value);
192 }
193
194 typedef JSValueRef (*jsc_type_t)(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception);
195
196 class Exports {
197 std::vector<std::pair<std::string, jsc_type_t>> implementations;
198
199 public:
200 static Exports* getInstance();
201
addImpl(const char * name,jsc_type_t impl)202 void addImpl(const char* name, jsc_type_t impl) {
203 implementations.push_back(std::make_pair(name, impl));
204 }
205
getImpls()206 const std::vector<std::pair<std::string, jsc_type_t>>& getImpls() {
207 return implementations;
208 }
209 };
210
211 void InitExports(JSGlobalContextRef globalContext);
212
213 #define MAKE_JSC_EXPORT(name) \
214 __attribute__((constructor)) \
215 static void __init_##name() { \
216 Exports::getInstance()->addImpl("_"#name, Jsc_##name); \
217 }
218
219 #define MAKE_JSC_EXPORT_V1(name) \
220 __attribute__((constructor)) \
221 static void __init_##name() { \
222 Exports::getInstance()->addImpl(#name, Jsc_##name); \
223 }
224
225 #define KOALA_INTEROP_0(name, Ret) \
226 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
227 KOALA_MAYBE_LOG(name) \
228 return makeResult<Ret>(ctx, impl_##name()); \
229 } \
230 MAKE_JSC_EXPORT(name)
231
232 #define KOALA_INTEROP_1(name, Ret, P0) \
233 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
234 KOALA_MAYBE_LOG(name) \
235 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
236 return makeResult<Ret>(ctx, impl_##name(p0)); \
237 } \
238 MAKE_JSC_EXPORT(name)
239
240 #define KOALA_INTEROP_2(name, Ret, P0, P1) \
241 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
242 KOALA_MAYBE_LOG(name) \
243 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
244 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
245 return makeResult<Ret>(ctx, impl_##name(p0, p1)); \
246 } \
247 MAKE_JSC_EXPORT(name)
248
249 #define KOALA_INTEROP_3(name, Ret, P0, P1, P2) \
250 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
251 KOALA_MAYBE_LOG(name) \
252 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
253 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
254 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
255 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2)); \
256 } \
257 MAKE_JSC_EXPORT(name)
258
259 #define KOALA_INTEROP_4(name, Ret, P0, P1, P2, P3) \
260 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
261 KOALA_MAYBE_LOG(name) \
262 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
263 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
264 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
265 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
266 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3)); \
267 } \
268 MAKE_JSC_EXPORT(name)
269
270 #define KOALA_INTEROP_5(name, Ret, P0, P1, P2, P3, P4) \
271 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
272 KOALA_MAYBE_LOG(name) \
273 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
274 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
275 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
276 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
277 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
278 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4)); \
279 } \
280 MAKE_JSC_EXPORT(name)
281
282 #define KOALA_INTEROP_6(name, Ret, P0, P1, P2, P3, P4, P5) \
283 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
284 KOALA_MAYBE_LOG(name) \
285 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
286 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
287 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
288 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
289 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
290 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
291 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5)); \
292 } \
293 MAKE_JSC_EXPORT(name)
294
295 #define KOALA_INTEROP_7(name, Ret, P0, P1, P2, P3, P4, P5, P6) \
296 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
297 KOALA_MAYBE_LOG(name) \
298 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
299 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
300 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
301 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
302 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
303 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
304 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
305 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6)); \
306 } \
307 MAKE_JSC_EXPORT(name)
308
309 #define KOALA_INTEROP_8(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7) \
310 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
311 KOALA_MAYBE_LOG(name) \
312 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
313 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
314 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
315 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
316 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
317 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
318 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
319 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
320 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6,p7)); \
321 } \
322 MAKE_JSC_EXPORT(name)
323
324 #define KOALA_INTEROP_9(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8) \
325 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
326 KOALA_MAYBE_LOG(name) \
327 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
328 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
329 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
330 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
331 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
332 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
333 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
334 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
335 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
336 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8)); \
337 } \
338 MAKE_JSC_EXPORT(name)
339
340 #define KOALA_INTEROP_10(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) \
341 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
342 KOALA_MAYBE_LOG(name) \
343 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
344 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
345 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
346 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
347 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
348 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
349 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
350 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
351 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
352 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
353 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9)); \
354 } \
355 MAKE_JSC_EXPORT(name)
356
357 #define KOALA_INTEROP_11(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) \
358 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
359 KOALA_MAYBE_LOG(name) \
360 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
361 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
362 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
363 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
364 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
365 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
366 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
367 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
368 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
369 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
370 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
371 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)); \
372 } \
373 MAKE_JSC_EXPORT(name)
374
375 #define KOALA_INTEROP_12(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) \
376 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
377 KOALA_MAYBE_LOG(name) \
378 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
379 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
380 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
381 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
382 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
383 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
384 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
385 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
386 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
387 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
388 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
389 P11 p11 = getArgument<P11>(ctx, argumentCount, arguments, 11); \
390 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)); \
391 } \
392 MAKE_JSC_EXPORT(name)
393
394 #define KOALA_INTEROP_13(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) \
395 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
396 KOALA_MAYBE_LOG(name) \
397 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
398 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
399 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
400 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
401 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
402 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
403 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
404 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
405 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
406 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
407 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
408 P11 p11 = getArgument<P11>(ctx, argumentCount, arguments, 11); \
409 P12 p12 = getArgument<P12>(ctx, argumentCount, arguments, 12); \
410 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12)); \
411 } \
412 MAKE_JSC_EXPORT(name)
413
414 #define KOALA_INTEROP_14(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) \
415 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
416 KOALA_MAYBE_LOG(name) \
417 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
418 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
419 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
420 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
421 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
422 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
423 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
424 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
425 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
426 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
427 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
428 P11 p11 = getArgument<P11>(ctx, argumentCount, arguments, 11); \
429 P12 p12 = getArgument<P12>(ctx, argumentCount, arguments, 12); \
430 P13 p13 = getArgument<P13>(ctx, argumentCount, arguments, 13); \
431 return makeResult<Ret>(ctx, impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13)); \
432 } \
433 MAKE_JSC_EXPORT(name)
434
435 #define KOALA_INTEROP_V0(name) \
436 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
437 KOALA_MAYBE_LOG(name) \
438 impl_##name(); \
439 return makeVoid(ctx); \
440 } \
441 MAKE_JSC_EXPORT(name)
442
443 #define KOALA_INTEROP_V1(name, P0) \
444 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
445 KOALA_MAYBE_LOG(name) \
446 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
447 impl_##name(p0); \
448 return makeVoid(ctx); \
449 } \
450 MAKE_JSC_EXPORT(name)
451
452 #define KOALA_INTEROP_V2(name, P0, P1) \
453 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
454 KOALA_MAYBE_LOG(name) \
455 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
456 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
457 impl_##name(p0,p1); \
458 return makeVoid(ctx); \
459 } \
460 MAKE_JSC_EXPORT(name)
461
462 #define KOALA_INTEROP_V3(name, P0, P1, P2) \
463 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
464 KOALA_MAYBE_LOG(name) \
465 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
466 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
467 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
468 impl_##name(p0,p1,p2); \
469 return makeVoid(ctx); \
470 } \
471 MAKE_JSC_EXPORT(name)
472
473 #define KOALA_INTEROP_V4(name, P0, P1, P2, P3) \
474 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
475 KOALA_MAYBE_LOG(name) \
476 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
477 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
478 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
479 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
480 impl_##name(p0,p1,p2,p3); \
481 return makeVoid(ctx); \
482 } \
483 MAKE_JSC_EXPORT(name)
484
485 #define KOALA_INTEROP_V5(name, P0, P1, P2, P3, P4) \
486 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
487 KOALA_MAYBE_LOG(name) \
488 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
489 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
490 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
491 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
492 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
493 impl_##name(p0,p1,p2,p3,p4); \
494 return makeVoid(ctx); \
495 } \
496 MAKE_JSC_EXPORT(name)
497
498 #define KOALA_INTEROP_V6(name, P0, P1, P2, P3, P4, P5) \
499 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
500 KOALA_MAYBE_LOG(name) \
501 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
502 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
503 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
504 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
505 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
506 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
507 impl_##name(p0,p1,p2,p3,p4,p5); \
508 return makeVoid(ctx); \
509 } \
510 MAKE_JSC_EXPORT(name)
511
512 #define KOALA_INTEROP_V7(name, P0, P1, P2, P3, P4, P5, P6) \
513 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
514 KOALA_MAYBE_LOG(name) \
515 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
516 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
517 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
518 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
519 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
520 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
521 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
522 impl_##name(p0,p1,p2,p3,p4,p5,p6); \
523 return makeVoid(ctx); \
524 } \
525 MAKE_JSC_EXPORT(name)
526
527 #define KOALA_INTEROP_V8(name, P0, P1, P2, P3, P4, P5, P6, P7) \
528 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
529 KOALA_MAYBE_LOG(name) \
530 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
531 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
532 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
533 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
534 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
535 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
536 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
537 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
538 impl_##name(p0,p1,p2,p3,p4,p5,p6,p7); \
539 return makeVoid(ctx); \
540 } \
541 MAKE_JSC_EXPORT(name)
542
543 #define KOALA_INTEROP_V9(name, P0, P1, P2, P3, P4, P5, P6, P7, P8) \
544 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
545 KOALA_MAYBE_LOG(name) \
546 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
547 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
548 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
549 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
550 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
551 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
552 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
553 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
554 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
555 impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8); \
556 return makeVoid(ctx); \
557 } \
558 MAKE_JSC_EXPORT(name)
559
560 #define KOALA_INTEROP_V10(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) \
561 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
562 KOALA_MAYBE_LOG(name) \
563 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
564 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
565 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
566 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
567 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
568 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
569 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
570 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
571 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
572 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
573 impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9); \
574 return makeVoid(ctx); \
575 } \
576 MAKE_JSC_EXPORT(name)
577
578 #define KOALA_INTEROP_V11(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) \
579 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
580 KOALA_MAYBE_LOG(name) \
581 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
582 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
583 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
584 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
585 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
586 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
587 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
588 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
589 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
590 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
591 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
592 impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10); \
593 return makeVoid(ctx); \
594 } \
595 MAKE_JSC_EXPORT(name)
596
597 #define KOALA_INTEROP_V12(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) \
598 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
599 KOALA_MAYBE_LOG(name) \
600 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
601 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
602 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
603 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
604 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
605 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
606 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
607 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
608 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
609 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
610 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
611 P11 p11 = getArgument<P11>(ctx, argumentCount, arguments, 11); \
612 impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11); \
613 return makeVoid(ctx); \
614 } \
615 MAKE_JSC_EXPORT(name)
616
617 #define KOALA_INTEROP_V13(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) \
618 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
619 KOALA_MAYBE_LOG(name) \
620 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
621 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
622 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
623 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
624 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
625 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
626 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
627 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
628 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
629 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
630 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
631 P11 p11 = getArgument<P11>(ctx, argumentCount, arguments, 11); \
632 P12 p12 = getArgument<P12>(ctx, argumentCount, arguments, 12); \
633 impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12); \
634 return makeVoid(ctx); \
635 } \
636 MAKE_JSC_EXPORT(name)
637
638 #define KOALA_INTEROP_V14(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) \
639 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
640 KOALA_MAYBE_LOG(name) \
641 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
642 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
643 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
644 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
645 P4 p4 = getArgument<P4>(ctx, argumentCount, arguments, 4); \
646 P5 p5 = getArgument<P5>(ctx, argumentCount, arguments, 5); \
647 P6 p6 = getArgument<P6>(ctx, argumentCount, arguments, 6); \
648 P7 p7 = getArgument<P7>(ctx, argumentCount, arguments, 7); \
649 P8 p8 = getArgument<P8>(ctx, argumentCount, arguments, 8); \
650 P9 p9 = getArgument<P9>(ctx, argumentCount, arguments, 9); \
651 P10 p10 = getArgument<P10>(ctx, argumentCount, arguments, 10); \
652 P11 p11 = getArgument<P11>(ctx, argumentCount, arguments, 11); \
653 P12 p12 = getArgument<P12>(ctx, argumentCount, arguments, 12); \
654 P13 p13 = getArgument<P13>(ctx, argumentCount, arguments, 13); \
655 impl_##name(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13); \
656 return makeVoid(ctx); \
657 } \
658 MAKE_JSC_EXPORT(name)
659
660 #define KOALA_INTEROP_CTX_3(name, Ret, P0, P1, P2) \
661 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) \
662 { \
663 printf("TODO: implement KOALA_INTEROP_CTX_3 for jsc"); \
664 KOALA_MAYBE_LOG(name) \
665 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
666 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
667 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
668 return makeResult<Ret>(ctx, impl_##name(nullptr, p0, p1, p2)); \
669 } \
670 MAKE_JSC_EXPORT(name)
671
672 #define KOALA_INTEROP_CTX_4(name, Ret, P0, P1, P2, P4) \
673 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) \
674 { \
675 printf("TODO: implement KOALA_INTEROP_CTX_4 for jsc"); \
676 KOALA_MAYBE_LOG(name) \
677 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
678 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
679 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
680 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
681 return makeResult<Ret>(ctx, impl_##name(nullptr, p0, p1, p2, p3)); \
682 } \
683 MAKE_JSC_EXPORT(name)
684
685 #define KOALA_INTEROP_CTX_V3(name, P0, P1, P2) \
686 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
687 printf("TODO: implement KOALA_INTEROP_CTX_V3 for jsc"); \
688 KOALA_MAYBE_LOG(name) \
689 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
690 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
691 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
692 impl_##name(nullptr, p0, p1, p2); \
693 return makeVoid(ctx); \
694 } \
695 MAKE_JSC_EXPORT(name)
696
697 #define KOALA_INTEROP_CTX_V4(name, P0, P1, P2, P3) \
698 JSValueRef Jsc_##name(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { \
699 printf("TODO: implement KOALA_INTEROP_CTX_V4 for jsc"); \
700 KOALA_MAYBE_LOG(name) \
701 P0 p0 = getArgument<P0>(ctx, argumentCount, arguments, 0); \
702 P1 p1 = getArgument<P1>(ctx, argumentCount, arguments, 1); \
703 P2 p2 = getArgument<P2>(ctx, argumentCount, arguments, 2); \
704 P3 p3 = getArgument<P3>(ctx, argumentCount, arguments, 3); \
705 impl_##name(nullptr, p0, p1, p2, p3); \
706 return makeVoid(ctx); \
707 } \
708 MAKE_JSC_EXPORT(name)
709
710 #define KOALA_INTEROP_THROW(vmContext, object, ...) \
711 do { \
712 ASSERT(false); \
713 return __VA_ARGS__; \
714 } while (0)
715
716 #define KOALA_INTEROP_THROW_STRING(vmContext, message, ...) \
717 do { \
718 ASSERT(false); \
719 return __VA_ARGS__; \
720 } while (0)
721
722 #endif // CONVERTORS_JSC_H