Chromium Code Reviews| 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/atomic-utils.h" | 7 #include "src/base/atomic-utils.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 | 9 |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 50 | 50 |
| 51 // Internal constants for the layout of the module object. | 51 // Internal constants for the layout of the module object. |
| 52 enum WasmInstanceObjectFields { | 52 enum WasmInstanceObjectFields { |
| 53 kWasmCompiledModule = 0, | 53 kWasmCompiledModule = 0, |
| 54 kWasmModuleFunctionTable, | 54 kWasmModuleFunctionTable, |
| 55 kWasmModuleCodeTable, | 55 kWasmModuleCodeTable, |
| 56 kWasmMemArrayBuffer, | 56 kWasmMemArrayBuffer, |
| 57 kWasmGlobalsArrayBuffer, | 57 kWasmGlobalsArrayBuffer, |
| 58 // TODO(clemensh): Remove function name array, extract names from module | 58 // TODO(clemensh): Remove function name array, extract names from module |
| 59 // bytes. | 59 // bytes. |
| 60 kWasmFunctionNamesArray, | |
| 61 kWasmModuleBytesString, | |
| 62 kWasmDebugInfo, | 60 kWasmDebugInfo, |
| 63 kWasmNumImportedFunctions, | |
| 64 kWasmModuleInternalFieldCount | 61 kWasmModuleInternalFieldCount |
| 65 }; | 62 }; |
| 66 | 63 |
| 67 enum WasmImportData { | 64 enum WasmImportData { |
| 68 kModuleName, // String | 65 kModuleName, // String |
| 69 kFunctionName, // maybe String | 66 kFunctionName, // maybe String |
| 70 kOutputCount, // Smi. an uint32_t | 67 kOutputCount, // Smi. an uint32_t |
| 71 kSignature, // ByteArray. A copy of the data in FunctionSig | 68 kSignature, // ByteArray. A copy of the data in FunctionSig |
| 72 kWasmImportDataSize // Sentinel value. | 69 kWasmImportDataSize // Sentinel value. |
| 73 }; | 70 }; |
| (...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 982 FixedArray* deopt_data = code->deoptimization_data(); | 979 FixedArray* deopt_data = code->deoptimization_data(); |
| 983 DCHECK_NOT_NULL(deopt_data); | 980 DCHECK_NOT_NULL(deopt_data); |
| 984 DCHECK(deopt_data->length() == 2); | 981 DCHECK(deopt_data->length() == 2); |
| 985 Object* weak_link = deopt_data->get(0); | 982 Object* weak_link = deopt_data->get(0); |
| 986 if (!weak_link->IsWeakCell()) return nullptr; | 983 if (!weak_link->IsWeakCell()) return nullptr; |
| 987 WeakCell* cell = WeakCell::cast(weak_link); | 984 WeakCell* cell = WeakCell::cast(weak_link); |
| 988 return cell->value(); | 985 return cell->value(); |
| 989 } | 986 } |
| 990 | 987 |
| 991 uint32_t GetNumImportedFunctions(Handle<JSObject> wasm_object) { | 988 uint32_t GetNumImportedFunctions(Handle<JSObject> wasm_object) { |
| 992 return static_cast<uint32_t>( | 989 DCHECK(IsWasmObject(*wasm_object)); |
| 993 Smi::cast(wasm_object->GetInternalField(kWasmNumImportedFunctions)) | 990 WasmCompiledModule* compiled_module = WasmCompiledModule::cast( |
| 994 ->value()); | 991 wasm_object->GetInternalField(kWasmCompiledModule)); |
| 992 return static_cast<uint32_t>(compiled_module->ptr_to_import_data()->length()); | |
|
titzer
2016/10/06 15:55:09
That won't work in my latest patch; the number of
Clemens Hammacher
2016/10/06 18:46:50
Fixed as discussed.
| |
| 995 } | 993 } |
| 996 | 994 |
| 997 WasmModule::WasmModule(byte* module_start) | 995 WasmModule::WasmModule(byte* module_start) |
| 998 : module_start(module_start), | 996 : module_start(module_start), |
| 999 module_end(nullptr), | 997 module_end(nullptr), |
| 1000 min_mem_pages(0), | 998 min_mem_pages(0), |
| 1001 max_mem_pages(0), | 999 max_mem_pages(0), |
| 1002 mem_export(false), | 1000 mem_export(false), |
| 1003 start_function_index(-1), | 1001 start_function_index(-1), |
| 1004 origin(kWasmOrigin), | 1002 origin(kWasmOrigin), |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1337 for (int index = 0; index < num_imported_functions; index++) { | 1335 for (int index = 0; index < num_imported_functions; index++) { |
| 1338 Handle<Code> import_wrapper = | 1336 Handle<Code> import_wrapper = |
| 1339 CompileImportWrapper(isolate, ffi, index, import_data, thrower); | 1337 CompileImportWrapper(isolate, ffi, index, import_data, thrower); |
| 1340 if (thrower->error()) return nothing; | 1338 if (thrower->error()) return nothing; |
| 1341 code_table->set(index, *import_wrapper); | 1339 code_table->set(index, *import_wrapper); |
| 1342 RecordStats(isolate, *import_wrapper); | 1340 RecordStats(isolate, *import_wrapper); |
| 1343 } | 1341 } |
| 1344 } | 1342 } |
| 1345 | 1343 |
| 1346 //-------------------------------------------------------------------------- | 1344 //-------------------------------------------------------------------------- |
| 1347 // Set up the debug support for the new instance. | |
| 1348 //-------------------------------------------------------------------------- | |
| 1349 // TODO(clemensh): avoid referencing this stuff from the instance, use it off | |
| 1350 // the compiled module instead. See the following 3 assignments: | |
| 1351 if (compiled_module->has_module_bytes()) { | |
| 1352 instance->SetInternalField(kWasmModuleBytesString, | |
| 1353 compiled_module->ptr_to_module_bytes()); | |
| 1354 } | |
| 1355 | |
| 1356 if (compiled_module->has_function_names()) { | |
| 1357 instance->SetInternalField(kWasmFunctionNamesArray, | |
| 1358 compiled_module->ptr_to_function_names()); | |
| 1359 } | |
| 1360 | |
| 1361 { | |
| 1362 Handle<Object> handle = factory->NewNumber(num_imported_functions); | |
| 1363 instance->SetInternalField(kWasmNumImportedFunctions, *handle); | |
| 1364 } | |
| 1365 | |
| 1366 //-------------------------------------------------------------------------- | |
| 1367 // Set up the runtime support for the new instance. | 1345 // Set up the runtime support for the new instance. |
| 1368 //-------------------------------------------------------------------------- | 1346 //-------------------------------------------------------------------------- |
| 1369 Handle<WeakCell> weak_link = isolate->factory()->NewWeakCell(instance); | 1347 Handle<WeakCell> weak_link = isolate->factory()->NewWeakCell(instance); |
| 1370 | 1348 |
| 1371 for (int i = num_imported_functions + FLAG_skip_compiling_wasm_funcs; | 1349 for (int i = num_imported_functions + FLAG_skip_compiling_wasm_funcs; |
| 1372 i < code_table->length(); ++i) { | 1350 i < code_table->length(); ++i) { |
| 1373 Handle<Code> code = code_table->GetValueChecked<Code>(isolate, i); | 1351 Handle<Code> code = code_table->GetValueChecked<Code>(isolate, i); |
| 1374 if (code->kind() == Code::WASM_FUNCTION) { | 1352 if (code->kind() == Code::WASM_FUNCTION) { |
| 1375 Handle<FixedArray> deopt_data = | 1353 Handle<FixedArray> deopt_data = |
| 1376 isolate->factory()->NewFixedArray(2, TENURED); | 1354 isolate->factory()->NewFixedArray(2, TENURED); |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1614 current = | 1592 current = |
| 1615 WasmCompiledModule::cast(current->ptr_to_weak_next_instance()->value()); | 1593 WasmCompiledModule::cast(current->ptr_to_weak_next_instance()->value()); |
| 1616 } | 1594 } |
| 1617 PrintF("\n"); | 1595 PrintF("\n"); |
| 1618 #endif | 1596 #endif |
| 1619 } | 1597 } |
| 1620 | 1598 |
| 1621 Handle<Object> GetWasmFunctionNameOrNull(Isolate* isolate, Handle<Object> wasm, | 1599 Handle<Object> GetWasmFunctionNameOrNull(Isolate* isolate, Handle<Object> wasm, |
| 1622 uint32_t func_index) { | 1600 uint32_t func_index) { |
| 1623 if (!wasm->IsUndefined(isolate)) { | 1601 if (!wasm->IsUndefined(isolate)) { |
| 1602 DCHECK(IsWasmObject(*wasm)); | |
| 1603 WasmCompiledModule* compiled_module = WasmCompiledModule::cast( | |
| 1604 Handle<JSObject>::cast(wasm)->GetInternalField(kWasmCompiledModule)); | |
| 1624 Handle<ByteArray> func_names_arr_obj( | 1605 Handle<ByteArray> func_names_arr_obj( |
| 1625 ByteArray::cast(Handle<JSObject>::cast(wasm)->GetInternalField( | 1606 compiled_module->ptr_to_function_names(), isolate); |
|
Mircea Trofin
2016/10/06 15:43:21
wouldn't compiled_module->function_names() give yo
Clemens Hammacher
2016/10/06 18:46:50
Good catch, fixed.
| |
| 1626 kWasmFunctionNamesArray)), | |
| 1627 isolate); | |
| 1628 // TODO(clemens): Extract this from the module bytes; skip whole function | 1607 // TODO(clemens): Extract this from the module bytes; skip whole function |
| 1629 // name table. | 1608 // name table. |
| 1630 Handle<Object> name; | 1609 Handle<Object> name; |
| 1631 if (GetWasmFunctionNameFromTable(func_names_arr_obj, func_index) | 1610 if (GetWasmFunctionNameFromTable(func_names_arr_obj, func_index) |
| 1632 .ToHandle(&name)) { | 1611 .ToHandle(&name)) { |
| 1633 return name; | 1612 return name; |
| 1634 } | 1613 } |
| 1635 } | 1614 } |
| 1636 return isolate->factory()->null_value(); | 1615 return isolate->factory()->null_value(); |
| 1637 } | 1616 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1651 | 1630 |
| 1652 JSObject* obj = JSObject::cast(object); | 1631 JSObject* obj = JSObject::cast(object); |
| 1653 Isolate* isolate = obj->GetIsolate(); | 1632 Isolate* isolate = obj->GetIsolate(); |
| 1654 if (obj->GetInternalFieldCount() != kWasmModuleInternalFieldCount) { | 1633 if (obj->GetInternalFieldCount() != kWasmModuleInternalFieldCount) { |
| 1655 return false; | 1634 return false; |
| 1656 } | 1635 } |
| 1657 | 1636 |
| 1658 Object* mem = obj->GetInternalField(kWasmMemArrayBuffer); | 1637 Object* mem = obj->GetInternalField(kWasmMemArrayBuffer); |
| 1659 if (!obj->GetInternalField(kWasmModuleCodeTable)->IsFixedArray() || | 1638 if (!obj->GetInternalField(kWasmModuleCodeTable)->IsFixedArray() || |
| 1660 !(mem->IsUndefined(isolate) || mem->IsJSArrayBuffer()) || | 1639 !(mem->IsUndefined(isolate) || mem->IsJSArrayBuffer()) || |
| 1661 !obj->GetInternalField(kWasmFunctionNamesArray)->IsByteArray() || | |
| 1662 !WasmCompiledModule::IsWasmCompiledModule( | 1640 !WasmCompiledModule::IsWasmCompiledModule( |
| 1663 obj->GetInternalField(kWasmCompiledModule))) { | 1641 obj->GetInternalField(kWasmCompiledModule))) { |
| 1664 return false; | 1642 return false; |
| 1665 } | 1643 } |
| 1666 | 1644 |
| 1667 // All checks passed. | 1645 // All checks passed. |
| 1668 return true; | 1646 return true; |
| 1669 } | 1647 } |
| 1670 | 1648 |
| 1671 SeqOneByteString* GetWasmBytes(JSObject* wasm) { | 1649 SeqOneByteString* GetWasmBytes(JSObject* wasm) { |
|
titzer
2016/10/06 15:55:09
Please return a handle instead of a raw pointer he
Clemens Hammacher
2016/10/06 18:46:50
Done.
| |
| 1672 return SeqOneByteString::cast(wasm->GetInternalField(kWasmModuleBytesString)); | 1650 DCHECK(IsWasmObject(wasm)); |
| 1651 WasmCompiledModule* compiled_module = | |
| 1652 WasmCompiledModule::cast(wasm->GetInternalField(kWasmCompiledModule)); | |
| 1653 return compiled_module->ptr_to_module_bytes(); | |
| 1673 } | 1654 } |
| 1674 | 1655 |
| 1675 Handle<WasmDebugInfo> GetDebugInfo(Handle<JSObject> wasm) { | 1656 Handle<WasmDebugInfo> GetDebugInfo(Handle<JSObject> wasm) { |
| 1676 Handle<Object> info(wasm->GetInternalField(kWasmDebugInfo), | 1657 Handle<Object> info(wasm->GetInternalField(kWasmDebugInfo), |
| 1677 wasm->GetIsolate()); | 1658 wasm->GetIsolate()); |
| 1678 if (!info->IsUndefined(wasm->GetIsolate())) | 1659 if (!info->IsUndefined(wasm->GetIsolate())) |
| 1679 return Handle<WasmDebugInfo>::cast(info); | 1660 return Handle<WasmDebugInfo>::cast(info); |
| 1680 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(wasm); | 1661 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(wasm); |
| 1681 wasm->SetInternalField(kWasmDebugInfo, *new_info); | 1662 wasm->SetInternalField(kWasmDebugInfo, *new_info); |
| 1682 return new_info; | 1663 return new_info; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1742 uint32_t max_size = table->length() / 2; | 1723 uint32_t max_size = table->length() / 2; |
| 1743 for (uint32_t i = max_size; i < max_size + table_size; ++i) { | 1724 for (uint32_t i = max_size; i < max_size + table_size; ++i) { |
| 1744 int index = Smi::cast(table->get(static_cast<int>(i)))->value(); | 1725 int index = Smi::cast(table->get(static_cast<int>(i)))->value(); |
| 1745 DCHECK_GE(index, 0); | 1726 DCHECK_GE(index, 0); |
| 1746 DCHECK_LT(static_cast<size_t>(index), code_table->size()); | 1727 DCHECK_LT(static_cast<size_t>(index), code_table->size()); |
| 1747 table->set(static_cast<int>(i), *(*code_table)[index]); | 1728 table->set(static_cast<int>(i), *(*code_table)[index]); |
| 1748 } | 1729 } |
| 1749 } | 1730 } |
| 1750 | 1731 |
| 1751 int GetNumberOfFunctions(JSObject* wasm) { | 1732 int GetNumberOfFunctions(JSObject* wasm) { |
| 1752 Object* func_names_obj = wasm->GetInternalField(kWasmFunctionNamesArray); | 1733 DCHECK(IsWasmObject(wasm)); |
| 1734 WasmCompiledModule* compiled_module = | |
| 1735 WasmCompiledModule::cast(wasm->GetInternalField(kWasmCompiledModule)); | |
| 1736 ByteArray* func_names_arr = compiled_module->ptr_to_function_names(); | |
| 1753 // TODO(clemensh): this looks inside an array constructed elsewhere. Refactor. | 1737 // TODO(clemensh): this looks inside an array constructed elsewhere. Refactor. |
| 1754 return ByteArray::cast(func_names_obj)->get_int(0); | 1738 return func_names_arr->get_int(0); |
| 1755 } | 1739 } |
| 1756 | 1740 |
| 1757 Handle<JSObject> CreateCompiledModuleObject(Isolate* isolate, | 1741 Handle<JSObject> CreateCompiledModuleObject(Isolate* isolate, |
| 1758 Handle<FixedArray> compiled_module, | 1742 Handle<FixedArray> compiled_module, |
| 1759 ModuleOrigin origin) { | 1743 ModuleOrigin origin) { |
| 1760 Handle<JSObject> module_obj; | 1744 Handle<JSObject> module_obj; |
| 1761 if (origin == ModuleOrigin::kWasmOrigin) { | 1745 if (origin == ModuleOrigin::kWasmOrigin) { |
| 1762 Handle<JSFunction> module_cons( | 1746 Handle<JSFunction> module_cons( |
| 1763 isolate->native_context()->wasm_module_constructor()); | 1747 isolate->native_context()->wasm_module_constructor()); |
| 1764 module_obj = isolate->factory()->NewJSObject(module_cons); | 1748 module_obj = isolate->factory()->NewJSObject(module_cons); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1935 WasmCompiledModule* compiled_module = | 1919 WasmCompiledModule* compiled_module = |
| 1936 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); | 1920 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); |
| 1937 CHECK(compiled_module->has_weak_module_object()); | 1921 CHECK(compiled_module->has_weak_module_object()); |
| 1938 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); | 1922 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); |
| 1939 } | 1923 } |
| 1940 | 1924 |
| 1941 } // namespace testing | 1925 } // namespace testing |
| 1942 } // namespace wasm | 1926 } // namespace wasm |
| 1943 } // namespace internal | 1927 } // namespace internal |
| 1944 } // namespace v8 | 1928 } // namespace v8 |
| OLD | NEW |