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

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

Issue 2321443002: [wasm] Call the wasm interpreter from the wasm-code-fuzzer. (Closed)
Patch Set: Address comments Created 4 years, 3 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/cctest/cctest.gyp » ('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 <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
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
OLDNEW
« no previous file with comments | « src/wasm/wasm-module.h ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698