Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: src/wasm/module-decoder.cc

Issue 2049513003: [wasm] Support undefined indirect table entries, behind a flag. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed static casting and formatting. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/flag-definitions.h ('k') | src/wasm/wasm-module.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 static_cast<int>(pc_ - start_)); 263 static_cast<int>(pc_ - start_));
264 module->data_segments.push_back({0, // dest_addr 264 module->data_segments.push_back({0, // dest_addr
265 0, // source_offset 265 0, // source_offset
266 0, // source_size 266 0, // source_size
267 false}); // init 267 false}); // init
268 WasmDataSegment* segment = &module->data_segments.back(); 268 WasmDataSegment* segment = &module->data_segments.back();
269 DecodeDataSegmentInModule(module, segment); 269 DecodeDataSegmentInModule(module, segment);
270 } 270 }
271 break; 271 break;
272 } 272 }
273 case WasmSection::Code::FunctionTablePad: {
274 if (!FLAG_wasm_jit_prototype) {
275 error("FunctionTablePad section without jiting enabled");
276 }
277 // An indirect function table requires functions first.
278 int length;
279 module->indirect_table_size =
280 consume_u32v(&length, "indirect entry count");
281 if (module->indirect_table_size > 0 &&
282 module->indirect_table_size < module->function_table.size()) {
283 error("more predefined indirect entries than table can hold");
284 }
285 break;
286 }
273 case WasmSection::Code::FunctionTable: { 287 case WasmSection::Code::FunctionTable: {
274 // An indirect function table requires functions first. 288 // An indirect function table requires functions first.
275 CheckForFunctions(module, section); 289 CheckForFunctions(module, section);
276 int length; 290 int length;
277 uint32_t function_table_count = 291 uint32_t function_table_count =
278 consume_u32v(&length, "function table count"); 292 consume_u32v(&length, "function table count");
279 module->function_table.reserve(SafeReserve(function_table_count)); 293 module->function_table.reserve(SafeReserve(function_table_count));
280 // Decode function table. 294 // Decode function table.
281 for (uint32_t i = 0; i < function_table_count; i++) { 295 for (uint32_t i = 0; i < function_table_count; i++) {
282 if (failed()) break; 296 if (failed()) break;
283 TRACE("DecodeFunctionTable[%d] module+%d\n", i, 297 TRACE("DecodeFunctionTable[%d] module+%d\n", i,
284 static_cast<int>(pc_ - start_)); 298 static_cast<int>(pc_ - start_));
285 uint16_t index = consume_u32v(&length); 299 uint16_t index = consume_u32v(&length);
286 if (index >= module->functions.size()) { 300 if (index >= module->functions.size()) {
287 error(pc_ - 2, "invalid function index"); 301 error(pc_ - 2, "invalid function index");
288 break; 302 break;
289 } 303 }
290 module->function_table.push_back(index); 304 module->function_table.push_back(index);
291 } 305 }
306 if (module->indirect_table_size > 0 &&
307 module->indirect_table_size < module->function_table.size()) {
308 error("more predefined indirect entries than table can hold");
309 }
292 break; 310 break;
293 } 311 }
294 case WasmSection::Code::StartFunction: { 312 case WasmSection::Code::StartFunction: {
295 // Declares a start function for a module. 313 // Declares a start function for a module.
296 CheckForFunctions(module, section); 314 CheckForFunctions(module, section);
297 if (module->start_function_index >= 0) { 315 if (module->start_function_index >= 0) {
298 error("start function already declared"); 316 error("start function already declared");
299 break; 317 break;
300 } 318 }
301 WasmFunction* func; 319 WasmFunction* func;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 it->name_length, pc, last->func_index, it->func_index); 402 it->name_length, pc, last->func_index, it->func_index);
385 break; 403 break;
386 } 404 }
387 } 405 }
388 } 406 }
389 break; 407 break;
390 } 408 }
391 case WasmSection::Code::Max: 409 case WasmSection::Code::Max:
392 // Skip unknown sections. 410 // Skip unknown sections.
393 TRACE("Unknown section: '"); 411 TRACE("Unknown section: '");
394 for (uint32_t i = 0; i != string_length; ++i) { 412 for (uint32_t i = 0; i != string_length; i++) {
395 TRACE("%c", *(section_name_start + i)); 413 TRACE("%c", *(section_name_start + i));
396 } 414 }
397 TRACE("'\n"); 415 TRACE("'\n");
398 consume_bytes(section_length); 416 consume_bytes(section_length);
399 break; 417 break;
400 } 418 }
401 419
402 if (pc_ != expected_section_end) { 420 if (pc_ != expected_section_end) {
403 const char* diff = pc_ < expected_section_end ? "shorter" : "longer"; 421 const char* diff = pc_ < expected_section_end ? "shorter" : "longer";
404 size_t expected_length = static_cast<size_t>(section_length); 422 size_t expected_length = static_cast<size_t>(section_length);
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 decoder.consume_bytes(size); 871 decoder.consume_bytes(size);
854 } 872 }
855 if (decoder.more()) decoder.error("unexpected additional bytes"); 873 if (decoder.more()) decoder.error("unexpected additional bytes");
856 874
857 return decoder.toResult(std::move(table)); 875 return decoder.toResult(std::move(table));
858 } 876 }
859 877
860 } // namespace wasm 878 } // namespace wasm
861 } // namespace internal 879 } // namespace internal
862 } // namespace v8 880 } // namespace v8
OLDNEW
« no previous file with comments | « src/flag-definitions.h ('k') | src/wasm/wasm-module.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698