| OLD | NEW |
| 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_FUNCTION_SIZE ((size_t)5) |
| 17 #define EMPTY_BODY 0 | 17 #define EMPTY_BODY 0 |
| 18 #define EMPTY_BODY_SIZE ((size_t)1) | 18 #define EMPTY_BODY_SIZE ((size_t)1) |
| 19 #define NOP_BODY 2, 0, kExprNop | 19 #define NOP_BODY 2, 0, kExprNop |
| 20 #define NOP_BODY_SIZE ((size_t)3) | 20 #define NOP_BODY_SIZE ((size_t)3) |
| 21 #define VOID_VOID_SIG 0, kLocalVoid | 21 #define VOID_VOID_SIG 0, kLocalVoid |
| 22 #define VOID_VOID_SIG_SIZE ((size_t)2) | 22 #define VOID_VOID_SIG_SIZE ((size_t)2) |
| 23 #define INT_INT_SIG 1, kLocalI32, kLocalI32 | 23 #define INT_INT_SIG 1, kLocalI32, kLocalI32 |
| 24 #define INT_INT_SIG_SIZE ((size_t)3) | 24 #define INT_INT_SIG_SIZE ((size_t)3) |
| 25 | 25 |
| 26 // TODO(titzer): tricky size logic! Remove -1. |
| 26 #define SECTION(NAME, EXTRA_SIZE) \ | 27 #define SECTION(NAME, EXTRA_SIZE) \ |
| 27 U32V_1(WASM_SECTION_##NAME##_SIZE + (EXTRA_SIZE)), WASM_SECTION_##NAME | 28 U32V_1(WASM_SECTION_##NAME##_SIZE + (EXTRA_SIZE)), WASM_SECTION_##NAME |
| 28 | 29 |
| 29 #define EXPECT_VERIFIES(data) \ | 30 #define EXPECT_VERIFIES(data) \ |
| 30 do { \ | 31 do { \ |
| 31 ModuleResult result = DecodeModule(data, data + arraysize(data)); \ | 32 ModuleResult result = DecodeModule(data, data + arraysize(data)); \ |
| 32 EXPECT_TRUE(result.ok()); \ | 33 EXPECT_TRUE(result.ok()); \ |
| 33 if (result.val) delete result.val; \ | 34 if (result.val) delete result.val; \ |
| 34 } while (false) | 35 } while (false) |
| 35 | 36 |
| 36 #define EXPECT_FAILURE_LEN(data, length) \ | 37 #define EXPECT_FAILURE_LEN(data, length) \ |
| 37 do { \ | 38 do { \ |
| 38 ModuleResult result = DecodeModule(data, data + length); \ | 39 ModuleResult result = DecodeModule(data, data + length); \ |
| 39 EXPECT_FALSE(result.ok()); \ | 40 EXPECT_FALSE(result.ok()); \ |
| 40 if (result.val) delete result.val; \ | 41 if (result.val) delete result.val; \ |
| 41 } while (false) | 42 } while (false) |
| 42 | 43 |
| 43 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data)) | 44 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data)) |
| 44 | 45 |
| 45 #define EXPECT_OFF_END_FAILURE(data, min, max) \ | 46 #define EXPECT_OFF_END_FAILURE(data, min, max) \ |
| 46 do { \ | 47 do { \ |
| 47 for (size_t length = min; length < max; length++) { \ | 48 for (size_t length = min; length < max; length++) { \ |
| 48 EXPECT_FAILURE_LEN(data, length); \ | 49 EXPECT_FAILURE_LEN(data, length); \ |
| 49 } \ | 50 } \ |
| 50 } while (false) | 51 } while (false) |
| 51 | 52 |
| 53 #define EXPECT_OK(result) \ |
| 54 do { \ |
| 55 EXPECT_TRUE(result.ok()); \ |
| 56 if (!result.ok()) { \ |
| 57 if (result.val) delete result.val; \ |
| 58 return; \ |
| 59 } \ |
| 60 } while (false) |
| 61 |
| 52 static size_t SizeOfVarInt(size_t value) { | 62 static size_t SizeOfVarInt(size_t value) { |
| 53 size_t size = 0; | 63 size_t size = 0; |
| 54 do { | 64 do { |
| 55 size++; | 65 size++; |
| 56 value = value >> 7; | 66 value = value >> 7; |
| 57 } while (value > 0); | 67 } while (value > 0); |
| 58 return size; | 68 return size; |
| 59 } | 69 } |
| 60 | 70 |
| 61 struct LocalTypePair { | 71 struct LocalTypePair { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 } | 118 } |
| 109 } | 119 } |
| 110 | 120 |
| 111 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { | 121 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { |
| 112 static const byte data[] = {SECTION(END, 0)}; | 122 static const byte data[] = {SECTION(END, 0)}; |
| 113 EXPECT_VERIFIES(data); | 123 EXPECT_VERIFIES(data); |
| 114 } | 124 } |
| 115 | 125 |
| 116 TEST_F(WasmModuleVerifyTest, OneGlobal) { | 126 TEST_F(WasmModuleVerifyTest, OneGlobal) { |
| 117 static const byte data[] = { | 127 static const byte data[] = { |
| 118 SECTION(GLOBALS, 7), // -- | 128 SECTION(GLOBALS, 5), // -- |
| 119 1, | 129 1, |
| 120 NAME_LENGTH(1), | 130 NAME_LENGTH(1), |
| 121 'g', // name | 131 'g', // name |
| 122 kMemI32, // memory type | 132 kMemI32, // memory type |
| 123 0, // exported | 133 0, // exported |
| 124 }; | 134 }; |
| 125 | 135 |
| 126 { | 136 { |
| 127 // Should decode to exactly one global. | 137 // Should decode to exactly one global. |
| 128 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 138 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 129 EXPECT_TRUE(result.ok()); | 139 EXPECT_OK(result); |
| 130 EXPECT_EQ(1, result.val->globals.size()); | 140 EXPECT_EQ(1, result.val->globals.size()); |
| 131 EXPECT_EQ(0, result.val->functions.size()); | 141 EXPECT_EQ(0, result.val->functions.size()); |
| 132 EXPECT_EQ(0, result.val->data_segments.size()); | 142 EXPECT_EQ(0, result.val->data_segments.size()); |
| 133 | 143 |
| 134 WasmGlobal* global = &result.val->globals.back(); | 144 WasmGlobal* global = &result.val->globals.back(); |
| 135 | 145 |
| 136 EXPECT_EQ(1, global->name_length); | 146 EXPECT_EQ(1, global->name_length); |
| 137 EXPECT_EQ(MachineType::Int32(), global->type); | 147 EXPECT_EQ(MachineType::Int32(), global->type); |
| 138 EXPECT_EQ(0, global->offset); | 148 EXPECT_EQ(0, global->offset); |
| 139 EXPECT_FALSE(global->exported); | 149 EXPECT_FALSE(global->exported); |
| 140 | 150 |
| 141 if (result.val) delete result.val; | 151 if (result.val) delete result.val; |
| 142 } | 152 } |
| 143 | 153 |
| 144 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); | 154 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); |
| 145 } | 155 } |
| 146 | 156 |
| 147 | 157 |
| 148 TEST_F(WasmModuleVerifyTest, ZeroGlobals) { | 158 TEST_F(WasmModuleVerifyTest, ZeroGlobals) { |
| 149 static const byte data[] = { | 159 static const byte data[] = { |
| 150 SECTION(GLOBALS, 1), // -- | 160 SECTION(GLOBALS, 1), // -- |
| 151 0, // declare 0 globals | 161 0, // declare 0 globals |
| 152 }; | 162 }; |
| 153 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 163 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 154 EXPECT_TRUE(result.ok()); | 164 EXPECT_OK(result); |
| 155 if (result.val) delete result.val; | 165 if (result.val) delete result.val; |
| 156 } | 166 } |
| 157 | 167 |
| 158 | 168 |
| 159 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) { | 169 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) { |
| 160 while (true) { | 170 while (true) { |
| 161 uint32_t next = val >> 7; | 171 uint32_t next = val >> 7; |
| 162 uint32_t out = val & 0x7f; | 172 uint32_t out = val & 0x7f; |
| 163 if (next) { | 173 if (next) { |
| 164 buffer.push_back(static_cast<byte>(0x80 | out)); | 174 buffer.push_back(static_cast<byte>(0x80 | out)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 185 const byte globals[] = {U32V_5(size), WASM_SECTION_GLOBALS}; | 195 const byte globals[] = {U32V_5(size), WASM_SECTION_GLOBALS}; |
| 186 for (size_t g = 0; g != sizeof(globals); ++g) { | 196 for (size_t g = 0; g != sizeof(globals); ++g) { |
| 187 buffer.push_back(globals[g]); | 197 buffer.push_back(globals[g]); |
| 188 } | 198 } |
| 189 AppendUint32v(buffer, i); // Number of globals. | 199 AppendUint32v(buffer, i); // Number of globals. |
| 190 for (uint32_t j = 0; j < i; j++) { | 200 for (uint32_t j = 0; j < i; j++) { |
| 191 buffer.insert(buffer.end(), data, data + sizeof(data)); | 201 buffer.insert(buffer.end(), data, data + sizeof(data)); |
| 192 } | 202 } |
| 193 | 203 |
| 194 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); | 204 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); |
| 195 EXPECT_TRUE(result.ok()); | 205 EXPECT_OK(result); |
| 196 if (result.val) delete result.val; | 206 if (result.val) delete result.val; |
| 197 } | 207 } |
| 198 } | 208 } |
| 199 | 209 |
| 200 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { | 210 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { |
| 201 static const byte data[] = { | 211 static const byte data[] = { |
| 202 SECTION(GLOBALS, 7), | 212 SECTION(GLOBALS, 7), |
| 203 1, // declare one global | 213 1, // declare one global |
| 204 NO_NAME, // name offset | 214 NO_NAME, // name offset |
| 205 33, // memory type | 215 33, // memory type |
| (...skipping 11 matching lines...) Expand all Loading... |
| 217 33, // memory type | 227 33, // memory type |
| 218 0, // exported | 228 0, // exported |
| 219 }; | 229 }; |
| 220 | 230 |
| 221 EXPECT_FAILURE(data); | 231 EXPECT_FAILURE(data); |
| 222 } | 232 } |
| 223 | 233 |
| 224 | 234 |
| 225 TEST_F(WasmModuleVerifyTest, TwoGlobals) { | 235 TEST_F(WasmModuleVerifyTest, TwoGlobals) { |
| 226 static const byte data[] = { | 236 static const byte data[] = { |
| 227 SECTION(GLOBALS, 13), | 237 SECTION(GLOBALS, 7), |
| 228 2, | 238 2, |
| 229 NO_NAME, // #0: name length | 239 NO_NAME, // #0: name length |
| 230 kMemF32, // memory type | 240 kMemF32, // memory type |
| 231 0, // exported | 241 0, // exported |
| 232 NO_NAME, // #1: name length | 242 NO_NAME, // #1: name length |
| 233 kMemF64, // memory type | 243 kMemF64, // memory type |
| 234 1, // exported | 244 1, // exported |
| 235 }; | 245 }; |
| 236 | 246 |
| 237 { | 247 { |
| 238 // Should decode to exactly two globals. | 248 // Should decode to exactly two globals. |
| 239 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 249 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 240 EXPECT_TRUE(result.ok()); | 250 EXPECT_OK(result); |
| 241 EXPECT_EQ(2, result.val->globals.size()); | 251 EXPECT_EQ(2, result.val->globals.size()); |
| 242 EXPECT_EQ(0, result.val->functions.size()); | 252 EXPECT_EQ(0, result.val->functions.size()); |
| 243 EXPECT_EQ(0, result.val->data_segments.size()); | 253 EXPECT_EQ(0, result.val->data_segments.size()); |
| 244 | 254 |
| 245 WasmGlobal* g0 = &result.val->globals[0]; | 255 WasmGlobal* g0 = &result.val->globals[0]; |
| 246 WasmGlobal* g1 = &result.val->globals[1]; | 256 WasmGlobal* g1 = &result.val->globals[1]; |
| 247 | 257 |
| 248 EXPECT_EQ(0, g0->name_length); | 258 EXPECT_EQ(0, g0->name_length); |
| 249 EXPECT_EQ(MachineType::Float32(), g0->type); | 259 EXPECT_EQ(MachineType::Float32(), g0->type); |
| 250 EXPECT_EQ(0, g0->offset); | 260 EXPECT_EQ(0, g0->offset); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 1, | 296 1, |
| 287 kLocalI32, | 297 kLocalI32, |
| 288 kLocalF32, // f32 -> i32 | 298 kLocalF32, // f32 -> i32 |
| 289 2, | 299 2, |
| 290 kLocalI32, | 300 kLocalI32, |
| 291 kLocalF64, | 301 kLocalF64, |
| 292 kLocalF64, // (f64,f64) -> i32 | 302 kLocalF64, // (f64,f64) -> i32 |
| 293 }; | 303 }; |
| 294 | 304 |
| 295 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 305 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 296 EXPECT_TRUE(result.ok()); | 306 EXPECT_OK(result); |
| 297 EXPECT_EQ(3, result.val->signatures.size()); | 307 EXPECT_EQ(3, result.val->signatures.size()); |
| 298 if (result.val->signatures.size() == 3) { | 308 if (result.val->signatures.size() == 3) { |
| 299 EXPECT_EQ(0, result.val->signatures[0]->return_count()); | 309 EXPECT_EQ(0, result.val->signatures[0]->return_count()); |
| 300 EXPECT_EQ(1, result.val->signatures[1]->return_count()); | 310 EXPECT_EQ(1, result.val->signatures[1]->return_count()); |
| 301 EXPECT_EQ(1, result.val->signatures[2]->return_count()); | 311 EXPECT_EQ(1, result.val->signatures[2]->return_count()); |
| 302 | 312 |
| 303 EXPECT_EQ(0, result.val->signatures[0]->parameter_count()); | 313 EXPECT_EQ(0, result.val->signatures[0]->parameter_count()); |
| 304 EXPECT_EQ(1, result.val->signatures[1]->parameter_count()); | 314 EXPECT_EQ(1, result.val->signatures[1]->parameter_count()); |
| 305 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); | 315 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); |
| 306 } | 316 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 334 | 344 |
| 335 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { | 345 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
| 336 const int kCodeStartOffset = 51; | 346 const int kCodeStartOffset = 51; |
| 337 const int kCodeEndOffset = kCodeStartOffset + 1; | 347 const int kCodeEndOffset = kCodeStartOffset + 1; |
| 338 | 348 |
| 339 static const byte data[] = { | 349 static const byte data[] = { |
| 340 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, | 350 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, |
| 341 // sig#0 ------------------------------------------------------- | 351 // sig#0 ------------------------------------------------------- |
| 342 VOID_VOID_SIG, | 352 VOID_VOID_SIG, |
| 343 // func#0 ------------------------------------------------------ | 353 // func#0 ------------------------------------------------------ |
| 344 SECTION(FUNCTIONS, 19), 1, | 354 SECTION(FUNCTIONS, 18), 1, |
| 345 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, | 355 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, |
| 346 SIG_INDEX(0), // signature index | 356 SIG_INDEX(0), // signature index |
| 347 NAME_LENGTH(2), 'h', 'i', // name | 357 NAME_LENGTH(2), 'h', 'i', // name |
| 348 U16_LE(1466), // local int32 count | 358 U16_LE(1466), // local int32 count |
| 349 U16_LE(1355), // local int64 count | 359 U16_LE(1355), // local int64 count |
| 350 U16_LE(1244), // local float32 count | 360 U16_LE(1244), // local float32 count |
| 351 U16_LE(1133), // local float64 count | 361 U16_LE(1133), // local float64 count |
| 352 1, 0, // size | 362 1, 0, // size |
| 353 kExprNop, | 363 kExprNop, |
| 354 }; | 364 }; |
| 355 | 365 |
| 356 { | 366 { |
| 357 // Should decode to exactly one function. | 367 // Should decode to exactly one function. |
| 358 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 368 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 359 EXPECT_TRUE(result.ok()); | 369 EXPECT_OK(result); |
| 360 EXPECT_EQ(0, result.val->globals.size()); | 370 EXPECT_EQ(0, result.val->globals.size()); |
| 361 EXPECT_EQ(1, result.val->signatures.size()); | 371 EXPECT_EQ(1, result.val->signatures.size()); |
| 362 EXPECT_EQ(1, result.val->functions.size()); | 372 EXPECT_EQ(1, result.val->functions.size()); |
| 363 EXPECT_EQ(0, result.val->data_segments.size()); | 373 EXPECT_EQ(0, result.val->data_segments.size()); |
| 364 EXPECT_EQ(0, result.val->function_table.size()); | 374 EXPECT_EQ(0, result.val->function_table.size()); |
| 365 | 375 |
| 366 WasmFunction* function = &result.val->functions.back(); | 376 WasmFunction* function = &result.val->functions.back(); |
| 367 | 377 |
| 368 EXPECT_EQ(39, function->name_offset); | 378 EXPECT_EQ(39, function->name_offset); |
| 369 EXPECT_EQ(2, function->name_length); | 379 EXPECT_EQ(2, function->name_length); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 380 | 390 |
| 381 if (result.val) delete result.val; | 391 if (result.val) delete result.val; |
| 382 } | 392 } |
| 383 | 393 |
| 384 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); | 394 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); |
| 385 } | 395 } |
| 386 | 396 |
| 387 | 397 |
| 388 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { | 398 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { |
| 389 static const byte data[] = { | 399 static const byte data[] = { |
| 390 SECTION(SIGNATURES, VOID_VOID_SIG_SIZE), 1, | 400 // signatures |
| 401 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, |
| 391 // sig#0 ------------------------------------------------------- | 402 // sig#0 ------------------------------------------------------- |
| 392 VOID_VOID_SIG, SECTION(FUNCTIONS, 6), 1, | 403 VOID_VOID_SIG, |
| 404 // functions |
| 405 SECTION(FUNCTIONS, 4), 1, |
| 393 // func#0 ------------------------------------------------------ | 406 // func#0 ------------------------------------------------------ |
| 394 kDeclFunctionImport, // no name, no locals, imported | 407 kDeclFunctionImport, // no name, no locals, imported |
| 395 SIG_INDEX(0), | 408 SIG_INDEX(0), |
| 396 }; | 409 }; |
| 397 | 410 |
| 398 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 411 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 399 EXPECT_TRUE(result.ok()); | 412 EXPECT_OK(result); |
| 400 EXPECT_EQ(1, result.val->functions.size()); | 413 EXPECT_EQ(1, result.val->functions.size()); |
| 401 WasmFunction* function = &result.val->functions.back(); | 414 WasmFunction* function = &result.val->functions.back(); |
| 402 | 415 |
| 403 EXPECT_EQ(0, function->name_length); | 416 EXPECT_EQ(0, function->name_length); |
| 404 EXPECT_EQ(0, function->code_start_offset); | 417 EXPECT_EQ(0, function->code_start_offset); |
| 405 EXPECT_EQ(0, function->code_end_offset); | 418 EXPECT_EQ(0, function->code_end_offset); |
| 406 | 419 |
| 407 EXPECT_EQ(0, function->local_i32_count); | 420 EXPECT_EQ(0, function->local_i32_count); |
| 408 EXPECT_EQ(0, function->local_i64_count); | 421 EXPECT_EQ(0, function->local_i64_count); |
| 409 EXPECT_EQ(0, function->local_f32_count); | 422 EXPECT_EQ(0, function->local_f32_count); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 425 0, 0, // void -> void | 438 0, 0, // void -> void |
| 426 SECTION(FUNCTIONS, 7), 1, | 439 SECTION(FUNCTIONS, 7), 1, |
| 427 // func#0 ------------------------------------------------------ | 440 // func#0 ------------------------------------------------------ |
| 428 0, // no name, no locals | 441 0, // no name, no locals |
| 429 0, 0, // signature index | 442 0, 0, // signature index |
| 430 1, 0, // body size | 443 1, 0, // body size |
| 431 kExprNop // body | 444 kExprNop // body |
| 432 }; | 445 }; |
| 433 | 446 |
| 434 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 447 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 435 EXPECT_TRUE(result.ok()); | 448 EXPECT_OK(result); |
| 436 EXPECT_EQ(1, result.val->functions.size()); | 449 EXPECT_EQ(1, result.val->functions.size()); |
| 437 WasmFunction* function = &result.val->functions.back(); | 450 WasmFunction* function = &result.val->functions.back(); |
| 438 | 451 |
| 439 EXPECT_EQ(0, function->name_length); | 452 EXPECT_EQ(0, function->name_length); |
| 440 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 453 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
| 441 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 454 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
| 442 | 455 |
| 443 EXPECT_EQ(0, function->local_i32_count); | 456 EXPECT_EQ(0, function->local_i32_count); |
| 444 EXPECT_EQ(0, function->local_i64_count); | 457 EXPECT_EQ(0, function->local_i64_count); |
| 445 EXPECT_EQ(0, function->local_f32_count); | 458 EXPECT_EQ(0, function->local_f32_count); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 465 kDeclFunctionLocals, 0, 0, // signature index | 478 kDeclFunctionLocals, 0, 0, // signature index |
| 466 1, 2, // local int32 count | 479 1, 2, // local int32 count |
| 467 3, 4, // local int64 count | 480 3, 4, // local int64 count |
| 468 5, 6, // local float32 count | 481 5, 6, // local float32 count |
| 469 7, 8, // local float64 count | 482 7, 8, // local float64 count |
| 470 1, 0, // body size | 483 1, 0, // body size |
| 471 kExprNop // body | 484 kExprNop // body |
| 472 }; | 485 }; |
| 473 | 486 |
| 474 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 487 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 475 EXPECT_TRUE(result.ok()); | 488 EXPECT_OK(result); |
| 476 EXPECT_EQ(1, result.val->functions.size()); | 489 EXPECT_EQ(1, result.val->functions.size()); |
| 477 WasmFunction* function = &result.val->functions.back(); | 490 WasmFunction* function = &result.val->functions.back(); |
| 478 | 491 |
| 479 EXPECT_EQ(0, function->name_length); | 492 EXPECT_EQ(0, function->name_length); |
| 480 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 493 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
| 481 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 494 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
| 482 | 495 |
| 483 EXPECT_EQ(513, function->local_i32_count); | 496 EXPECT_EQ(513, function->local_i32_count); |
| 484 EXPECT_EQ(1027, function->local_i64_count); | 497 EXPECT_EQ(1027, function->local_i64_count); |
| 485 EXPECT_EQ(1541, function->local_f32_count); | 498 EXPECT_EQ(1541, function->local_f32_count); |
| 486 EXPECT_EQ(2055, function->local_f64_count); | 499 EXPECT_EQ(2055, function->local_f64_count); |
| 487 | 500 |
| 488 EXPECT_FALSE(function->exported); | 501 EXPECT_FALSE(function->exported); |
| 489 EXPECT_FALSE(function->external); | 502 EXPECT_FALSE(function->external); |
| 490 | 503 |
| 491 if (result.val) delete result.val; | 504 if (result.val) delete result.val; |
| 492 } | 505 } |
| 493 | 506 |
| 494 | 507 |
| 495 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { | 508 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { |
| 496 static const byte kCodeStartOffset = 75; | 509 static const byte kCodeStartOffset = 64; |
| 497 static const byte kCodeEndOffset = kCodeStartOffset + 3; | 510 static const byte kCodeEndOffset = kCodeStartOffset + 3; |
| 498 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 20; | 511 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 31; |
| 499 | 512 |
| 500 static const byte data[] = { | 513 static const byte data[] = { |
| 501 SECTION(MEMORY, 3), 28, 28, 1, | |
| 502 // global#0 -------------------------------------------------- | 514 // global#0 -------------------------------------------------- |
| 503 SECTION(GLOBALS, 7), 1, | 515 SECTION(GLOBALS, 4), 1, |
| 504 0, // name length | 516 0, // name length |
| 505 kMemU8, // memory type | 517 kMemU8, // memory type |
| 506 0, // exported | 518 0, // exported |
| 507 // sig#0 ----------------------------------------------------- | 519 // sig#0 ----------------------------------------------------- |
| 508 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void | 520 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void |
| 509 // func#0 ---------------------------------------------------- | 521 // func#0 ---------------------------------------------------- |
| 510 SECTION(FUNCTIONS, 20), 1, kDeclFunctionLocals | kDeclFunctionName, 0, | 522 SECTION(FUNCTIONS, 20), 1, |
| 511 0, // signature index | 523 kDeclFunctionLocals | kDeclFunctionName, // -- |
| 512 2, 'h', 'i', // name | 524 SIG_INDEX(0), // signature index |
| 513 1, 2, // local int32 count | 525 2, 'h', 'i', // name |
| 514 3, 4, // local int64 count | 526 1, 2, // local int32 count |
| 515 5, 6, // local float32 count | 527 3, 4, // local int64 count |
| 516 7, 8, // local float64 count | 528 5, 6, // local float32 count |
| 517 3, 0, // body size | 529 7, 8, // local float64 count |
| 518 kExprNop, // func#0 body | 530 3, 0, // body size |
| 519 kExprNop, // func#0 body | 531 kExprNop, // func#0 body |
| 520 kExprNop, // func#0 body | 532 kExprNop, // func#0 body |
| 533 kExprNop, // func#0 body |
| 534 // memory section -------------------------------------------- |
| 535 SECTION(MEMORY, 3), 28, 28, 1, |
| 521 // segment#0 ------------------------------------------------- | 536 // segment#0 ------------------------------------------------- |
| 522 SECTION(DATA_SEGMENTS, 14), 1, | 537 SECTION(DATA_SEGMENTS, 10), 1, |
| 523 U32V_3(0x8b3ae), // dest addr | 538 U32V_3(0x8b3ae), // dest addr |
| 524 U32V_1(5), // source size | 539 U32V_1(5), // source size |
| 525 0, 1, 2, 3, 4, // data bytes | 540 0, 1, 2, 3, 4, // data bytes |
| 526 // rest ------------------------------------------------------ | 541 // rest ------------------------------------------------------ |
| 527 SECTION(END, 0), | 542 SECTION(END, 0), |
| 528 }; | 543 }; |
| 529 | 544 |
| 530 { | 545 { |
| 531 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 546 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 532 EXPECT_TRUE(result.ok()); | 547 EXPECT_OK(result); |
| 533 EXPECT_EQ(1, result.val->globals.size()); | 548 EXPECT_EQ(1, result.val->globals.size()); |
| 534 EXPECT_EQ(1, result.val->functions.size()); | 549 EXPECT_EQ(1, result.val->functions.size()); |
| 535 EXPECT_EQ(1, result.val->data_segments.size()); | 550 EXPECT_EQ(1, result.val->data_segments.size()); |
| 536 | 551 |
| 537 WasmGlobal* global = &result.val->globals.back(); | 552 WasmGlobal* global = &result.val->globals.back(); |
| 538 | 553 |
| 539 EXPECT_EQ(0, global->name_length); | 554 EXPECT_EQ(0, global->name_length); |
| 540 EXPECT_EQ(MachineType::Uint8(), global->type); | 555 EXPECT_EQ(MachineType::Uint8(), global->type); |
| 541 EXPECT_EQ(0, global->offset); | 556 EXPECT_EQ(0, global->offset); |
| 542 EXPECT_FALSE(global->exported); | 557 EXPECT_FALSE(global->exported); |
| 543 | 558 |
| 544 WasmFunction* function = &result.val->functions.back(); | 559 WasmFunction* function = &result.val->functions.back(); |
| 545 | 560 |
| 546 EXPECT_EQ(63, function->name_offset); | 561 EXPECT_EQ(52, function->name_offset); |
| 547 EXPECT_EQ(2, function->name_length); | 562 EXPECT_EQ(2, function->name_length); |
| 548 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 563 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
| 549 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 564 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
| 550 | 565 |
| 551 EXPECT_FALSE(function->exported); | 566 EXPECT_FALSE(function->exported); |
| 552 EXPECT_FALSE(function->external); | 567 EXPECT_FALSE(function->external); |
| 553 | 568 |
| 554 WasmDataSegment* segment = &result.val->data_segments.back(); | 569 WasmDataSegment* segment = &result.val->data_segments.back(); |
| 555 | 570 |
| 556 EXPECT_EQ(0x8b3ae, segment->dest_addr); | 571 EXPECT_EQ(0x8b3ae, segment->dest_addr); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 575 U32V_3(0x9bbaa), // dest addr | 590 U32V_3(0x9bbaa), // dest addr |
| 576 U32V_1(3), // source size | 591 U32V_1(3), // source size |
| 577 'a', | 592 'a', |
| 578 'b', | 593 'b', |
| 579 'c' // data bytes | 594 'c' // data bytes |
| 580 }; | 595 }; |
| 581 | 596 |
| 582 { | 597 { |
| 583 EXPECT_VERIFIES(data); | 598 EXPECT_VERIFIES(data); |
| 584 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 599 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 585 EXPECT_TRUE(result.ok()); | 600 EXPECT_OK(result); |
| 586 EXPECT_EQ(0, result.val->globals.size()); | 601 EXPECT_EQ(0, result.val->globals.size()); |
| 587 EXPECT_EQ(0, result.val->functions.size()); | 602 EXPECT_EQ(0, result.val->functions.size()); |
| 588 EXPECT_EQ(1, result.val->data_segments.size()); | 603 EXPECT_EQ(1, result.val->data_segments.size()); |
| 589 | 604 |
| 590 WasmDataSegment* segment = &result.val->data_segments.back(); | 605 WasmDataSegment* segment = &result.val->data_segments.back(); |
| 591 | 606 |
| 592 EXPECT_EQ(0x9bbaa, segment->dest_addr); | 607 EXPECT_EQ(0x9bbaa, segment->dest_addr); |
| 593 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); | 608 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); |
| 594 EXPECT_EQ(3, segment->source_size); | 609 EXPECT_EQ(3, segment->source_size); |
| 595 EXPECT_TRUE(segment->init); | 610 EXPECT_TRUE(segment->init); |
| 596 | 611 |
| 597 if (result.val) delete result.val; | 612 if (result.val) delete result.val; |
| 598 } | 613 } |
| 599 | 614 |
| 600 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data)); | 615 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data)); |
| 601 } | 616 } |
| 602 | 617 |
| 603 | 618 |
| 604 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { | 619 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { |
| 605 const byte kDataSegment0SourceOffset = 39; | 620 const byte kDataSegment0SourceOffset = 39; |
| 606 const byte kDataSegment1SourceOffset = 39 + 8; | 621 const byte kDataSegment1SourceOffset = 39 + 8; |
| 607 | 622 |
| 608 const byte data[] = { | 623 const byte data[] = { |
| 609 SECTION(MEMORY, 3), | 624 SECTION(MEMORY, 3), |
| 610 28, | 625 28, |
| 611 28, | 626 28, |
| 612 1, | 627 1, |
| 613 SECTION(DATA_SEGMENTS, 31), | 628 SECTION(DATA_SEGMENTS, 23), |
| 614 2, // segment count | 629 2, // segment count |
| 615 U32V_3(0x7ffee), // #0: dest addr | 630 U32V_3(0x7ffee), // #0: dest addr |
| 616 U32V_1(4), // source size | 631 U32V_1(4), // source size |
| 617 1, | 632 1, |
| 618 2, | 633 2, |
| 619 3, | 634 3, |
| 620 4, // data bytes | 635 4, // data bytes |
| 621 U32V_3(0x6ddcc), // #1: dest addr | 636 U32V_3(0x6ddcc), // #1: dest addr |
| 622 U32V_1(10), // source size | 637 U32V_1(10), // source size |
| 623 1, | 638 1, |
| 624 2, | 639 2, |
| 625 3, | 640 3, |
| 626 4, | 641 4, |
| 627 5, | 642 5, |
| 628 6, | 643 6, |
| 629 7, | 644 7, |
| 630 8, | 645 8, |
| 631 9, | 646 9, |
| 632 10 // data bytes | 647 10 // data bytes |
| 633 }; | 648 }; |
| 634 | 649 |
| 635 { | 650 { |
| 636 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 651 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 637 EXPECT_TRUE(result.ok()); | 652 EXPECT_OK(result); |
| 638 EXPECT_EQ(0, result.val->globals.size()); | 653 EXPECT_EQ(0, result.val->globals.size()); |
| 639 EXPECT_EQ(0, result.val->functions.size()); | 654 EXPECT_EQ(0, result.val->functions.size()); |
| 640 EXPECT_EQ(2, result.val->data_segments.size()); | 655 EXPECT_EQ(2, result.val->data_segments.size()); |
| 641 | 656 |
| 642 WasmDataSegment* s0 = &result.val->data_segments[0]; | 657 WasmDataSegment* s0 = &result.val->data_segments[0]; |
| 643 WasmDataSegment* s1 = &result.val->data_segments[1]; | 658 WasmDataSegment* s1 = &result.val->data_segments[1]; |
| 644 | 659 |
| 645 EXPECT_EQ(0x7ffee, s0->dest_addr); | 660 EXPECT_EQ(0x7ffee, s0->dest_addr); |
| 646 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset); | 661 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset); |
| 647 EXPECT_EQ(4, s0->source_size); | 662 EXPECT_EQ(4, s0->source_size); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 663 | 678 |
| 664 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) { | 679 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) { |
| 665 int mem_size = mem_pages * 0x10000; // 64k pages. | 680 int mem_size = mem_pages * 0x10000; // 64k pages. |
| 666 | 681 |
| 667 for (int dest_addr = mem_size - source_size; | 682 for (int dest_addr = mem_size - source_size; |
| 668 dest_addr < mem_size + source_size; dest_addr++) { | 683 dest_addr < mem_size + source_size; dest_addr++) { |
| 669 byte data[] = {SECTION(MEMORY, 3), | 684 byte data[] = {SECTION(MEMORY, 3), |
| 670 mem_pages, | 685 mem_pages, |
| 671 mem_pages, | 686 mem_pages, |
| 672 1, | 687 1, |
| 673 SECTION(DATA_SEGMENTS, 14), | 688 SECTION(DATA_SEGMENTS, 8), |
| 674 1, | 689 1, |
| 675 U32V_3(dest_addr), | 690 U32V_3(dest_addr), |
| 676 U32V_1(source_size), | 691 U32V_1(source_size), |
| 677 'a', | 692 'a', |
| 678 'b', | 693 'b', |
| 679 'c'}; | 694 'c'}; |
| 680 | 695 |
| 681 if (dest_addr <= (mem_size - source_size)) { | 696 if (dest_addr <= (mem_size - source_size)) { |
| 682 EXPECT_VERIFIES(data); | 697 EXPECT_VERIFIES(data); |
| 683 } else { | 698 } else { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 694 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { | 709 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { |
| 695 static const byte data[] = { | 710 static const byte data[] = { |
| 696 // sig#0 ------------------------------------------------------- | 711 // sig#0 ------------------------------------------------------- |
| 697 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void | 712 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void |
| 698 // func#0 ------------------------------------------------------ | 713 // func#0 ------------------------------------------------------ |
| 699 SECTION(FUNCTIONS, 4), 1, FUNCTION(0, 0), | 714 SECTION(FUNCTIONS, 4), 1, FUNCTION(0, 0), |
| 700 // indirect table ---------------------------------------------- | 715 // indirect table ---------------------------------------------- |
| 701 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; | 716 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; |
| 702 | 717 |
| 703 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 718 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 704 EXPECT_TRUE(result.ok()); | 719 EXPECT_OK(result); |
| 705 if (result.ok()) { | 720 if (result.ok()) { |
| 706 EXPECT_EQ(1, result.val->signatures.size()); | 721 EXPECT_EQ(1, result.val->signatures.size()); |
| 707 EXPECT_EQ(1, result.val->functions.size()); | 722 EXPECT_EQ(1, result.val->functions.size()); |
| 708 EXPECT_EQ(1, result.val->function_table.size()); | 723 EXPECT_EQ(1, result.val->function_table.size()); |
| 709 EXPECT_EQ(0, result.val->function_table[0]); | 724 EXPECT_EQ(0, result.val->function_table[0]); |
| 710 } | 725 } |
| 711 if (result.val) delete result.val; | 726 if (result.val) delete result.val; |
| 712 } | 727 } |
| 713 | 728 |
| 714 | 729 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 728 U32V_1(1), // -- | 743 U32V_1(1), // -- |
| 729 U32V_1(2), // -- | 744 U32V_1(2), // -- |
| 730 U32V_1(3), // -- | 745 U32V_1(3), // -- |
| 731 U32V_1(0), // -- | 746 U32V_1(0), // -- |
| 732 U32V_1(1), // -- | 747 U32V_1(1), // -- |
| 733 U32V_1(2), // -- | 748 U32V_1(2), // -- |
| 734 U32V_1(3), // -- | 749 U32V_1(3), // -- |
| 735 }; | 750 }; |
| 736 | 751 |
| 737 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 752 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 738 EXPECT_TRUE(result.ok()); | 753 EXPECT_OK(result); |
| 739 if (result.ok()) { | 754 if (result.ok()) { |
| 740 EXPECT_EQ(2, result.val->signatures.size()); | 755 EXPECT_EQ(2, result.val->signatures.size()); |
| 741 EXPECT_EQ(4, result.val->functions.size()); | 756 EXPECT_EQ(4, result.val->functions.size()); |
| 742 EXPECT_EQ(8, result.val->function_table.size()); | 757 EXPECT_EQ(8, result.val->function_table.size()); |
| 743 for (int i = 0; i < 8; i++) { | 758 for (int i = 0; i < 8; i++) { |
| 744 EXPECT_EQ(i & 3, result.val->function_table[i]); | 759 EXPECT_EQ(i & 3, result.val->function_table[i]); |
| 745 } | 760 } |
| 746 } | 761 } |
| 747 if (result.val) delete result.val; | 762 if (result.val) delete result.val; |
| 748 } | 763 } |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 4, // locals | 924 4, // locals |
| 910 3, kLocalI32, // -- | 925 3, kLocalI32, // -- |
| 911 4, kLocalI64, // -- | 926 4, kLocalI64, // -- |
| 912 5, kLocalF32, // -- | 927 5, kLocalF32, // -- |
| 913 6, kLocalF64, // -- | 928 6, kLocalF64, // -- |
| 914 kExprNop // body | 929 kExprNop // body |
| 915 }; | 930 }; |
| 916 | 931 |
| 917 FunctionResult result = DecodeWasmFunction(isolate(), zone(), nullptr, data, | 932 FunctionResult result = DecodeWasmFunction(isolate(), zone(), nullptr, data, |
| 918 data + arraysize(data)); | 933 data + arraysize(data)); |
| 919 EXPECT_TRUE(result.ok()); | 934 EXPECT_OK(result); |
| 920 | 935 |
| 921 if (result.val && result.ok()) { | 936 if (result.val && result.ok()) { |
| 922 WasmFunction* function = result.val; | 937 WasmFunction* function = result.val; |
| 923 EXPECT_EQ(0, function->sig->parameter_count()); | 938 EXPECT_EQ(0, function->sig->parameter_count()); |
| 924 EXPECT_EQ(0, function->sig->return_count()); | 939 EXPECT_EQ(0, function->sig->return_count()); |
| 925 EXPECT_EQ(0, function->name_offset); | 940 EXPECT_EQ(0, function->name_offset); |
| 926 EXPECT_EQ(2, function->code_start_offset); | 941 EXPECT_EQ(2, function->code_start_offset); |
| 927 EXPECT_EQ(arraysize(data), function->code_end_offset); | 942 EXPECT_EQ(arraysize(data), function->code_end_offset); |
| 928 // TODO(titzer): verify encoding of local declarations | 943 // TODO(titzer): verify encoding of local declarations |
| 929 EXPECT_FALSE(function->external); | 944 EXPECT_FALSE(function->external); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 }; | 1039 }; |
| 1025 EXPECT_FAILURE(data); | 1040 EXPECT_FAILURE(data); |
| 1026 } | 1041 } |
| 1027 | 1042 |
| 1028 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) { | 1043 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) { |
| 1029 static const byte data[] = { | 1044 static const byte data[] = { |
| 1030 3, // Section size. | 1045 3, // Section size. |
| 1031 1, | 1046 1, |
| 1032 '\0', // Section name: LEB128 1, string '\0' | 1047 '\0', // Section name: LEB128 1, string '\0' |
| 1033 0, // one byte section | 1048 0, // one byte section |
| 1034 SECTION(GLOBALS, 7), | 1049 SECTION(GLOBALS, 4), |
| 1035 1, | 1050 1, |
| 1036 0, // name length | 1051 0, // name length |
| 1037 kMemI32, // memory type | 1052 kMemI32, // memory type |
| 1038 0, // exported | 1053 0, // exported |
| 1039 }; | 1054 }; |
| 1040 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 1055 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 1041 EXPECT_TRUE(result.ok()); | 1056 EXPECT_OK(result); |
| 1042 | 1057 |
| 1043 EXPECT_EQ(1, result.val->globals.size()); | 1058 EXPECT_EQ(1, result.val->globals.size()); |
| 1044 EXPECT_EQ(0, result.val->functions.size()); | 1059 EXPECT_EQ(0, result.val->functions.size()); |
| 1045 EXPECT_EQ(0, result.val->data_segments.size()); | 1060 EXPECT_EQ(0, result.val->data_segments.size()); |
| 1046 | 1061 |
| 1047 WasmGlobal* global = &result.val->globals.back(); | 1062 WasmGlobal* global = &result.val->globals.back(); |
| 1048 | 1063 |
| 1049 EXPECT_EQ(0, global->name_length); | 1064 EXPECT_EQ(0, global->name_length); |
| 1050 EXPECT_EQ(MachineType::Int32(), global->type); | 1065 EXPECT_EQ(MachineType::Int32(), global->type); |
| 1051 EXPECT_EQ(0, global->offset); | 1066 EXPECT_EQ(0, global->offset); |
| 1052 EXPECT_FALSE(global->exported); | 1067 EXPECT_FALSE(global->exported); |
| 1053 | 1068 |
| 1054 if (result.val) delete result.val; | 1069 if (result.val) delete result.val; |
| 1055 } | 1070 } |
| 1056 | 1071 |
| 1057 TEST_F(WasmModuleVerifyTest, ImportTable_empty) { | 1072 TEST_F(WasmModuleVerifyTest, ImportTable_empty) { |
| 1058 static const byte data[] = {SECTION(SIGNATURES, 1), 0, | 1073 static const byte data[] = {SECTION(SIGNATURES, 1), 0, |
| 1059 SECTION(IMPORT_TABLE, 1), 0}; | 1074 SECTION(IMPORT_TABLE, 1), 0}; |
| 1060 EXPECT_VERIFIES(data); | 1075 EXPECT_VERIFIES(data); |
| 1061 } | 1076 } |
| 1062 | 1077 |
| 1063 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { | 1078 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs1) { |
| 1064 static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0}; | 1079 static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0}; |
| 1080 EXPECT_VERIFIES(data); |
| 1081 } |
| 1082 |
| 1083 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs2) { |
| 1084 static const byte data[] = { |
| 1085 SECTION(IMPORT_TABLE, 6), 1, // sig table |
| 1086 IMPORT_SIG_INDEX(0), // sig index |
| 1087 NAME_LENGTH(1), 'm', // module name |
| 1088 NAME_LENGTH(1), 'f', // function name |
| 1089 }; |
| 1065 EXPECT_FAILURE(data); | 1090 EXPECT_FAILURE(data); |
| 1066 } | 1091 } |
| 1067 | 1092 |
| 1068 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { | 1093 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { |
| 1069 static const byte data[] = { | 1094 static const byte data[] = { |
| 1070 SECTION(SIGNATURES, 1), 0, SECTION(IMPORT_TABLE, 6), 1, | 1095 SECTION(SIGNATURES, 1), 0, SECTION(IMPORT_TABLE, 6), 1, |
| 1071 IMPORT_SIG_INDEX(0), // sig index | 1096 IMPORT_SIG_INDEX(0), // sig index |
| 1072 NAME_LENGTH(1), 'm', // module name | 1097 NAME_LENGTH(1), 'm', // module name |
| 1073 NAME_LENGTH(1), 'f', // function name | 1098 NAME_LENGTH(1), 'f', // function name |
| 1074 }; | 1099 }; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1155 } | 1180 } |
| 1156 | 1181 |
| 1157 TEST_F(WasmModuleVerifyTest, ExportTableOne) { | 1182 TEST_F(WasmModuleVerifyTest, ExportTableOne) { |
| 1158 static const byte data[] = { | 1183 static const byte data[] = { |
| 1159 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), | 1184 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), |
| 1160 1, // sigs | 1185 1, // sigs |
| 1161 VOID_VOID_SIG, // -- | 1186 VOID_VOID_SIG, // -- |
| 1162 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE), | 1187 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE), |
| 1163 1, // functions | 1188 1, // functions |
| 1164 EMPTY_FUNCTION(0), // -- | 1189 EMPTY_FUNCTION(0), // -- |
| 1165 SECTION(EXPORT_TABLE, 7), | 1190 SECTION(EXPORT_TABLE, 3), |
| 1166 1, // exports | 1191 1, // exports |
| 1167 FUNC_INDEX(0), // -- | 1192 FUNC_INDEX(0), // -- |
| 1168 NO_NAME // -- | 1193 NO_NAME // -- |
| 1169 }; | 1194 }; |
| 1170 EXPECT_VERIFIES(data); | 1195 EXPECT_VERIFIES(data); |
| 1171 } | 1196 } |
| 1172 | 1197 |
| 1173 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { | 1198 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { |
| 1174 static const byte data[] = { | 1199 static const byte data[] = { |
| 1175 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), | 1200 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1262 }; | 1287 }; |
| 1263 | 1288 |
| 1264 for (int length = 33; length < sizeof(data); length++) { | 1289 for (int length = 33; length < sizeof(data); length++) { |
| 1265 ModuleResult result = DecodeModule(data, data + length); | 1290 ModuleResult result = DecodeModule(data, data + length); |
| 1266 EXPECT_FALSE(result.ok()); | 1291 EXPECT_FALSE(result.ok()); |
| 1267 if (result.val) delete result.val; | 1292 if (result.val) delete result.val; |
| 1268 } | 1293 } |
| 1269 } | 1294 } |
| 1270 | 1295 |
| 1271 #define SIGNATURES_SECTION(count, ...) \ | 1296 #define SIGNATURES_SECTION(count, ...) \ |
| 1272 SECTION(SIGNATURES, 1 + 3 * (count)), U32V_1(count), __VA_ARGS__ | 1297 SECTION(SIGNATURES, 1 + 2 * (count)), U32V_1(count), __VA_ARGS__ |
| 1273 #define FUNCTION_SIGNATURES_SECTION(count, ...) \ | 1298 #define FUNCTION_SIGNATURES_SECTION(count, ...) \ |
| 1274 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__ | 1299 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__ |
| 1275 | 1300 |
| 1276 #define FOO_STRING 3, 'f', 'o', 'o' | 1301 #define FOO_STRING 3, 'f', 'o', 'o' |
| 1277 #define NO_LOCAL_NAMES 0 | 1302 #define NO_LOCAL_NAMES 0 |
| 1278 | 1303 |
| 1279 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0 | 1304 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0 |
| 1280 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0 | 1305 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0 |
| 1281 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0 | 1306 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0 |
| 1282 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0 | 1307 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0 |
| 1283 | 1308 |
| 1284 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) { | 1309 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) { |
| 1285 static const byte data[] = {SECTION(SIGNATURES, 1), 0, | 1310 static const byte data[] = { |
| 1286 SECTION(FUNCTION_SIGNATURES, 1), 0}; | 1311 SECTION(SIGNATURES, 1), 0, // -- |
| 1312 SECTION(FUNCTION_SIGNATURES, 1), 0 // -- |
| 1313 }; // -- |
| 1287 EXPECT_VERIFIES(data); | 1314 EXPECT_VERIFIES(data); |
| 1288 } | 1315 } |
| 1289 | 1316 |
| 1290 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) { | 1317 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) { |
| 1291 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), | 1318 static const byte data[] = { |
| 1292 FUNCTION_SIGNATURES_SECTION(1, 0)}; | 1319 SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
| 1320 FUNCTION_SIGNATURES_SECTION(1, 0) // -- |
| 1321 }; |
| 1293 EXPECT_VERIFIES(data); | 1322 EXPECT_VERIFIES(data); |
| 1294 } | 1323 } |
| 1295 | 1324 |
| 1296 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) { | 1325 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) { |
| 1297 static const byte data[] = {EMPTY_SIGNATURES_SECTION, | 1326 static const byte data[] = { |
| 1298 EMPTY_FUNCTION_SIGNATURES_SECTION, | 1327 EMPTY_SIGNATURES_SECTION, // -- |
| 1299 EMPTY_FUNCTION_BODIES_SECTION}; | 1328 EMPTY_FUNCTION_SIGNATURES_SECTION, // -- |
| 1329 EMPTY_FUNCTION_BODIES_SECTION // -- |
| 1330 }; |
| 1300 EXPECT_VERIFIES(data); | 1331 EXPECT_VERIFIES(data); |
| 1301 } | 1332 } |
| 1302 | 1333 |
| 1303 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) { | 1334 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) { |
| 1304 static const byte data[] = { | 1335 static const byte data[] = { |
| 1305 SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0), | 1336 SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
| 1306 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, EMPTY_BODY}; | 1337 FUNCTION_SIGNATURES_SECTION(1, 0), // -- |
| 1338 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, EMPTY_BODY // -- |
| 1339 }; |
| 1307 EXPECT_VERIFIES(data); | 1340 EXPECT_VERIFIES(data); |
| 1308 } | 1341 } |
| 1309 | 1342 |
| 1310 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) { | 1343 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) { |
| 1311 static const byte data[] = { | 1344 static const byte data[] = { |
| 1312 SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0), | 1345 SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
| 1313 SECTION(FUNCTION_BODIES, 1 + NOP_BODY_SIZE), 1, NOP_BODY}; | 1346 FUNCTION_SIGNATURES_SECTION(1, 0), // -- |
| 1347 SECTION(FUNCTION_BODIES, 1 + NOP_BODY_SIZE), 1, NOP_BODY // -- |
| 1348 }; |
| 1314 EXPECT_VERIFIES(data); | 1349 EXPECT_VERIFIES(data); |
| 1315 } | 1350 } |
| 1316 | 1351 |
| 1317 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) { | 1352 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) { |
| 1318 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), | 1353 static const byte data[] = { |
| 1319 FUNCTION_SIGNATURES_SECTION(2, 0, 0), | 1354 SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
| 1320 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, | 1355 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // -- |
| 1321 EMPTY_BODY}; | 1356 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, // -- |
| 1357 EMPTY_BODY // -- |
| 1358 }; |
| 1322 EXPECT_FAILURE(data); | 1359 EXPECT_FAILURE(data); |
| 1323 } | 1360 } |
| 1324 | 1361 |
| 1325 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) { | 1362 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) { |
| 1326 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), | 1363 static const byte data[] = { |
| 1327 FUNCTION_SIGNATURES_SECTION(1, 0), | 1364 SIGNATURES_SECTION(1, VOID_VOID_SIG), // -- |
| 1328 SECTION(FUNCTION_BODIES, 1 + 2 * NOP_BODY_SIZE), | 1365 FUNCTION_SIGNATURES_SECTION(1, 0), // -- |
| 1329 2, | 1366 SECTION(FUNCTION_BODIES, 1 + 2 * NOP_BODY_SIZE), // -- |
| 1330 NOP_BODY, | 1367 2, // -- |
| 1331 NOP_BODY}; | 1368 NOP_BODY, // -- |
| 1369 NOP_BODY // -- |
| 1370 }; |
| 1332 EXPECT_FAILURE(data); | 1371 EXPECT_FAILURE(data); |
| 1333 } | 1372 } |
| 1334 | 1373 |
| 1335 TEST_F(WasmModuleVerifyTest, Names_empty) { | 1374 TEST_F(WasmModuleVerifyTest, Names_empty) { |
| 1336 static const byte data[] = { | 1375 static const byte data[] = { |
| 1337 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION, | 1376 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION, |
| 1338 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION}; | 1377 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION}; |
| 1339 EXPECT_VERIFIES(data); | 1378 EXPECT_VERIFIES(data); |
| 1340 } | 1379 } |
| 1341 | 1380 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1368 NO_LOCAL_NAMES, // -- | 1407 NO_LOCAL_NAMES, // -- |
| 1369 FOO_STRING, | 1408 FOO_STRING, |
| 1370 NO_LOCAL_NAMES, // -- | 1409 NO_LOCAL_NAMES, // -- |
| 1371 }; | 1410 }; |
| 1372 EXPECT_VERIFIES(data); | 1411 EXPECT_VERIFIES(data); |
| 1373 } | 1412 } |
| 1374 | 1413 |
| 1375 } // namespace wasm | 1414 } // namespace wasm |
| 1376 } // namespace internal | 1415 } // namespace internal |
| 1377 } // namespace v8 | 1416 } // namespace v8 |
| OLD | NEW |