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

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

Issue 1744713003: [wasm] Add an export table. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 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/export-table.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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 min_mem_size_log2(0), 276 min_mem_size_log2(0),
277 max_mem_size_log2(0), 277 max_mem_size_log2(0),
278 mem_export(false), 278 mem_export(false),
279 mem_external(false), 279 mem_external(false),
280 start_function_index(-1), 280 start_function_index(-1),
281 globals(nullptr), 281 globals(nullptr),
282 signatures(nullptr), 282 signatures(nullptr),
283 functions(nullptr), 283 functions(nullptr),
284 data_segments(nullptr), 284 data_segments(nullptr),
285 function_table(nullptr), 285 function_table(nullptr),
286 import_table(nullptr) {} 286 import_table(nullptr),
287 export_table(nullptr) {}
287 288
288 WasmModule::~WasmModule() { 289 WasmModule::~WasmModule() {
289 if (globals) delete globals; 290 if (globals) delete globals;
290 if (signatures) delete signatures; 291 if (signatures) delete signatures;
291 if (functions) delete functions; 292 if (functions) delete functions;
292 if (data_segments) delete data_segments; 293 if (data_segments) delete data_segments;
293 if (function_table) delete function_table; 294 if (function_table) delete function_table;
294 if (import_table) delete import_table; 295 if (import_table) delete import_table;
296 if (export_table) delete export_table;
295 } 297 }
296 298
297 static MaybeHandle<JSFunction> LookupFunction(ErrorThrower& thrower, 299 static MaybeHandle<JSFunction> LookupFunction(ErrorThrower& thrower,
298 Handle<JSObject> ffi, 300 Handle<JSObject> ffi,
299 uint32_t index, 301 uint32_t index,
300 Handle<String> name, 302 Handle<String> name,
301 const char* cstr) { 303 const char* cstr) {
302 if (!ffi.is_null()) { 304 if (!ffi.is_null()) {
303 MaybeHandle<Object> result = Object::GetProperty(ffi, name); 305 MaybeHandle<Object> result = Object::GetProperty(ffi, name);
304 if (!result.is_null()) { 306 if (!result.is_null()) {
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 JSObject::AddProperty(instance.js_object, name, function, READ_ONLY); 450 JSObject::AddProperty(instance.js_object, name, function, READ_ONLY);
449 } 451 }
450 index++; 452 index++;
451 } 453 }
452 454
453 // Second pass: patch all direct call sites. 455 // Second pass: patch all direct call sites.
454 linker.Link(instance.function_table, this->function_table); 456 linker.Link(instance.function_table, this->function_table);
455 instance.js_object->SetInternalField(kWasmModuleFunctionTable, 457 instance.js_object->SetInternalField(kWasmModuleFunctionTable,
456 Smi::FromInt(0)); 458 Smi::FromInt(0));
457 459
460 //-------------------------------------------------------------------------
461 // Create and populate the exports object.
462 //-------------------------------------------------------------------------
463 if (export_table->size() > 0) {
464 index = 0;
465 // Create the "exports" object.
466 Handle<JSFunction> object_function = Handle<JSFunction>(
467 isolate->native_context()->object_function(), isolate);
468 Handle<JSObject> exports_object =
469 factory->NewJSObject(object_function, TENURED);
470 Handle<String> exports_name = factory->InternalizeUtf8String("exports");
471 JSObject::AddProperty(instance.js_object, exports_name, exports_object,
472 READ_ONLY);
473
474 // Compile wrappers and add them to the exports object.
475 for (const WasmExport& exp : *export_table) {
476 if (thrower.error()) break;
477 const char* cstr = GetName(exp.name_offset);
478 Handle<String> name = factory->InternalizeUtf8String(cstr);
479 Handle<Code> code = linker.GetFunctionCode(exp.func_index);
480 Handle<JSFunction> function = compiler::CompileJSToWasmWrapper(
481 isolate, &module_env, name, code, instance.js_object, exp.func_index);
482 JSObject::AddProperty(exports_object, name, function, READ_ONLY);
483 }
484 }
485
458 // Run the start function if one was specified. 486 // Run the start function if one was specified.
459 if (this->start_function_index >= 0) { 487 if (this->start_function_index >= 0) {
460 HandleScope scope(isolate); 488 HandleScope scope(isolate);
461 uint32_t index = static_cast<uint32_t>(this->start_function_index); 489 uint32_t index = static_cast<uint32_t>(this->start_function_index);
462 Handle<String> name = isolate->factory()->NewStringFromStaticChars("start"); 490 Handle<String> name = isolate->factory()->NewStringFromStaticChars("start");
463 Handle<Code> code = linker.GetFunctionCode(index); 491 Handle<Code> code = linker.GetFunctionCode(index);
464 Handle<JSFunction> jsfunc = compiler::CompileJSToWasmWrapper( 492 Handle<JSFunction> jsfunc = compiler::CompileJSToWasmWrapper(
465 isolate, &module_env, name, code, instance.js_object, index); 493 isolate, &module_env, name, code, instance.js_object, index);
466 494
467 // Call the JS function. 495 // Call the JS function.
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 } 632 }
605 if (result->IsHeapNumber()) { 633 if (result->IsHeapNumber()) {
606 return static_cast<int32_t>(HeapNumber::cast(*result)->value()); 634 return static_cast<int32_t>(HeapNumber::cast(*result)->value());
607 } 635 }
608 thrower.Error("WASM.compileRun() failed: Return value should be number"); 636 thrower.Error("WASM.compileRun() failed: Return value should be number");
609 return -1; 637 return -1;
610 } 638 }
611 } // namespace wasm 639 } // namespace wasm
612 } // namespace internal 640 } // namespace internal
613 } // namespace v8 641 } // namespace v8
OLDNEW
« no previous file with comments | « src/wasm/wasm-module.h ('k') | test/mjsunit/wasm/export-table.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698