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 "src/wasm/module-decoder.h" | 5 #include "src/wasm/module-decoder.h" |
6 | 6 |
7 #include "src/base/functional.h" | 7 #include "src/base/functional.h" |
8 #include "src/base/platform/platform.h" | 8 #include "src/base/platform/platform.h" |
9 #include "src/flags.h" | 9 #include "src/flags.h" |
10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 0, // code_start_offset | 297 0, // code_start_offset |
298 0, // code_end_offset | 298 0, // code_end_offset |
299 true, // imported | 299 true, // imported |
300 false}); // exported | 300 false}); // exported |
301 WasmFunction* function = &module->functions.back(); | 301 WasmFunction* function = &module->functions.back(); |
302 function->sig_index = consume_sig_index(module, &function->sig); | 302 function->sig_index = consume_sig_index(module, &function->sig); |
303 break; | 303 break; |
304 } | 304 } |
305 case kExternalTable: { | 305 case kExternalTable: { |
306 // ===== Imported table ========================================== | 306 // ===== Imported table ========================================== |
| 307 if (!AddTable(module)) break; |
307 import->index = | 308 import->index = |
308 static_cast<uint32_t>(module->function_tables.size()); | 309 static_cast<uint32_t>(module->function_tables.size()); |
309 module->function_tables.push_back({0, 0, false, | 310 module->function_tables.push_back({0, 0, false, |
310 std::vector<int32_t>(), true, | 311 std::vector<int32_t>(), true, |
311 false, SignatureMap()}); | 312 false, SignatureMap()}); |
312 expect_u8("element type", kWasmAnyFunctionTypeForm); | 313 expect_u8("element type", kWasmAnyFunctionTypeForm); |
313 WasmIndirectFunctionTable* table = &module->function_tables.back(); | 314 WasmIndirectFunctionTable* table = &module->function_tables.back(); |
314 consume_resizable_limits("element count", "elements", | 315 consume_resizable_limits("element count", "elements", |
315 kV8MaxWasmTableSize, &table->min_size, | 316 kV8MaxWasmTableSize, &table->min_size, |
316 &table->has_max, kV8MaxWasmTableSize, | 317 &table->has_max, kV8MaxWasmTableSize, |
317 &table->max_size); | 318 &table->max_size); |
318 break; | 319 break; |
319 } | 320 } |
320 case kExternalMemory: { | 321 case kExternalMemory: { |
321 // ===== Imported memory ========================================= | 322 // ===== Imported memory ========================================= |
| 323 if (!AddMemory(module)) break; |
322 consume_resizable_limits( | 324 consume_resizable_limits( |
323 "memory", "pages", kV8MaxWasmMemoryPages, | 325 "memory", "pages", kV8MaxWasmMemoryPages, |
324 &module->min_mem_pages, &module->has_max_mem, | 326 &module->min_mem_pages, &module->has_max_mem, |
325 kSpecMaxWasmMemoryPages, &module->max_mem_pages); | 327 kSpecMaxWasmMemoryPages, &module->max_mem_pages); |
326 SetHasMemory(module); | |
327 break; | 328 break; |
328 } | 329 } |
329 case kExternalGlobal: { | 330 case kExternalGlobal: { |
330 // ===== Imported global ========================================= | 331 // ===== Imported global ========================================= |
331 import->index = static_cast<uint32_t>(module->globals.size()); | 332 import->index = static_cast<uint32_t>(module->globals.size()); |
332 module->globals.push_back( | 333 module->globals.push_back( |
333 {kWasmStmt, false, WasmInitExpr(), 0, true, false}); | 334 {kWasmStmt, false, WasmInitExpr(), 0, true, false}); |
334 WasmGlobal* global = &module->globals.back(); | 335 WasmGlobal* global = &module->globals.back(); |
335 global->type = consume_value_type(); | 336 global->type = consume_value_type(); |
336 global->mutability = consume_mutability(); | 337 global->mutability = consume_mutability(); |
(...skipping 29 matching lines...) Expand all Loading... |
366 false}); // exported | 367 false}); // exported |
367 WasmFunction* function = &module->functions.back(); | 368 WasmFunction* function = &module->functions.back(); |
368 function->sig_index = consume_sig_index(module, &function->sig); | 369 function->sig_index = consume_sig_index(module, &function->sig); |
369 } | 370 } |
370 section_iter.advance(); | 371 section_iter.advance(); |
371 } | 372 } |
372 | 373 |
373 // ===== Table section =================================================== | 374 // ===== Table section =================================================== |
374 if (section_iter.section_code() == kTableSectionCode) { | 375 if (section_iter.section_code() == kTableSectionCode) { |
375 uint32_t table_count = consume_count("table count", kV8MaxWasmTables); | 376 uint32_t table_count = consume_count("table count", kV8MaxWasmTables); |
376 if (module->function_tables.size() < 1) { | 377 |
| 378 for (uint32_t i = 0; ok() && i < table_count; i++) { |
| 379 if (!AddTable(module)) break; |
377 module->function_tables.push_back({0, 0, false, std::vector<int32_t>(), | 380 module->function_tables.push_back({0, 0, false, std::vector<int32_t>(), |
378 false, false, SignatureMap()}); | 381 false, false, SignatureMap()}); |
379 } | |
380 | |
381 for (uint32_t i = 0; ok() && i < table_count; i++) { | |
382 WasmIndirectFunctionTable* table = &module->function_tables.back(); | 382 WasmIndirectFunctionTable* table = &module->function_tables.back(); |
383 expect_u8("table type", kWasmAnyFunctionTypeForm); | 383 expect_u8("table type", kWasmAnyFunctionTypeForm); |
384 consume_resizable_limits( | 384 consume_resizable_limits( |
385 "table elements", "elements", kV8MaxWasmTableSize, &table->min_size, | 385 "table elements", "elements", kV8MaxWasmTableSize, &table->min_size, |
386 &table->has_max, kV8MaxWasmTableSize, &table->max_size); | 386 &table->has_max, kV8MaxWasmTableSize, &table->max_size); |
387 } | 387 } |
388 section_iter.advance(); | 388 section_iter.advance(); |
389 } | 389 } |
390 | 390 |
391 // ===== Memory section ================================================== | 391 // ===== Memory section ================================================== |
392 if (section_iter.section_code() == kMemorySectionCode) { | 392 if (section_iter.section_code() == kMemorySectionCode) { |
393 uint32_t memory_count = consume_count("memory count", kV8MaxWasmMemories); | 393 uint32_t memory_count = consume_count("memory count", kV8MaxWasmMemories); |
394 | 394 |
395 for (uint32_t i = 0; ok() && i < memory_count; i++) { | 395 for (uint32_t i = 0; ok() && i < memory_count; i++) { |
| 396 if (!AddMemory(module)) break; |
396 consume_resizable_limits("memory", "pages", kV8MaxWasmMemoryPages, | 397 consume_resizable_limits("memory", "pages", kV8MaxWasmMemoryPages, |
397 &module->min_mem_pages, &module->has_max_mem, | 398 &module->min_mem_pages, &module->has_max_mem, |
398 kSpecMaxWasmMemoryPages, | 399 kSpecMaxWasmMemoryPages, |
399 &module->max_mem_pages); | 400 &module->max_mem_pages); |
400 } | 401 } |
401 SetHasMemory(module); | |
402 section_iter.advance(); | 402 section_iter.advance(); |
403 } | 403 } |
404 | 404 |
405 // ===== Global section ================================================== | 405 // ===== Global section ================================================== |
406 if (section_iter.section_code() == kGlobalSectionCode) { | 406 if (section_iter.section_code() == kGlobalSectionCode) { |
407 uint32_t globals_count = | 407 uint32_t globals_count = |
408 consume_count("globals count", kV8MaxWasmGlobals); | 408 consume_count("globals count", kV8MaxWasmGlobals); |
409 uint32_t imported_globals = static_cast<uint32_t>(module->globals.size()); | 409 uint32_t imported_globals = static_cast<uint32_t>(module->globals.size()); |
410 module->globals.reserve(imported_globals + globals_count); | 410 module->globals.reserve(imported_globals + globals_count); |
411 for (uint32_t i = 0; ok() && i < globals_count; ++i) { | 411 for (uint32_t i = 0; ok() && i < globals_count; ++i) { |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 return consume_init_expr(nullptr, kWasmStmt); | 676 return consume_init_expr(nullptr, kWasmStmt); |
677 } | 677 } |
678 | 678 |
679 private: | 679 private: |
680 Zone* module_zone; | 680 Zone* module_zone; |
681 ModuleResult result_; | 681 ModuleResult result_; |
682 ModuleOrigin origin_; | 682 ModuleOrigin origin_; |
683 | 683 |
684 uint32_t off(const byte* ptr) { return static_cast<uint32_t>(ptr - start_); } | 684 uint32_t off(const byte* ptr) { return static_cast<uint32_t>(ptr - start_); } |
685 | 685 |
686 void SetHasMemory(WasmModule* module) { | 686 bool AddTable(WasmModule* module) { |
687 if (module->has_memory) { | 687 if (module->function_tables.size() > 0) { |
688 error("At most one memory object is supported"); | 688 error("At most one table is supported"); |
| 689 return false; |
689 } else { | 690 } else { |
690 module->has_memory = true; | 691 return true; |
691 } | 692 } |
692 } | 693 } |
693 | 694 |
| 695 bool AddMemory(WasmModule* module) { |
| 696 if (module->has_memory) { |
| 697 error("At most one memory is supported"); |
| 698 return false; |
| 699 } else { |
| 700 module->has_memory = true; |
| 701 return true; |
| 702 } |
| 703 } |
| 704 |
694 // Decodes a single global entry inside a module starting at {pc_}. | 705 // Decodes a single global entry inside a module starting at {pc_}. |
695 void DecodeGlobalInModule(WasmModule* module, uint32_t index, | 706 void DecodeGlobalInModule(WasmModule* module, uint32_t index, |
696 WasmGlobal* global) { | 707 WasmGlobal* global) { |
697 global->type = consume_value_type(); | 708 global->type = consume_value_type(); |
698 global->mutability = consume_mutability(); | 709 global->mutability = consume_mutability(); |
699 const byte* pos = pc(); | 710 const byte* pos = pc(); |
700 global->init = consume_init_expr(module, kWasmStmt); | 711 global->init = consume_init_expr(module, kWasmStmt); |
701 switch (global->init.kind) { | 712 switch (global->init.kind) { |
702 case WasmInitExpr::kGlobalIndex: { | 713 case WasmInitExpr::kGlobalIndex: { |
703 uint32_t other_index = global->init.val.global_index; | 714 uint32_t other_index = global->init.val.global_index; |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1245 table.push_back(std::move(func_asm_offsets)); | 1256 table.push_back(std::move(func_asm_offsets)); |
1246 } | 1257 } |
1247 if (decoder.more()) decoder.error("unexpected additional bytes"); | 1258 if (decoder.more()) decoder.error("unexpected additional bytes"); |
1248 | 1259 |
1249 return decoder.toResult(std::move(table)); | 1260 return decoder.toResult(std::move(table)); |
1250 } | 1261 } |
1251 | 1262 |
1252 } // namespace wasm | 1263 } // namespace wasm |
1253 } // namespace internal | 1264 } // namespace internal |
1254 } // namespace v8 | 1265 } // namespace v8 |
OLD | NEW |