/*
 * Copyright (C) 2019 Intel Corporation.  All rights reserved.
 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 */

#include "../wasm_runtime_common.h"
#include "../wasm_exec_env.h"

void
invokeNative(void (*native_code)(), uint32 argv[], uint32 argc)
{
    bh_assert(argc >= sizeof(WASMExecEnv *) / sizeof(uint32));

    switch (argc) {
        case 0:
            native_code();
            break;
        case 1:
            native_code(argv[0]);
            break;
        case 2:
            native_code(argv[0], argv[1]);
            break;
        case 3:
            native_code(argv[0], argv[1], argv[2]);
            break;
        case 4:
            native_code(argv[0], argv[1], argv[2], argv[3]);
            break;
        case 5:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4]);
            break;
        case 6:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
            break;
        case 7:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6]);
            break;
        case 8:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7]);
            break;
        case 9:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8]);
            break;
        case 10:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9]);
            break;
        case 11:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10]);
            break;
        case 12:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]);
            break;
        case 13:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12]);
            break;
        case 14:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12], argv[13]);
            break;
        case 15:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12], argv[13], argv[14]);
            break;
        case 16:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12], argv[13], argv[14], argv[15]);
            break;
        case 17:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12], argv[13], argv[14], argv[15], argv[16]);
            break;
        case 18:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12], argv[13], argv[14], argv[15], argv[16],
                        argv[17]);
            break;
        case 19:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12], argv[13], argv[14], argv[15], argv[16],
                        argv[17], argv[18]);
            break;
        case 20:
            native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
                        argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
                        argv[12], argv[13], argv[14], argv[15], argv[16],
                        argv[17], argv[18], argv[19]);
            break;
        default:
        {
            /* FIXME: If this happen, add more cases. */
            WASMExecEnv *exec_env = *(WASMExecEnv **)argv;
            WASMModuleInstanceCommon *module_inst = exec_env->module_inst;
            wasm_runtime_set_exception(
                module_inst,
                "the argument number of native function exceeds maximum");
            return;
        }
    }
}