Index: test/unittests/wasm/module-decoder-unittest.cc |
diff --git a/test/unittests/wasm/module-decoder-unittest.cc b/test/unittests/wasm/module-decoder-unittest.cc |
index cfff90b5931fe04a8da5a8acd59c98b4af7624de..88a4ee5e449ef2604ba0258d6aaeb8d67f71d306 100644 |
--- a/test/unittests/wasm/module-decoder-unittest.cc |
+++ b/test/unittests/wasm/module-decoder-unittest.cc |
@@ -23,6 +23,7 @@ namespace wasm { |
#define INT_INT_SIG 1, kLocalI32, kLocalI32 |
#define INT_INT_SIG_SIZE ((size_t)3) |
+// TODO(titzer): tricky size logic! Remove -1. |
#define SECTION(NAME, EXTRA_SIZE) \ |
U32V_1(WASM_SECTION_##NAME##_SIZE + (EXTRA_SIZE)), WASM_SECTION_##NAME |
@@ -49,6 +50,15 @@ namespace wasm { |
} \ |
} while (false) |
+#define EXPECT_OK(result) \ |
+ do { \ |
+ EXPECT_TRUE(result.ok()); \ |
+ if (!result.ok()) { \ |
+ if (result.val) delete result.val; \ |
+ return; \ |
+ } \ |
+ } while (false) |
+ |
static size_t SizeOfVarInt(size_t value) { |
size_t size = 0; |
do { |
@@ -115,7 +125,7 @@ TEST_F(WasmModuleVerifyTest, DecodeEmpty) { |
TEST_F(WasmModuleVerifyTest, OneGlobal) { |
static const byte data[] = { |
- SECTION(GLOBALS, 7), // -- |
+ SECTION(GLOBALS, 5), // -- |
1, |
NAME_LENGTH(1), |
'g', // name |
@@ -126,7 +136,7 @@ TEST_F(WasmModuleVerifyTest, OneGlobal) { |
{ |
// Should decode to exactly one global. |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(1, result.val->globals.size()); |
EXPECT_EQ(0, result.val->functions.size()); |
EXPECT_EQ(0, result.val->data_segments.size()); |
@@ -151,7 +161,7 @@ TEST_F(WasmModuleVerifyTest, ZeroGlobals) { |
0, // declare 0 globals |
}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
if (result.val) delete result.val; |
} |
@@ -192,7 +202,7 @@ TEST_F(WasmModuleVerifyTest, NGlobals) { |
} |
ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
if (result.val) delete result.val; |
} |
} |
@@ -224,7 +234,7 @@ TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { |
TEST_F(WasmModuleVerifyTest, TwoGlobals) { |
static const byte data[] = { |
- SECTION(GLOBALS, 13), |
+ SECTION(GLOBALS, 7), |
2, |
NO_NAME, // #0: name length |
kMemF32, // memory type |
@@ -237,7 +247,7 @@ TEST_F(WasmModuleVerifyTest, TwoGlobals) { |
{ |
// Should decode to exactly two globals. |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(2, result.val->globals.size()); |
EXPECT_EQ(0, result.val->functions.size()); |
EXPECT_EQ(0, result.val->data_segments.size()); |
@@ -293,7 +303,7 @@ TEST_F(WasmModuleVerifyTest, MultipleSignatures) { |
}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(3, result.val->signatures.size()); |
if (result.val->signatures.size() == 3) { |
EXPECT_EQ(0, result.val->signatures[0]->return_count()); |
@@ -341,7 +351,7 @@ TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
// sig#0 ------------------------------------------------------- |
VOID_VOID_SIG, |
// func#0 ------------------------------------------------------ |
- SECTION(FUNCTIONS, 19), 1, |
+ SECTION(FUNCTIONS, 18), 1, |
kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, |
SIG_INDEX(0), // signature index |
NAME_LENGTH(2), 'h', 'i', // name |
@@ -356,7 +366,7 @@ TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
{ |
// Should decode to exactly one function. |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(0, result.val->globals.size()); |
EXPECT_EQ(1, result.val->signatures.size()); |
EXPECT_EQ(1, result.val->functions.size()); |
@@ -387,16 +397,19 @@ TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
TEST_F(WasmModuleVerifyTest, OneFunctionImported) { |
static const byte data[] = { |
- SECTION(SIGNATURES, VOID_VOID_SIG_SIZE), 1, |
+ // signatures |
+ SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, |
// sig#0 ------------------------------------------------------- |
- VOID_VOID_SIG, SECTION(FUNCTIONS, 6), 1, |
+ VOID_VOID_SIG, |
+ // functions |
+ SECTION(FUNCTIONS, 4), 1, |
// func#0 ------------------------------------------------------ |
kDeclFunctionImport, // no name, no locals, imported |
SIG_INDEX(0), |
}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(1, result.val->functions.size()); |
WasmFunction* function = &result.val->functions.back(); |
@@ -432,7 +445,7 @@ TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) { |
}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(1, result.val->functions.size()); |
WasmFunction* function = &result.val->functions.back(); |
@@ -472,7 +485,7 @@ TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) { |
}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(1, result.val->functions.size()); |
WasmFunction* function = &result.val->functions.back(); |
@@ -493,33 +506,35 @@ TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) { |
TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { |
- static const byte kCodeStartOffset = 75; |
+ static const byte kCodeStartOffset = 64; |
static const byte kCodeEndOffset = kCodeStartOffset + 3; |
- static const byte kDataSegmentSourceOffset = kCodeEndOffset + 20; |
+ static const byte kDataSegmentSourceOffset = kCodeEndOffset + 31; |
static const byte data[] = { |
- SECTION(MEMORY, 3), 28, 28, 1, |
// global#0 -------------------------------------------------- |
- SECTION(GLOBALS, 7), 1, |
+ SECTION(GLOBALS, 4), 1, |
0, // name length |
kMemU8, // memory type |
0, // exported |
// sig#0 ----------------------------------------------------- |
SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void |
// func#0 ---------------------------------------------------- |
- SECTION(FUNCTIONS, 20), 1, kDeclFunctionLocals | kDeclFunctionName, 0, |
- 0, // signature index |
- 2, 'h', 'i', // name |
- 1, 2, // local int32 count |
- 3, 4, // local int64 count |
- 5, 6, // local float32 count |
- 7, 8, // local float64 count |
- 3, 0, // body size |
- kExprNop, // func#0 body |
- kExprNop, // func#0 body |
- kExprNop, // func#0 body |
+ SECTION(FUNCTIONS, 20), 1, |
+ kDeclFunctionLocals | kDeclFunctionName, // -- |
+ SIG_INDEX(0), // signature index |
+ 2, 'h', 'i', // name |
+ 1, 2, // local int32 count |
+ 3, 4, // local int64 count |
+ 5, 6, // local float32 count |
+ 7, 8, // local float64 count |
+ 3, 0, // body size |
+ kExprNop, // func#0 body |
+ kExprNop, // func#0 body |
+ kExprNop, // func#0 body |
+ // memory section -------------------------------------------- |
+ SECTION(MEMORY, 3), 28, 28, 1, |
// segment#0 ------------------------------------------------- |
- SECTION(DATA_SEGMENTS, 14), 1, |
+ SECTION(DATA_SEGMENTS, 10), 1, |
U32V_3(0x8b3ae), // dest addr |
U32V_1(5), // source size |
0, 1, 2, 3, 4, // data bytes |
@@ -529,7 +544,7 @@ TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { |
{ |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(1, result.val->globals.size()); |
EXPECT_EQ(1, result.val->functions.size()); |
EXPECT_EQ(1, result.val->data_segments.size()); |
@@ -543,7 +558,7 @@ TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { |
WasmFunction* function = &result.val->functions.back(); |
- EXPECT_EQ(63, function->name_offset); |
+ EXPECT_EQ(52, function->name_offset); |
EXPECT_EQ(2, function->name_length); |
EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
@@ -582,7 +597,7 @@ TEST_F(WasmModuleVerifyTest, OneDataSegment) { |
{ |
EXPECT_VERIFIES(data); |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(0, result.val->globals.size()); |
EXPECT_EQ(0, result.val->functions.size()); |
EXPECT_EQ(1, result.val->data_segments.size()); |
@@ -610,7 +625,7 @@ TEST_F(WasmModuleVerifyTest, TwoDataSegments) { |
28, |
28, |
1, |
- SECTION(DATA_SEGMENTS, 31), |
+ SECTION(DATA_SEGMENTS, 23), |
2, // segment count |
U32V_3(0x7ffee), // #0: dest addr |
U32V_1(4), // source size |
@@ -634,7 +649,7 @@ TEST_F(WasmModuleVerifyTest, TwoDataSegments) { |
{ |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(0, result.val->globals.size()); |
EXPECT_EQ(0, result.val->functions.size()); |
EXPECT_EQ(2, result.val->data_segments.size()); |
@@ -670,7 +685,7 @@ TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) { |
mem_pages, |
mem_pages, |
1, |
- SECTION(DATA_SEGMENTS, 14), |
+ SECTION(DATA_SEGMENTS, 8), |
1, |
U32V_3(dest_addr), |
U32V_1(source_size), |
@@ -701,7 +716,7 @@ TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { |
SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
if (result.ok()) { |
EXPECT_EQ(1, result.val->signatures.size()); |
EXPECT_EQ(1, result.val->functions.size()); |
@@ -735,7 +750,7 @@ TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { |
}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
if (result.ok()) { |
EXPECT_EQ(2, result.val->signatures.size()); |
EXPECT_EQ(4, result.val->functions.size()); |
@@ -916,7 +931,7 @@ TEST_F(WasmFunctionVerifyTest, Ok_v_v_empty) { |
FunctionResult result = DecodeWasmFunction(isolate(), zone(), nullptr, data, |
data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
if (result.val && result.ok()) { |
WasmFunction* function = result.val; |
@@ -1031,14 +1046,14 @@ TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) { |
1, |
'\0', // Section name: LEB128 1, string '\0' |
0, // one byte section |
- SECTION(GLOBALS, 7), |
+ SECTION(GLOBALS, 4), |
1, |
0, // name length |
kMemI32, // memory type |
0, // exported |
}; |
ModuleResult result = DecodeModule(data, data + arraysize(data)); |
- EXPECT_TRUE(result.ok()); |
+ EXPECT_OK(result); |
EXPECT_EQ(1, result.val->globals.size()); |
EXPECT_EQ(0, result.val->functions.size()); |
@@ -1060,8 +1075,18 @@ TEST_F(WasmModuleVerifyTest, ImportTable_empty) { |
EXPECT_VERIFIES(data); |
} |
-TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { |
+TEST_F(WasmModuleVerifyTest, ImportTable_nosigs1) { |
static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0}; |
+ EXPECT_VERIFIES(data); |
+} |
+ |
+TEST_F(WasmModuleVerifyTest, ImportTable_nosigs2) { |
+ static const byte data[] = { |
+ SECTION(IMPORT_TABLE, 6), 1, // sig table |
+ IMPORT_SIG_INDEX(0), // sig index |
+ NAME_LENGTH(1), 'm', // module name |
+ NAME_LENGTH(1), 'f', // function name |
+ }; |
EXPECT_FAILURE(data); |
} |
@@ -1162,7 +1187,7 @@ TEST_F(WasmModuleVerifyTest, ExportTableOne) { |
SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE), |
1, // functions |
EMPTY_FUNCTION(0), // -- |
- SECTION(EXPORT_TABLE, 7), |
+ SECTION(EXPORT_TABLE, 3), |
1, // exports |
FUNC_INDEX(0), // -- |
NO_NAME // -- |
@@ -1269,7 +1294,7 @@ TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) { |
} |
#define SIGNATURES_SECTION(count, ...) \ |
- SECTION(SIGNATURES, 1 + 3 * (count)), U32V_1(count), __VA_ARGS__ |
+ SECTION(SIGNATURES, 1 + 2 * (count)), U32V_1(count), __VA_ARGS__ |
#define FUNCTION_SIGNATURES_SECTION(count, ...) \ |
SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__ |
@@ -1282,53 +1307,67 @@ TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) { |
#define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0 |
TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) { |
- static const byte data[] = {SECTION(SIGNATURES, 1), 0, |
- SECTION(FUNCTION_SIGNATURES, 1), 0}; |
+ static const byte data[] = { |
+ SECTION(SIGNATURES, 1), 0, // -- |
+ SECTION(FUNCTION_SIGNATURES, 1), 0 // -- |
+ }; // -- |
EXPECT_VERIFIES(data); |
} |
TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) { |
- static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), |
- FUNCTION_SIGNATURES_SECTION(1, 0)}; |
+ static const byte data[] = { |
+ SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
+ FUNCTION_SIGNATURES_SECTION(1, 0) // -- |
+ }; |
EXPECT_VERIFIES(data); |
} |
TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) { |
- static const byte data[] = {EMPTY_SIGNATURES_SECTION, |
- EMPTY_FUNCTION_SIGNATURES_SECTION, |
- EMPTY_FUNCTION_BODIES_SECTION}; |
+ static const byte data[] = { |
+ EMPTY_SIGNATURES_SECTION, // -- |
+ EMPTY_FUNCTION_SIGNATURES_SECTION, // -- |
+ EMPTY_FUNCTION_BODIES_SECTION // -- |
+ }; |
EXPECT_VERIFIES(data); |
} |
TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) { |
static const byte data[] = { |
- SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0), |
- SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, EMPTY_BODY}; |
+ SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
+ FUNCTION_SIGNATURES_SECTION(1, 0), // -- |
+ SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, EMPTY_BODY // -- |
+ }; |
EXPECT_VERIFIES(data); |
} |
TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) { |
static const byte data[] = { |
- SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0), |
- SECTION(FUNCTION_BODIES, 1 + NOP_BODY_SIZE), 1, NOP_BODY}; |
+ SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
+ FUNCTION_SIGNATURES_SECTION(1, 0), // -- |
+ SECTION(FUNCTION_BODIES, 1 + NOP_BODY_SIZE), 1, NOP_BODY // -- |
+ }; |
EXPECT_VERIFIES(data); |
} |
TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) { |
- static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), |
- FUNCTION_SIGNATURES_SECTION(2, 0, 0), |
- SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, |
- EMPTY_BODY}; |
+ static const byte data[] = { |
+ SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
+ FUNCTION_SIGNATURES_SECTION(2, 0, 0), // -- |
+ SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, // -- |
+ EMPTY_BODY // -- |
+ }; |
EXPECT_FAILURE(data); |
} |
TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) { |
- static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), |
- FUNCTION_SIGNATURES_SECTION(1, 0), |
- SECTION(FUNCTION_BODIES, 1 + 2 * NOP_BODY_SIZE), |
- 2, |
- NOP_BODY, |
- NOP_BODY}; |
+ static const byte data[] = { |
+ SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
+ FUNCTION_SIGNATURES_SECTION(1, 0), // -- |
+ SECTION(FUNCTION_BODIES, 1 + 2 * NOP_BODY_SIZE), // -- |
+ 2, // -- |
+ NOP_BODY, // -- |
+ NOP_BODY // -- |
+ }; |
EXPECT_FAILURE(data); |
} |