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 "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 uint32_t table_count = 1; |
|
Mircea Trofin
2016/07/26 03:37:27
static const uint32_t kSupportedTableCount = 1
ddchen
2016/07/26 05:44:44
Done.
| |
| 265 module->function_tables.reserve(SafeReserve(table_count)); | |
| 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 < table_count; ++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, |
| 284 error(pc_ - 2, "invalid function index"); | 273 &module->function_tables.back()); |
|
Mircea Trofin
2016/07/26 03:37:26
should it be module->function_tables[i], for consi
ddchen
2016/07/26 05:44:44
Done.
| |
| 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 } | 274 } |
| 293 break; | 275 break; |
| 294 } | 276 } |
| 295 case WasmSection::Code::StartFunction: { | 277 case WasmSection::Code::StartFunction: { |
| 296 // Declares a start function for a module. | 278 // Declares a start function for a module. |
| 297 CheckForFunctions(module, section); | 279 CheckForFunctions(module, section); |
| 298 if (module->start_function_index >= 0) { | 280 if (module->start_function_index >= 0) { |
| 299 error("start function already declared"); | 281 error("start function already declared"); |
| 300 break; | 282 break; |
| 301 } | 283 } |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 WasmModule::kPageSize * (module ? module->min_mem_pages | 495 WasmModule::kPageSize * (module ? module->min_mem_pages |
| 514 : WasmModule::kMaxMemPages); | 496 : WasmModule::kMaxMemPages); |
| 515 if (!IsWithinLimit(memory_limit, segment->dest_addr, | 497 if (!IsWithinLimit(memory_limit, segment->dest_addr, |
| 516 segment->source_size)) { | 498 segment->source_size)) { |
| 517 error(start, "segment out of bounds of memory"); | 499 error(start, "segment out of bounds of memory"); |
| 518 } | 500 } |
| 519 | 501 |
| 520 consume_bytes(segment->source_size); | 502 consume_bytes(segment->source_size); |
| 521 } | 503 } |
| 522 | 504 |
| 505 // Decodes a single function table inside a module starting at {pc_}. | |
| 506 void DecodeFunctionTableInModule(WasmModule* module, WasmTable* 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++) { | |
|
Mircea Trofin
2016/07/26 03:37:26
++i
ddchen
2016/07/26 05:44:44
Done.
| |
| 516 uint16_t index = consume_u32v(); | |
| 517 if (index >= module->functions.size()) { | |
| 518 error(pc_ - 2, "invalid function index"); | |
|
Mircea Trofin
2016/07/26 03:37:26
what's "2"? (sizeof(uint16_t) ?)
ddchen
2016/07/26 05:44:44
Done.
| |
| 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 |