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

Side by Side Diff: src/wasm/wasm-module.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: fix 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
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/base/atomic-utils.h" 5 #include "src/base/atomic-utils.h"
6 #include "src/macro-assembler.h" 6 #include "src/macro-assembler.h"
7 #include "src/objects.h" 7 #include "src/objects.h"
8 #include "src/property-descriptor.h" 8 #include "src/property-descriptor.h"
9 #include "src/v8.h" 9 #include "src/v8.h"
10 10
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 CHECK_LE(segment.source_size, mem_size); 137 CHECK_LE(segment.source_size, mem_size);
138 CHECK_LE(segment.dest_addr + segment.source_size, mem_size); 138 CHECK_LE(segment.dest_addr + segment.source_size, mem_size);
139 byte* addr = mem_addr + segment.dest_addr; 139 byte* addr = mem_addr + segment.dest_addr;
140 memcpy(addr, module->module_start + segment.source_offset, 140 memcpy(addr, module->module_start + segment.source_offset,
141 segment.source_size); 141 segment.source_size);
142 } 142 }
143 } 143 }
144 144
145 Handle<FixedArray> BuildFunctionTable(Isolate* isolate, 145 Handle<FixedArray> BuildFunctionTable(Isolate* isolate,
146 const WasmModule* module) { 146 const WasmModule* module) {
147 if (module->function_table.size() == 0) { 147 // Compute the size of the indirect function table
148 int table_size = module->FunctionTableSize();
Mircea Trofin 2016/06/21 19:46:14 uint32_t table_size
149 if (table_size == 0) {
148 return Handle<FixedArray>::null(); 150 return Handle<FixedArray>::null();
149 } 151 }
150 int table_size = static_cast<int>(module->function_table.size()); 152 int populated_table_size = static_cast<int>(module->function_table.size());
Mircea Trofin 2016/06/21 19:46:14 could you avoid the cast to int here? in fact, you
153
151 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); 154 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size);
152 for (int i = 0; i < table_size; i++) { 155 for (int i = 0; i < populated_table_size; i++) {
153 const WasmFunction* function = 156 const WasmFunction* function =
154 &module->functions[module->function_table[i]]; 157 &module->functions[module->function_table[i]];
155 fixed->set(i, Smi::FromInt(function->sig_index)); 158 fixed->set(i, Smi::FromInt(function->sig_index));
156 } 159 }
157 return fixed; 160 return fixed;
158 } 161 }
159 162
160 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size, 163 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size,
161 byte** backing_store) { 164 byte** backing_store) {
162 *backing_store = nullptr; 165 *backing_store = nullptr;
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 } // namespace 338 } // namespace
336 339
337 WasmModule::WasmModule() 340 WasmModule::WasmModule()
338 : module_start(nullptr), 341 : module_start(nullptr),
339 module_end(nullptr), 342 module_end(nullptr),
340 min_mem_pages(0), 343 min_mem_pages(0),
341 max_mem_pages(0), 344 max_mem_pages(0),
342 mem_export(false), 345 mem_export(false),
343 mem_external(false), 346 mem_external(false),
344 start_function_index(-1), 347 start_function_index(-1),
345 origin(kWasmOrigin) {} 348 origin(kWasmOrigin),
349 globals_size(0),
350 indirect_table_size(0) {}
346 351
347 static MaybeHandle<JSFunction> ReportFFIError(ErrorThrower& thrower, 352 static MaybeHandle<JSFunction> ReportFFIError(ErrorThrower& thrower,
348 const char* error, uint32_t index, 353 const char* error, uint32_t index,
349 wasm::WasmName module_name, 354 wasm::WasmName module_name,
350 wasm::WasmName function_name) { 355 wasm::WasmName function_name) {
351 if (!function_name.is_empty()) { 356 if (!function_name.is_empty()) {
352 thrower.Error("Import #%d module=\"%.*s\" function=\"%.*s\" error: %s", 357 thrower.Error("Import #%d module=\"%.*s\" function=\"%.*s\" error: %s",
353 index, module_name.length(), module_name.start(), 358 index, module_name.length(), module_name.start(),
354 function_name.length(), function_name.start(), error); 359 function_name.length(), function_name.start(), error);
355 } else { 360 } else {
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 str.start()); 671 str.start());
667 break; 672 break;
668 } 673 }
669 // Install the code into the linker table. 674 // Install the code into the linker table.
670 functions[i] = code; 675 functions[i] = code;
671 } 676 }
672 } 677 }
673 678
674 void PopulateFunctionTable(WasmModuleInstance* instance) { 679 void PopulateFunctionTable(WasmModuleInstance* instance) {
675 if (!instance->function_table.is_null()) { 680 if (!instance->function_table.is_null()) {
676 int table_size = static_cast<int>(instance->module->function_table.size()); 681 int table_size = instance->module->FunctionTableSize();
Mircea Trofin 2016/06/21 19:46:14 same note as above about avoiding the cast - I rea
677 DCHECK_EQ(instance->function_table->length(), table_size * 2); 682 DCHECK_EQ(table_size * 2, instance->function_table->length());
678 for (int i = 0; i < table_size; i++) { 683 int populated_table_size =
684 static_cast<int>(instance->module->function_table.size());
685 DCHECK_LE(populated_table_size * 2, instance->function_table->length());
686 for (int i = 0; i < populated_table_size; i++) {
679 instance->function_table->set( 687 instance->function_table->set(
680 i + table_size, 688 i + table_size,
681 *instance->function_code[instance->module->function_table[i]]); 689 *instance->function_code[instance->module->function_table[i]]);
682 } 690 }
683 } 691 }
684 } 692 }
685 } // namespace 693 } // namespace
686 694
687 void SetDeoptimizationData(Factory* factory, Handle<JSObject> js_object, 695 void SetDeoptimizationData(Factory* factory, Handle<JSObject> js_object,
688 std::vector<Handle<Code>>& functions) { 696 std::vector<Handle<Code>>& functions) {
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 Object* info = wasm->GetInternalField(kWasmDebugInfo); 1124 Object* info = wasm->GetInternalField(kWasmDebugInfo);
1117 if (!info->IsUndefined(wasm->GetIsolate())) return WasmDebugInfo::cast(info); 1125 if (!info->IsUndefined(wasm->GetIsolate())) return WasmDebugInfo::cast(info);
1118 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(handle(wasm)); 1126 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(handle(wasm));
1119 wasm->SetInternalField(kWasmDebugInfo, *new_info); 1127 wasm->SetInternalField(kWasmDebugInfo, *new_info);
1120 return *new_info; 1128 return *new_info;
1121 } 1129 }
1122 1130
1123 } // namespace wasm 1131 } // namespace wasm
1124 } // namespace internal 1132 } // namespace internal
1125 } // namespace v8 1133 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698