Chromium Code Reviews| 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-opcodes.h" | 8 #include "src/wasm/wasm-opcodes.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| 11 namespace internal { | 11 namespace internal { |
| 12 namespace wasm { | 12 namespace wasm { |
| 13 | 13 |
| 14 #define VOID_VOID_SIG 0, kLocalVoid | |
| 15 #define INT_INT_SIG 1, kLocalI32, kLocalI32 | |
| 16 #define EMPTY_FUNCTION(sig_index) 0, static_cast<byte>(sig_index), 0, 0, 0 | |
|
binji
2016/02/27 01:12:15
might was well use SIG_INDEX here too, no?
titzer
2016/02/27 01:22:24
Done.
| |
| 17 | |
| 18 #define U32(v) \ | |
| 19 static_cast<byte>(v), static_cast<byte>(v >> 8), static_cast<byte>(v >> 16), \ | |
| 20 static_cast<byte>(v >> 24) | |
| 21 #define U16(v) static_cast<byte>(v), static_cast<byte>(v >> 8) | |
| 22 #define U8(v) static_cast<byte>(v) | |
| 23 | |
| 24 #define SIG_INDEX(v) U16(v) | |
| 25 #define FUNC_INDEX(v) U16(v) | |
| 26 #define NAME_OFFSET(v) U32(v) | |
| 27 | |
| 14 class WasmModuleVerifyTest : public TestWithZone { | 28 class WasmModuleVerifyTest : public TestWithZone { |
| 15 public: | 29 public: |
| 16 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) { | 30 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) { |
| 17 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false, | 31 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false, |
| 18 false); | 32 false); |
| 19 } | 33 } |
| 20 }; | 34 }; |
| 21 | 35 |
| 22 | 36 |
| 23 #define EXPECT_VERIFIES(data) \ | 37 #define EXPECT_VERIFIES(data) \ |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 38 | 52 |
| 39 struct LocalTypePair { | 53 struct LocalTypePair { |
| 40 uint8_t code; | 54 uint8_t code; |
| 41 LocalType type; | 55 LocalType type; |
| 42 } kLocalTypes[] = {{kLocalI32, kAstI32}, | 56 } kLocalTypes[] = {{kLocalI32, kAstI32}, |
| 43 {kLocalI64, kAstI64}, | 57 {kLocalI64, kAstI64}, |
| 44 {kLocalF32, kAstF32}, | 58 {kLocalF32, kAstF32}, |
| 45 {kLocalF64, kAstF64}}; | 59 {kLocalF64, kAstF64}}; |
| 46 | 60 |
| 47 | 61 |
| 48 // TODO(titzer): use these macros everywhere below. | |
| 49 #define U32_LE(v) \ | |
| 50 static_cast<byte>(v), static_cast<byte>((v) >> 8), \ | |
| 51 static_cast<byte>((v) >> 16), static_cast<byte>((v) >> 24) | |
| 52 | |
| 53 | |
| 54 #define U16_LE(v) static_cast<byte>(v), static_cast<byte>((v) >> 8) | |
| 55 | |
| 56 | |
| 57 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { | 62 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { |
| 58 static const byte data[1]{kDeclEnd}; | 63 static const byte data[1]{kDeclEnd}; |
| 59 { | 64 { |
| 60 ModuleResult result = DecodeModule(data, data); | 65 ModuleResult result = DecodeModule(data, data); |
| 61 EXPECT_TRUE(result.ok()); | 66 EXPECT_TRUE(result.ok()); |
| 62 if (result.val) delete result.val; | 67 if (result.val) delete result.val; |
| 63 } | 68 } |
| 64 { | 69 { |
| 65 ModuleResult result = DecodeModule(data, data + 1); | 70 ModuleResult result = DecodeModule(data, data + 1); |
| 66 EXPECT_TRUE(result.ok()); | 71 EXPECT_TRUE(result.ok()); |
| 67 if (result.val) delete result.val; | 72 if (result.val) delete result.val; |
| 68 } | 73 } |
| 69 } | 74 } |
| 70 | 75 |
| 71 | 76 |
| 72 TEST_F(WasmModuleVerifyTest, OneGlobal) { | 77 TEST_F(WasmModuleVerifyTest, OneGlobal) { |
| 73 static const byte data[] = { | 78 static const byte data[] = { |
| 74 kDeclGlobals, | 79 kDeclGlobals, |
| 75 1, | 80 1, |
| 76 0, | 81 NAME_OFFSET(0), |
| 77 0, | |
| 78 0, | |
| 79 0, // name offset | |
| 80 kMemI32, // memory type | 82 kMemI32, // memory type |
| 81 0, // exported | 83 0, // exported |
| 82 }; | 84 }; |
| 83 | 85 |
| 84 { | 86 { |
| 85 // Should decode to exactly one global. | 87 // Should decode to exactly one global. |
| 86 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 88 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 87 EXPECT_TRUE(result.ok()); | 89 EXPECT_TRUE(result.ok()); |
| 88 EXPECT_EQ(1, result.val->globals->size()); | 90 EXPECT_EQ(1, result.val->globals->size()); |
| 89 EXPECT_EQ(0, result.val->functions->size()); | 91 EXPECT_EQ(0, result.val->functions->size()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 } else { | 130 } else { |
| 129 buffer.push_back(static_cast<byte>(out)); | 131 buffer.push_back(static_cast<byte>(out)); |
| 130 break; | 132 break; |
| 131 } | 133 } |
| 132 } | 134 } |
| 133 } | 135 } |
| 134 | 136 |
| 135 | 137 |
| 136 TEST_F(WasmModuleVerifyTest, NGlobals) { | 138 TEST_F(WasmModuleVerifyTest, NGlobals) { |
| 137 static const byte data[] = { | 139 static const byte data[] = { |
| 138 0, 0, 0, 0, // name offset | 140 NAME_OFFSET(0), // name offset |
| 139 kMemI32, // memory type | 141 kMemI32, // memory type |
| 140 0, // exported | 142 0, // exported |
| 141 }; | 143 }; |
| 142 for (uint32_t i = 0; i < 1000000; i = i * 7 + 1) { | 144 for (uint32_t i = 0; i < 1000000; i = i * 7 + 1) { |
| 143 std::vector<byte> buffer; | 145 std::vector<byte> buffer; |
| 144 buffer.push_back(kDeclGlobals); | 146 buffer.push_back(kDeclGlobals); |
| 145 AppendUint32v(buffer, i); | 147 AppendUint32v(buffer, i); |
| 146 for (uint32_t j = 0; j < i; j++) { | 148 for (uint32_t j = 0; j < i; j++) { |
| 147 buffer.insert(buffer.end(), data, data + arraysize(data)); | 149 buffer.insert(buffer.end(), data, data + arraysize(data)); |
| 148 } | 150 } |
| 149 | 151 |
| 150 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); | 152 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); |
| 151 EXPECT_TRUE(result.ok()); | 153 EXPECT_TRUE(result.ok()); |
| 152 if (result.val) delete result.val; | 154 if (result.val) delete result.val; |
| 153 } | 155 } |
| 154 } | 156 } |
| 155 | 157 |
| 156 | 158 |
| 157 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { | 159 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { |
| 158 static const byte data[] = { | 160 static const byte data[] = { |
| 159 kDeclGlobals, | 161 kDeclGlobals, |
| 160 1, // declare one global | 162 1, // declare one global |
| 161 0, | 163 0, |
| 162 3, | 164 3, |
| 163 0, | 165 NAME_OFFSET(0), // name offset |
|
binji
2016/02/27 01:12:15
this one should be invalid
titzer
2016/02/27 01:21:58
Ah, yeah, the offset should be 3 * 256 or somethin
| |
| 164 0, // name offset | 166 kMemI32, // memory type |
| 165 kMemI32, // memory type | 167 0, // exported |
| 166 0, // exported | |
| 167 }; | 168 }; |
| 168 | 169 |
| 169 EXPECT_FAILURE(data); | 170 EXPECT_FAILURE(data); |
| 170 } | 171 } |
| 171 | 172 |
| 172 | 173 |
| 173 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { | 174 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { |
| 174 static const byte data[] = { | 175 static const byte data[] = { |
| 175 kDeclGlobals, | 176 kDeclGlobals, |
| 176 1, // declare one global | 177 1, // declare one global |
| 177 0, | 178 NAME_OFFSET(0), // name offset |
| 178 0, | 179 33, // memory type |
| 179 0, | 180 0, // exported |
| 180 0, // name offset | |
| 181 33, // memory type | |
| 182 0, // exported | |
| 183 }; | 181 }; |
| 184 | 182 |
| 185 EXPECT_FAILURE(data); | 183 EXPECT_FAILURE(data); |
| 186 } | 184 } |
| 187 | 185 |
| 188 | 186 |
| 189 TEST_F(WasmModuleVerifyTest, TwoGlobals) { | 187 TEST_F(WasmModuleVerifyTest, TwoGlobals) { |
| 190 static const byte data[] = { | 188 static const byte data[] = { |
| 191 kDeclGlobals, | 189 kDeclGlobals, |
| 192 2, | 190 2, |
| 193 0, | 191 NAME_OFFSET(0), // #0: name offset |
| 194 0, | 192 kMemF32, // memory type |
| 195 0, | 193 0, // exported |
| 196 0, // #0: name offset | 194 NAME_OFFSET(0), // #1: name offset |
| 197 kMemF32, // memory type | 195 kMemF64, // memory type |
| 198 0, // exported | 196 1, // exported |
| 199 0, | |
| 200 0, | |
| 201 0, | |
| 202 0, // #1: name offset | |
| 203 kMemF64, // memory type | |
| 204 1, // exported | |
| 205 }; | 197 }; |
| 206 | 198 |
| 207 { | 199 { |
| 208 // Should decode to exactly two globals. | 200 // Should decode to exactly two globals. |
| 209 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 201 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 210 EXPECT_TRUE(result.ok()); | 202 EXPECT_TRUE(result.ok()); |
| 211 EXPECT_EQ(2, result.val->globals->size()); | 203 EXPECT_EQ(2, result.val->globals->size()); |
| 212 EXPECT_EQ(0, result.val->functions->size()); | 204 EXPECT_EQ(0, result.val->functions->size()); |
| 213 EXPECT_EQ(0, result.val->data_segments->size()); | 205 EXPECT_EQ(0, result.val->data_segments->size()); |
| 214 | 206 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 231 for (size_t size = 1; size < arraysize(data); size++) { | 223 for (size_t size = 1; size < arraysize(data); size++) { |
| 232 // Should fall off end of module bytes. | 224 // Should fall off end of module bytes. |
| 233 ModuleResult result = DecodeModule(data, data + size); | 225 ModuleResult result = DecodeModule(data, data + size); |
| 234 EXPECT_FALSE(result.ok()); | 226 EXPECT_FALSE(result.ok()); |
| 235 if (result.val) delete result.val; | 227 if (result.val) delete result.val; |
| 236 } | 228 } |
| 237 } | 229 } |
| 238 | 230 |
| 239 | 231 |
| 240 TEST_F(WasmModuleVerifyTest, OneSignature) { | 232 TEST_F(WasmModuleVerifyTest, OneSignature) { |
| 241 static const byte data[] = { | 233 { |
| 242 kDeclSignatures, 1, 0, kLocalVoid // void -> void | 234 static const byte data[] = {kDeclSignatures, 1, VOID_VOID_SIG}; |
| 243 }; | 235 EXPECT_VERIFIES(data); |
| 244 EXPECT_VERIFIES(data); | 236 } |
| 237 | |
| 238 { | |
| 239 static const byte data[] = {kDeclSignatures, 1, INT_INT_SIG}; | |
| 240 EXPECT_VERIFIES(data); | |
| 241 } | |
| 245 } | 242 } |
| 246 | 243 |
| 247 | 244 |
| 248 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { | 245 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { |
| 249 static const byte data[] = { | 246 static const byte data[] = { |
| 250 kDeclSignatures, | 247 kDeclSignatures, |
| 251 3, | 248 3, |
| 252 0, | 249 0, |
| 253 kLocalVoid, // void -> void | 250 kLocalVoid, // void -> void |
| 254 1, | 251 1, |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 280 EXPECT_FALSE(result.ok()); | 277 EXPECT_FALSE(result.ok()); |
| 281 if (result.val) delete result.val; | 278 if (result.val) delete result.val; |
| 282 } | 279 } |
| 283 } | 280 } |
| 284 | 281 |
| 285 | 282 |
| 286 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { | 283 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { |
| 287 static const byte data[] = { | 284 static const byte data[] = { |
| 288 kDeclFunctions, 1, | 285 kDeclFunctions, 1, |
| 289 // func#0 ------------------------------------------------------ | 286 // func#0 ------------------------------------------------------ |
| 290 0, 0, // signature index | 287 SIG_INDEX(0), // signature index |
| 291 0, 0, 0, 0, // name offset | 288 NAME_OFFSET(0), // name offset |
| 292 0, 0, 0, 0, // code start offset | 289 U32(0), // code start offset |
| 293 0, 0, 0, 0, // code end offset | 290 U32(0), // code end offset |
| 294 1, 2, // local int32 count | 291 U16(899), // local int32 count |
| 295 3, 4, // local int64 count | 292 U16(799), // local int64 count |
| 296 5, 6, // local float32 count | 293 U16(699), // local float32 count |
| 297 7, 8, // local float64 count | 294 U16(599), // local float64 count |
| 298 0, // exported | 295 0, // exported |
| 299 1 // external | 296 1 // external |
| 300 }; | 297 }; |
| 301 | 298 |
| 302 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 299 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 303 EXPECT_FALSE(result.ok()); | 300 EXPECT_FALSE(result.ok()); |
| 304 if (result.val) delete result.val; | 301 if (result.val) delete result.val; |
| 305 } | 302 } |
| 306 | 303 |
| 307 | 304 |
| 308 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { | 305 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
| 309 const int kCodeStartOffset = 23; | 306 const int kCodeStartOffset = 23; |
| 310 const int kCodeEndOffset = kCodeStartOffset + 1; | 307 const int kCodeEndOffset = kCodeStartOffset + 1; |
| 311 | 308 |
| 312 static const byte data[] = { | 309 static const byte data[] = { |
| 313 kDeclSignatures, 1, | 310 kDeclSignatures, 1, |
| 314 // sig#0 ------------------------------------------------------- | 311 // sig#0 ------------------------------------------------------- |
| 315 0, 0, // void -> void | 312 VOID_VOID_SIG, |
| 316 // func#0 ------------------------------------------------------ | 313 // func#0 ------------------------------------------------------ |
| 317 kDeclFunctions, 1, | 314 kDeclFunctions, 1, |
| 318 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 0, | 315 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 0, |
|
binji
2016/02/27 01:12:15
SIG_INDEX(0) here?
titzer
2016/02/27 01:21:58
Done.
| |
| 319 0, // signature index | 316 0, // signature index |
| 320 9, 0, 0, 0, // name offset | 317 NAME_OFFSET(9), // name offset |
| 321 11, 2, // local int32 count | 318 U16(1466), // local int32 count |
| 322 13, 4, // local int64 count | 319 U16(1355), // local int64 count |
| 323 15, 6, // local float32 count | 320 U16(1244), // local float32 count |
| 324 17, 8, // local float64 count | 321 U16(1133), // local float64 count |
| 325 1, 0, // size | 322 1, 0, // size |
| 326 kExprNop, | 323 kExprNop, |
| 327 }; | 324 }; |
| 328 | 325 |
| 329 { | 326 { |
| 330 // Should decode to exactly one function. | 327 // Should decode to exactly one function. |
| 331 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 328 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 332 EXPECT_TRUE(result.ok()); | 329 EXPECT_TRUE(result.ok()); |
| 333 EXPECT_EQ(0, result.val->globals->size()); | 330 EXPECT_EQ(0, result.val->globals->size()); |
| 334 EXPECT_EQ(1, result.val->signatures->size()); | 331 EXPECT_EQ(1, result.val->signatures->size()); |
| 335 EXPECT_EQ(1, result.val->functions->size()); | 332 EXPECT_EQ(1, result.val->functions->size()); |
| 336 EXPECT_EQ(0, result.val->data_segments->size()); | 333 EXPECT_EQ(0, result.val->data_segments->size()); |
| 337 EXPECT_EQ(0, result.val->function_table->size()); | 334 EXPECT_EQ(0, result.val->function_table->size()); |
| 338 | 335 |
| 339 WasmFunction* function = &result.val->functions->back(); | 336 WasmFunction* function = &result.val->functions->back(); |
| 340 | 337 |
| 341 EXPECT_EQ(9, function->name_offset); | 338 EXPECT_EQ(9, function->name_offset); |
| 342 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 339 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
| 343 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 340 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
| 344 | 341 |
| 345 EXPECT_EQ(523, function->local_i32_count); | 342 EXPECT_EQ(1466, function->local_i32_count); |
| 346 EXPECT_EQ(1037, function->local_i64_count); | 343 EXPECT_EQ(1355, function->local_i64_count); |
| 347 EXPECT_EQ(1551, function->local_f32_count); | 344 EXPECT_EQ(1244, function->local_f32_count); |
| 348 EXPECT_EQ(2065, function->local_f64_count); | 345 EXPECT_EQ(1133, function->local_f64_count); |
| 349 | 346 |
| 350 EXPECT_TRUE(function->exported); | 347 EXPECT_TRUE(function->exported); |
| 351 EXPECT_FALSE(function->external); | 348 EXPECT_FALSE(function->external); |
| 352 | 349 |
| 353 if (result.val) delete result.val; | 350 if (result.val) delete result.val; |
| 354 } | 351 } |
| 355 | 352 |
| 356 for (size_t size = 5; size < arraysize(data); size++) { | 353 for (size_t size = 5; size < arraysize(data); size++) { |
| 357 // Should fall off end of module bytes. | 354 // Should fall off end of module bytes. |
| 358 ModuleResult result = DecodeModule(data, data + size); | 355 ModuleResult result = DecodeModule(data, data + size); |
| 359 EXPECT_FALSE(result.ok()); | 356 EXPECT_FALSE(result.ok()); |
| 360 if (result.val) delete result.val; | 357 if (result.val) delete result.val; |
| 361 } | 358 } |
| 362 } | 359 } |
| 363 | 360 |
| 364 | 361 |
| 365 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { | 362 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { |
| 366 static const byte data[] = { | 363 static const byte data[] = { |
| 367 kDeclSignatures, 1, | 364 kDeclSignatures, 1, |
| 368 // sig#0 ------------------------------------------------------- | 365 // sig#0 ------------------------------------------------------- |
| 369 0, 0, // void -> void | 366 VOID_VOID_SIG, kDeclFunctions, 1, |
| 370 kDeclFunctions, 1, | |
| 371 // func#0 ------------------------------------------------------ | 367 // func#0 ------------------------------------------------------ |
| 372 kDeclFunctionImport, // no name, no locals, imported | 368 kDeclFunctionImport, // no name, no locals, imported |
| 373 0, 0, // signature index | 369 U16(0), |
|
binji
2016/02/27 01:12:15
SIG_INDEX
titzer
2016/02/27 01:21:58
Done.
| |
| 374 }; | 370 }; |
| 375 | 371 |
| 376 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 372 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 377 EXPECT_TRUE(result.ok()); | 373 EXPECT_TRUE(result.ok()); |
| 378 EXPECT_EQ(1, result.val->functions->size()); | 374 EXPECT_EQ(1, result.val->functions->size()); |
| 379 WasmFunction* function = &result.val->functions->back(); | 375 WasmFunction* function = &result.val->functions->back(); |
| 380 | 376 |
| 381 EXPECT_EQ(0, function->name_offset); | 377 EXPECT_EQ(0, function->name_offset); |
| 382 EXPECT_EQ(0, function->code_start_offset); | 378 EXPECT_EQ(0, function->code_start_offset); |
| 383 EXPECT_EQ(0, function->code_end_offset); | 379 EXPECT_EQ(0, function->code_end_offset); |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 636 | 632 |
| 637 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) { | 633 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) { |
| 638 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) { | 634 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) { |
| 639 byte data[] = { | 635 byte data[] = { |
| 640 kDeclMemory, | 636 kDeclMemory, |
| 641 mem_size_log2, | 637 mem_size_log2, |
| 642 mem_size_log2, | 638 mem_size_log2, |
| 643 1, | 639 1, |
| 644 kDeclDataSegments, | 640 kDeclDataSegments, |
| 645 1, | 641 1, |
| 646 U32_LE(dest_addr), | 642 U32(dest_addr), |
| 647 U32_LE(source_offset), | 643 U32(source_offset), |
| 648 U32_LE(source_size), | 644 U32(source_size), |
| 649 1, // init | 645 1, // init |
| 650 }; | 646 }; |
| 651 | 647 |
| 652 STATIC_ASSERT(kDataSize == arraysize(data)); | 648 STATIC_ASSERT(kDataSize == arraysize(data)); |
| 653 | 649 |
| 654 if (source_offset < kDataSize && source_size >= 0 && | 650 if (source_offset < kDataSize && source_size >= 0 && |
| 655 (source_offset + source_size) <= kDataSize) { | 651 (source_offset + source_size) <= kDataSize) { |
| 656 EXPECT_VERIFIES(data); | 652 EXPECT_VERIFIES(data); |
| 657 } else { | 653 } else { |
| 658 EXPECT_FAILURE(data); | 654 EXPECT_FAILURE(data); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 671 | 667 |
| 672 for (int dest_addr = mem_size - source_size; | 668 for (int dest_addr = mem_size - source_size; |
| 673 dest_addr < mem_size + source_size; dest_addr++) { | 669 dest_addr < mem_size + source_size; dest_addr++) { |
| 674 byte data[] = { | 670 byte data[] = { |
| 675 kDeclMemory, | 671 kDeclMemory, |
| 676 mem_size_log2, | 672 mem_size_log2, |
| 677 mem_size_log2, | 673 mem_size_log2, |
| 678 1, | 674 1, |
| 679 kDeclDataSegments, | 675 kDeclDataSegments, |
| 680 1, | 676 1, |
| 681 U32_LE(dest_addr), | 677 U32(dest_addr), |
| 682 U32_LE(source_offset), | 678 U32(source_offset), |
| 683 U32_LE(source_size), | 679 U32(source_size), |
| 684 1, // init | 680 1, // init |
| 685 }; | 681 }; |
| 686 | 682 |
| 687 if (dest_addr <= (mem_size - source_size)) { | 683 if (dest_addr <= (mem_size - source_size)) { |
| 688 EXPECT_VERIFIES(data); | 684 EXPECT_VERIFIES(data); |
| 689 } else { | 685 } else { |
| 690 EXPECT_FAILURE(data); | 686 EXPECT_FAILURE(data); |
| 691 } | 687 } |
| 692 } | 688 } |
| 693 } | 689 } |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1011 EXPECT_VERIFIES(data); | 1007 EXPECT_VERIFIES(data); |
| 1012 } | 1008 } |
| 1013 | 1009 |
| 1014 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { | 1010 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { |
| 1015 static const byte data[] = {kDeclImportTable, 0}; | 1011 static const byte data[] = {kDeclImportTable, 0}; |
| 1016 EXPECT_FAILURE(data); | 1012 EXPECT_FAILURE(data); |
| 1017 } | 1013 } |
| 1018 | 1014 |
| 1019 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { | 1015 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { |
| 1020 static const byte data[] = { | 1016 static const byte data[] = { |
| 1021 kDeclSignatures, | 1017 kDeclSignatures, 0, kDeclImportTable, 1, |
| 1022 0, | 1018 SIG_INDEX(0), // sig index |
| 1023 kDeclImportTable, | 1019 NAME_OFFSET(1), // module name |
| 1024 1, | 1020 NAME_OFFSET(1), // function name |
| 1025 0, | |
| 1026 0, // sig index | |
| 1027 1, | |
| 1028 0, | |
| 1029 0, | |
| 1030 0, // module name | |
| 1031 1, | |
| 1032 0, | |
| 1033 0, | |
| 1034 0 // function name | |
| 1035 }; | 1021 }; |
| 1036 EXPECT_FAILURE(data); | 1022 EXPECT_FAILURE(data); |
| 1037 } | 1023 } |
| 1038 | 1024 |
| 1039 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { | 1025 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { |
| 1040 static const byte data[] = { | 1026 static const byte data[] = { |
| 1041 kDeclSignatures, | 1027 kDeclSignatures, |
| 1042 1, | 1028 1, |
| 1043 0, | 1029 VOID_VOID_SIG, |
| 1044 static_cast<byte>(kAstStmt), | |
| 1045 kDeclImportTable, | 1030 kDeclImportTable, |
| 1046 1, | 1031 1, // -- |
| 1047 0, | 1032 SIG_INDEX(0), // sig index |
| 1048 0, // sig index | 1033 NAME_OFFSET(1), // module name |
| 1049 1, | 1034 NAME_OFFSET(1) // function name |
| 1050 0, | |
| 1051 0, | |
| 1052 0, // module name | |
| 1053 1, | |
| 1054 0, | |
| 1055 0, | |
| 1056 0 // function name | |
| 1057 }; | 1035 }; |
| 1058 EXPECT_VERIFIES(data); | 1036 EXPECT_VERIFIES(data); |
| 1059 } | 1037 } |
| 1060 | 1038 |
| 1061 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) { | 1039 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) { |
| 1062 static const byte data[] = { | 1040 static const byte data[] = { |
| 1063 kDeclSignatures, | 1041 kDeclSignatures, 1, VOID_VOID_SIG, kDeclImportTable, 1, |
| 1064 1, | 1042 SIG_INDEX(0), // sig index |
| 1065 0, | 1043 NAME_OFFSET(1), // module name |
| 1066 static_cast<byte>(kAstStmt), | 1044 NAME_OFFSET(1), // function name |
| 1067 kDeclImportTable, | |
| 1068 1, | |
| 1069 0, | |
| 1070 0, // sig index | |
| 1071 1, | |
| 1072 0, | |
| 1073 0, | |
| 1074 0, // module name | |
| 1075 1, | |
| 1076 0, | |
| 1077 0, | |
| 1078 0 // function name | |
| 1079 }; | 1045 }; |
| 1080 | 1046 |
| 1081 for (size_t length = 5; length < sizeof(data); length++) { | 1047 for (size_t length = 5; length < sizeof(data); length++) { |
| 1082 ModuleResult result = DecodeModule(data, data + length); | 1048 ModuleResult result = DecodeModule(data, data + length); |
| 1083 EXPECT_FALSE(result.ok()); | 1049 EXPECT_FALSE(result.ok()); |
| 1084 if (result.val) delete result.val; | 1050 if (result.val) delete result.val; |
| 1085 } | 1051 } |
| 1086 } | 1052 } |
| 1087 | 1053 |
| 1054 TEST_F(WasmModuleVerifyTest, ExportTable_empty) { | |
| 1055 static const byte data[] = {kDeclSignatures, 0, kDeclFunctions, 0, | |
| 1056 kDeclExportTable, 0}; | |
| 1057 EXPECT_VERIFIES(data); | |
| 1058 } | |
| 1059 | |
| 1060 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) { | |
| 1061 static const byte data[] = {kDeclSignatures, 0, kDeclExportTable, 0}; | |
| 1062 EXPECT_FAILURE(data); | |
| 1063 } | |
| 1064 | |
| 1065 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) { | |
| 1066 static const byte data[] = {kDeclExportTable, 0}; | |
| 1067 EXPECT_FAILURE(data); | |
| 1068 } | |
| 1069 | |
| 1070 TEST_F(WasmModuleVerifyTest, ExportTableOne) { | |
| 1071 static const byte data[] = { | |
| 1072 kDeclSignatures, 1, // sigs | |
| 1073 VOID_VOID_SIG, // -- | |
| 1074 kDeclFunctions, 1, // functions | |
| 1075 EMPTY_FUNCTION(0), // -- | |
| 1076 kDeclExportTable, 1, // exports | |
| 1077 FUNC_INDEX(0), // -- | |
| 1078 NAME_OFFSET(0) // -- | |
| 1079 }; | |
| 1080 EXPECT_VERIFIES(data); | |
| 1081 } | |
| 1082 | |
| 1083 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { | |
| 1084 static const byte data[] = { | |
| 1085 kDeclSignatures, 1, // sigs | |
| 1086 VOID_VOID_SIG, // -- | |
| 1087 kDeclFunctions, 1, // functions | |
| 1088 EMPTY_FUNCTION(0), // -- | |
| 1089 kDeclExportTable, 2, // exports | |
| 1090 FUNC_INDEX(0), // -- | |
| 1091 NAME_OFFSET(1), // -- | |
| 1092 FUNC_INDEX(0), // -- | |
| 1093 NAME_OFFSET(2) // -- | |
| 1094 }; | |
| 1095 EXPECT_VERIFIES(data); | |
| 1096 } | |
| 1097 | |
| 1098 TEST_F(WasmModuleVerifyTest, ExportTableThree) { | |
| 1099 static const byte data[] = { | |
| 1100 kDeclSignatures, 1, // sigs | |
| 1101 VOID_VOID_SIG, // -- | |
| 1102 kDeclFunctions, 3, // functions | |
| 1103 EMPTY_FUNCTION(0), // -- | |
| 1104 EMPTY_FUNCTION(0), // -- | |
| 1105 EMPTY_FUNCTION(0), // -- | |
| 1106 kDeclExportTable, 3, // exports | |
| 1107 FUNC_INDEX(0), // -- | |
| 1108 NAME_OFFSET(1), // -- | |
| 1109 FUNC_INDEX(1), // -- | |
| 1110 NAME_OFFSET(2), // -- | |
| 1111 FUNC_INDEX(2), // -- | |
| 1112 NAME_OFFSET(2) // -- | |
| 1113 }; | |
| 1114 EXPECT_VERIFIES(data); | |
| 1115 } | |
| 1116 | |
| 1117 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) { | |
| 1118 for (int i = 0; i < 6; i++) { | |
| 1119 const byte data[] = { | |
| 1120 kDeclSignatures, 1, // sigs | |
| 1121 VOID_VOID_SIG, // -- | |
| 1122 kDeclFunctions, 3, // functions | |
| 1123 EMPTY_FUNCTION(0), // -- | |
| 1124 EMPTY_FUNCTION(0), // -- | |
| 1125 EMPTY_FUNCTION(0), // -- | |
| 1126 kDeclExportTable, 1, // exports | |
| 1127 FUNC_INDEX(i), // -- | |
| 1128 NAME_OFFSET(1) // -- | |
| 1129 }; | |
| 1130 | |
| 1131 if (i < 3) { | |
| 1132 EXPECT_VERIFIES(data); | |
| 1133 } else { | |
| 1134 EXPECT_FAILURE(data); | |
| 1135 } | |
| 1136 } | |
| 1137 } | |
| 1138 | |
| 1139 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) { | |
| 1140 static const byte data[] = { | |
| 1141 kDeclSignatures, 1, // sigs | |
| 1142 VOID_VOID_SIG, // -- | |
| 1143 kDeclFunctions, 1, // functions | |
| 1144 EMPTY_FUNCTION(0), // -- | |
| 1145 kDeclExportTable, 1, // exports | |
| 1146 FUNC_INDEX(0), // -- | |
| 1147 NAME_OFFSET(0) // -- | |
| 1148 }; | |
| 1149 | |
| 1150 for (int length = 13; length < sizeof(data); length++) { | |
| 1151 ModuleResult result = DecodeModule(data, data + length); | |
| 1152 EXPECT_FALSE(result.ok()); | |
| 1153 if (result.val) delete result.val; | |
| 1154 } | |
| 1155 } | |
| 1156 | |
| 1088 } // namespace wasm | 1157 } // namespace wasm |
| 1089 } // namespace internal | 1158 } // namespace internal |
| 1090 } // namespace v8 | 1159 } // namespace v8 |
| OLD | NEW |