分两步:
- 先把JAVA class翻译为Wasm C的文本格式。
- 再对Wasm C进行编译,产生正式的wasm文件。
举例说明。
源码:
@Export(name = "layoutJs2Java") public static int[] layoutJs2Java() { int[] intarray = new int[]{5, 8}; return intarray; }
中间代码
int32_t layoutJs2Java() { int32_t _intarray; int32_t localVar1; int32_t ___stack__; ___stack__ = meth_otbw_WasmRuntime_allocStack(INT32_C(0)); if (((*((int32_t *) &wasm_heap[INT32_C(468) + 0]) & INT32_C(1)) == INT32_C(0))) { *((int32_t *) &wasm_heap[___stack__ + 0]) = INT32_C(12); initclass_tw_WasmBenchmarkStarter(); if ((*((int32_t *) &wasm_heap[___stack__ + 0]) != INT32_C(12))) { goto block_0; } } *((int32_t *) &wasm_heap[___stack__ + 0]) = INT32_C(11); _intarray = meth_otr_Allocator_allocateArray(INT32_C(15040), INT32_C(2)); if ((*((int32_t *) &wasm_heap[___stack__ + 0]) == INT32_C(11))) { localVar1 = _intarray; if ((INT32_C(0) >= *((int32_t *) &wasm_heap[(localVar1 + INT32_C(8)) + 0]))) { *((int32_t *) &wasm_heap[___stack__ + 0]) = INT32_C(13); teavm_throwArrayIndexOutOfBoundsException(); } else { *((int32_t *) &wasm_heap[((localVar1 + INT32_C(12)) + (INT32_C(0) << INT32_C(2))) + 0]) = INT32_C(5); if ((INT32_C(1) < *((int32_t *) &wasm_heap[(localVar1 + INT32_C(8)) + 0]))) { *((int32_t *) &wasm_heap[((localVar1 + INT32_C(12)) + (INT32_C(1) << INT32_C(2))) + 0]) = INT32_C(8); goto block_1; } *((int32_t *) &wasm_heap[___stack__ + 0]) = INT32_C(14); teavm_throwArrayIndexOutOfBoundsException(); } } block_0: ; _intarray = INT32_C(0); block_1: ; *((int32_t *) &wasm_heap[INT32_C(724) + 0]) = (___stack__ - INT32_C(4)); return _intarray; }