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

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

Issue 1692173002: [wasm] Add support for a start function. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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/wasm/wasm-module.h ('k') | test/mjsunit/wasm/start-function.js » ('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/macro-assembler.h" 5 #include "src/macro-assembler.h"
6 #include "src/objects.h" 6 #include "src/objects.h"
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "src/simulator.h" 9 #include "src/simulator.h"
10 10
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 if (!instance->globals_start) { 249 if (!instance->globals_start) {
250 // Not enough space for backing store of globals. 250 // Not enough space for backing store of globals.
251 thrower->Error("Out of memory: wasm globals"); 251 thrower->Error("Out of memory: wasm globals");
252 return false; 252 return false;
253 } 253 }
254 } 254 }
255 return true; 255 return true;
256 } 256 }
257 } // namespace 257 } // namespace
258 258
259
260 WasmModule::WasmModule() 259 WasmModule::WasmModule()
261 : globals(nullptr), 260 : shared_isolate(nullptr),
261 module_start(nullptr),
262 module_end(nullptr),
263 min_mem_size_log2(0),
264 max_mem_size_log2(0),
265 mem_export(false),
266 mem_external(false),
267 start_function_index(-1),
268 globals(nullptr),
262 signatures(nullptr), 269 signatures(nullptr),
263 functions(nullptr), 270 functions(nullptr),
264 data_segments(nullptr), 271 data_segments(nullptr),
265 function_table(nullptr) {} 272 function_table(nullptr) {}
266 273
267
268 WasmModule::~WasmModule() { 274 WasmModule::~WasmModule() {
269 if (globals) delete globals; 275 if (globals) delete globals;
270 if (signatures) delete signatures; 276 if (signatures) delete signatures;
271 if (functions) delete functions; 277 if (functions) delete functions;
272 if (data_segments) delete data_segments; 278 if (data_segments) delete data_segments;
273 if (function_table) delete function_table; 279 if (function_table) delete function_table;
274 } 280 }
275 281
276 282
277 // Instantiates a wasm module as a JSObject. 283 // Instantiates a wasm module as a JSObject.
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 // Exported functions are installed as read-only properties on the module. 402 // Exported functions are installed as read-only properties on the module.
397 JSObject::AddProperty(instance.js_object, name, function, READ_ONLY); 403 JSObject::AddProperty(instance.js_object, name, function, READ_ONLY);
398 } 404 }
399 index++; 405 index++;
400 } 406 }
401 407
402 // Second pass: patch all direct call sites. 408 // Second pass: patch all direct call sites.
403 linker.Link(instance.function_table, this->function_table); 409 linker.Link(instance.function_table, this->function_table);
404 instance.js_object->SetInternalField(kWasmModuleFunctionTable, 410 instance.js_object->SetInternalField(kWasmModuleFunctionTable,
405 Smi::FromInt(0)); 411 Smi::FromInt(0));
412
413 // Run the start function if one was specified.
414 if (this->start_function_index >= 0) {
415 HandleScope scope(isolate);
416 uint32_t index = static_cast<uint32_t>(this->start_function_index);
417 Handle<String> name = isolate->factory()->NewStringFromStaticChars("start");
418 Handle<Code> code = linker.GetFunctionCode(index);
419 Handle<JSFunction> jsfunc = compiler::CompileJSToWasmWrapper(
420 isolate, &module_env, name, code, instance.js_object, index);
421
422 // Call the JS function.
423 Handle<Object> undefined(isolate->heap()->undefined_value(), isolate);
424 MaybeHandle<Object> retval =
425 Execution::Call(isolate, jsfunc, undefined, 0, nullptr);
426
427 if (retval.is_null()) {
428 thrower.Error("WASM.instantiateModule(): start function failed");
429 }
430 }
406 return instance.js_object; 431 return instance.js_object;
407 } 432 }
408 433
409 434
410 Handle<Code> ModuleEnv::GetFunctionCode(uint32_t index) { 435 Handle<Code> ModuleEnv::GetFunctionCode(uint32_t index) {
411 DCHECK(IsValidFunction(index)); 436 DCHECK(IsValidFunction(index));
412 if (linker) return linker->GetFunctionCode(index); 437 if (linker) return linker->GetFunctionCode(index);
413 if (instance && instance->function_code) { 438 if (instance && instance->function_code) {
414 return instance->function_code->at(index); 439 return instance->function_code->at(index);
415 } 440 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 } 551 }
527 if (result->IsHeapNumber()) { 552 if (result->IsHeapNumber()) {
528 return static_cast<int32_t>(HeapNumber::cast(*result)->value()); 553 return static_cast<int32_t>(HeapNumber::cast(*result)->value());
529 } 554 }
530 thrower.Error("WASM.compileRun() failed: Return value should be number"); 555 thrower.Error("WASM.compileRun() failed: Return value should be number");
531 return -1; 556 return -1;
532 } 557 }
533 } // namespace wasm 558 } // namespace wasm
534 } // namespace internal 559 } // namespace internal
535 } // namespace v8 560 } // namespace v8
OLDNEW
« no previous file with comments | « src/wasm/wasm-module.h ('k') | test/mjsunit/wasm/start-function.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698