| 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 1654 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1665     thrower->Failed("Wasm decoding failed", result); | 1665     thrower->Failed("Wasm decoding failed", result); | 
| 1666     return nothing; | 1666     return nothing; | 
| 1667   } | 1667   } | 
| 1668   MaybeHandle<FixedArray> compiled_module = | 1668   MaybeHandle<FixedArray> compiled_module = | 
| 1669       decoded_module->CompileFunctions(isolate, thrower); | 1669       decoded_module->CompileFunctions(isolate, thrower); | 
| 1670   if (compiled_module.is_null()) return nothing; | 1670   if (compiled_module.is_null()) return nothing; | 
| 1671 | 1671 | 
| 1672   return CreateCompiledModuleObject(isolate, compiled_module.ToHandleChecked(), | 1672   return CreateCompiledModuleObject(isolate, compiled_module.ToHandleChecked(), | 
| 1673                                     origin); | 1673                                     origin); | 
| 1674 } | 1674 } | 
| 1675 |  | 
| 1676 namespace testing { |  | 
| 1677 |  | 
| 1678 int32_t CompileAndRunWasmModule(Isolate* isolate, const byte* module_start, |  | 
| 1679                                 const byte* module_end, bool asm_js) { |  | 
| 1680   HandleScope scope(isolate); |  | 
| 1681   Zone zone(isolate->allocator()); |  | 
| 1682   ErrorThrower thrower(isolate, "CompileAndRunWasmModule"); |  | 
| 1683 |  | 
| 1684   // Decode the module, but don't verify function bodies, since we'll |  | 
| 1685   // be compiling them anyway. |  | 
| 1686   ModuleResult decoding_result = |  | 
| 1687       DecodeWasmModule(isolate, &zone, module_start, module_end, false, |  | 
| 1688                        asm_js ? kAsmJsOrigin : kWasmOrigin); |  | 
| 1689 |  | 
| 1690   std::unique_ptr<const WasmModule> module(decoding_result.val); |  | 
| 1691   if (decoding_result.failed()) { |  | 
| 1692     // Module verification failed. throw. |  | 
| 1693     thrower.Error("WASM.compileRun() failed: %s", |  | 
| 1694                   decoding_result.error_msg.get()); |  | 
| 1695     return -1; |  | 
| 1696   } |  | 
| 1697 |  | 
| 1698   if (module->import_table.size() > 0) { |  | 
| 1699     thrower.Error("Not supported: module has imports."); |  | 
| 1700   } |  | 
| 1701   if (module->export_table.size() == 0) { |  | 
| 1702     thrower.Error("Not supported: module has no exports."); |  | 
| 1703   } |  | 
| 1704 |  | 
| 1705   if (thrower.error()) return -1; |  | 
| 1706   MaybeHandle<FixedArray> compiled_module = |  | 
| 1707       module->CompileFunctions(isolate, &thrower); |  | 
| 1708 |  | 
| 1709   if (compiled_module.is_null()) return -1; |  | 
| 1710   Handle<JSObject> instance = |  | 
| 1711       WasmModule::Instantiate(isolate, compiled_module.ToHandleChecked(), |  | 
| 1712                               Handle<JSReceiver>::null(), |  | 
| 1713                               Handle<JSArrayBuffer>::null()) |  | 
| 1714           .ToHandleChecked(); |  | 
| 1715 |  | 
| 1716   return CallFunction(isolate, instance, &thrower, asm_js ? "caller" : "main", |  | 
| 1717                       0, nullptr, asm_js); |  | 
| 1718 } |  | 
| 1719 |  | 
| 1720 int32_t CallFunction(Isolate* isolate, Handle<JSObject> instance, |  | 
| 1721                      ErrorThrower* thrower, const char* name, int argc, |  | 
| 1722                      Handle<Object> argv[], bool asm_js) { |  | 
| 1723   Handle<JSObject> exports_object; |  | 
| 1724   if (asm_js) { |  | 
| 1725     exports_object = instance; |  | 
| 1726   } else { |  | 
| 1727     Handle<Name> exports = isolate->factory()->InternalizeUtf8String("exports"); |  | 
| 1728     exports_object = Handle<JSObject>::cast( |  | 
| 1729         JSObject::GetProperty(instance, exports).ToHandleChecked()); |  | 
| 1730   } |  | 
| 1731   Handle<Name> main_name = isolate->factory()->NewStringFromAsciiChecked(name); |  | 
| 1732   PropertyDescriptor desc; |  | 
| 1733   Maybe<bool> property_found = JSReceiver::GetOwnPropertyDescriptor( |  | 
| 1734       isolate, exports_object, main_name, &desc); |  | 
| 1735   if (!property_found.FromMaybe(false)) return -1; |  | 
| 1736 |  | 
| 1737   Handle<JSFunction> main_export = Handle<JSFunction>::cast(desc.value()); |  | 
| 1738 |  | 
| 1739   // Call the JS function. |  | 
| 1740   Handle<Object> undefined = isolate->factory()->undefined_value(); |  | 
| 1741   MaybeHandle<Object> retval = |  | 
| 1742       Execution::Call(isolate, main_export, undefined, argc, argv); |  | 
| 1743 |  | 
| 1744   // The result should be a number. |  | 
| 1745   if (retval.is_null()) { |  | 
| 1746     thrower->Error("WASM.compileRun() failed: Invocation was null"); |  | 
| 1747     return -1; |  | 
| 1748   } |  | 
| 1749   Handle<Object> result = retval.ToHandleChecked(); |  | 
| 1750   if (result->IsSmi()) { |  | 
| 1751     return Smi::cast(*result)->value(); |  | 
| 1752   } |  | 
| 1753   if (result->IsHeapNumber()) { |  | 
| 1754     return static_cast<int32_t>(HeapNumber::cast(*result)->value()); |  | 
| 1755   } |  | 
| 1756   thrower->Error("WASM.compileRun() failed: Return value should be number"); |  | 
| 1757   return -1; |  | 
| 1758 } |  | 
| 1759 |  | 
| 1760 }  // namespace testing |  | 
| 1761 }  // namespace wasm | 1675 }  // namespace wasm | 
| 1762 }  // namespace internal | 1676 }  // namespace internal | 
| 1763 }  // namespace v8 | 1677 }  // namespace v8 | 
| OLD | NEW | 
|---|