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 <memory> | 5 #include <memory> |
6 | 6 |
7 #include "src/base/adapters.h" | 7 #include "src/base/adapters.h" |
8 #include "src/base/atomic-utils.h" | 8 #include "src/base/atomic-utils.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/compiler/wasm-compiler.h" | 10 #include "src/compiler/wasm-compiler.h" |
(...skipping 1374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1385 Handle<JSObject> module_object_; | 1385 Handle<JSObject> module_object_; |
1386 Handle<JSReceiver> ffi_; | 1386 Handle<JSReceiver> ffi_; |
1387 Handle<JSArrayBuffer> memory_; | 1387 Handle<JSArrayBuffer> memory_; |
1388 Handle<JSArrayBuffer> globals_; | 1388 Handle<JSArrayBuffer> globals_; |
1389 Handle<WasmCompiledModule> compiled_module_; | 1389 Handle<WasmCompiledModule> compiled_module_; |
1390 std::vector<TableInstance> table_instances_; | 1390 std::vector<TableInstance> table_instances_; |
1391 std::vector<Handle<JSFunction>> js_wrappers_; | 1391 std::vector<Handle<JSFunction>> js_wrappers_; |
1392 | 1392 |
1393 // Helper routines to print out errors with imports. | 1393 // Helper routines to print out errors with imports. |
1394 void ReportLinkError(const char* error, uint32_t index, | 1394 void ReportLinkError(const char* error, uint32_t index, |
1395 Handle<String> module_name, | 1395 Handle<String> module_name, Handle<String> import_name) { |
1396 Handle<String> import_name) { | |
1397 thrower_->LinkError( | 1396 thrower_->LinkError( |
1398 "Import #%d module=\"%.*s\" function=\"%.*s\" error: %s", index, | 1397 "Import #%d module=\"%.*s\" function=\"%.*s\" error: %s", index, |
1399 module_name->length(), module_name->ToCString().get(), | 1398 module_name->length(), module_name->ToCString().get(), |
1400 import_name->length(), import_name->ToCString().get(), error); | 1399 import_name->length(), import_name->ToCString().get(), error); |
1401 } | 1400 } |
1402 | 1401 |
1403 MaybeHandle<Object> ReportTypeError(const char* error, uint32_t index, | 1402 MaybeHandle<Object> ReportTypeError(const char* error, uint32_t index, |
1404 Handle<String> module_name) { | 1403 Handle<String> module_name) { |
1405 thrower_->TypeError("Import #%d module=\"%.*s\" error: %s", index, | 1404 thrower_->TypeError("Import #%d module=\"%.*s\" error: %s", index, |
1406 module_name->length(), module_name->ToCString().get(), | 1405 module_name->length(), module_name->ToCString().get(), |
(...skipping 17 matching lines...) Expand all Loading... |
1424 | 1423 |
1425 Handle<Object> module = result.ToHandleChecked(); | 1424 Handle<Object> module = result.ToHandleChecked(); |
1426 | 1425 |
1427 // TODO(bradnelson): Making this conditional on non-empty names violates the | 1426 // TODO(bradnelson): Making this conditional on non-empty names violates the |
1428 // Wasm spec, but seems to be a hack intended for the asm-to-wasm pipeline. | 1427 // Wasm spec, but seems to be a hack intended for the asm-to-wasm pipeline. |
1429 // We need to get rid of it. | 1428 // We need to get rid of it. |
1430 if (import_name->length() != 0) { | 1429 if (import_name->length() != 0) { |
1431 // Look up the value in the module. | 1430 // Look up the value in the module. |
1432 if (!module->IsJSReceiver()) { | 1431 if (!module->IsJSReceiver()) { |
1433 return ReportTypeError("module is not an object or function", index, | 1432 return ReportTypeError("module is not an object or function", index, |
1434 module_name); | 1433 module_name); |
1435 } | 1434 } |
1436 | 1435 |
1437 result = Object::GetPropertyOrElement(module, import_name); | 1436 result = Object::GetPropertyOrElement(module, import_name); |
1438 if (result.is_null()) { | 1437 if (result.is_null()) { |
1439 ReportLinkError("import not found", index, module_name, import_name); | 1438 ReportLinkError("import not found", index, module_name, import_name); |
1440 return MaybeHandle<JSFunction>(); | 1439 return MaybeHandle<JSFunction>(); |
1441 } | 1440 } |
1442 } | 1441 } |
1443 | 1442 |
1444 return result; | 1443 return result; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1515 // functions. | 1514 // functions. |
1516 int ProcessImports(Handle<FixedArray> code_table, | 1515 int ProcessImports(Handle<FixedArray> code_table, |
1517 Handle<WasmInstanceObject> instance) { | 1516 Handle<WasmInstanceObject> instance) { |
1518 int num_imported_functions = 0; | 1517 int num_imported_functions = 0; |
1519 int num_imported_tables = 0; | 1518 int num_imported_tables = 0; |
1520 for (int index = 0; index < static_cast<int>(module_->import_table.size()); | 1519 for (int index = 0; index < static_cast<int>(module_->import_table.size()); |
1521 ++index) { | 1520 ++index) { |
1522 WasmImport& import = module_->import_table[index]; | 1521 WasmImport& import = module_->import_table[index]; |
1523 | 1522 |
1524 Handle<String> module_name; | 1523 Handle<String> module_name; |
1525 MaybeHandle<String> maybe_module_name = | 1524 MaybeHandle<String> maybe_module_name = ExtractStringFromModuleBytes( |
1526 ExtractStringFromModuleBytes(isolate_, compiled_module_, | 1525 isolate_, compiled_module_, import.module_name_offset, |
1527 import.module_name_offset, | 1526 import.module_name_length); |
1528 import.module_name_length); | |
1529 if (!maybe_module_name.ToHandle(&module_name)) return -1; | 1527 if (!maybe_module_name.ToHandle(&module_name)) return -1; |
1530 | 1528 |
1531 Handle<String> import_name; | 1529 Handle<String> import_name; |
1532 MaybeHandle<String> maybe_import_name = | 1530 MaybeHandle<String> maybe_import_name = ExtractStringFromModuleBytes( |
1533 ExtractStringFromModuleBytes(isolate_, compiled_module_, | 1531 isolate_, compiled_module_, import.field_name_offset, |
1534 import.field_name_offset, | 1532 import.field_name_length); |
1535 import.field_name_length); | |
1536 if (!maybe_import_name.ToHandle(&import_name)) return -1; | 1533 if (!maybe_import_name.ToHandle(&import_name)) return -1; |
1537 | 1534 |
1538 MaybeHandle<Object> result = | 1535 MaybeHandle<Object> result = |
1539 LookupImport(index, module_name, import_name); | 1536 LookupImport(index, module_name, import_name); |
1540 if (thrower_->error()) return -1; | 1537 if (thrower_->error()) return -1; |
1541 Handle<Object> value = result.ToHandleChecked(); | 1538 Handle<Object> value = result.ToHandleChecked(); |
1542 | 1539 |
1543 switch (import.kind) { | 1540 switch (import.kind) { |
1544 case kExternalFunction: { | 1541 case kExternalFunction: { |
1545 // Function imports must be callable. | 1542 // Function imports must be callable. |
1546 if (!value->IsCallable()) { | 1543 if (!value->IsCallable()) { |
1547 ReportLinkError("function import requires a callable", index, | 1544 ReportLinkError("function import requires a callable", index, |
1548 module_name, import_name); | 1545 module_name, import_name); |
1549 return -1; | 1546 return -1; |
1550 } | 1547 } |
1551 | 1548 |
1552 Handle<Code> import_wrapper = CompileImportWrapper( | 1549 Handle<Code> import_wrapper = CompileImportWrapper( |
1553 isolate_, index, module_->functions[import.index].sig, | 1550 isolate_, index, module_->functions[import.index].sig, |
1554 Handle<JSReceiver>::cast(value), module_name, import_name, | 1551 Handle<JSReceiver>::cast(value), module_name, import_name, |
1555 module_->origin); | 1552 module_->origin); |
1556 if (import_wrapper.is_null()) { | 1553 if (import_wrapper.is_null()) { |
1557 ReportLinkError( | 1554 ReportLinkError( |
1558 "imported function does not match the expected type", | 1555 "imported function does not match the expected type", index, |
1559 index, module_name, import_name); | 1556 module_name, import_name); |
1560 return -1; | 1557 return -1; |
1561 } | 1558 } |
1562 code_table->set(num_imported_functions, *import_wrapper); | 1559 code_table->set(num_imported_functions, *import_wrapper); |
1563 RecordStats(isolate_, *import_wrapper); | 1560 RecordStats(isolate_, *import_wrapper); |
1564 num_imported_functions++; | 1561 num_imported_functions++; |
1565 break; | 1562 break; |
1566 } | 1563 } |
1567 case kExternalTable: { | 1564 case kExternalTable: { |
1568 if (!WasmJs::IsWasmTableObject(isolate_, value)) { | 1565 if (!WasmJs::IsWasmTableObject(isolate_, value)) { |
1569 ReportLinkError("table import requires a WebAssembly.Table", index, | 1566 ReportLinkError("table import requires a WebAssembly.Table", index, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1623 auto memory = Handle<WasmMemoryObject>::cast(value); | 1620 auto memory = Handle<WasmMemoryObject>::cast(value); |
1624 DCHECK(WasmJs::IsWasmMemoryObject(isolate_, memory)); | 1621 DCHECK(WasmJs::IsWasmMemoryObject(isolate_, memory)); |
1625 instance->set_memory_object(*memory); | 1622 instance->set_memory_object(*memory); |
1626 memory_ = Handle<JSArrayBuffer>(memory->get_buffer(), isolate_); | 1623 memory_ = Handle<JSArrayBuffer>(memory->get_buffer(), isolate_); |
1627 break; | 1624 break; |
1628 } | 1625 } |
1629 case kExternalGlobal: { | 1626 case kExternalGlobal: { |
1630 // Global imports are converted to numbers and written into the | 1627 // Global imports are converted to numbers and written into the |
1631 // {globals_} array buffer. | 1628 // {globals_} array buffer. |
1632 if (!value->IsNumber()) { | 1629 if (!value->IsNumber()) { |
1633 ReportLinkError("global import must be a number", | 1630 ReportLinkError("global import must be a number", index, |
1634 index, module_name, import_name); | 1631 module_name, import_name); |
1635 return -1; | 1632 return -1; |
1636 } | 1633 } |
1637 WriteGlobalValue(module_->globals[import.index], value); | 1634 WriteGlobalValue(module_->globals[import.index], value); |
1638 break; | 1635 break; |
1639 } | 1636 } |
1640 default: | 1637 default: |
1641 UNREACHABLE(); | 1638 UNREACHABLE(); |
1642 break; | 1639 break; |
1643 } | 1640 } |
1644 } | 1641 } |
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2387 MaybeHandle<String> WasmCompiledModule::GetFunctionName( | 2384 MaybeHandle<String> WasmCompiledModule::GetFunctionName( |
2388 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { | 2385 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { |
2389 DCHECK_LT(func_index, compiled_module->module()->functions.size()); | 2386 DCHECK_LT(func_index, compiled_module->module()->functions.size()); |
2390 WasmFunction& function = compiled_module->module()->functions[func_index]; | 2387 WasmFunction& function = compiled_module->module()->functions[func_index]; |
2391 Isolate* isolate = compiled_module->GetIsolate(); | 2388 Isolate* isolate = compiled_module->GetIsolate(); |
2392 MaybeHandle<String> string = ExtractStringFromModuleBytes( | 2389 MaybeHandle<String> string = ExtractStringFromModuleBytes( |
2393 isolate, compiled_module, function.name_offset, function.name_length); | 2390 isolate, compiled_module, function.name_offset, function.name_length); |
2394 if (!string.is_null()) return string.ToHandleChecked(); | 2391 if (!string.is_null()) return string.ToHandleChecked(); |
2395 return {}; | 2392 return {}; |
2396 } | 2393 } |
OLD | NEW |