Index: test/unittests/wasm/ast-decoder-unittest.cc |
diff --git a/test/unittests/wasm/ast-decoder-unittest.cc b/test/unittests/wasm/ast-decoder-unittest.cc |
index 5d4786d724961099a2ecba947d40dc91ff85efd2..672158714af3ab7695fc67063e7ea22657e918e0 100644 |
--- a/test/unittests/wasm/ast-decoder-unittest.cc |
+++ b/test/unittests/wasm/ast-decoder-unittest.cc |
@@ -1192,6 +1192,7 @@ class TestModuleEnv : public ModuleEnv { |
mod.globals = new std::vector<WasmGlobal>; |
mod.signatures = new std::vector<FunctionSig*>; |
mod.functions = new std::vector<WasmFunction>; |
+ mod.import_table = new std::vector<WasmImport>; |
} |
byte AddGlobal(MachineType mem_type) { |
mod.globals->push_back({0, mem_type, 0, false}); |
@@ -1208,6 +1209,11 @@ class TestModuleEnv : public ModuleEnv { |
CHECK(mod.functions->size() <= 127); |
return static_cast<byte>(mod.functions->size() - 1); |
} |
+ byte AddImport(FunctionSig* sig) { |
+ mod.import_table->push_back({sig, 0, 0}); |
+ CHECK(mod.import_table->size() <= 127); |
+ return static_cast<byte>(mod.import_table->size() - 1); |
+ } |
private: |
WasmModule mod; |
@@ -1364,6 +1370,39 @@ TEST_F(WasmDecoderTest, IndirectCallsWithMismatchedSigs3) { |
EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_F32(17.6))); |
} |
+TEST_F(WasmDecoderTest, SimpleImportCalls) { |
+ FunctionEnv* env = &env_i_i; |
+ TestModuleEnv module_env; |
+ env->module = &module_env; |
+ |
+ byte f0 = module_env.AddImport(sigs.i_v()); |
+ byte f1 = module_env.AddImport(sigs.i_i()); |
+ byte f2 = module_env.AddImport(sigs.i_ii()); |
+ |
+ EXPECT_VERIFIES_INLINE(env, WASM_CALL_IMPORT0(f0)); |
+ EXPECT_VERIFIES_INLINE(env, WASM_CALL_IMPORT(f1, WASM_I8(22))); |
+ EXPECT_VERIFIES_INLINE(env, WASM_CALL_IMPORT(f2, WASM_I8(32), WASM_I8(72))); |
+} |
+ |
+TEST_F(WasmDecoderTest, ImportCallsWithMismatchedSigs3) { |
+ FunctionEnv* env = &env_i_i; |
+ TestModuleEnv module_env; |
+ env->module = &module_env; |
+ |
+ byte f0 = module_env.AddImport(sigs.i_f()); |
+ |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT0(f0)); |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f0, WASM_I8(17))); |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f0, WASM_I64(27))); |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f0, WASM_F64(37.2))); |
+ |
+ byte f1 = module_env.AddImport(sigs.i_d()); |
+ |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT0(f1)); |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f1, WASM_I8(16))); |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f1, WASM_I64(16))); |
+ EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f1, WASM_F32(17.6))); |
+} |
TEST_F(WasmDecoderTest, Int32Globals) { |
FunctionEnv* env = &env_i_i; |
@@ -1987,6 +2026,7 @@ TEST_F(WasmOpcodeLengthTest, MiscExpressions) { |
EXPECT_LENGTH(2, kExprLoadGlobal); |
EXPECT_LENGTH(2, kExprStoreGlobal); |
EXPECT_LENGTH(2, kExprCallFunction); |
+ EXPECT_LENGTH(2, kExprCallImport); |
EXPECT_LENGTH(2, kExprCallIndirect); |
EXPECT_LENGTH(1, kExprIf); |
EXPECT_LENGTH(1, kExprIfElse); |
@@ -2237,12 +2277,16 @@ TEST_F(WasmOpcodeArityTest, Calls) { |
module.AddSignature(sigs.f_ff()); |
module.AddSignature(sigs.i_d()); |
+ module.AddImport(sigs.f_ff()); |
+ module.AddImport(sigs.i_d()); |
+ |
{ |
FunctionEnv env; |
WasmDecoderTest::init_env(&env, sigs.i_ii()); |
env.module = &module; |
EXPECT_ARITY(2, kExprCallFunction, 0); |
+ EXPECT_ARITY(2, kExprCallImport, 0); |
EXPECT_ARITY(3, kExprCallIndirect, 0); |
EXPECT_ARITY(1, kExprBr); |
EXPECT_ARITY(2, kExprBrIf); |
@@ -2254,6 +2298,7 @@ TEST_F(WasmOpcodeArityTest, Calls) { |
env.module = &module; |
EXPECT_ARITY(1, kExprCallFunction, 1); |
+ EXPECT_ARITY(1, kExprCallImport, 1); |
EXPECT_ARITY(2, kExprCallIndirect, 1); |
EXPECT_ARITY(1, kExprBr); |
EXPECT_ARITY(2, kExprBrIf); |