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_CJ_H
17 #define CONVERTORS_CJ_H
18
19 #include <cmath>
20 #include <memory>
21 #include <vector>
22 #include <string>
23
24 #include "koala-types.h"
25 #include "interop-logging.h"
26
27 #define KOALA_INTEROP_EXPORT extern "C"
28
29 #define MAKE_CJ_EXPORT(name, type, flag) \
30 __attribute__((constructor)) \
31 static void __init_ets_##name() { \
32 CJExports::getInstance()->addImpl("_"#name, type, reinterpret_cast<void *>(Ark_##name), flag); \
33 }
34
35 class CJExports {
36 std::vector<std::tuple<std::string, std::string, void*>> implementations;
37
38 public:
39 static CJExports* getInstance();
40
41 void addImpl(const char* name, const char* type, void* impl);
getImpls()42 const std::vector<std::tuple<std::string, std::string, void*>>& getImpls() {
43 return implementations;
44 }
45 };
46
47 template<class T>
48 struct InteropTypeConverter {
49 using InteropType = T;
convertFromInteropTypeConverter50 static inline T convertFrom(InteropType value) { return value; }
convertToInteropTypeConverter51 static inline InteropType convertTo(T value) { return value; }
52 };
53
54 template <typename T>
getArgument(typename InteropTypeConverter<T>::InteropType arg)55 inline T getArgument(typename InteropTypeConverter<T>::InteropType arg) {
56 return InteropTypeConverter<T>::convertFrom(arg);
57 }
58
59 template <typename T>
makeResult(T value)60 inline typename InteropTypeConverter<T>::InteropType makeResult(T value) {
61 return InteropTypeConverter<T>::convertTo(value);
62 }
63
64 template<>
65 struct InteropTypeConverter<KInteropNumber> {
66 using InteropType = KDouble;
67 static inline KInteropNumber convertFrom(InteropType value) {
68 return KInteropNumber::fromDouble(value);
69 }
70 static inline InteropType convertTo(KInteropNumber value) {
71 return value.asDouble();
72 }
73 };
74
75 template<>
76 struct InteropTypeConverter<KStringPtr> {
77 using InteropType = char*;
78 static KStringPtr convertFrom(InteropType value) {
79 return KStringPtr(value);
80 }
81 static InteropType convertTo(const KStringPtr& value) {
82 return value.data();
83 }
84 };
85
86 // TODO: Rewrite all others to typed convertors.
87
88 #define KOALA_INTEROP_0(name, Ret) \
89 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name() { \
90 KOALA_MAYBE_LOG(name) \
91 return makeResult<Ret>(impl_##name()); \
92 }
93 // MAKE_CJ_EXPORT(name, #Ret, 0)
94
95 #define KOALA_INTEROP_1(name, Ret, P0) \
96 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name(InteropTypeConverter<P0>::InteropType _p0) { \
97 KOALA_MAYBE_LOG(name) \
98 P0 p0 = getArgument<P0>(_p0); \
99 return makeResult<Ret>(impl_##name(p0)); \
100 }
101 // MAKE_CJ_EXPORT(name, #Ret "|" #P0, 0)
102
103 #define KOALA_INTEROP_2(name, Ret, P0, P1) \
104 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
105 InteropTypeConverter<P0>::InteropType _p0, \
106 InteropTypeConverter<P1>::InteropType _p1 \
107 ) { \
108 KOALA_MAYBE_LOG(name) \
109 P0 p0 = getArgument<P0>(_p0); \
110 P1 p1 = getArgument<P1>(_p1); \
111 return makeResult<Ret>(impl_##name(p0, p1)); \
112 }
113 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1, 0)
114
115 #define KOALA_INTEROP_3(name, Ret, P0, P1, P2) \
116 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
117 InteropTypeConverter<P0>::InteropType _p0, \
118 InteropTypeConverter<P1>::InteropType _p1, \
119 InteropTypeConverter<P2>::InteropType _p2 \
120 ) { \
121 KOALA_MAYBE_LOG(name) \
122 P0 p0 = getArgument<P0>(_p0); \
123 P1 p1 = getArgument<P1>(_p1); \
124 P2 p2 = getArgument<P2>(_p2); \
125 return makeResult<Ret>(impl_##name(p0, p1, p2)); \
126 }
127 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2, 0)
128
129 #define KOALA_INTEROP_4(name, Ret, P0, P1, P2, P3) \
130 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
131 InteropTypeConverter<P0>::InteropType _p0, \
132 InteropTypeConverter<P1>::InteropType _p1, \
133 InteropTypeConverter<P2>::InteropType _p2, \
134 InteropTypeConverter<P3>::InteropType _p3 \
135 ) { \
136 KOALA_MAYBE_LOG(name) \
137 P0 p0 = getArgument<P0>(_p0); \
138 P1 p1 = getArgument<P1>(_p1); \
139 P2 p2 = getArgument<P2>(_p2); \
140 P3 p3 = getArgument<P3>(_p3); \
141 return makeResult<Ret>(impl_##name(p0, p1, p2, p3)); \
142 }
143 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3, 0)
144
145 #define KOALA_INTEROP_5(name, Ret, P0, P1, P2, P3, P4) \
146 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
147 InteropTypeConverter<P0>::InteropType _p0, \
148 InteropTypeConverter<P1>::InteropType _p1, \
149 InteropTypeConverter<P2>::InteropType _p2, \
150 InteropTypeConverter<P3>::InteropType _p3, \
151 InteropTypeConverter<P4>::InteropType _p4 \
152 ) { \
153 KOALA_MAYBE_LOG(name) \
154 P0 p0 = getArgument<P0>(_p0); \
155 P1 p1 = getArgument<P1>(_p1); \
156 P2 p2 = getArgument<P2>(_p2); \
157 P3 p3 = getArgument<P3>(_p3); \
158 P4 p4 = getArgument<P4>(_p4); \
159 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4)); \
160 }
161 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4, 0)
162
163 #define KOALA_INTEROP_6(name, Ret, P0, P1, P2, P3, P4, P5) \
164 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
165 InteropTypeConverter<P0>::InteropType _p0, \
166 InteropTypeConverter<P1>::InteropType _p1, \
167 InteropTypeConverter<P2>::InteropType _p2, \
168 InteropTypeConverter<P3>::InteropType _p3, \
169 InteropTypeConverter<P4>::InteropType _p4, \
170 InteropTypeConverter<P5>::InteropType _p5 \
171 ) { \
172 KOALA_MAYBE_LOG(name) \
173 P0 p0 = getArgument<P0>(_p0); \
174 P1 p1 = getArgument<P1>(_p1); \
175 P2 p2 = getArgument<P2>(_p2); \
176 P3 p3 = getArgument<P3>(_p3); \
177 P4 p4 = getArgument<P4>(_p4); \
178 P5 p5 = getArgument<P5>(_p5); \
179 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5)); \
180 }
181 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5, 0)
182
183 #define KOALA_INTEROP_7(name, Ret, P0, P1, P2, P3, P4, P5, P6) \
184 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
185 InteropTypeConverter<P0>::InteropType _p0, \
186 InteropTypeConverter<P1>::InteropType _p1, \
187 InteropTypeConverter<P2>::InteropType _p2, \
188 InteropTypeConverter<P3>::InteropType _p3, \
189 InteropTypeConverter<P4>::InteropType _p4, \
190 InteropTypeConverter<P5>::InteropType _p5, \
191 InteropTypeConverter<P6>::InteropType _p6 \
192 ) { \
193 KOALA_MAYBE_LOG(name) \
194 P0 p0 = getArgument<P0>(_p0); \
195 P1 p1 = getArgument<P1>(_p1); \
196 P2 p2 = getArgument<P2>(_p2); \
197 P3 p3 = getArgument<P3>(_p3); \
198 P4 p4 = getArgument<P4>(_p4); \
199 P5 p5 = getArgument<P5>(_p5); \
200 P6 p6 = getArgument<P6>(_p6); \
201 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6)); \
202 }
203 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6, 0)
204
205 #define KOALA_INTEROP_8(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7) \
206 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
207 InteropTypeConverter<P0>::InteropType _p0, \
208 InteropTypeConverter<P1>::InteropType _p1, \
209 InteropTypeConverter<P2>::InteropType _p2, \
210 InteropTypeConverter<P3>::InteropType _p3, \
211 InteropTypeConverter<P4>::InteropType _p4, \
212 InteropTypeConverter<P5>::InteropType _p5, \
213 InteropTypeConverter<P6>::InteropType _p6, \
214 InteropTypeConverter<P7>::InteropType _p7 \
215 ) { \
216 KOALA_MAYBE_LOG(name) \
217 P0 p0 = getArgument<P0>(_p0); \
218 P1 p1 = getArgument<P1>(_p1); \
219 P2 p2 = getArgument<P2>(_p2); \
220 P3 p3 = getArgument<P3>(_p3); \
221 P4 p4 = getArgument<P4>(_p4); \
222 P5 p5 = getArgument<P5>(_p5); \
223 P6 p6 = getArgument<P6>(_p6); \
224 P7 p7 = getArgument<P7>(_p7); \
225 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6, p7)); \
226 }
227 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6 "|" #P7, 0)
228
229 #define KOALA_INTEROP_9(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8) \
230 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
231 InteropTypeConverter<P0>::InteropType _p0, \
232 InteropTypeConverter<P1>::InteropType _p1, \
233 InteropTypeConverter<P2>::InteropType _p2, \
234 InteropTypeConverter<P3>::InteropType _p3, \
235 InteropTypeConverter<P4>::InteropType _p4, \
236 InteropTypeConverter<P5>::InteropType _p5, \
237 InteropTypeConverter<P6>::InteropType _p6, \
238 InteropTypeConverter<P7>::InteropType _p7, \
239 InteropTypeConverter<P8>::InteropType _p8 \
240 ) { \
241 KOALA_MAYBE_LOG(name) \
242 P0 p0 = getArgument<P0>(_p0); \
243 P1 p1 = getArgument<P1>(_p1); \
244 P2 p2 = getArgument<P2>(_p2); \
245 P3 p3 = getArgument<P3>(_p3); \
246 P4 p4 = getArgument<P4>(_p4); \
247 P5 p5 = getArgument<P5>(_p5); \
248 P6 p6 = getArgument<P6>(_p6); \
249 P7 p7 = getArgument<P7>(_p7); \
250 P8 p8 = getArgument<P8>(_p8); \
251 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8)); \
252 }
253 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6 "|" #P7 "|" #P8, 0)
254
255 #define KOALA_INTEROP_10(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) \
256 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
257 InteropTypeConverter<P0>::InteropType _p0, \
258 InteropTypeConverter<P1>::InteropType _p1, \
259 InteropTypeConverter<P2>::InteropType _p2, \
260 InteropTypeConverter<P3>::InteropType _p3, \
261 InteropTypeConverter<P4>::InteropType _p4, \
262 InteropTypeConverter<P5>::InteropType _p5, \
263 InteropTypeConverter<P6>::InteropType _p6, \
264 InteropTypeConverter<P7>::InteropType _p7, \
265 InteropTypeConverter<P8>::InteropType _p8, \
266 InteropTypeConverter<P9>::InteropType _p9 \
267 ) { \
268 KOALA_MAYBE_LOG(name) \
269 P0 p0 = getArgument<P0>(_p0); \
270 P1 p1 = getArgument<P1>(_p1); \
271 P2 p2 = getArgument<P2>(_p2); \
272 P3 p3 = getArgument<P3>(_p3); \
273 P4 p4 = getArgument<P4>(_p4); \
274 P5 p5 = getArgument<P5>(_p5); \
275 P6 p6 = getArgument<P6>(_p6); \
276 P7 p7 = getArgument<P7>(_p7); \
277 P8 p8 = getArgument<P8>(_p8); \
278 P9 p9 = getArgument<P9>(_p9); \
279 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)); \
280 }
281 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6 "|" #P7 "|" #P8 "|" #P9, 0)
282
283 #define KOALA_INTEROP_11(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) \
284 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
285 InteropTypeConverter<P0>::InteropType _p0, \
286 InteropTypeConverter<P1>::InteropType _p1, \
287 InteropTypeConverter<P2>::InteropType _p2, \
288 InteropTypeConverter<P3>::InteropType _p3, \
289 InteropTypeConverter<P4>::InteropType _p4, \
290 InteropTypeConverter<P5>::InteropType _p5, \
291 InteropTypeConverter<P6>::InteropType _p6, \
292 InteropTypeConverter<P7>::InteropType _p7, \
293 InteropTypeConverter<P8>::InteropType _p8, \
294 InteropTypeConverter<P9>::InteropType _p9, \
295 InteropTypeConverter<P10>::InteropType _p10 \
296 ) { \
297 KOALA_MAYBE_LOG(name) \
298 P0 p0 = getArgument<P0>(_p0); \
299 P1 p1 = getArgument<P1>(_p1); \
300 P2 p2 = getArgument<P2>(_p2); \
301 P3 p3 = getArgument<P3>(_p3); \
302 P4 p4 = getArgument<P4>(_p4); \
303 P5 p5 = getArgument<P5>(_p5); \
304 P6 p6 = getArgument<P6>(_p6); \
305 P7 p7 = getArgument<P7>(_p7); \
306 P8 p8 = getArgument<P8>(_p8); \
307 P9 p9 = getArgument<P9>(_p9); \
308 P10 p10 = getArgument<P10>(_p10); \
309 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); \
310 }
311 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6 "|" #P7 "|" #P8 "|" #P9 "|" #P10, 0)
312
313 #define KOALA_INTEROP_12(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) \
314 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
315 InteropTypeConverter<P0>::InteropType _p0, \
316 InteropTypeConverter<P1>::InteropType _p1, \
317 InteropTypeConverter<P2>::InteropType _p2, \
318 InteropTypeConverter<P3>::InteropType _p3, \
319 InteropTypeConverter<P4>::InteropType _p4, \
320 InteropTypeConverter<P5>::InteropType _p5, \
321 InteropTypeConverter<P6>::InteropType _p6, \
322 InteropTypeConverter<P7>::InteropType _p7, \
323 InteropTypeConverter<P8>::InteropType _p8, \
324 InteropTypeConverter<P9>::InteropType _p9, \
325 InteropTypeConverter<P10>::InteropType _p10, \
326 InteropTypeConverter<P11>::InteropType _p11 \
327 ) { \
328 KOALA_MAYBE_LOG(name) \
329 P0 p0 = getArgument<P0>(_p0); \
330 P1 p1 = getArgument<P1>(_p1); \
331 P2 p2 = getArgument<P2>(_p2); \
332 P3 p3 = getArgument<P3>(_p3); \
333 P4 p4 = getArgument<P4>(_p4); \
334 P5 p5 = getArgument<P5>(_p5); \
335 P6 p6 = getArgument<P6>(_p6); \
336 P7 p7 = getArgument<P7>(_p7); \
337 P8 p8 = getArgument<P8>(_p8); \
338 P9 p9 = getArgument<P9>(_p9); \
339 P10 p10 = getArgument<P10>(_p10); \
340 P11 p11 = getArgument<P11>(_p11); \
341 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); \
342 }
343 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6 "|" #P7 "|" #P8 "|" #P9 "|" #P10 "|" #P11, 0)
344
345 #define KOALA_INTEROP_13(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) \
346 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
347 InteropTypeConverter<P0>::InteropType _p0, \
348 InteropTypeConverter<P1>::InteropType _p1, \
349 InteropTypeConverter<P2>::InteropType _p2, \
350 InteropTypeConverter<P3>::InteropType _p3, \
351 InteropTypeConverter<P4>::InteropType _p4, \
352 InteropTypeConverter<P5>::InteropType _p5, \
353 InteropTypeConverter<P6>::InteropType _p6, \
354 InteropTypeConverter<P7>::InteropType _p7, \
355 InteropTypeConverter<P8>::InteropType _p8, \
356 InteropTypeConverter<P9>::InteropType _p9, \
357 InteropTypeConverter<P10>::InteropType _p10, \
358 InteropTypeConverter<P11>::InteropType _p11, \
359 InteropTypeConverter<P12>::InteropType _p12 \
360 ) { \
361 KOALA_MAYBE_LOG(name) \
362 P0 p0 = getArgument<P0>(_p0); \
363 P1 p1 = getArgument<P1>(_p1); \
364 P2 p2 = getArgument<P2>(_p2); \
365 P3 p3 = getArgument<P3>(_p3); \
366 P4 p4 = getArgument<P4>(_p4); \
367 P5 p5 = getArgument<P5>(_p5); \
368 P6 p6 = getArgument<P6>(_p6); \
369 P7 p7 = getArgument<P7>(_p7); \
370 P8 p8 = getArgument<P8>(_p8); \
371 P9 p9 = getArgument<P9>(_p9); \
372 P10 p10 = getArgument<P10>(_p10); \
373 P11 p11 = getArgument<P11>(_p11); \
374 P12 p12 = getArgument<P12>(_p12); \
375 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); \
376 }
377 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6 "|" #P7 "|" #P8 "|" #P9 "|" #P10 "|" #P11 "|" #P12, 0)
378
379 #define KOALA_INTEROP_14(name, Ret, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) \
380 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
381 InteropTypeConverter<P0>::InteropType _p0, \
382 InteropTypeConverter<P1>::InteropType _p1, \
383 InteropTypeConverter<P2>::InteropType _p2, \
384 InteropTypeConverter<P3>::InteropType _p3, \
385 InteropTypeConverter<P4>::InteropType _p4, \
386 InteropTypeConverter<P5>::InteropType _p5, \
387 InteropTypeConverter<P6>::InteropType _p6, \
388 InteropTypeConverter<P7>::InteropType _p7, \
389 InteropTypeConverter<P8>::InteropType _p8, \
390 InteropTypeConverter<P9>::InteropType _p9, \
391 InteropTypeConverter<P10>::InteropType _p10, \
392 InteropTypeConverter<P11>::InteropType _p11, \
393 InteropTypeConverter<P12>::InteropType _p12, \
394 InteropTypeConverter<P13>::InteropType _p13 \
395 ) { \
396 KOALA_MAYBE_LOG(name) \
397 P0 p0 = getArgument<P0>(_p0); \
398 P1 p1 = getArgument<P1>(_p1); \
399 P2 p2 = getArgument<P2>(_p2); \
400 P3 p3 = getArgument<P3>(_p3); \
401 P4 p4 = getArgument<P4>(_p4); \
402 P5 p5 = getArgument<P5>(_p5); \
403 P6 p6 = getArgument<P6>(_p6); \
404 P7 p7 = getArgument<P7>(_p7); \
405 P8 p8 = getArgument<P8>(_p8); \
406 P9 p9 = getArgument<P9>(_p9); \
407 P10 p10 = getArgument<P10>(_p10); \
408 P11 p11 = getArgument<P11>(_p11); \
409 P12 p12 = getArgument<P12>(_p12); \
410 P13 p13 = getArgument<P13>(_p13); \
411 return makeResult<Ret>(impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); \
412 }
413 // MAKE_CJ_EXPORT(name, #Ret "|" #P0 "|" #P1 "|" #P2 "|" #P3 "|" #P4 "|" #P5 "|" #P6 "|" #P7 "|" #P8 "|" #P9 "|" #P10 "|" #P11 "|" #P12 "|" #P13, 0)
414
415 #define KOALA_INTEROP_V0(name) \
416 KOALA_INTEROP_EXPORT void name() { \
417 KOALA_MAYBE_LOG(name) \
418 impl_##name(); \
419 return; \
420 }
421
422 #define KOALA_INTEROP_V1(name, P0) \
423 KOALA_INTEROP_EXPORT void name(typename InteropTypeConverter<P0>::InteropType _p0) { \
424 KOALA_MAYBE_LOG(name) \
425 P0 p0 = getArgument<P0>(_p0); \
426 impl_##name(p0); \
427 return; \
428 }
429
430 #define KOALA_INTEROP_V2(name, P0, P1) \
431 KOALA_INTEROP_EXPORT void name( \
432 typename InteropTypeConverter<P0>::InteropType _p0, \
433 typename InteropTypeConverter<P1>::InteropType _p1 \
434 ) { \
435 KOALA_MAYBE_LOG(name) \
436 P0 p0 = getArgument<P0>(_p0); \
437 P1 p1 = getArgument<P1>(_p1); \
438 impl_##name(p0, p1); \
439 return; \
440 }
441
442 #define KOALA_INTEROP_V3(name, P0, P1, P2) \
443 KOALA_INTEROP_EXPORT void name( \
444 typename InteropTypeConverter<P0>::InteropType _p0, \
445 typename InteropTypeConverter<P1>::InteropType _p1, \
446 typename InteropTypeConverter<P2>::InteropType _p2 \
447 ) { \
448 KOALA_MAYBE_LOG(name) \
449 P0 p0 = getArgument<P0>(_p0); \
450 P1 p1 = getArgument<P1>(_p1); \
451 P2 p2 = getArgument<P2>(_p2); \
452 impl_##name(p0, p1, p2); \
453 return; \
454 }
455
456 #define KOALA_INTEROP_V4(name, P0, P1, P2, P3) \
457 KOALA_INTEROP_EXPORT void name( \
458 typename InteropTypeConverter<P0>::InteropType _p0, \
459 typename InteropTypeConverter<P1>::InteropType _p1, \
460 typename InteropTypeConverter<P2>::InteropType _p2, \
461 typename InteropTypeConverter<P3>::InteropType _p3 \
462 ) { \
463 KOALA_MAYBE_LOG(name) \
464 P0 p0 = getArgument<P0>(_p0); \
465 P1 p1 = getArgument<P1>(_p1); \
466 P2 p2 = getArgument<P2>(_p2); \
467 P3 p3 = getArgument<P3>(_p3); \
468 impl_##name(p0, p1, p2, p3); \
469 return; \
470 }
471
472 #define KOALA_INTEROP_V5(name, P0, P1, P2, P3, P4) \
473 KOALA_INTEROP_EXPORT void name( \
474 typename InteropTypeConverter<P0>::InteropType _p0, \
475 typename InteropTypeConverter<P1>::InteropType _p1, \
476 typename InteropTypeConverter<P2>::InteropType _p2, \
477 typename InteropTypeConverter<P3>::InteropType _p3, \
478 typename InteropTypeConverter<P4>::InteropType _p4 \
479 ) { \
480 KOALA_MAYBE_LOG(name) \
481 P0 p0 = getArgument<P0>(_p0); \
482 P1 p1 = getArgument<P1>(_p1); \
483 P2 p2 = getArgument<P2>(_p2); \
484 P3 p3 = getArgument<P3>(_p3); \
485 P4 p4 = getArgument<P4>(_p4); \
486 impl_##name(p0, p1, p2, p3, p4); \
487 return; \
488 }
489
490 #define KOALA_INTEROP_V6(name, P0, P1, P2, P3, P4, P5) \
491 KOALA_INTEROP_EXPORT void name( \
492 typename InteropTypeConverter<P0>::InteropType _p0, \
493 typename InteropTypeConverter<P1>::InteropType _p1, \
494 typename InteropTypeConverter<P2>::InteropType _p2, \
495 typename InteropTypeConverter<P3>::InteropType _p3, \
496 typename InteropTypeConverter<P4>::InteropType _p4, \
497 typename InteropTypeConverter<P5>::InteropType _p5 \
498 ) { \
499 KOALA_MAYBE_LOG(name) \
500 P0 p0 = getArgument<P0>(_p0); \
501 P1 p1 = getArgument<P1>(_p1); \
502 P2 p2 = getArgument<P2>(_p2); \
503 P3 p3 = getArgument<P3>(_p3); \
504 P4 p4 = getArgument<P4>(_p4); \
505 P5 p5 = getArgument<P5>(_p5); \
506 impl_##name(p0, p1, p2, p3, p4, p5); \
507 return; \
508 }
509
510 #define KOALA_INTEROP_V7(name, P0, P1, P2, P3, P4, P5, P6) \
511 KOALA_INTEROP_EXPORT void name( \
512 typename InteropTypeConverter<P0>::InteropType _p0, \
513 typename InteropTypeConverter<P1>::InteropType _p1, \
514 typename InteropTypeConverter<P2>::InteropType _p2, \
515 typename InteropTypeConverter<P3>::InteropType _p3, \
516 typename InteropTypeConverter<P4>::InteropType _p4, \
517 typename InteropTypeConverter<P5>::InteropType _p5, \
518 typename InteropTypeConverter<P6>::InteropType _p6 \
519 ) { \
520 KOALA_MAYBE_LOG(name) \
521 P0 p0 = getArgument<P0>(_p0); \
522 P1 p1 = getArgument<P1>(_p1); \
523 P2 p2 = getArgument<P2>(_p2); \
524 P3 p3 = getArgument<P3>(_p3); \
525 P4 p4 = getArgument<P4>(_p4); \
526 P5 p5 = getArgument<P5>(_p5); \
527 P6 p6 = getArgument<P6>(_p6); \
528 impl_##name(p0, p1, p2, p3, p4, p5, p6); \
529 return; \
530 }
531
532 #define KOALA_INTEROP_V8(name, P0, P1, P2, P3, P4, P5, P6, P7) \
533 KOALA_INTEROP_EXPORT void name( \
534 typename InteropTypeConverter<P0>::InteropType _p0, \
535 typename InteropTypeConverter<P1>::InteropType _p1, \
536 typename InteropTypeConverter<P2>::InteropType _p2, \
537 typename InteropTypeConverter<P3>::InteropType _p3, \
538 typename InteropTypeConverter<P4>::InteropType _p4, \
539 typename InteropTypeConverter<P5>::InteropType _p5, \
540 typename InteropTypeConverter<P6>::InteropType _p6, \
541 typename InteropTypeConverter<P7>::InteropType _p7 \
542 ) { \
543 KOALA_MAYBE_LOG(name) \
544 P0 p0 = getArgument<P0>(_p0); \
545 P1 p1 = getArgument<P1>(_p1); \
546 P2 p2 = getArgument<P2>(_p2); \
547 P3 p3 = getArgument<P3>(_p3); \
548 P4 p4 = getArgument<P4>(_p4); \
549 P5 p5 = getArgument<P5>(_p5); \
550 P6 p6 = getArgument<P6>(_p6); \
551 P7 p7 = getArgument<P7>(_p7); \
552 impl_##name(p0, p1, p2, p3, p4, p5, p6, p7); \
553 return; \
554 }
555
556 #define KOALA_INTEROP_V9(name, P0, P1, P2, P3, P4, P5, P6, P7, P8) \
557 KOALA_INTEROP_EXPORT void name( \
558 typename InteropTypeConverter<P0>::InteropType _p0, \
559 typename InteropTypeConverter<P1>::InteropType _p1, \
560 typename InteropTypeConverter<P2>::InteropType _p2, \
561 typename InteropTypeConverter<P3>::InteropType _p3, \
562 typename InteropTypeConverter<P4>::InteropType _p4, \
563 typename InteropTypeConverter<P5>::InteropType _p5, \
564 typename InteropTypeConverter<P6>::InteropType _p6, \
565 typename InteropTypeConverter<P7>::InteropType _p7, \
566 typename InteropTypeConverter<P8>::InteropType _p8 \
567 ) { \
568 KOALA_MAYBE_LOG(name) \
569 P0 p0 = getArgument<P0>(_p0); \
570 P1 p1 = getArgument<P1>(_p1); \
571 P2 p2 = getArgument<P2>(_p2); \
572 P3 p3 = getArgument<P3>(_p3); \
573 P4 p4 = getArgument<P4>(_p4); \
574 P5 p5 = getArgument<P5>(_p5); \
575 P6 p6 = getArgument<P6>(_p6); \
576 P7 p7 = getArgument<P7>(_p7); \
577 P8 p8 = getArgument<P8>(_p8); \
578 impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8); \
579 return; \
580 }
581
582 #define KOALA_INTEROP_V10(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) \
583 KOALA_INTEROP_EXPORT void name( \
584 typename InteropTypeConverter<P0>::InteropType _p0, \
585 typename InteropTypeConverter<P1>::InteropType _p1, \
586 typename InteropTypeConverter<P2>::InteropType _p2, \
587 typename InteropTypeConverter<P3>::InteropType _p3, \
588 typename InteropTypeConverter<P4>::InteropType _p4, \
589 typename InteropTypeConverter<P5>::InteropType _p5, \
590 typename InteropTypeConverter<P6>::InteropType _p6, \
591 typename InteropTypeConverter<P7>::InteropType _p7, \
592 typename InteropTypeConverter<P8>::InteropType _p8, \
593 typename InteropTypeConverter<P9>::InteropType _p9 \
594 ) { \
595 KOALA_MAYBE_LOG(name) \
596 P0 p0 = getArgument<P0>(_p0); \
597 P1 p1 = getArgument<P1>(_p1); \
598 P2 p2 = getArgument<P2>(_p2); \
599 P3 p3 = getArgument<P3>(_p3); \
600 P4 p4 = getArgument<P4>(_p4); \
601 P5 p5 = getArgument<P5>(_p5); \
602 P6 p6 = getArgument<P6>(_p6); \
603 P7 p7 = getArgument<P7>(_p7); \
604 P8 p8 = getArgument<P8>(_p8); \
605 P9 p9 = getArgument<P9>(_p9); \
606 impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); \
607 return; \
608 }
609
610 #define KOALA_INTEROP_V11(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) \
611 KOALA_INTEROP_EXPORT void name( \
612 typename InteropTypeConverter<P0>::InteropType _p0, \
613 typename InteropTypeConverter<P1>::InteropType _p1, \
614 typename InteropTypeConverter<P2>::InteropType _p2, \
615 typename InteropTypeConverter<P3>::InteropType _p3, \
616 typename InteropTypeConverter<P4>::InteropType _p4, \
617 typename InteropTypeConverter<P5>::InteropType _p5, \
618 typename InteropTypeConverter<P6>::InteropType _p6, \
619 typename InteropTypeConverter<P7>::InteropType _p7, \
620 typename InteropTypeConverter<P8>::InteropType _p8, \
621 typename InteropTypeConverter<P9>::InteropType _p9, \
622 typename InteropTypeConverter<P10>::InteropType _p10 \
623 ) { \
624 KOALA_MAYBE_LOG(name) \
625 P0 p0 = getArgument<P0>(_p0); \
626 P1 p1 = getArgument<P1>(_p1); \
627 P2 p2 = getArgument<P2>(_p2); \
628 P3 p3 = getArgument<P3>(_p3); \
629 P4 p4 = getArgument<P4>(_p4); \
630 P5 p5 = getArgument<P5>(_p5); \
631 P6 p6 = getArgument<P6>(_p6); \
632 P7 p7 = getArgument<P7>(_p7); \
633 P8 p8 = getArgument<P8>(_p8); \
634 P9 p9 = getArgument<P9>(_p9); \
635 P10 p10 = getArgument<P10>(_p10); \
636 impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); \
637 return; \
638 }
639
640 #define KOALA_INTEROP_V12(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) \
641 KOALA_INTEROP_EXPORT void name( \
642 typename InteropTypeConverter<P0>::InteropType _p0, \
643 typename InteropTypeConverter<P1>::InteropType _p1, \
644 typename InteropTypeConverter<P2>::InteropType _p2, \
645 typename InteropTypeConverter<P3>::InteropType _p3, \
646 typename InteropTypeConverter<P4>::InteropType _p4, \
647 typename InteropTypeConverter<P5>::InteropType _p5, \
648 typename InteropTypeConverter<P6>::InteropType _p6, \
649 typename InteropTypeConverter<P7>::InteropType _p7, \
650 typename InteropTypeConverter<P8>::InteropType _p8, \
651 typename InteropTypeConverter<P9>::InteropType _p9, \
652 typename InteropTypeConverter<P10>::InteropType _p10, \
653 typename InteropTypeConverter<P11>::InteropType _p11 \
654 ) { \
655 KOALA_MAYBE_LOG(name) \
656 P0 p0 = getArgument<P0>(_p0); \
657 P1 p1 = getArgument<P1>(_p1); \
658 P2 p2 = getArgument<P2>(_p2); \
659 P3 p3 = getArgument<P3>(_p3); \
660 P4 p4 = getArgument<P4>(_p4); \
661 P5 p5 = getArgument<P5>(_p5); \
662 P6 p6 = getArgument<P6>(_p6); \
663 P7 p7 = getArgument<P7>(_p7); \
664 P8 p8 = getArgument<P8>(_p8); \
665 P9 p9 = getArgument<P9>(_p9); \
666 P10 p10 = getArgument<P10>(_p10); \
667 P11 p11 = getArgument<P11>(_p11); \
668 impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); \
669 return; \
670 }
671
672 #define KOALA_INTEROP_V13(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) \
673 KOALA_INTEROP_EXPORT void name( \
674 typename InteropTypeConverter<P0>::InteropType _p0, \
675 typename InteropTypeConverter<P1>::InteropType _p1, \
676 typename InteropTypeConverter<P2>::InteropType _p2, \
677 typename InteropTypeConverter<P3>::InteropType _p3, \
678 typename InteropTypeConverter<P4>::InteropType _p4, \
679 typename InteropTypeConverter<P5>::InteropType _p5, \
680 typename InteropTypeConverter<P6>::InteropType _p6, \
681 typename InteropTypeConverter<P7>::InteropType _p7, \
682 typename InteropTypeConverter<P8>::InteropType _p8, \
683 typename InteropTypeConverter<P9>::InteropType _p9, \
684 typename InteropTypeConverter<P10>::InteropType _p10, \
685 typename InteropTypeConverter<P11>::InteropType _p11, \
686 typename InteropTypeConverter<P12>::InteropType _p12 \
687 ) { \
688 KOALA_MAYBE_LOG(name) \
689 P0 p0 = getArgument<P0>(_p0); \
690 P1 p1 = getArgument<P1>(_p1); \
691 P2 p2 = getArgument<P2>(_p2); \
692 P3 p3 = getArgument<P3>(_p3); \
693 P4 p4 = getArgument<P4>(_p4); \
694 P5 p5 = getArgument<P5>(_p5); \
695 P6 p6 = getArgument<P6>(_p6); \
696 P7 p7 = getArgument<P7>(_p7); \
697 P8 p8 = getArgument<P8>(_p8); \
698 P9 p9 = getArgument<P9>(_p9); \
699 P10 p10 = getArgument<P10>(_p10); \
700 P11 p11 = getArgument<P11>(_p11); \
701 P12 p12 = getArgument<P12>(_p12); \
702 impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); \
703 return; \
704 }
705
706 #define KOALA_INTEROP_V14(name, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) \
707 KOALA_INTEROP_EXPORT void name( \
708 typename InteropTypeConverter<P0>::InteropType _p0, \
709 typename InteropTypeConverter<P1>::InteropType _p1, \
710 typename InteropTypeConverter<P2>::InteropType _p2, \
711 typename InteropTypeConverter<P3>::InteropType _p3, \
712 typename InteropTypeConverter<P4>::InteropType _p4, \
713 typename InteropTypeConverter<P5>::InteropType _p5, \
714 typename InteropTypeConverter<P6>::InteropType _p6, \
715 typename InteropTypeConverter<P7>::InteropType _p7, \
716 typename InteropTypeConverter<P8>::InteropType _p8, \
717 typename InteropTypeConverter<P9>::InteropType _p9, \
718 typename InteropTypeConverter<P10>::InteropType _p10, \
719 typename InteropTypeConverter<P11>::InteropType _p11, \
720 typename InteropTypeConverter<P12>::InteropType _p12, \
721 typename InteropTypeConverter<P13>::InteropType _p13 \
722 ) { \
723 KOALA_MAYBE_LOG(name) \
724 P0 p0 = getArgument<P0>(_p0); \
725 P1 p1 = getArgument<P1>(_p1); \
726 P2 p2 = getArgument<P2>(_p2); \
727 P3 p3 = getArgument<P3>(_p3); \
728 P4 p4 = getArgument<P4>(_p4); \
729 P5 p5 = getArgument<P5>(_p5); \
730 P6 p6 = getArgument<P6>(_p6); \
731 P7 p7 = getArgument<P7>(_p7); \
732 P8 p8 = getArgument<P8>(_p8); \
733 P9 p9 = getArgument<P9>(_p9); \
734 P10 p10 = getArgument<P10>(_p10); \
735 P11 p11 = getArgument<P11>(_p11); \
736 P12 p12 = getArgument<P12>(_p12); \
737 P13 p13 = getArgument<P13>(_p13); \
738 impl_##name(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); \
739 return; \
740 }
741
742 #define KOALA_INTEROP_CTX_0(name, Ret) \
743 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name() { \
744 KOALA_MAYBE_LOG(name) \
745 KVMContext ctx = (KVMContext)0; \
746 return makeResult<Ret>(impl_##name(ctx)); \
747 }
748
749 #define KOALA_INTEROP_CTX_1(name, Ret, P0) \
750 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name(InteropTypeConverter<P0>::InteropType _p0) { \
751 KOALA_MAYBE_LOG(name) \
752 P0 p0 = getArgument<P0>(_p0); \
753 KVMContext ctx = (KVMContext)0; \
754 return makeResult<Ret>(impl_##name(ctx, p0)); \
755 }
756
757 #define KOALA_INTEROP_CTX_2(name, Ret, P0, P1) \
758 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name(InteropTypeConverter<P0>::InteropType _p0, \
759 InteropTypeConverter<P1>::InteropType _p1) { \
760 KOALA_MAYBE_LOG(name) \
761 P0 p0 = getArgument<P0>(_p0); \
762 P1 p1 = getArgument<P1>(_p1); \
763 KVMContext ctx = (KVMContext)0; \
764 return makeResult<Ret>(impl_##name(ctx, p0, p1)); \
765 }
766
767
768 #define KOALA_INTEROP_CTX_3(name, Ret, P0, P1, P2) \
769 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
770 InteropTypeConverter<P0>::InteropType _p0, \
771 InteropTypeConverter<P1>::InteropType _p1, \
772 InteropTypeConverter<P2>::InteropType _p2) { \
773 KOALA_MAYBE_LOG(name) \
774 P0 p0 = getArgument<P0>(_p0); \
775 P1 p1 = getArgument<P1>(_p1); \
776 P2 p2 = getArgument<P2>(_p2); \
777 KVMContext ctx = (KVMContext)0; \
778 return makeResult<Ret>(impl_##name(ctx, p0, p1, p2)); \
779 }
780
781 #define KOALA_INTEROP_CTX_4(name, Ret, P0, P1, P2, P3) \
782 KOALA_INTEROP_EXPORT InteropTypeConverter<Ret>::InteropType name( \
783 InteropTypeConverter<P0>::InteropType _p0, \
784 InteropTypeConverter<P1>::InteropType _p1, \
785 InteropTypeConverter<P2>::InteropType _p2, \
786 InteropTypeConverter<P3>::InteropType _p3) { \
787 KOALA_MAYBE_LOG(name) \
788 P0 p0 = getArgument<P0>(_p0); \
789 P1 p1 = getArgument<P1>(_p1); \
790 P2 p2 = getArgument<P2>(_p2); \
791 P3 p3 = getArgument<P3>(_p3); \
792 KVMContext ctx = (KVMContext)0; \
793 return makeResult<Ret>(impl_##name(ctx, p0, p1, p2, p3)); \
794 }
795
796
797 #define KOALA_INTEROP_CALL_INT(venv, id, length, args) \
798 { \
799 int32_t rv = 0; \
800 return rv; \
801 }
802 #define KOALA_INTEROP_CALL_VOID(venv, id, length, args) \
803 { \
804 }
805
806
807 #define KOALA_INTEROP_CALL_VOID_INTS32(venv, id, argc, args) KOALA_INTEROP_CALL_VOID(venv, id, (argc) * sizeof(int32_t), args)
808 #define KOALA_INTEROP_CALL_INT_INTS32(venv, id, argc, args) KOALA_INTEROP_CALL_INT(venv, id, (argc) * sizeof(int32_t), args)
809
810
811 #define KOALA_INTEROP_CTX_V1(name, P0) \
812 KOALA_INTEROP_EXPORT void name(InteropTypeConverter<P0>::InteropType _p0) {\
813 KOALA_MAYBE_LOG(name) \
814 P0 p0 = getArgument<P0>(_p0); \
815 impl_##name(nullptr, p0); \
816 }
817
818 #define KOALA_INTEROP_CTX_V2(name, P0, P1) \
819 KOALA_INTEROP_EXPORT void name(InteropTypeConverter<P0>::InteropType _p0, \
820 InteropTypeConverter<P1>::InteropType _p1) { \
821 KOALA_MAYBE_LOG(name) \
822 P0 p0 = getArgument<P0>(_p0); \
823 P1 p1 = getArgument<P1>(_p1); \
824 impl_##name(nullptr, p0, p1); \
825 }
826
827 #define KOALA_INTEROP_CTX_V3(name, P0, P1, P2) \
828 KOALA_INTEROP_EXPORT void name(InteropTypeConverter<P0>::InteropType _p0, \
829 InteropTypeConverter<P1>::InteropType _p1, \
830 InteropTypeConverter<P2>::InteropType _p2) { \
831 KOALA_MAYBE_LOG(name) \
832 P0 p0 = getArgument<P0>(_p0); \
833 P1 p1 = getArgument<P1>(_p1); \
834 P2 p2 = getArgument<P2>(_p2); \
835 impl_##name(nullptr, p0, p1, p2); \
836 }
837
838 #define KOALA_INTEROP_CTX_V4(name, P0, P1, P2, P3) \
839 KOALA_INTEROP_EXPORT void name(InteropTypeConverter<P0>::InteropType _p0, \
840 InteropTypeConverter<P1>::InteropType _p1, \
841 InteropTypeConverter<P2>::InteropType _p2, \
842 InteropTypeConverter<P3>::InteropType _p3) { \
843 KOALA_MAYBE_LOG(name) \
844 P0 p0 = getArgument<P0>(_p0); \
845 P1 p1 = getArgument<P1>(_p1); \
846 P2 p2 = getArgument<P2>(_p2); \
847 P3 p3 = getArgument<P3>(_p3); \
848 impl_##name(nullptr, p0, p1, p2, p3); \
849 }
850
851 #define KOALA_INTEROP_CTX_V5(name, P0, P1, P2, P3, P4) \
852 KOALA_INTEROP_EXPORT void name(InteropTypeConverter<P0>::InteropType _p0, \
853 InteropTypeConverter<P1>::InteropType _p1, \
854 InteropTypeConverter<P2>::InteropType _p2, \
855 InteropTypeConverter<P3>::InteropType _p3, \
856 InteropTypeConverter<P4>::InteropType _p4) { \
857 KOALA_MAYBE_LOG(name) \
858 P0 p0 = getArgument<P0>(_p0); \
859 P1 p1 = getArgument<P1>(_p1); \
860 P2 p2 = getArgument<P2>(_p2); \
861 P3 p3 = getArgument<P3>(_p3); \
862 P4 p4 = getArgument<P4>(_p4); \
863 impl_##name(nullptr, p0, p1, p2, p3, p4); \
864 }
865
866 #define KOALA_INTEROP_THROW(vmContext, object, ...) \
867 do { \
868 ASSERT(false); \
869 return __VA_ARGS__; \
870 } while (0)
871
872 #define KOALA_INTEROP_THROW_STRING(vmContext, message, ...) \
873 do { \
874 ASSERT(false); \
875 return __VA_ARGS__; \
876 } while (0)
877
878 #endif // CONVERTORS_CJ_H