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