• 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_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