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