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/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 static_cast<int>(pc_ - start_)); | 250 static_cast<int>(pc_ - start_)); |
251 module->data_segments.push_back({0, // dest_addr | 251 module->data_segments.push_back({0, // dest_addr |
252 0, // source_offset | 252 0, // source_offset |
253 0, // source_size | 253 0, // source_size |
254 false}); // init | 254 false}); // init |
255 WasmDataSegment* segment = &module->data_segments.back(); | 255 WasmDataSegment* segment = &module->data_segments.back(); |
256 DecodeDataSegmentInModule(module, segment); | 256 DecodeDataSegmentInModule(module, segment); |
257 } | 257 } |
258 break; | 258 break; |
259 } | 259 } |
260 case WasmSection::Code::FunctionTablePad: { | |
261 if (!FLAG_wasm_jit_prototype) { | |
262 error("FunctionTablePad section without jiting enabled"); | |
263 } | |
264 // An indirect function table requires functions first. | |
265 module->indirect_table_size = consume_u32v("indirect entry count"); | |
266 if (module->indirect_table_size > 0 && | |
267 module->indirect_table_size < module->function_table.size()) { | |
268 error("more predefined indirect entries than table can hold"); | |
269 } | |
270 break; | |
271 } | |
272 case WasmSection::Code::FunctionTable: { | 260 case WasmSection::Code::FunctionTable: { |
273 // An indirect function table requires functions first. | 261 // An indirect function table requires functions first. |
274 CheckForFunctions(module, section); | 262 CheckForFunctions(module, section); |
275 uint32_t function_table_count = consume_u32v("function table count"); | 263 // Assume only one table for now. |
276 module->function_table.reserve(SafeReserve(function_table_count)); | 264 static const uint32_t kSupportedTableCount = 1; |
| 265 module->function_tables.reserve(SafeReserve(kSupportedTableCount)); |
277 // Decode function table. | 266 // Decode function table. |
278 for (uint32_t i = 0; i < function_table_count; ++i) { | 267 for (uint32_t i = 0; i < kSupportedTableCount; ++i) { |
279 if (failed()) break; | 268 if (failed()) break; |
280 TRACE("DecodeFunctionTable[%d] module+%d\n", i, | 269 TRACE("DecodeFunctionTable[%d] module+%d\n", i, |
281 static_cast<int>(pc_ - start_)); | 270 static_cast<int>(pc_ - start_)); |
282 uint16_t index = consume_u32v(); | 271 module->function_tables.push_back({0, 0, std::vector<uint16_t>()}); |
283 if (index >= module->functions.size()) { | 272 DecodeFunctionTableInModule(module, &module->function_tables[i]); |
284 error(pc_ - 2, "invalid function index"); | |
285 break; | |
286 } | |
287 module->function_table.push_back(index); | |
288 } | |
289 if (module->indirect_table_size > 0 && | |
290 module->indirect_table_size < module->function_table.size()) { | |
291 error("more predefined indirect entries than table can hold"); | |
292 } | 273 } |
293 break; | 274 break; |
294 } | 275 } |
295 case WasmSection::Code::StartFunction: { | 276 case WasmSection::Code::StartFunction: { |
296 // Declares a start function for a module. | 277 // Declares a start function for a module. |
297 CheckForFunctions(module, section); | 278 CheckForFunctions(module, section); |
298 if (module->start_function_index >= 0) { | 279 if (module->start_function_index >= 0) { |
299 error("start function already declared"); | 280 error("start function already declared"); |
300 break; | 281 break; |
301 } | 282 } |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 WasmModule::kPageSize * (module ? module->min_mem_pages | 494 WasmModule::kPageSize * (module ? module->min_mem_pages |
514 : WasmModule::kMaxMemPages); | 495 : WasmModule::kMaxMemPages); |
515 if (!IsWithinLimit(memory_limit, segment->dest_addr, | 496 if (!IsWithinLimit(memory_limit, segment->dest_addr, |
516 segment->source_size)) { | 497 segment->source_size)) { |
517 error(start, "segment out of bounds of memory"); | 498 error(start, "segment out of bounds of memory"); |
518 } | 499 } |
519 | 500 |
520 consume_bytes(segment->source_size); | 501 consume_bytes(segment->source_size); |
521 } | 502 } |
522 | 503 |
| 504 // Decodes a single function table inside a module starting at {pc_}. |
| 505 void DecodeFunctionTableInModule(WasmModule* module, |
| 506 WasmIndirectFunctionTable* table) { |
| 507 table->size = consume_u32v("function table entry count"); |
| 508 table->max_size = FLAG_wasm_jit_prototype ? consume_u32v() : table->size; |
| 509 |
| 510 if ((!FLAG_wasm_jit_prototype && table->max_size != table->size) || |
| 511 (FLAG_wasm_jit_prototype && table->max_size < table->size)) { |
| 512 error("invalid table maximum size"); |
| 513 } |
| 514 |
| 515 for (uint32_t i = 0; i < table->size; ++i) { |
| 516 uint16_t index = consume_u32v(); |
| 517 if (index >= module->functions.size()) { |
| 518 error(pc_ - sizeof(index), "invalid function index"); |
| 519 break; |
| 520 } |
| 521 table->values.push_back(index); |
| 522 } |
| 523 } |
| 524 |
523 // Calculate individual global offsets and total size of globals table. | 525 // Calculate individual global offsets and total size of globals table. |
524 void CalculateGlobalsOffsets(WasmModule* module) { | 526 void CalculateGlobalsOffsets(WasmModule* module) { |
525 uint32_t offset = 0; | 527 uint32_t offset = 0; |
526 if (module->globals.size() == 0) { | 528 if (module->globals.size() == 0) { |
527 module->globals_size = 0; | 529 module->globals_size = 0; |
528 return; | 530 return; |
529 } | 531 } |
530 for (WasmGlobal& global : module->globals) { | 532 for (WasmGlobal& global : module->globals) { |
531 byte size = | 533 byte size = |
532 WasmOpcodes::MemSize(WasmOpcodes::MachineTypeFor(global.type)); | 534 WasmOpcodes::MemSize(WasmOpcodes::MachineTypeFor(global.type)); |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 decoder.consume_bytes(size); | 810 decoder.consume_bytes(size); |
809 } | 811 } |
810 if (decoder.more()) decoder.error("unexpected additional bytes"); | 812 if (decoder.more()) decoder.error("unexpected additional bytes"); |
811 | 813 |
812 return decoder.toResult(std::move(table)); | 814 return decoder.toResult(std::move(table)); |
813 } | 815 } |
814 | 816 |
815 } // namespace wasm | 817 } // namespace wasm |
816 } // namespace internal | 818 } // namespace internal |
817 } // namespace v8 | 819 } // namespace v8 |
OLD | NEW |