invokeNative_general.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. #if defined(__clang__)
  8. #pragma clang diagnostic push
  9. #pragma clang diagnostic ignored "-Wdeprecated-non-prototype"
  10. #endif
  11. void
  12. invokeNative(void (*native_code)(), uint32 argv[], uint32 argc)
  13. {
  14. bh_assert(argc >= sizeof(WASMExecEnv *) / sizeof(uint32));
  15. switch (argc) {
  16. case 0:
  17. native_code();
  18. break;
  19. case 1:
  20. native_code(argv[0]);
  21. break;
  22. case 2:
  23. native_code(argv[0], argv[1]);
  24. break;
  25. case 3:
  26. native_code(argv[0], argv[1], argv[2]);
  27. break;
  28. case 4:
  29. native_code(argv[0], argv[1], argv[2], argv[3]);
  30. break;
  31. case 5:
  32. native_code(argv[0], argv[1], argv[2], argv[3], argv[4]);
  33. break;
  34. case 6:
  35. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
  36. break;
  37. case 7:
  38. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  39. argv[6]);
  40. break;
  41. case 8:
  42. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  43. argv[6], argv[7]);
  44. break;
  45. case 9:
  46. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  47. argv[6], argv[7], argv[8]);
  48. break;
  49. case 10:
  50. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  51. argv[6], argv[7], argv[8], argv[9]);
  52. break;
  53. case 11:
  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]);
  56. break;
  57. case 12:
  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. break;
  61. case 13:
  62. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  63. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  64. argv[12]);
  65. break;
  66. case 14:
  67. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  68. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  69. argv[12], argv[13]);
  70. break;
  71. case 15:
  72. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  73. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  74. argv[12], argv[13], argv[14]);
  75. break;
  76. case 16:
  77. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  78. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  79. argv[12], argv[13], argv[14], argv[15]);
  80. break;
  81. case 17:
  82. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  83. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  84. argv[12], argv[13], argv[14], argv[15], argv[16]);
  85. break;
  86. case 18:
  87. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  88. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  89. argv[12], argv[13], argv[14], argv[15], argv[16],
  90. argv[17]);
  91. break;
  92. case 19:
  93. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  94. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  95. argv[12], argv[13], argv[14], argv[15], argv[16],
  96. argv[17], argv[18]);
  97. break;
  98. case 20:
  99. native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
  100. argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
  101. argv[12], argv[13], argv[14], argv[15], argv[16],
  102. argv[17], argv[18], argv[19]);
  103. break;
  104. default:
  105. {
  106. /* FIXME: If this happen, add more cases. */
  107. WASMExecEnv *exec_env = *(WASMExecEnv **)argv;
  108. WASMModuleInstanceCommon *module_inst = exec_env->module_inst;
  109. wasm_runtime_set_exception(
  110. module_inst,
  111. "the argument number of native function exceeds maximum");
  112. return;
  113. }
  114. }
  115. }
  116. #if defined(__clang__)
  117. #pragma clang diagnostic pop
  118. #endif