• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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