Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: test/unittests/wasm/module-decoder-unittest.cc

Issue 1765843002: wasm: use strings for section names (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: `git cl format` decides to uglify stuff Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "test/unittests/test-utils.h" 5 #include "test/unittests/test-utils.h"
6 6
7 #include "src/wasm/module-decoder.h" 7 #include "src/wasm/module-decoder.h"
8 #include "src/wasm/wasm-macro-gen.h" 8 #include "src/wasm/wasm-macro-gen.h"
9 #include "src/wasm/wasm-opcodes.h" 9 #include "src/wasm/wasm-opcodes.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 namespace wasm { 13 namespace wasm {
14 14
15 #define EMPTY_FUNCTION(sig_index) 0, SIG_INDEX(sig_index), U16_LE(0) 15 #define EMPTY_FUNCTION(sig_index) 0, SIG_INDEX(sig_index), U16_LE(0)
16 #define EMPTY_FUNCTION_SIZE ((size_t)5)
16 #define EMPTY_BODY 0 17 #define EMPTY_BODY 0
18 #define EMPTY_BODY_SIZE ((size_t)1)
17 #define NOP_BODY 2, 0, kExprNop 19 #define NOP_BODY 2, 0, kExprNop
20 #define NOP_BODY_SIZE ((size_t)3)
18 #define VOID_VOID_SIG 0, kLocalVoid 21 #define VOID_VOID_SIG 0, kLocalVoid
22 #define VOID_VOID_SIG_SIZE ((size_t)2)
19 #define INT_INT_SIG 1, kLocalI32, kLocalI32 23 #define INT_INT_SIG 1, kLocalI32, kLocalI32
24 #define INT_INT_SIG_SIZE ((size_t)3)
25
26 #define SECTION(NAME, EXTRA_SIZE) \
27 U32V_1(WASM_SECTION_##NAME##_SIZE + (EXTRA_SIZE)), WASM_SECTION_##NAME
20 28
21 #define EXPECT_VERIFIES(data) \ 29 #define EXPECT_VERIFIES(data) \
22 do { \ 30 do { \
23 ModuleResult result = DecodeModule(data, data + arraysize(data)); \ 31 ModuleResult result = DecodeModule(data, data + arraysize(data)); \
24 EXPECT_TRUE(result.ok()); \ 32 EXPECT_TRUE(result.ok()); \
25 if (result.val) delete result.val; \ 33 if (result.val) delete result.val; \
26 } while (false) 34 } while (false)
27 35
28 #define EXPECT_FAILURE_LEN(data, length) \ 36 #define EXPECT_FAILURE_LEN(data, length) \
29 do { \ 37 do { \
30 ModuleResult result = DecodeModule(data, data + length); \ 38 ModuleResult result = DecodeModule(data, data + length); \
31 EXPECT_FALSE(result.ok()); \ 39 EXPECT_FALSE(result.ok()); \
32 if (result.val) delete result.val; \ 40 if (result.val) delete result.val; \
33 } while (false) 41 } while (false)
34 42
35 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data)) 43 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data))
36 44
37 #define EXPECT_OFF_END_FAILURE(data, min, max) \ 45 #define EXPECT_OFF_END_FAILURE(data, min, max) \
38 do { \ 46 do { \
39 for (size_t length = min; length < max; length++) { \ 47 for (size_t length = min; length < max; length++) { \
40 EXPECT_FAILURE_LEN(data, length); \ 48 EXPECT_FAILURE_LEN(data, length); \
41 } \ 49 } \
42 } while (false) 50 } while (false)
43 51
52 static size_t SizeOfVarInt(size_t value) {
53 size_t size = 0;
54 do {
55 size++;
56 value = value >> 7;
57 } while (value > 0);
58 return size;
59 }
60
44 struct LocalTypePair { 61 struct LocalTypePair {
45 uint8_t code; 62 uint8_t code;
46 LocalType type; 63 LocalType type;
47 } kLocalTypes[] = {{kLocalI32, kAstI32}, 64 } kLocalTypes[] = {{kLocalI32, kAstI32},
48 {kLocalI64, kAstI64}, 65 {kLocalI64, kAstI64},
49 {kLocalF32, kAstF32}, 66 {kLocalF32, kAstF32},
50 {kLocalF64, kAstF64}}; 67 {kLocalF64, kAstF64}};
51 68
52 class WasmModuleVerifyTest : public TestWithZone { 69 class WasmModuleVerifyTest : public TestWithZone {
53 public: 70 public:
(...skipping 13 matching lines...) Expand all
67 ModuleResult DecodeModuleNoHeader(const byte* module_start, 84 ModuleResult DecodeModuleNoHeader(const byte* module_start,
68 const byte* module_end) { 85 const byte* module_end) {
69 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false, 86 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false,
70 kWasmOrigin); 87 kWasmOrigin);
71 } 88 }
72 }; 89 };
73 90
74 TEST_F(WasmModuleVerifyTest, WrongMagic) { 91 TEST_F(WasmModuleVerifyTest, WrongMagic) {
75 for (uint32_t x = 1; x; x <<= 1) { 92 for (uint32_t x = 1; x; x <<= 1) {
76 const byte data[] = {U32_LE(kWasmMagic ^ x), U32_LE(kWasmVersion), 93 const byte data[] = {U32_LE(kWasmMagic ^ x), U32_LE(kWasmVersion),
77 kDeclEnd}; 94 SECTION(END, 0)};
78 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data)); 95 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data));
79 EXPECT_FALSE(result.ok()); 96 EXPECT_FALSE(result.ok());
80 if (result.val) delete result.val; 97 if (result.val) delete result.val;
81 } 98 }
82 } 99 }
83 100
84 TEST_F(WasmModuleVerifyTest, WrongVersion) { 101 TEST_F(WasmModuleVerifyTest, WrongVersion) {
85 for (uint32_t x = 1; x; x <<= 1) { 102 for (uint32_t x = 1; x; x <<= 1) {
86 const byte data[] = {U32_LE(kWasmMagic), U32_LE(kWasmVersion ^ x), 103 const byte data[] = {U32_LE(kWasmMagic), U32_LE(kWasmVersion ^ x),
87 kDeclEnd}; 104 SECTION(END, 0)};
88 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data)); 105 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data));
89 EXPECT_FALSE(result.ok()); 106 EXPECT_FALSE(result.ok());
90 if (result.val) delete result.val; 107 if (result.val) delete result.val;
91 } 108 }
92 } 109 }
93 110
94 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { 111 TEST_F(WasmModuleVerifyTest, DecodeEmpty) {
95 static const byte data[] = {kDeclEnd}; 112 static const byte data[] = {SECTION(END, 0)};
96 EXPECT_VERIFIES(data); 113 EXPECT_VERIFIES(data);
97 } 114 }
98 115
99 TEST_F(WasmModuleVerifyTest, OneGlobal) { 116 TEST_F(WasmModuleVerifyTest, OneGlobal) {
100 static const byte data[] = { 117 static const byte data[] = {
101 kDeclGlobals, 118 SECTION(GLOBALS, 7), // --
102 1, 119 1,
103 NAME_LENGTH(1), 'g', // name 120 NAME_LENGTH(1),
104 kMemI32, // memory type 121 'g', // name
105 0, // exported 122 kMemI32, // memory type
123 0, // exported
106 }; 124 };
107 125
108 { 126 {
109 // Should decode to exactly one global. 127 // Should decode to exactly one global.
110 ModuleResult result = DecodeModule(data, data + arraysize(data)); 128 ModuleResult result = DecodeModule(data, data + arraysize(data));
111 EXPECT_TRUE(result.ok()); 129 EXPECT_TRUE(result.ok());
112 EXPECT_EQ(1, result.val->globals.size()); 130 EXPECT_EQ(1, result.val->globals.size());
113 EXPECT_EQ(0, result.val->functions.size()); 131 EXPECT_EQ(0, result.val->functions.size());
114 EXPECT_EQ(0, result.val->data_segments.size()); 132 EXPECT_EQ(0, result.val->data_segments.size());
115 133
116 WasmGlobal* global = &result.val->globals.back(); 134 WasmGlobal* global = &result.val->globals.back();
117 135
118 EXPECT_EQ(1, global->name_length); 136 EXPECT_EQ(1, global->name_length);
119 EXPECT_EQ(MachineType::Int32(), global->type); 137 EXPECT_EQ(MachineType::Int32(), global->type);
120 EXPECT_EQ(0, global->offset); 138 EXPECT_EQ(0, global->offset);
121 EXPECT_FALSE(global->exported); 139 EXPECT_FALSE(global->exported);
122 140
123 if (result.val) delete result.val; 141 if (result.val) delete result.val;
124 } 142 }
125 143
126 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 144 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
127 } 145 }
128 146
129 147
130 TEST_F(WasmModuleVerifyTest, ZeroGlobals) { 148 TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
131 static const byte data[] = { 149 static const byte data[] = {
132 kDeclGlobals, 0, // declare 0 globals 150 SECTION(GLOBALS, 1), // --
151 0, // declare 0 globals
133 }; 152 };
134 ModuleResult result = DecodeModule(data, data + arraysize(data)); 153 ModuleResult result = DecodeModule(data, data + arraysize(data));
135 EXPECT_TRUE(result.ok()); 154 EXPECT_TRUE(result.ok());
136 if (result.val) delete result.val; 155 if (result.val) delete result.val;
137 } 156 }
138 157
139 158
140 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) { 159 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) {
141 while (true) { 160 while (true) {
142 uint32_t next = val >> 7; 161 uint32_t next = val >> 7;
(...skipping 11 matching lines...) Expand all
154 173
155 TEST_F(WasmModuleVerifyTest, NGlobals) { 174 TEST_F(WasmModuleVerifyTest, NGlobals) {
156 static const byte data[] = { 175 static const byte data[] = {
157 NO_NAME, // name length 176 NO_NAME, // name length
158 kMemI32, // memory type 177 kMemI32, // memory type
159 0, // exported 178 0, // exported
160 }; 179 };
161 180
162 for (uint32_t i = 0; i < 1000000; i = i * 13 + 1) { 181 for (uint32_t i = 0; i < 1000000; i = i * 13 + 1) {
163 std::vector<byte> buffer; 182 std::vector<byte> buffer;
164 buffer.push_back(kDeclGlobals); 183 AppendUint32v(buffer, (uint32_t)(WASM_SECTION_GLOBALS_SIZE +
184 i * sizeof(data) + SizeOfVarInt(i)));
185 static const byte globals[] = {WASM_SECTION_GLOBALS};
186 for (size_t i = 0; i != WASM_SECTION_GLOBALS_SIZE; ++i) {
187 buffer.push_back(globals[i]);
188 }
165 AppendUint32v(buffer, i); 189 AppendUint32v(buffer, i);
166 for (uint32_t j = 0; j < i; j++) { 190 for (uint32_t j = 0; j < i; j++) {
167 buffer.insert(buffer.end(), data, data + sizeof(data)); 191 buffer.insert(buffer.end(), data, data + sizeof(data));
168 } 192 }
169 193
170 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); 194 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size());
171 EXPECT_TRUE(result.ok()); 195 EXPECT_TRUE(result.ok());
172 if (result.val) delete result.val; 196 if (result.val) delete result.val;
173 } 197 }
174 } 198 }
175 199
200 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) {
201 static const byte data[] = {
202 SECTION(GLOBALS, 7),
203 1, // declare one global
204 NO_NAME, // name offset
205 33, // memory type
206 0, // exported
207 };
208
209 EXPECT_FAILURE(data);
210 }
176 211
177 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { 212 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) {
178 static const byte data[] = { 213 static const byte data[] = {
179 kDeclGlobals, 214 SECTION(GLOBALS, 7),
180 1, // declare one global 215 1, // declare one global
181 NO_NAME, // name length 216 NO_NAME, // name offset
182 33, // memory type 217 33, // memory type
183 0, // exported 218 0, // exported
184 }; 219 };
185 220
186 EXPECT_FAILURE(data); 221 EXPECT_FAILURE(data);
187 } 222 }
188 223
189 224
190 TEST_F(WasmModuleVerifyTest, TwoGlobals) { 225 TEST_F(WasmModuleVerifyTest, TwoGlobals) {
191 static const byte data[] = { 226 static const byte data[] = {
192 kDeclGlobals, 227 SECTION(GLOBALS, 13),
193 2, 228 2,
194 NO_NAME, // #0: name length 229 NO_NAME, // #0: name length
195 kMemF32, // memory type 230 kMemF32, // memory type
196 0, // exported 231 0, // exported
197 NO_NAME, // #1: name length 232 NO_NAME, // #1: name length
198 kMemF64, // memory type 233 kMemF64, // memory type
199 1, // exported 234 1, // exported
200 }; 235 };
201 236
202 { 237 {
(...skipping 19 matching lines...) Expand all
222 257
223 if (result.val) delete result.val; 258 if (result.val) delete result.val;
224 } 259 }
225 260
226 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 261 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
227 } 262 }
228 263
229 264
230 TEST_F(WasmModuleVerifyTest, OneSignature) { 265 TEST_F(WasmModuleVerifyTest, OneSignature) {
231 { 266 {
232 static const byte data[] = {kDeclSignatures, 1, VOID_VOID_SIG}; 267 static const byte data[] = {SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1,
268 VOID_VOID_SIG};
233 EXPECT_VERIFIES(data); 269 EXPECT_VERIFIES(data);
234 } 270 }
235 271
236 { 272 {
237 static const byte data[] = {kDeclSignatures, 1, INT_INT_SIG}; 273 static const byte data[] = {SECTION(SIGNATURES, 1 + INT_INT_SIG_SIZE), 1,
274 INT_INT_SIG};
238 EXPECT_VERIFIES(data); 275 EXPECT_VERIFIES(data);
239 } 276 }
240 } 277 }
241 278
242 279
243 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { 280 TEST_F(WasmModuleVerifyTest, MultipleSignatures) {
244 static const byte data[] = { 281 static const byte data[] = {
245 kDeclSignatures, 282 SECTION(SIGNATURES, 10),
246 3, 283 3,
247 0, 284 0,
248 kLocalVoid, // void -> void 285 kLocalVoid, // void -> void
249 1, 286 1,
250 kLocalI32, 287 kLocalI32,
251 kLocalF32, // f32 -> i32 288 kLocalF32, // f32 -> i32
252 2, 289 2,
253 kLocalI32, 290 kLocalI32,
254 kLocalF64, 291 kLocalF64,
255 kLocalF64, // (f64,f64) -> i32 292 kLocalF64, // (f64,f64) -> i32
(...skipping 12 matching lines...) Expand all
268 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); 305 EXPECT_EQ(2, result.val->signatures[2]->parameter_count());
269 } 306 }
270 if (result.val) delete result.val; 307 if (result.val) delete result.val;
271 308
272 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 309 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
273 } 310 }
274 311
275 312
276 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { 313 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) {
277 static const byte data[] = { 314 static const byte data[] = {
278 kDeclFunctions, 1, 315 SECTION(FUNCTIONS, 25), 1,
279 // func#0 ------------------------------------------------------ 316 // func#0 ------------------------------------------------------
280 SIG_INDEX(0), // signature index 317 SIG_INDEX(0), // signature index
281 NO_NAME, // name length 318 NO_NAME, // name length
282 U32_LE(0), // code start offset 319 U32_LE(0), // code start offset
283 U32_LE(0), // code end offset 320 U32_LE(0), // code end offset
284 U16_LE(899), // local int32 count 321 U16_LE(899), // local int32 count
285 U16_LE(799), // local int64 count 322 U16_LE(799), // local int64 count
286 U16_LE(699), // local float32 count 323 U16_LE(699), // local float32 count
287 U16_LE(599), // local float64 count 324 U16_LE(599), // local float64 count
288 0, // exported 325 0, // exported
289 1 // external 326 1 // external
290 }; 327 };
291 328
292 ModuleResult result = DecodeModule(data, data + arraysize(data)); 329 ModuleResult result = DecodeModule(data, data + arraysize(data));
293 EXPECT_FALSE(result.ok()); 330 EXPECT_FALSE(result.ok());
294 if (result.val) delete result.val; 331 if (result.val) delete result.val;
295 } 332 }
296 333
297 334
298 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { 335 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) {
299 const int kCodeStartOffset = 30; 336 const int kCodeStartOffset = 51;
300 const int kCodeEndOffset = kCodeStartOffset + 1; 337 const int kCodeEndOffset = kCodeStartOffset + 1;
301 338
302 static const byte data[] = { 339 static const byte data[] = {
303 kDeclSignatures, 1, 340 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1,
304 // sig#0 ------------------------------------------------------- 341 // sig#0 -------------------------------------------------------
305 VOID_VOID_SIG, 342 VOID_VOID_SIG,
306 // func#0 ------------------------------------------------------ 343 // func#0 ------------------------------------------------------
307 kDeclFunctions, 1, 344 SECTION(FUNCTIONS, 19), 1,
308 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 345 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName,
309 SIG_INDEX(0), // signature index 346 SIG_INDEX(0), // signature index
310 NAME_LENGTH(2), 'h', 'i', // name 347 NAME_LENGTH(2), 'h', 'i', // name
311 U16_LE(1466), // local int32 count 348 U16_LE(1466), // local int32 count
312 U16_LE(1355), // local int64 count 349 U16_LE(1355), // local int64 count
313 U16_LE(1244), // local float32 count 350 U16_LE(1244), // local float32 count
314 U16_LE(1133), // local float64 count 351 U16_LE(1133), // local float64 count
315 1, 0, // size 352 1, 0, // size
316 kExprNop, 353 kExprNop,
317 }; 354 };
318 355
319 { 356 {
320 // Should decode to exactly one function. 357 // Should decode to exactly one function.
321 ModuleResult result = DecodeModule(data, data + arraysize(data)); 358 ModuleResult result = DecodeModule(data, data + arraysize(data));
322 EXPECT_TRUE(result.ok()); 359 EXPECT_TRUE(result.ok());
323 EXPECT_EQ(0, result.val->globals.size()); 360 EXPECT_EQ(0, result.val->globals.size());
324 EXPECT_EQ(1, result.val->signatures.size()); 361 EXPECT_EQ(1, result.val->signatures.size());
325 EXPECT_EQ(1, result.val->functions.size()); 362 EXPECT_EQ(1, result.val->functions.size());
326 EXPECT_EQ(0, result.val->data_segments.size()); 363 EXPECT_EQ(0, result.val->data_segments.size());
327 EXPECT_EQ(0, result.val->function_table.size()); 364 EXPECT_EQ(0, result.val->function_table.size());
328 365
329 WasmFunction* function = &result.val->functions.back(); 366 WasmFunction* function = &result.val->functions.back();
330 367
331 EXPECT_EQ(18, function->name_offset); 368 EXPECT_EQ(39, function->name_offset);
332 EXPECT_EQ(2, function->name_length); 369 EXPECT_EQ(2, function->name_length);
333 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); 370 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
334 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); 371 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
335 372
336 EXPECT_EQ(1466, function->local_i32_count); 373 EXPECT_EQ(1466, function->local_i32_count);
337 EXPECT_EQ(1355, function->local_i64_count); 374 EXPECT_EQ(1355, function->local_i64_count);
338 EXPECT_EQ(1244, function->local_f32_count); 375 EXPECT_EQ(1244, function->local_f32_count);
339 EXPECT_EQ(1133, function->local_f64_count); 376 EXPECT_EQ(1133, function->local_f64_count);
340 377
341 EXPECT_TRUE(function->exported); 378 EXPECT_TRUE(function->exported);
342 EXPECT_FALSE(function->external); 379 EXPECT_FALSE(function->external);
343 380
344 if (result.val) delete result.val; 381 if (result.val) delete result.val;
345 } 382 }
346 383
347 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); 384 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
348 } 385 }
349 386
350 387
351 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { 388 TEST_F(WasmModuleVerifyTest, OneFunctionImported) {
352 static const byte data[] = { 389 static const byte data[] = {
353 kDeclSignatures, 1, 390 SECTION(SIGNATURES, VOID_VOID_SIG_SIZE), 1,
354 // sig#0 ------------------------------------------------------- 391 // sig#0 -------------------------------------------------------
355 VOID_VOID_SIG, kDeclFunctions, 1, 392 VOID_VOID_SIG, SECTION(FUNCTIONS, 6), 1,
356 // func#0 ------------------------------------------------------ 393 // func#0 ------------------------------------------------------
357 kDeclFunctionImport, // no name, no locals, imported 394 kDeclFunctionImport, // no name, no locals, imported
358 SIG_INDEX(0), 395 SIG_INDEX(0),
359 }; 396 };
360 397
361 ModuleResult result = DecodeModule(data, data + arraysize(data)); 398 ModuleResult result = DecodeModule(data, data + arraysize(data));
362 EXPECT_TRUE(result.ok()); 399 EXPECT_TRUE(result.ok());
363 EXPECT_EQ(1, result.val->functions.size()); 400 EXPECT_EQ(1, result.val->functions.size());
364 WasmFunction* function = &result.val->functions.back(); 401 WasmFunction* function = &result.val->functions.back();
365 402
366 EXPECT_EQ(0, function->name_length); 403 EXPECT_EQ(0, function->name_length);
367 EXPECT_EQ(0, function->code_start_offset); 404 EXPECT_EQ(0, function->code_start_offset);
368 EXPECT_EQ(0, function->code_end_offset); 405 EXPECT_EQ(0, function->code_end_offset);
369 406
370 EXPECT_EQ(0, function->local_i32_count); 407 EXPECT_EQ(0, function->local_i32_count);
371 EXPECT_EQ(0, function->local_i64_count); 408 EXPECT_EQ(0, function->local_i64_count);
372 EXPECT_EQ(0, function->local_f32_count); 409 EXPECT_EQ(0, function->local_f32_count);
373 EXPECT_EQ(0, function->local_f64_count); 410 EXPECT_EQ(0, function->local_f64_count);
374 411
375 EXPECT_FALSE(function->exported); 412 EXPECT_FALSE(function->exported);
376 EXPECT_TRUE(function->external); 413 EXPECT_TRUE(function->external);
377 414
378 if (result.val) delete result.val; 415 if (result.val) delete result.val;
379 } 416 }
380 417
381 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) { 418 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) {
382 static const byte kCodeStartOffset = 19; 419 static const byte kCodeStartOffset = 40;
383 static const byte kCodeEndOffset = kCodeStartOffset + 1; 420 static const byte kCodeEndOffset = kCodeStartOffset + 1;
384 421
385 static const byte data[] = { 422 static const byte data[] = {
386 kDeclSignatures, 1, 423 SECTION(SIGNATURES, 3), 1,
387 // sig#0 ------------------------------------------------------- 424 // sig#0 -------------------------------------------------------
388 0, 0, // void -> void 425 0, 0, // void -> void
389 kDeclFunctions, 1, 426 SECTION(FUNCTIONS, 7), 1,
390 // func#0 ------------------------------------------------------ 427 // func#0 ------------------------------------------------------
391 0, // no name, no locals 428 0, // no name, no locals
392 0, 0, // signature index 429 0, 0, // signature index
393 1, 0, // body size 430 1, 0, // body size
394 kExprNop // body 431 kExprNop // body
395 }; 432 };
396 433
397 ModuleResult result = DecodeModule(data, data + arraysize(data)); 434 ModuleResult result = DecodeModule(data, data + arraysize(data));
398 EXPECT_TRUE(result.ok()); 435 EXPECT_TRUE(result.ok());
399 EXPECT_EQ(1, result.val->functions.size()); 436 EXPECT_EQ(1, result.val->functions.size());
400 WasmFunction* function = &result.val->functions.back(); 437 WasmFunction* function = &result.val->functions.back();
401 438
402 EXPECT_EQ(0, function->name_length); 439 EXPECT_EQ(0, function->name_length);
403 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); 440 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
404 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); 441 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
405 442
406 EXPECT_EQ(0, function->local_i32_count); 443 EXPECT_EQ(0, function->local_i32_count);
407 EXPECT_EQ(0, function->local_i64_count); 444 EXPECT_EQ(0, function->local_i64_count);
408 EXPECT_EQ(0, function->local_f32_count); 445 EXPECT_EQ(0, function->local_f32_count);
409 EXPECT_EQ(0, function->local_f64_count); 446 EXPECT_EQ(0, function->local_f64_count);
410 447
411 EXPECT_FALSE(function->exported); 448 EXPECT_FALSE(function->exported);
412 EXPECT_FALSE(function->external); 449 EXPECT_FALSE(function->external);
413 450
414 if (result.val) delete result.val; 451 if (result.val) delete result.val;
415 } 452 }
416 453
417 454
418 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) { 455 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) {
419 static const byte kCodeStartOffset = 27; 456 static const byte kCodeStartOffset = 48;
420 static const byte kCodeEndOffset = kCodeStartOffset + 1; 457 static const byte kCodeEndOffset = kCodeStartOffset + 1;
421 458
422 static const byte data[] = { 459 static const byte data[] = {
423 kDeclSignatures, 1, 460 SECTION(SIGNATURES, 3), 1,
424 // sig#0 ------------------------------------------------------- 461 // sig#0 -------------------------------------------------------
425 0, 0, // void -> void 462 0, 0, // void -> void
426 kDeclFunctions, 1, 463 SECTION(FUNCTIONS, 15), 1,
427 // func#0 ------------------------------------------------------ 464 // func#0 ------------------------------------------------------
428 kDeclFunctionLocals, 0, 0, // signature index 465 kDeclFunctionLocals, 0, 0, // signature index
429 1, 2, // local int32 count 466 1, 2, // local int32 count
430 3, 4, // local int64 count 467 3, 4, // local int64 count
431 5, 6, // local float32 count 468 5, 6, // local float32 count
432 7, 8, // local float64 count 469 7, 8, // local float64 count
433 1, 0, // body size 470 1, 0, // body size
434 kExprNop // body 471 kExprNop // body
435 }; 472 };
436 473
(...skipping 12 matching lines...) Expand all
449 EXPECT_EQ(2055, function->local_f64_count); 486 EXPECT_EQ(2055, function->local_f64_count);
450 487
451 EXPECT_FALSE(function->exported); 488 EXPECT_FALSE(function->exported);
452 EXPECT_FALSE(function->external); 489 EXPECT_FALSE(function->external);
453 490
454 if (result.val) delete result.val; 491 if (result.val) delete result.val;
455 } 492 }
456 493
457 494
458 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { 495 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) {
459 static const byte kCodeStartOffset = 8 + 4 + 5 + 4 + 18; 496 static const byte kCodeStartOffset = 75;
460 static const byte kCodeEndOffset = kCodeStartOffset + 3; 497 static const byte kCodeEndOffset = kCodeStartOffset + 3;
461 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 6; 498 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 20;
462 499
463 static const byte data[] = { 500 static const byte data[] = {
464 kDeclMemory, 28, 28, 1, 501 SECTION(MEMORY, 3), 28, 28, 1,
465 // global#0 -------------------------------------------------- 502 // global#0 --------------------------------------------------
466 kDeclGlobals, 1, 0, // name length 503 SECTION(GLOBALS, 7), 1,
467 kMemU8, // memory type 504 0, // name length
468 0, // exported 505 kMemU8, // memory type
506 0, // exported
469 // sig#0 ----------------------------------------------------- 507 // sig#0 -----------------------------------------------------
470 kDeclSignatures, 1, 0, 0, // void -> void 508 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void
471 // func#0 ---------------------------------------------------- 509 // func#0 ----------------------------------------------------
472 kDeclFunctions, 1, kDeclFunctionLocals | kDeclFunctionName, 0, 510 SECTION(FUNCTIONS, 20), 1, kDeclFunctionLocals | kDeclFunctionName, 0,
473 0, // signature index 511 0, // signature index
474 2, 'h', 'i', // name 512 2, 'h', 'i', // name
475 1, 2, // local int32 count 513 1, 2, // local int32 count
476 3, 4, // local int64 count 514 3, 4, // local int64 count
477 5, 6, // local float32 count 515 5, 6, // local float32 count
478 7, 8, // local float64 count 516 7, 8, // local float64 count
479 3, 0, // body size 517 3, 0, // body size
480 kExprNop, // func#0 body 518 kExprNop, // func#0 body
481 kExprNop, // func#0 body 519 kExprNop, // func#0 body
482 kExprNop, // func#0 body 520 kExprNop, // func#0 body
483 // segment#0 ------------------------------------------------- 521 // segment#0 -------------------------------------------------
484 kDeclDataSegments, 1, U32V_3(0x8b3ae), // dest addr 522 SECTION(DATA_SEGMENTS, 14), 1,
485 U32V_1(5), // source size 523 U32V_3(0x8b3ae), // dest addr
486 0, 1, 2, 3, 4, // data bytes 524 U32V_1(5), // source size
525 0, 1, 2, 3, 4, // data bytes
487 // rest ------------------------------------------------------ 526 // rest ------------------------------------------------------
488 kDeclEnd, 527 SECTION(END, 0),
489 }; 528 };
490 529
491 { 530 {
492 ModuleResult result = DecodeModule(data, data + arraysize(data)); 531 ModuleResult result = DecodeModule(data, data + arraysize(data));
493 EXPECT_TRUE(result.ok()); 532 EXPECT_TRUE(result.ok());
494 EXPECT_EQ(1, result.val->globals.size()); 533 EXPECT_EQ(1, result.val->globals.size());
495 EXPECT_EQ(1, result.val->functions.size()); 534 EXPECT_EQ(1, result.val->functions.size());
496 EXPECT_EQ(1, result.val->data_segments.size()); 535 EXPECT_EQ(1, result.val->data_segments.size());
497 536
498 WasmGlobal* global = &result.val->globals.back(); 537 WasmGlobal* global = &result.val->globals.back();
499 538
500 EXPECT_EQ(0, global->name_length); 539 EXPECT_EQ(0, global->name_length);
501 EXPECT_EQ(MachineType::Uint8(), global->type); 540 EXPECT_EQ(MachineType::Uint8(), global->type);
502 EXPECT_EQ(0, global->offset); 541 EXPECT_EQ(0, global->offset);
503 EXPECT_FALSE(global->exported); 542 EXPECT_FALSE(global->exported);
504 543
505 WasmFunction* function = &result.val->functions.back(); 544 WasmFunction* function = &result.val->functions.back();
506 545
507 EXPECT_EQ(27, function->name_offset); 546 EXPECT_EQ(63, function->name_offset);
508 EXPECT_EQ(2, function->name_length); 547 EXPECT_EQ(2, function->name_length);
509 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); 548 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
510 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); 549 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
511 550
512 EXPECT_FALSE(function->exported); 551 EXPECT_FALSE(function->exported);
513 EXPECT_FALSE(function->external); 552 EXPECT_FALSE(function->external);
514 553
515 WasmDataSegment* segment = &result.val->data_segments.back(); 554 WasmDataSegment* segment = &result.val->data_segments.back();
516 555
517 EXPECT_EQ(0x8b3ae, segment->dest_addr); 556 EXPECT_EQ(0x8b3ae, segment->dest_addr);
518 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); 557 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
519 EXPECT_EQ(5, segment->source_size); 558 EXPECT_EQ(5, segment->source_size);
520 EXPECT_TRUE(segment->init); 559 EXPECT_TRUE(segment->init);
521 560
522 if (result.val) delete result.val; 561 if (result.val) delete result.val;
523 } 562 }
524 } 563 }
525 564
526 565
527 TEST_F(WasmModuleVerifyTest, OneDataSegment) { 566 TEST_F(WasmModuleVerifyTest, OneDataSegment) {
528 const byte kDataSegmentSourceOffset = 8 + 10; 567 const byte kDataSegmentSourceOffset = 39;
529 const byte data[] = { 568 const byte data[] = {
530 kDeclMemory, 28, 28, 1, 569 SECTION(MEMORY, 3),
531 kDeclDataSegments, 1, 570 28,
571 28,
572 1,
573 SECTION(DATA_SEGMENTS, 8),
574 1,
532 U32V_3(0x9bbaa), // dest addr 575 U32V_3(0x9bbaa), // dest addr
533 U32V_1(3), // source size 576 U32V_1(3), // source size
534 'a', 'b', 'c' // data bytes 577 'a',
578 'b',
579 'c' // data bytes
535 }; 580 };
536 581
537 { 582 {
538 EXPECT_VERIFIES(data); 583 EXPECT_VERIFIES(data);
539 ModuleResult result = DecodeModule(data, data + arraysize(data)); 584 ModuleResult result = DecodeModule(data, data + arraysize(data));
540 EXPECT_TRUE(result.ok()); 585 EXPECT_TRUE(result.ok());
541 EXPECT_EQ(0, result.val->globals.size()); 586 EXPECT_EQ(0, result.val->globals.size());
542 EXPECT_EQ(0, result.val->functions.size()); 587 EXPECT_EQ(0, result.val->functions.size());
543 EXPECT_EQ(1, result.val->data_segments.size()); 588 EXPECT_EQ(1, result.val->data_segments.size());
544 589
545 WasmDataSegment* segment = &result.val->data_segments.back(); 590 WasmDataSegment* segment = &result.val->data_segments.back();
546 591
547 EXPECT_EQ(0x9bbaa, segment->dest_addr); 592 EXPECT_EQ(0x9bbaa, segment->dest_addr);
548 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); 593 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
549 EXPECT_EQ(3, segment->source_size); 594 EXPECT_EQ(3, segment->source_size);
550 EXPECT_TRUE(segment->init); 595 EXPECT_TRUE(segment->init);
551 596
552 if (result.val) delete result.val; 597 if (result.val) delete result.val;
553 } 598 }
554 599
555 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); 600 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data));
556 } 601 }
557 602
558 603
559 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { 604 TEST_F(WasmModuleVerifyTest, TwoDataSegments) {
560 const byte kDataSegment0SourceOffset = 8 + 10; 605 const byte kDataSegment0SourceOffset = 39;
561 const byte kDataSegment1SourceOffset = 8 + 10 + 8; 606 const byte kDataSegment1SourceOffset = 39 + 8;
562 607
563 const byte data[] = { 608 const byte data[] = {
564 kDeclMemory, 28, 28, 1, 609 SECTION(MEMORY, 3),
565 kDeclDataSegments, 2, 610 28,
566 U32V_3(0x7ffee), // #0: dest addr 611 28,
567 U32V_1(4), // source size 612 1,
568 1, 2, 3, 4, // data bytes 613 SECTION(DATA_SEGMENTS, 31),
569 U32V_3(0x6ddcc), // #1: dest addr 614 2, // segment count
570 U32V_1(10), // source size 615 U32V_3(0x7ffee), // #0: dest addr
571 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 // data bytes 616 U32V_1(4), // source size
617 1,
618 2,
619 3,
620 4, // data bytes
621 U32V_3(0x6ddcc), // #1: dest addr
622 U32V_1(10), // source size
623 1,
624 2,
625 3,
626 4,
627 5,
628 6,
629 7,
630 8,
631 9,
632 10 // data bytes
572 }; 633 };
573 634
574 { 635 {
575 ModuleResult result = DecodeModule(data, data + arraysize(data)); 636 ModuleResult result = DecodeModule(data, data + arraysize(data));
576 EXPECT_TRUE(result.ok()); 637 EXPECT_TRUE(result.ok());
577 EXPECT_EQ(0, result.val->globals.size()); 638 EXPECT_EQ(0, result.val->globals.size());
578 EXPECT_EQ(0, result.val->functions.size()); 639 EXPECT_EQ(0, result.val->functions.size());
579 EXPECT_EQ(2, result.val->data_segments.size()); 640 EXPECT_EQ(2, result.val->data_segments.size());
580 641
581 WasmDataSegment* s0 = &result.val->data_segments[0]; 642 WasmDataSegment* s0 = &result.val->data_segments[0];
582 WasmDataSegment* s1 = &result.val->data_segments[1]; 643 WasmDataSegment* s1 = &result.val->data_segments[1];
583 644
584 EXPECT_EQ(0x7ffee, s0->dest_addr); 645 EXPECT_EQ(0x7ffee, s0->dest_addr);
585 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset); 646 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset);
586 EXPECT_EQ(4, s0->source_size); 647 EXPECT_EQ(4, s0->source_size);
587 EXPECT_TRUE(s0->init); 648 EXPECT_TRUE(s0->init);
588 649
589 EXPECT_EQ(0x6ddcc, s1->dest_addr); 650 EXPECT_EQ(0x6ddcc, s1->dest_addr);
590 EXPECT_EQ(kDataSegment1SourceOffset, s1->source_offset); 651 EXPECT_EQ(kDataSegment1SourceOffset, s1->source_offset);
591 EXPECT_EQ(10, s1->source_size); 652 EXPECT_EQ(10, s1->source_size);
592 EXPECT_TRUE(s1->init); 653 EXPECT_TRUE(s1->init);
593 654
594 if (result.val) delete result.val; 655 if (result.val) delete result.val;
595 } 656 }
596 657
597 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); 658 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data));
598 } 659 }
599 660
661 TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidSource) {
662 const int dest_addr = 0x100;
663 const byte mem_pages = 1;
664 const int kHeaderSize = 8;
665 const size_t kDataSize =
666 17 + WasmSection::getNameLength(WasmSection::Code::Memory) +
667 WasmSection::getNameLength(WasmSection::Code::DataSegments) + 2;
668 const size_t kTotalSize = kHeaderSize + kDataSize;
669
670 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) {
671 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) {
672 byte data[] = {
673 SECTION(MEMORY, 3),
674 mem_pages,
675 mem_pages,
676 1,
677 SECTION(DATA_SEGMENTS, 14),
678 1,
679 U32_LE(dest_addr),
680 U32_LE(source_offset),
681 U32_LE(source_size),
682 1, // init
683 };
684
685 EXPECT_EQ(kDataSize, arraysize(data));
686
687 if (source_offset < kTotalSize && source_size >= 0 &&
688 (source_offset + source_size) <= kTotalSize) {
689 EXPECT_VERIFIES(data);
690 } else {
691 EXPECT_FAILURE(data);
692 }
693 }
694 }
695 }
600 696
601 TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) { 697 TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) {
602 const int source_size = 3; 698 const int source_size = 3;
603 699
604 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) { 700 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) {
605 int mem_size = mem_pages * 0x10000; // 64k pages. 701 int mem_size = mem_pages * 0x10000; // 64k pages.
606 702
607 for (int dest_addr = mem_size - source_size; 703 for (int dest_addr = mem_size - source_size;
608 dest_addr < mem_size + source_size; dest_addr++) { 704 dest_addr < mem_size + source_size; dest_addr++) {
609 byte data[] = { 705 byte data[] = {SECTION(MEMORY, 3),
610 kDeclMemory, 706 mem_pages,
611 mem_pages, 707 mem_pages,
612 mem_pages, 708 1,
613 1, 709 SECTION(DATA_SEGMENTS, 14),
614 kDeclDataSegments, 710 1,
615 1, 711 U32V_3(dest_addr),
616 U32V_3(dest_addr), 712 U32V_1(source_size),
617 U32V_1(source_size), 713 'a',
618 'a', 'b', 'c' 714 'b',
619 }; 715 'c'};
620 716
621 if (dest_addr <= (mem_size - source_size)) { 717 if (dest_addr <= (mem_size - source_size)) {
622 EXPECT_VERIFIES(data); 718 EXPECT_VERIFIES(data);
623 } else { 719 } else {
624 EXPECT_FAILURE(data); 720 EXPECT_FAILURE(data);
625 } 721 }
626 } 722 }
627 } 723 }
628 } 724 }
629 725
630 726
631 // To make below tests for indirect calls much shorter. 727 // To make below tests for indirect calls much shorter.
632 #define FUNCTION(sig_index, external) kDeclFunctionImport, SIG_INDEX(sig_index) 728 #define FUNCTION(sig_index, external) kDeclFunctionImport, SIG_INDEX(sig_index)
633 729
634 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { 730 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
635 static const byte data[] = { 731 static const byte data[] = {
636 // sig#0 ------------------------------------------------------- 732 // sig#0 -------------------------------------------------------
637 kDeclSignatures, 1, 0, 0, // void -> void 733 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void
638 // func#0 ------------------------------------------------------ 734 // func#0 ------------------------------------------------------
639 kDeclFunctions, 1, FUNCTION(0, 0), 735 SECTION(FUNCTIONS, 4), 1, FUNCTION(0, 0),
640 // indirect table ---------------------------------------------- 736 // indirect table ----------------------------------------------
641 kDeclFunctionTable, 1, U32V_1(0)}; 737 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)};
642 738
643 ModuleResult result = DecodeModule(data, data + arraysize(data)); 739 ModuleResult result = DecodeModule(data, data + arraysize(data));
644 EXPECT_TRUE(result.ok()); 740 EXPECT_TRUE(result.ok());
645 if (result.ok()) { 741 if (result.ok()) {
646 EXPECT_EQ(1, result.val->signatures.size()); 742 EXPECT_EQ(1, result.val->signatures.size());
647 EXPECT_EQ(1, result.val->functions.size()); 743 EXPECT_EQ(1, result.val->functions.size());
648 EXPECT_EQ(1, result.val->function_table.size()); 744 EXPECT_EQ(1, result.val->function_table.size());
649 EXPECT_EQ(0, result.val->function_table[0]); 745 EXPECT_EQ(0, result.val->function_table[0]);
650 } 746 }
651 if (result.val) delete result.val; 747 if (result.val) delete result.val;
652 } 748 }
653 749
654 750
655 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { 751 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) {
656 static const byte data[] = { 752 static const byte data[] = {
657 // sig#0 ------------------------------------------------------- 753 // sig#0 -------------------------------------------------------
658 kDeclSignatures, 2, 0, 0, // void -> void 754 SECTION(SIGNATURES, 5), 2, 0, 0, // void -> void
659 0, kLocalI32, // void -> i32 755 0, kLocalI32, // void -> i32
660 // func#0 ------------------------------------------------------ 756 // func#0 ------------------------------------------------------
661 kDeclFunctions, 4, FUNCTION(0, 1), // -- 757 SECTION(FUNCTIONS, 13), 4, FUNCTION(0, 1), // --
662 FUNCTION(1, 1), // -- 758 FUNCTION(1, 1), // --
663 FUNCTION(0, 1), // -- 759 FUNCTION(0, 1), // --
664 FUNCTION(1, 1), // -- 760 FUNCTION(1, 1), // --
665 // indirect table ---------------------------------------------- 761 // indirect table ----------------------------------------------
666 kDeclFunctionTable, 8, 762 SECTION(FUNCTION_TABLE, 9), 8,
667 U32V_1(0), // -- 763 U32V_1(0), // --
668 U32V_1(1), // -- 764 U32V_1(1), // --
669 U32V_1(2), // -- 765 U32V_1(2), // --
670 U32V_1(3), // -- 766 U32V_1(3), // --
671 U32V_1(0), // -- 767 U32V_1(0), // --
672 U32V_1(1), // -- 768 U32V_1(1), // --
673 U32V_1(2), // -- 769 U32V_1(2), // --
674 U32V_1(3), // -- 770 U32V_1(3), // --
675 }; 771 };
676 772
677 ModuleResult result = DecodeModule(data, data + arraysize(data)); 773 ModuleResult result = DecodeModule(data, data + arraysize(data));
678 EXPECT_TRUE(result.ok()); 774 EXPECT_TRUE(result.ok());
679 if (result.ok()) { 775 if (result.ok()) {
680 EXPECT_EQ(2, result.val->signatures.size()); 776 EXPECT_EQ(2, result.val->signatures.size());
681 EXPECT_EQ(4, result.val->functions.size()); 777 EXPECT_EQ(4, result.val->functions.size());
682 EXPECT_EQ(8, result.val->function_table.size()); 778 EXPECT_EQ(8, result.val->function_table.size());
683 for (int i = 0; i < 8; i++) { 779 for (int i = 0; i < 8; i++) {
684 EXPECT_EQ(i & 3, result.val->function_table[i]); 780 EXPECT_EQ(i & 3, result.val->function_table[i]);
685 } 781 }
686 } 782 }
687 if (result.val) delete result.val; 783 if (result.val) delete result.val;
688 } 784 }
689 785
690 786
691 TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) { 787 TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) {
692 static const byte data[] = { 788 static const byte data[] = {
693 // sig#0 ------------------------------------------------------- 789 // sig#0 -------------------------------------------------------
694 kDeclSignatures, 1, 0, 0, // void -> void 790 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void
695 // indirect table ---------------------------------------------- 791 // indirect table ----------------------------------------------
696 kDeclFunctionTable, 1, 0, 0, 792 SECTION(FUNCTION_TABLE, 3), 1, 0, 0,
697 }; 793 };
698 794
699 EXPECT_FAILURE(data); 795 EXPECT_FAILURE(data);
700 } 796 }
701 797
702 798
703 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) { 799 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) {
704 static const byte data[] = { 800 static const byte data[] = {
705 // sig#0 ------------------------------------------------------- 801 // sig#0 -------------------------------------------------------
706 kDeclSignatures, 1, 0, 0, // void -> void 802 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void
707 // functions --------------------------------------------------- 803 // functions ---------------------------------------------------
708 kDeclFunctions, 1, FUNCTION(0, 1), 804 SECTION(FUNCTIONS, 4), 1, FUNCTION(0, 1),
709 // indirect table ---------------------------------------------- 805 // indirect table ----------------------------------------------
710 kDeclFunctionTable, 1, 1, 0, 806 SECTION(FUNCTION_TABLE, 3), 1, 1, 0,
711 }; 807 };
712 808
713 EXPECT_FAILURE(data); 809 EXPECT_FAILURE(data);
714 } 810 }
715 811
716 812
717 class WasmSignatureDecodeTest : public TestWithZone {}; 813 class WasmSignatureDecodeTest : public TestWithZone {};
718 814
719 815
720 TEST_F(WasmSignatureDecodeTest, Ok_v_v) { 816 TEST_F(WasmSignatureDecodeTest, Ok_v_v) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 EXPECT_EQ(2, function->code_start_offset); 963 EXPECT_EQ(2, function->code_start_offset);
868 EXPECT_EQ(arraysize(data), function->code_end_offset); 964 EXPECT_EQ(arraysize(data), function->code_end_offset);
869 // TODO(titzer): verify encoding of local declarations 965 // TODO(titzer): verify encoding of local declarations
870 EXPECT_FALSE(function->external); 966 EXPECT_FALSE(function->external);
871 EXPECT_FALSE(function->exported); 967 EXPECT_FALSE(function->exported);
872 } 968 }
873 969
874 if (result.val) delete result.val; 970 if (result.val) delete result.val;
875 } 971 }
876 972
877 TEST_F(WasmModuleVerifyTest, UnknownSectionNoLen) { 973 TEST_F(WasmModuleVerifyTest, SectionWithoutNameLength) {
878 const byte data[] = { 974 const byte data[] = {1};
879 kMaxModuleSectionCode, // unknown section without length.
880 };
881 EXPECT_FAILURE(data); 975 EXPECT_FAILURE(data);
882 } 976 }
883 977
884 TEST_F(WasmModuleVerifyTest, UnknownSectionEmpty) { 978 TEST_F(WasmModuleVerifyTest, TheLoneliestOfValidModulesTheTrulyEmptyOne) {
885 for (int i = 0; i < 255 - kMaxModuleSectionCode; ++i) { 979 const byte data[] = {
886 const byte data[] = { 980 1, // Section size.
887 byte(kMaxModuleSectionCode + i), 0, // empty unknown section 981 0, // Empty section name.
888 }; 982 // No section name, no content, nothing but sadness.
889 ModuleResult result = DecodeModule(data, data + arraysize(data)); 983 };
890 EXPECT_TRUE(result.ok()); 984 EXPECT_VERIFIES(data);
891 if (result.val) delete result.val;
892 }
893 } 985 }
894 986
895 TEST_F(WasmModuleVerifyTest, UnknownSectionOne) { 987 TEST_F(WasmModuleVerifyTest, OnlyUnknownSectionEmpty) {
896 static const byte data[] = { 988 const byte data[] = {
897 kMaxModuleSectionCode, 989 5, // Section size.
898 1, // LEB128 1 990 4, 'l', 'u', 'l', 'z', // unknown section.
899 0, // one byte section
900 }; 991 };
901 ModuleResult result = DecodeModule(data, data + arraysize(data)); 992 EXPECT_VERIFIES(data);
902 EXPECT_TRUE(result.ok());
903 if (result.val) delete result.val;
904 } 993 }
905 994
906 TEST_F(WasmModuleVerifyTest, UnknownSectionTen) { 995 TEST_F(WasmModuleVerifyTest, OnlyUnknownSectionNonEmpty) {
907 static const byte data[] = { 996 const byte data[] = {
908 kMaxModuleSectionCode, 997 10, // Section size.
909 10, // LEB128 10 998 4, 'l', 'u', 'l', 'z', // unknown section.
910 1, 999 // Section content:
911 2, 1000 0xff, 0xff, 0xff, 0xff, 0xff,
912 3,
913 4,
914 5,
915 6,
916 7,
917 8,
918 9,
919 10, // 10 byte section
920 }; 1001 };
921 ModuleResult result = DecodeModule(data, data + arraysize(data)); 1002 EXPECT_VERIFIES(data);
922 EXPECT_TRUE(result.ok()); 1003 }
923 if (result.val) delete result.val; 1004
1005 TEST_F(WasmModuleVerifyTest, SignatureFollowedByEmptyUnknownSection) {
1006 const byte data[] = {
1007 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, VOID_VOID_SIG,
1008 // -----------------------------------------------------------
1009 5, // Section size.
1010 4, 'l', 'u', 'l', 'z', // unknown section.
1011 };
1012 EXPECT_VERIFIES(data);
1013 }
1014
1015 TEST_F(WasmModuleVerifyTest, SignatureFollowedByUnknownSection) {
1016 const byte data[] = {
1017 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, VOID_VOID_SIG,
1018 // -----------------------------------------------------------
1019 10, // Section size.
1020 4, 'l', 'u', 'l', 'z', // unknown section.
1021 0xff, 0xff, 0xff, 0xff, 0xff,
1022 };
1023 EXPECT_VERIFIES(data);
1024 }
1025
1026 TEST_F(WasmModuleVerifyTest, SignatureFollowedByUnknownSectionWithLongLEB) {
1027 const byte data[] = {
1028 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, VOID_VOID_SIG,
1029 // -----------------------------------------------------------
1030 0x85, 0x80, 0x80, 0x80, 0x00, // Section size: 1 but in a 5-byte LEB.
1031 4, 'l', 'u', 'l', 'z', // unknown section.
1032 };
1033 EXPECT_VERIFIES(data);
924 } 1034 }
925 1035
926 TEST_F(WasmModuleVerifyTest, UnknownSectionOverflow) { 1036 TEST_F(WasmModuleVerifyTest, UnknownSectionOverflow) {
927 static const byte data[] = { 1037 static const byte data[] = {
928 kMaxModuleSectionCode, 1038 13, // Section size.
929 11, // LEB128 11 1039 1, // Section name length.
930 1, 1040 '\0', // Section name.
931 2, 1041 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10 byte section
932 3,
933 4,
934 5,
935 6,
936 7,
937 8,
938 9,
939 10, // 10 byte section
940 }; 1042 };
941 EXPECT_FAILURE(data); 1043 EXPECT_FAILURE(data);
942 } 1044 }
943 1045
944 TEST_F(WasmModuleVerifyTest, UnknownSectionUnderflow) { 1046 TEST_F(WasmModuleVerifyTest, UnknownSectionUnderflow) {
945 static const byte data[] = { 1047 static const byte data[] = {
946 kMaxModuleSectionCode, 1048 0xff, 0xff, 0xff, 0xff, 0x0f, // Section size LEB128 0xffffffff
947 0xff, 1049 1, '\0', // Section name and name length.
948 0xff, 1050 1, 2, 3, 4, // 4 byte section
949 0xff,
950 0xff,
951 0x0f, // LEB128 0xffffffff
952 1,
953 2,
954 3,
955 4, // 4 byte section
956 }; 1051 };
957 EXPECT_FAILURE(data); 1052 EXPECT_FAILURE(data);
958 } 1053 }
959 1054
960 TEST_F(WasmModuleVerifyTest, UnknownSectionLoop) { 1055 TEST_F(WasmModuleVerifyTest, UnknownSectionLoop) {
961 // Would infinite loop decoding if wrapping and allowed. 1056 // Would infinite loop decoding if wrapping and allowed.
962 static const byte data[] = { 1057 static const byte data[] = {
963 kMaxModuleSectionCode, 1058 0xfa, 0xff, 0xff, 0xff, 0x0f, // Section size LEB128 0xfffffffa
964 0xfa, 1059 1, '\0', // Section name and name length.
965 0xff, 1060 1, 2, 3, 4, // 4 byte section
966 0xff,
967 0xff,
968 0x0f, // LEB128 0xfffffffa
969 1,
970 2,
971 3,
972 4, // 4 byte section
973 }; 1061 };
974 EXPECT_FAILURE(data); 1062 EXPECT_FAILURE(data);
975 } 1063 }
976 1064
977 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) { 1065 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) {
978 static const byte data[] = { 1066 static const byte data[] = {
979 kMaxModuleSectionCode, 1067 3, // Section size.
980 1, // LEB128 1 1068 1,
981 0, // one byte section 1069 '\0', // Section name: LEB128 1, string '\0'
982 kDeclGlobals, 1070 0, // one byte section
1071 SECTION(GLOBALS, 7),
983 1, 1072 1,
984 0, // name length 1073 0, // name length
985 kMemI32, // memory type 1074 kMemI32, // memory type
986 0, // exported 1075 0, // exported
987 }; 1076 };
988 ModuleResult result = DecodeModule(data, data + arraysize(data)); 1077 ModuleResult result = DecodeModule(data, data + arraysize(data));
989 EXPECT_TRUE(result.ok()); 1078 EXPECT_TRUE(result.ok());
990 1079
991 EXPECT_EQ(1, result.val->globals.size()); 1080 EXPECT_EQ(1, result.val->globals.size());
992 EXPECT_EQ(0, result.val->functions.size()); 1081 EXPECT_EQ(0, result.val->functions.size());
993 EXPECT_EQ(0, result.val->data_segments.size()); 1082 EXPECT_EQ(0, result.val->data_segments.size());
994 1083
995 WasmGlobal* global = &result.val->globals.back(); 1084 WasmGlobal* global = &result.val->globals.back();
996 1085
997 EXPECT_EQ(0, global->name_length); 1086 EXPECT_EQ(0, global->name_length);
998 EXPECT_EQ(MachineType::Int32(), global->type); 1087 EXPECT_EQ(MachineType::Int32(), global->type);
999 EXPECT_EQ(0, global->offset); 1088 EXPECT_EQ(0, global->offset);
1000 EXPECT_FALSE(global->exported); 1089 EXPECT_FALSE(global->exported);
1001 1090
1002 if (result.val) delete result.val; 1091 if (result.val) delete result.val;
1003 } 1092 }
1004 1093
1005 TEST_F(WasmModuleVerifyTest, ImportTable_empty) { 1094 TEST_F(WasmModuleVerifyTest, ImportTable_empty) {
1006 static const byte data[] = {kDeclSignatures, 0, kDeclImportTable, 0}; 1095 static const byte data[] = {SECTION(SIGNATURES, 1), 0,
1096 SECTION(IMPORT_TABLE, 1), 0};
1007 EXPECT_VERIFIES(data); 1097 EXPECT_VERIFIES(data);
1008 } 1098 }
1009 1099
1010 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { 1100 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) {
1011 static const byte data[] = {kDeclImportTable, 0}; 1101 static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0};
1012 EXPECT_FAILURE(data); 1102 EXPECT_FAILURE(data);
1013 } 1103 }
1014 1104
1015 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { 1105 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) {
1016 static const byte data[] = { 1106 static const byte data[] = {
1017 kDeclSignatures, 0, kDeclImportTable, 1, 1107 SECTION(SIGNATURES, 1), 0, SECTION(IMPORT_TABLE, 6), 1,
1018 IMPORT_SIG_INDEX(0), // sig index 1108 IMPORT_SIG_INDEX(0), // sig index
1019 NAME_LENGTH(1), 'm', // module name 1109 NAME_LENGTH(1), 'm', // module name
1020 NAME_LENGTH(1), 'f', // function name 1110 NAME_LENGTH(1), 'f', // function name
1021 }; 1111 };
1022 EXPECT_FAILURE(data); 1112 EXPECT_FAILURE(data);
1023 } 1113 }
1024 1114
1025 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { 1115 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) {
1026 static const byte data[] = { 1116 static const byte data[] = {
1027 kDeclSignatures, 1117 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1028 1, 1118 1,
1029 VOID_VOID_SIG, 1119 VOID_VOID_SIG,
1030 kDeclImportTable, 1120 SECTION(IMPORT_TABLE, 6),
1031 1, // -- 1121 1, // --
1032 IMPORT_SIG_INDEX(0), // sig index 1122 IMPORT_SIG_INDEX(0), // sig index
1033 NAME_LENGTH(1), 'm', // module name 1123 NAME_LENGTH(1),
1034 NAME_LENGTH(1), 'f', // function name 1124 'm', // module name
1125 NAME_LENGTH(1),
1126 'f', // function name
1035 }; 1127 };
1036 EXPECT_VERIFIES(data); 1128 EXPECT_VERIFIES(data);
1037 } 1129 }
1038 1130
1039 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) { 1131 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) {
1040 static const byte data[] = { 1132 static const byte data[] = {
1041 kDeclSignatures, 1133 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1042 1, 1134 1,
1043 VOID_VOID_SIG, 1135 VOID_VOID_SIG,
1044 kDeclImportTable, 1136 SECTION(IMPORT_TABLE, 6),
1045 1, // -- 1137 1, // --
1046 IMPORT_SIG_INDEX(0), // sig index 1138 IMPORT_SIG_INDEX(0), // sig index
1047 NO_NAME, // module name 1139 NO_NAME, // module name
1048 NAME_LENGTH(1), 'f' // function name 1140 NAME_LENGTH(1),
1141 'f' // function name
1049 }; 1142 };
1050 EXPECT_FAILURE(data); 1143 EXPECT_FAILURE(data);
1051 } 1144 }
1052 1145
1053 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) { 1146 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) {
1054 static const byte data[] = { 1147 static const byte data[] = {
1055 kDeclSignatures, 1, VOID_VOID_SIG, kDeclImportTable, 1, 1148 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1149 1,
1150 VOID_VOID_SIG,
1151 SECTION(IMPORT_TABLE, 6),
1152 1,
1056 IMPORT_SIG_INDEX(0), // sig index 1153 IMPORT_SIG_INDEX(0), // sig index
1057 NAME_LENGTH(1), 'm', // module name 1154 NAME_LENGTH(1),
1058 NAME_LENGTH(1), 'f', // function name 1155 'm', // module name
1156 NAME_LENGTH(1),
1157 'f', // function name
1059 }; 1158 };
1060 1159
1061 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); 1160 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
1062 } 1161 }
1063 1162
1064 TEST_F(WasmModuleVerifyTest, ExportTable_empty1) { 1163 TEST_F(WasmModuleVerifyTest, ExportTable_empty1) {
1065 static const byte data[] = {kDeclSignatures, 1, VOID_VOID_SIG, 1164 static const byte data[] = {SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1066 kDeclFunctions, 1, EMPTY_FUNCTION(0), 1165 1,
1067 kDeclExportTable, 0}; 1166 VOID_VOID_SIG,
1167 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE),
1168 1,
1169 EMPTY_FUNCTION(0),
1170 SECTION(EXPORT_TABLE, 1),
1171 0};
1068 EXPECT_VERIFIES(data); 1172 EXPECT_VERIFIES(data);
1069 } 1173 }
1070 1174
1071 TEST_F(WasmModuleVerifyTest, ExportTable_empty2) { 1175 TEST_F(WasmModuleVerifyTest, ExportTable_empty2) {
1072 static const byte data[] = {kDeclSignatures, 0, kDeclFunctions, 0, 1176 static const byte data[] = {SECTION(SIGNATURES, 1), 0,
1073 kDeclExportTable, 0}; 1177 SECTION(FUNCTIONS, 1), 0,
1178 SECTION(EXPORT_TABLE, 1), 0};
1074 // TODO(titzer): current behavior treats empty functions section as missing. 1179 // TODO(titzer): current behavior treats empty functions section as missing.
1075 EXPECT_FAILURE(data); 1180 EXPECT_FAILURE(data);
1076 } 1181 }
1077 1182
1078 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) { 1183 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) {
1079 static const byte data[] = {kDeclSignatures, 0, kDeclExportTable, 0}; 1184 static const byte data[] = {SECTION(SIGNATURES, 1), 0,
1185 SECTION(EXPORT_TABLE, 1), 0};
1080 EXPECT_FAILURE(data); 1186 EXPECT_FAILURE(data);
1081 } 1187 }
1082 1188
1083 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) { 1189 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) {
1084 static const byte data[] = {kDeclExportTable, 0}; 1190 static const byte data[] = {SECTION(EXPORT_TABLE, 1), 0};
1085 EXPECT_FAILURE(data); 1191 EXPECT_FAILURE(data);
1086 } 1192 }
1087 1193
1088 TEST_F(WasmModuleVerifyTest, ExportTableOne) { 1194 TEST_F(WasmModuleVerifyTest, ExportTableOne) {
1089 static const byte data[] = { 1195 static const byte data[] = {
1090 kDeclSignatures, 1, // sigs 1196 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1091 VOID_VOID_SIG, // -- 1197 1, // sigs
1092 kDeclFunctions, 1, // functions 1198 VOID_VOID_SIG, // --
1093 EMPTY_FUNCTION(0), // -- 1199 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE),
1094 kDeclExportTable, 1, // exports 1200 1, // functions
1095 FUNC_INDEX(0), // -- 1201 EMPTY_FUNCTION(0), // --
1096 NO_NAME // -- 1202 SECTION(EXPORT_TABLE, 7),
1203 1, // exports
1204 FUNC_INDEX(0), // --
1205 NO_NAME // --
1097 }; 1206 };
1098 EXPECT_VERIFIES(data); 1207 EXPECT_VERIFIES(data);
1099 } 1208 }
1100 1209
1101 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { 1210 TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
1102 static const byte data[] = { 1211 static const byte data[] = {
1103 kDeclSignatures, 1, // sigs 1212 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1104 VOID_VOID_SIG, // -- 1213 1, // sigs
1105 kDeclFunctions, 1, // functions 1214 VOID_VOID_SIG, // --
1106 EMPTY_FUNCTION(0), // -- 1215 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE),
1107 kDeclExportTable, 2, // exports 1216 1, // functions
1108 FUNC_INDEX(0), // -- 1217 EMPTY_FUNCTION(0), // --
1109 NAME_LENGTH(4), 'n', 'a', 'm', 'e', // -- 1218 SECTION(EXPORT_TABLE, 12),
1110 FUNC_INDEX(0), // -- 1219 2, // exports
1111 NAME_LENGTH(3), 'n', 'o', 'm' // -- 1220 FUNC_INDEX(0), // --
1221 NAME_LENGTH(4),
1222 'n',
1223 'a',
1224 'm',
1225 'e', // --
1226 FUNC_INDEX(0), // --
1227 NAME_LENGTH(3),
1228 'n',
1229 'o',
1230 'm' // --
1112 }; 1231 };
1113 EXPECT_VERIFIES(data); 1232 EXPECT_VERIFIES(data);
1114 } 1233 }
1115 1234
1116 TEST_F(WasmModuleVerifyTest, ExportTableThree) { 1235 TEST_F(WasmModuleVerifyTest, ExportTableThree) {
1117 static const byte data[] = { 1236 static const byte data[] = {
1118 kDeclSignatures, 1, // sigs 1237 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1119 VOID_VOID_SIG, // -- 1238 1, // sigs
1120 kDeclFunctions, 3, // functions 1239 VOID_VOID_SIG, // --
1121 EMPTY_FUNCTION(0), // -- 1240 SECTION(FUNCTIONS, 1 + 3 * EMPTY_FUNCTION_SIZE),
1122 EMPTY_FUNCTION(0), // -- 1241 3, // functions
1123 EMPTY_FUNCTION(0), // -- 1242 EMPTY_FUNCTION(0), // --
1124 kDeclExportTable, 3, // exports 1243 EMPTY_FUNCTION(0), // --
1125 FUNC_INDEX(0), // -- 1244 EMPTY_FUNCTION(0), // --
1126 NAME_LENGTH(1), 'a', // -- 1245 SECTION(EXPORT_TABLE, 10),
1127 FUNC_INDEX(1), // -- 1246 3, // exports
1128 NAME_LENGTH(1), 'b', // -- 1247 FUNC_INDEX(0), // --
1129 FUNC_INDEX(2), // -- 1248 NAME_LENGTH(1),
1130 NAME_LENGTH(1), 'c' // -- 1249 'a', // --
1250 FUNC_INDEX(1), // --
1251 NAME_LENGTH(1),
1252 'b', // --
1253 FUNC_INDEX(2), // --
1254 NAME_LENGTH(1),
1255 'c' // --
1131 }; 1256 };
1132 EXPECT_VERIFIES(data); 1257 EXPECT_VERIFIES(data);
1133 } 1258 }
1134 1259
1135 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) { 1260 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
1136 for (int i = 0; i < 6; i++) { 1261 for (int i = 0; i < 6; i++) {
1137 const byte data[] = { 1262 const byte data[] = {
1138 kDeclSignatures, 1, // sigs 1263 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1139 VOID_VOID_SIG, // -- 1264 1, // sigs
1140 kDeclFunctions, 3, // functions 1265 VOID_VOID_SIG, // --
1141 EMPTY_FUNCTION(0), // -- 1266 SECTION(FUNCTIONS, 1 + 3 * EMPTY_FUNCTION_SIZE),
1142 EMPTY_FUNCTION(0), // -- 1267 3, // functions
1143 EMPTY_FUNCTION(0), // -- 1268 EMPTY_FUNCTION(0), // --
1144 kDeclExportTable, 1, // exports 1269 EMPTY_FUNCTION(0), // --
1145 FUNC_INDEX(i), // -- 1270 EMPTY_FUNCTION(0), // --
1146 NAME_LENGTH(2), 'e', 'x', // -- 1271 SECTION(EXPORT_TABLE, 5),
1272 1, // exports
1273 FUNC_INDEX(i), // --
1274 NAME_LENGTH(2),
1275 'e',
1276 'x', // --
1147 }; 1277 };
1148 1278
1149 if (i < 3) { 1279 if (i < 3) {
1150 EXPECT_VERIFIES(data); 1280 EXPECT_VERIFIES(data);
1151 } else { 1281 } else {
1152 EXPECT_FAILURE(data); 1282 EXPECT_FAILURE(data);
1153 } 1283 }
1154 } 1284 }
1155 } 1285 }
1156 1286
1157 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) { 1287 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) {
1158 static const byte data[] = { 1288 static const byte data[] = {
1159 kDeclSignatures, 1, // sigs 1289 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1160 VOID_VOID_SIG, // -- 1290 1, // sigs
1161 kDeclFunctions, 1, // functions 1291 VOID_VOID_SIG, // --
1162 EMPTY_FUNCTION(0), // -- 1292 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE),
1163 kDeclExportTable, 1, // exports 1293 1, // functions
1164 FUNC_INDEX(0), // -- 1294 EMPTY_FUNCTION(0), // --
1165 NO_NAME // -- 1295 SECTION(EXPORT_TABLE, 1 + 6),
1296 1, // exports
1297 FUNC_INDEX(0), // --
1298 NO_NAME // --
1166 }; 1299 };
1167 1300
1168 for (int length = 13; length < sizeof(data); length++) { 1301 for (int length = 33; length < sizeof(data); length++) {
1169 ModuleResult result = DecodeModule(data, data + length); 1302 ModuleResult result = DecodeModule(data, data + length);
1170 EXPECT_FALSE(result.ok()); 1303 EXPECT_FALSE(result.ok());
1171 if (result.val) delete result.val; 1304 if (result.val) delete result.val;
1172 } 1305 }
1173 } 1306 }
1174 1307
1175 #define SIGNATURES_SECTION(count, ...) \ 1308 #define SIGNATURES_SECTION(count, ...) \
1176 kDeclSignatures, U32V_1(count), __VA_ARGS__ 1309 SECTION(SIGNATURES, 1 + 3 * (count)), U32V_1(count), __VA_ARGS__
1177 #define FUNCTION_SIGNATURES_SECTION(count, ...) \ 1310 #define FUNCTION_SIGNATURES_SECTION(count, ...) \
1178 kDeclFunctionSignatures, U32V_1(count), __VA_ARGS__ 1311 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__
1179 #define FUNCTION_BODIES_SECTION(count, ...) \
1180 kDeclFunctionBodies, U32V_1(count), __VA_ARGS__
1181 #define NAMES_SECTION(count, ...) kDeclNames, U32V_1(count), __VA_ARGS__
1182 1312
1183 #define FOO_STRING 3, 'f', 'o', 'o' 1313 #define FOO_STRING 3, 'f', 'o', 'o'
1184 #define NO_LOCAL_NAMES 0 1314 #define NO_LOCAL_NAMES 0
1185 1315
1186 #define EMPTY_SIGNATURES_SECTION kDeclSignatures, 0 1316 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0
1187 #define EMPTY_FUNCTION_SIGNATURES_SECTION kDeclFunctionSignatures, 0 1317 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0
1188 #define EMPTY_FUNCTION_BODIES_SECTION kDeclFunctionBodies, 0 1318 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0
1189 #define EMPTY_NAMES_SECTION kDeclNames, 0 1319 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0
1190 1320
1191 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) { 1321 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) {
1192 static const byte data[] = {kDeclSignatures, 0, kDeclFunctionSignatures, 0}; 1322 static const byte data[] = {SECTION(SIGNATURES, 1), 0,
1323 SECTION(FUNCTION_SIGNATURES, 1), 0};
1193 EXPECT_VERIFIES(data); 1324 EXPECT_VERIFIES(data);
1194 } 1325 }
1195 1326
1196 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) { 1327 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) {
1197 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1328 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG),
1198 FUNCTION_SIGNATURES_SECTION(1, 0)}; 1329 FUNCTION_SIGNATURES_SECTION(1, 0)};
1199 EXPECT_VERIFIES(data); 1330 EXPECT_VERIFIES(data);
1200 } 1331 }
1201 1332
1202 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) { 1333 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) {
1203 static const byte data[] = {EMPTY_SIGNATURES_SECTION, 1334 static const byte data[] = {EMPTY_SIGNATURES_SECTION,
1204 EMPTY_FUNCTION_SIGNATURES_SECTION, 1335 EMPTY_FUNCTION_SIGNATURES_SECTION,
1205 EMPTY_FUNCTION_BODIES_SECTION}; 1336 EMPTY_FUNCTION_BODIES_SECTION};
1206 EXPECT_VERIFIES(data); 1337 EXPECT_VERIFIES(data);
1207 } 1338 }
1208 1339
1209 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) { 1340 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) {
1210 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1341 static const byte data[] = {
1211 FUNCTION_SIGNATURES_SECTION(1, 0), 1342 SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0),
1212 FUNCTION_BODIES_SECTION(1, EMPTY_BODY)}; 1343 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, EMPTY_BODY};
1213 EXPECT_VERIFIES(data); 1344 EXPECT_VERIFIES(data);
1214 } 1345 }
1215 1346
1216 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) { 1347 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) {
1217 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1348 static const byte data[] = {
1218 FUNCTION_SIGNATURES_SECTION(1, 0), 1349 SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0),
1219 FUNCTION_BODIES_SECTION(1, NOP_BODY)}; 1350 SECTION(FUNCTION_BODIES, 1 + NOP_BODY_SIZE), 1, NOP_BODY};
1220 EXPECT_VERIFIES(data); 1351 EXPECT_VERIFIES(data);
1221 } 1352 }
1222 1353
1223 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) { 1354 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) {
1224 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1355 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG),
1225 FUNCTION_SIGNATURES_SECTION(2, 0, 0), 1356 FUNCTION_SIGNATURES_SECTION(2, 0, 0),
1226 FUNCTION_BODIES_SECTION(1, EMPTY_BODY)}; 1357 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1,
1358 EMPTY_BODY};
1227 EXPECT_FAILURE(data); 1359 EXPECT_FAILURE(data);
1228 } 1360 }
1229 1361
1230 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) { 1362 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) {
1231 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1363 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG),
1232 FUNCTION_SIGNATURES_SECTION(1, 0), 1364 FUNCTION_SIGNATURES_SECTION(1, 0),
1233 FUNCTION_BODIES_SECTION(2, NOP_BODY, NOP_BODY)}; 1365 SECTION(FUNCTION_BODIES, 1 + 2 * NOP_BODY_SIZE),
1366 2,
1367 NOP_BODY,
1368 NOP_BODY};
1234 EXPECT_FAILURE(data); 1369 EXPECT_FAILURE(data);
1235 } 1370 }
1236 1371
1237 TEST_F(WasmModuleVerifyTest, Names_empty) { 1372 TEST_F(WasmModuleVerifyTest, Names_empty) {
1238 static const byte data[] = { 1373 static const byte data[] = {
1239 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION, 1374 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION,
1240 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION}; 1375 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION};
1241 EXPECT_VERIFIES(data); 1376 EXPECT_VERIFIES(data);
1242 } 1377 }
1243 1378
1244 TEST_F(WasmModuleVerifyTest, Names_one_empty) { 1379 TEST_F(WasmModuleVerifyTest, Names_one_empty) {
1245 static const byte data[] = { 1380 static const byte data[] = {
1246 SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- 1381 SIGNATURES_SECTION(1, VOID_VOID_SIG), // --
1247 FUNCTION_SIGNATURES_SECTION(1, 0), // -- 1382 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1248 FUNCTION_BODIES_SECTION(1, EMPTY_BODY), // -- 1383 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE),
1249 NAMES_SECTION(1, FOO_STRING, NO_LOCAL_NAMES) // -- 1384 1,
1385 EMPTY_BODY, // --
1386 SECTION(NAMES, 1 + 5),
1387 1,
1388 FOO_STRING,
1389 NO_LOCAL_NAMES // --
1250 }; 1390 };
1251 EXPECT_VERIFIES(data); 1391 EXPECT_VERIFIES(data);
1252 } 1392 }
1253 1393
1254 TEST_F(WasmModuleVerifyTest, Names_two_empty) { 1394 TEST_F(WasmModuleVerifyTest, Names_two_empty) {
1255 static const byte data[] = { 1395 static const byte data[] = {
1256 SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- 1396 SIGNATURES_SECTION(1, VOID_VOID_SIG), // --
1257 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // -- 1397 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
1258 FUNCTION_BODIES_SECTION(2, EMPTY_BODY, EMPTY_BODY), // -- 1398 SECTION(FUNCTION_BODIES, 1 + 2 * EMPTY_BODY_SIZE), // --
1259 NAMES_SECTION(2, FOO_STRING, NO_LOCAL_NAMES, // -- 1399 2,
1260 FOO_STRING, NO_LOCAL_NAMES) // -- 1400 EMPTY_BODY,
1401 EMPTY_BODY, // --
1402 SECTION(NAMES, 1 + 10),
1403 2, // --
1404 FOO_STRING,
1405 NO_LOCAL_NAMES, // --
1406 FOO_STRING,
1407 NO_LOCAL_NAMES, // --
1261 }; 1408 };
1262 EXPECT_VERIFIES(data); 1409 EXPECT_VERIFIES(data);
1263 } 1410 }
1264 1411
1265 } // namespace wasm 1412 } // namespace wasm
1266 } // namespace internal 1413 } // namespace internal
1267 } // namespace v8 1414 } // namespace v8
OLDNEW
« test/mjsunit/wasm/wasm-module-builder.js ('K') | « test/mjsunit/wasm/wasm-module-builder.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698