Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/test/unittests/wasm/module-decoder-unittest.cc b/test/unittests/wasm/module-decoder-unittest.cc
index 7090c1f..789112a 100644
--- a/test/unittests/wasm/module-decoder-unittest.cc
+++ b/test/unittests/wasm/module-decoder-unittest.cc
@@ -4,6 +4,8 @@
#include "test/unittests/test-utils.h"
+#include "src/handles.h"
+#include "src/objects-inl.h"
#include "src/wasm/module-decoder.h"
#include "src/wasm/wasm-macro-gen.h"
#include "src/wasm/wasm-opcodes.h"
@@ -39,6 +41,38 @@
#define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0
#define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0
+#define X1(...) __VA_ARGS__
+#define X2(...) __VA_ARGS__, __VA_ARGS__
+#define X3(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__
+#define X4(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__, __VA_ARGS__
+
+#define ONE_EMPTY_FUNCTION WASM_SECTION_FUNCTION_SIGNATURES, 1 + 1 * 1, 1, X1(0)
+
+#define TWO_EMPTY_FUNCTIONS \
+ WASM_SECTION_FUNCTION_SIGNATURES, 1 + 2 * 1, 2, X2(0)
+
+#define THREE_EMPTY_FUNCTIONS \
+ WASM_SECTION_FUNCTION_SIGNATURES, 1 + 3 * 1, 3, X3(0)
+
+#define FOUR_EMPTY_FUNCTIONS \
+ WASM_SECTION_FUNCTION_SIGNATURES, 1 + 4 * 1, 4, X4(0)
+
+#define ONE_EMPTY_BODY \
+ WASM_SECTION_FUNCTION_BODIES, 1 + 1 * (1 + SIZEOF_EMPTY_BODY), 1, \
+ X1(SIZEOF_EMPTY_BODY, EMPTY_BODY)
+
+#define TWO_EMPTY_BODIES \
+ WASM_SECTION_FUNCTION_BODIES, 1 + 2 * (1 + SIZEOF_EMPTY_BODY), 2, \
+ X2(SIZEOF_EMPTY_BODY, EMPTY_BODY)
+
+#define THREE_EMPTY_BODIES \
+ WASM_SECTION_FUNCTION_BODIES, 1 + 3 * (1 + SIZEOF_EMPTY_BODY), 3, \
+ X3(SIZEOF_EMPTY_BODY, EMPTY_BODY)
+
+#define FOUR_EMPTY_BODIES \
+ WASM_SECTION_FUNCTION_BODIES, 1 + 4 * (1 + SIZEOF_EMPTY_BODY), 4, \
+ X4(SIZEOF_EMPTY_BODY, EMPTY_BODY)
+
#define SIGNATURES_SECTION_VOID_VOID \
SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v), 1, SIG_ENTRY_v_v
@@ -156,7 +190,7 @@
EXPECT_EQ(0, result.val->functions.size());
EXPECT_EQ(0, result.val->data_segments.size());
- WasmGlobal* global = &result.val->globals.back();
+ const WasmGlobal* global = &result.val->globals.back();
EXPECT_EQ(1, global->name_length);
EXPECT_EQ(MachineType::Int32(), global->type);
@@ -169,6 +203,21 @@
EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
}
+TEST_F(WasmModuleVerifyTest, Global_invalid_type) {
+ static const byte data[] = {
+ SECTION(GLOBALS, 5), // --
+ 1,
+ NAME_LENGTH(1),
+ 'g', // name
+ 64, // invalid memory type
+ 0, // exported
+ };
+
+ ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data));
+ EXPECT_FALSE(result.ok());
+ if (result.val) delete result.val;
+}
+
TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
static const byte data[] = {
SECTION(GLOBALS, 1), // --
@@ -262,8 +311,8 @@
EXPECT_EQ(0, result.val->functions.size());
EXPECT_EQ(0, result.val->data_segments.size());
- WasmGlobal* g0 = &result.val->globals[0];
- WasmGlobal* g1 = &result.val->globals[1];
+ const WasmGlobal* g0 = &result.val->globals[0];
+ const WasmGlobal* g1 = &result.val->globals[1];
EXPECT_EQ(0, g0->name_length);
EXPECT_EQ(MachineType::Float32(), g0->type);
@@ -272,7 +321,7 @@
EXPECT_EQ(0, g1->name_length);
EXPECT_EQ(MachineType::Float64(), g1->type);
- EXPECT_EQ(0, g1->offset);
+ EXPECT_EQ(8, g1->offset);
EXPECT_TRUE(g1->exported);
if (result.val) delete result.val;
@@ -321,163 +370,6 @@
EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
}
-TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) {
- static const byte data[] = {
- SECTION(OLD_FUNCTIONS, 25), 1,
- // func#0 ------------------------------------------------------
- SIG_INDEX(0), // signature index
- NO_NAME, // name length
- U32_LE(0), // code start offset
- U32_LE(0), // code end offset
- U16_LE(899), // local int32 count
- U16_LE(799), // local int64 count
- U16_LE(699), // local float32 count
- U16_LE(599), // local float64 count
- 0, // exported
- 0 // external
- };
-
- ModuleResult result = DecodeModule(data, data + arraysize(data));
- EXPECT_FALSE(result.ok());
- if (result.val) delete result.val;
-}
-
-TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) {
- const int kCodeStartOffset = 41;
- const int kCodeEndOffset = kCodeStartOffset + 1;
-
- static const byte data[] = {
- // signatures
- SIGNATURES_SECTION_VOID_VOID,
- // func#0 ------------------------------------------------------
- SECTION(OLD_FUNCTIONS, 10), 1, kDeclFunctionExport | kDeclFunctionName,
- SIG_INDEX(0), // signature index
- NAME_LENGTH(2), 'h', 'i', // name
- 1, 0, // size
- kExprNop,
- };
-
- {
- // Should decode to exactly one function.
- ModuleResult result = DecodeModule(data, data + arraysize(data));
- EXPECT_OK(result);
- EXPECT_EQ(0, result.val->globals.size());
- EXPECT_EQ(1, result.val->signatures.size());
- EXPECT_EQ(1, result.val->functions.size());
- EXPECT_EQ(0, result.val->data_segments.size());
- EXPECT_EQ(0, result.val->function_table.size());
-
- WasmFunction* function = &result.val->functions.back();
-
- EXPECT_EQ(37, function->name_offset);
- EXPECT_EQ(2, function->name_length);
- EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
- EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
-
- EXPECT_TRUE(function->exported);
-
- if (result.val) delete result.val;
- }
-
- EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
-}
-
-TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) {
- static const byte kCodeStartOffset = 38;
- static const byte kCodeEndOffset = kCodeStartOffset + 1;
-
- static const byte data[] = {
- SIGNATURES_SECTION_VOID_VOID, // --
- SECTION(OLD_FUNCTIONS, 7), 1,
- // func#0 ------------------------------------------------------
- 0, // no name, no locals
- 0, 0, // signature index
- 1, 0, // body size
- kExprNop // body
- };
-
- ModuleResult result = DecodeModule(data, data + arraysize(data));
- EXPECT_OK(result);
- EXPECT_EQ(1, result.val->functions.size());
- WasmFunction* function = &result.val->functions.back();
-
- EXPECT_EQ(0, function->name_length);
- EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
- EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
-
- EXPECT_FALSE(function->exported);
-
- if (result.val) delete result.val;
-}
-
-TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) {
- static const byte kNameOffset = 49;
- static const byte kCodeStartOffset = 53;
- static const byte kCodeEndOffset = kCodeStartOffset + 3;
- static const byte kDataSegmentSourceOffset = kCodeEndOffset + 22;
-
- static const byte data[] = {
- // global#0 --------------------------------------------------
- SECTION(GLOBALS, 4), 1,
- 0, // name length
- kMemU8, // memory type
- 0, // exported
- // sig#0 -----------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
- // func#0 ----------------------------------------------------
- SECTION(OLD_FUNCTIONS, 12), 1,
- kDeclFunctionName, // --
- SIG_INDEX(0), // signature index
- 2, 'h', 'i', // name
- 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, 10), 1,
- U32V_3(0x8b3ae), // dest addr
- U32V_1(5), // source size
- 0, 1, 2, 3, 4, // data bytes
- // rest ------------------------------------------------------
- SECTION(END, 0),
- };
-
- {
- ModuleResult result = DecodeModule(data, data + arraysize(data));
- 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());
-
- WasmGlobal* global = &result.val->globals.back();
-
- EXPECT_EQ(0, global->name_length);
- EXPECT_EQ(MachineType::Uint8(), global->type);
- EXPECT_EQ(0, global->offset);
- EXPECT_FALSE(global->exported);
-
- WasmFunction* function = &result.val->functions.back();
-
- EXPECT_EQ(kNameOffset, function->name_offset);
- EXPECT_EQ(2, function->name_length);
- EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
- EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
-
- EXPECT_FALSE(function->exported);
-
- WasmDataSegment* segment = &result.val->data_segments.back();
-
- EXPECT_EQ(0x8b3ae, segment->dest_addr);
- EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
- EXPECT_EQ(5, segment->source_size);
- EXPECT_TRUE(segment->init);
-
- if (result.val) delete result.val;
- }
-}
-
TEST_F(WasmModuleVerifyTest, OneDataSegment) {
const byte kDataSegmentSourceOffset = 30;
const byte data[] = {
@@ -502,7 +394,7 @@
EXPECT_EQ(0, result.val->functions.size());
EXPECT_EQ(1, result.val->data_segments.size());
- WasmDataSegment* segment = &result.val->data_segments.back();
+ const WasmDataSegment* segment = &result.val->data_segments.back();
EXPECT_EQ(0x9bbaa, segment->dest_addr);
EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
@@ -553,8 +445,8 @@
EXPECT_EQ(0, result.val->functions.size());
EXPECT_EQ(2, result.val->data_segments.size());
- WasmDataSegment* s0 = &result.val->data_segments[0];
- WasmDataSegment* s1 = &result.val->data_segments[1];
+ const WasmDataSegment* s0 = &result.val->data_segments[0];
+ const WasmDataSegment* s1 = &result.val->data_segments[1];
EXPECT_EQ(0x7ffee, s0->dest_addr);
EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset);
@@ -605,9 +497,8 @@
static const byte data[] = {
// sig#0 -------------------------------------------------------
SIGNATURES_SECTION_VOID_VOID,
- // func#0 ------------------------------------------------------
- SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 1, // --
- EMPTY_FUNCTION(0),
+ // funcs ------------------------------------------------------
+ ONE_EMPTY_FUNCTION,
// indirect table ----------------------------------------------
SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)};
@@ -629,12 +520,8 @@
2, // --
SIG_ENTRY_v_v, // void -> void
SIG_ENTRY_v_x(kLocalI32), // void -> i32
- // func#0 ------------------------------------------------------
- SECTION(OLD_FUNCTIONS, 1 + 4 * SIZEOF_EMPTY_FUNCTION), 4, // --
- EMPTY_FUNCTION(0), // --
- EMPTY_FUNCTION(1), // --
- EMPTY_FUNCTION(0), // --
- EMPTY_FUNCTION(1), // --
+ // funcs ------------------------------------------------------
+ FOUR_EMPTY_FUNCTIONS,
// indirect table ----------------------------------------------
SECTION(FUNCTION_TABLE, 9), 8,
U32V_1(0), // --
@@ -645,7 +532,7 @@
U32V_1(1), // --
U32V_1(2), // --
U32V_1(3), // --
- };
+ FOUR_EMPTY_BODIES};
ModuleResult result = DecodeModule(data, data + arraysize(data));
EXPECT_OK(result);
@@ -676,8 +563,7 @@
// sig#0 -------------------------------------------------------
SIGNATURES_SECTION_VOID_VOID,
// functions ---------------------------------------------------
- SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 1, // --
- EMPTY_FUNCTION(0),
+ ONE_EMPTY_FUNCTION,
// indirect table ----------------------------------------------
SECTION(FUNCTION_TABLE, 3), 1, 1, 0,
};
@@ -839,7 +725,6 @@
EXPECT_EQ(SIZEOF_SIG_ENTRY_v_v, function->code_start_offset);
EXPECT_EQ(arraysize(data), function->code_end_offset);
// TODO(titzer): verify encoding of local declarations
- EXPECT_FALSE(function->exported);
}
if (result.val) delete result.val;
@@ -983,7 +868,7 @@
EXPECT_EQ(0, result.val->functions.size());
EXPECT_EQ(0, result.val->data_segments.size());
- WasmGlobal* global = &result.val->globals.back();
+ const WasmGlobal* global = &result.val->globals.back();
EXPECT_EQ(0, global->name_length);
EXPECT_EQ(MachineType::Int32(), global->type);
@@ -1071,22 +956,24 @@
}
TEST_F(WasmModuleVerifyTest, ExportTable_empty1) {
- static const byte data[] = {
- // signatures
- SIGNATURES_SECTION_VOID_VOID,
- SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
- 1,
- EMPTY_FUNCTION(0),
- SECTION(EXPORT_TABLE, 1),
- 0 // --
- };
- EXPECT_VERIFIES(data);
+ static const byte data[] = {// signatures
+ SIGNATURES_SECTION_VOID_VOID, ONE_EMPTY_FUNCTION,
+ SECTION(EXPORT_TABLE, 1),
+ 0, // --
+ ONE_EMPTY_BODY};
+
+ ModuleResult result = DecodeModule(data, data + arraysize(data));
+ EXPECT_OK(result);
+
+ EXPECT_EQ(1, result.val->functions.size());
+ EXPECT_EQ(0, result.val->export_table.size());
+
+ if (result.val) delete result.val;
}
TEST_F(WasmModuleVerifyTest, ExportTable_empty2) {
static const byte data[] = {
- SECTION(SIGNATURES, 1), 0, SECTION(OLD_FUNCTIONS, 1), 0,
- SECTION(EXPORT_TABLE, 1), 0 // --
+ SECTION(SIGNATURES, 1), 0, SECTION(EXPORT_TABLE, 1), 0 // --
};
// TODO(titzer): current behavior treats empty functions section as missing.
EXPECT_FAILURE(data);
@@ -1105,85 +992,88 @@
}
TEST_F(WasmModuleVerifyTest, ExportTableOne) {
- static const byte data[] = {
- // signatures
- SIGNATURES_SECTION_VOID_VOID,
- SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
- 1, // functions
- EMPTY_FUNCTION(0), // --
- SECTION(EXPORT_TABLE, 3),
- 1, // exports
- FUNC_INDEX(0), // --
- NO_NAME // --
- };
- EXPECT_VERIFIES(data);
+ static const byte data[] = {// signatures
+ SIGNATURES_SECTION_VOID_VOID,
+ ONE_EMPTY_FUNCTION,
+ SECTION(EXPORT_TABLE, 3),
+ 1, // exports
+ FUNC_INDEX(0), // --
+ NO_NAME, // --
+ ONE_EMPTY_BODY};
+ ModuleResult result = DecodeModule(data, data + arraysize(data));
+ EXPECT_OK(result);
+
+ EXPECT_EQ(1, result.val->functions.size());
+ EXPECT_EQ(1, result.val->export_table.size());
+
+ if (result.val) delete result.val;
}
TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
- static const byte data[] = {
- // signatures
- SIGNATURES_SECTION_VOID_VOID,
- SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
- 1, // functions
- EMPTY_FUNCTION(0), // --
- SECTION(EXPORT_TABLE, 12),
- 2, // exports
- FUNC_INDEX(0), // --
- NAME_LENGTH(4),
- 'n',
- 'a',
- 'm',
- 'e', // --
- FUNC_INDEX(0), // --
- NAME_LENGTH(3),
- 'n',
- 'o',
- 'm' // --
- };
- EXPECT_VERIFIES(data);
+ static const byte data[] = {// signatures
+ SIGNATURES_SECTION_VOID_VOID,
+ ONE_EMPTY_FUNCTION,
+ SECTION(EXPORT_TABLE, 12),
+ 2, // exports
+ FUNC_INDEX(0), // --
+ NAME_LENGTH(4),
+ 'n',
+ 'a',
+ 'm',
+ 'e', // --
+ FUNC_INDEX(0), // --
+ NAME_LENGTH(3),
+ 'n',
+ 'o',
+ 'm', // --
+ ONE_EMPTY_BODY};
+
+ ModuleResult result = DecodeModule(data, data + arraysize(data));
+ EXPECT_OK(result);
+
+ EXPECT_EQ(1, result.val->functions.size());
+ EXPECT_EQ(2, result.val->export_table.size());
+
+ if (result.val) delete result.val;
}
TEST_F(WasmModuleVerifyTest, ExportTableThree) {
- static const byte data[] = {
- // signatures
- SIGNATURES_SECTION_VOID_VOID,
- SECTION(OLD_FUNCTIONS, 1 + 3 * SIZEOF_EMPTY_FUNCTION),
- 3, // functions
- EMPTY_FUNCTION(0), // --
- EMPTY_FUNCTION(0), // --
- EMPTY_FUNCTION(0), // --
- SECTION(EXPORT_TABLE, 10),
- 3, // exports
- FUNC_INDEX(0), // --
- NAME_LENGTH(1),
- 'a', // --
- FUNC_INDEX(1), // --
- NAME_LENGTH(1),
- 'b', // --
- FUNC_INDEX(2), // --
- NAME_LENGTH(1),
- 'c' // --
- };
- EXPECT_VERIFIES(data);
+ static const byte data[] = {// signatures
+ SIGNATURES_SECTION_VOID_VOID,
+ THREE_EMPTY_FUNCTIONS,
+ SECTION(EXPORT_TABLE, 10),
+ 3, // exports
+ FUNC_INDEX(0), // --
+ NAME_LENGTH(1),
+ 'a', // --
+ FUNC_INDEX(1), // --
+ NAME_LENGTH(1),
+ 'b', // --
+ FUNC_INDEX(2), // --
+ NAME_LENGTH(1),
+ 'c', // --
+ THREE_EMPTY_BODIES};
+ ModuleResult result = DecodeModule(data, data + arraysize(data));
+ EXPECT_OK(result);
+
+ EXPECT_EQ(3, result.val->functions.size());
+ EXPECT_EQ(3, result.val->export_table.size());
+
+ if (result.val) delete result.val;
}
TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
for (int i = 0; i < 6; i++) {
- const byte data[] = {
- // signatures
- SIGNATURES_SECTION_VOID_VOID,
- SECTION(OLD_FUNCTIONS, 1 + 3 * SIZEOF_EMPTY_FUNCTION),
- 3, // functions
- EMPTY_FUNCTION(0), // --
- EMPTY_FUNCTION(0), // --
- EMPTY_FUNCTION(0), // --
- SECTION(EXPORT_TABLE, 5),
- 1, // exports
- FUNC_INDEX(i), // --
- NAME_LENGTH(2),
- 'e',
- 'x', // --
- };
+ const byte data[] = {// signatures
+ SIGNATURES_SECTION_VOID_VOID,
+ THREE_EMPTY_FUNCTIONS,
+ SECTION(EXPORT_TABLE, 5),
+ 1, // exports
+ FUNC_INDEX(i), // --
+ NAME_LENGTH(2),
+ 'e',
+ 'x', // --
+ THREE_EMPTY_BODIES};
if (i < 3) {
EXPECT_VERIFIES(data);
@@ -1197,9 +1087,7 @@
static const byte data[] = {
// signatures
SIGNATURES_SECTION_VOID_VOID,
- SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
- 1, // functions
- EMPTY_FUNCTION(0), // --
+ ONE_EMPTY_FUNCTION,
SECTION(EXPORT_TABLE, 1 + 6),
1, // exports
FUNC_INDEX(0), // --