invokeNative_general.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "../wasm_runtime_common.h"
  6. #include "../wasm_exec_env.h"
  7. void
  8. invokeNative(void (*native_code)(), uint32 argv[], uint32 argc)
  9. {
  10. bh_assert(argc >= sizeof(WASMExecEnv *) / sizeof(uint32));
  11. switch (argc) {
  12. case 0:
  13. native_code();
  14. break;
  15. case 1:
  16. native_code(argv[0]);
  17. break;
  18. case 2:
  19. native_code(argv[0], argv[1]);
  20. break;
  21. case 3:
  22. native_code(argv[0], argv[1], argv[2]);
  23. break;
  24. case 4:
  25. native_code(argv[0], argv[1], argv[2], argv[3]);
  26. break;
  27. case 5:
  28. native_code(argv[0], argv[1], argv[2], argv[3], argv[4]);
  29. break;
  30. case 6:
  31. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
  32. break;
  33. case 7:
  34. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  35. argv[6]);
  36. break;
  37. case 8:
  38. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  39. argv[6], argv[7]);
  40. break;
  41. case 9:
  42. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  43. argv[6], argv[7], argv[8]);
  44. break;
  45. case 10:
  46. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  47. argv[6], argv[7], argv[8], argv[9]);
  48. break;
  49. case 11:
  50. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  51. argv[6], argv[7], argv[8], argv[9], argv[10]);
  52. break;
  53. case 12:
  54. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  55. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]);
  56. break;
  57. case 13:
  58. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  59. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  60. argv[12]);
  61. break;
  62. case 14:
  63. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  64. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  65. argv[12], argv[13]);
  66. break;
  67. case 15:
  68. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  69. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  70. argv[12], argv[13], argv[14]);
  71. break;
  72. case 16:
  73. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  74. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  75. argv[12], argv[13], argv[14], argv[15]);
  76. break;
  77. case 17:
  78. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  79. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  80. argv[12], argv[13], argv[14], argv[15], argv[16]);
  81. break;
  82. case 18:
  83. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  84. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  85. argv[12], argv[13], argv[14], argv[15], argv[16],
  86. argv[17]);
  87. break;
  88. case 19:
  89. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  90. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  91. argv[12], argv[13], argv[14], argv[15], argv[16],
  92. argv[17], argv[18]);
  93. break;
  94. case 20:
  95. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  96. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  97. argv[12], argv[13], argv[14], argv[15], argv[16],
  98. argv[17], argv[18], argv[19]);
  99. break;
  100. default:
  101. {
  102. /* FIXME: If this happen, add more cases. */
  103. WASMExecEnv *exec_env = *(WASMExecEnv **)argv;
  104. WASMModuleInstanceCommon *module_inst = exec_env->module_inst;
  105. wasm_runtime_set_exception(
  106. module_inst,
  107. "the argument number of native function exceeds maximum");
  108. return;
  109. }
  110. }
  111. }