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

Unified Diff: src/wasm/wasm-module.cc

Issue 2091533002: [wasm] Consolidate CompileAndRunWasmModule (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/wasm/wasm-module.h ('k') | test/cctest/wasm/test-run-wasm-module.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-module.cc
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
index 6d9b06b2b51fa835d2d4cc74934369f4dd1045be..00d38ecfa960180e91d44cc5f2f042a6153180c2 100644
--- a/src/wasm/wasm-module.cc
+++ b/src/wasm/wasm-module.cc
@@ -966,106 +966,6 @@ compiler::CallDescriptor* ModuleEnv::GetCallDescriptor(Zone* zone,
return GetWasmCallDescriptor(zone, function->sig);
}
-int32_t CompileAndRunWasmModule(Isolate* isolate, const byte* module_start,
- const byte* module_end, bool asm_js) {
- HandleScope scope(isolate);
- Zone zone(isolate->allocator());
- // Decode the module, but don't verify function bodies, since we'll
- // be compiling them anyway.
- ModuleResult result =
- DecodeWasmModule(isolate, &zone, module_start, module_end, false,
- asm_js ? kAsmJsOrigin : kWasmOrigin);
- if (result.failed()) {
- if (result.val) {
- delete result.val;
- }
- // Module verification failed. throw.
- std::ostringstream str;
- str << "WASM.compileRun() failed: " << result;
- isolate->Throw(
- *isolate->factory()->NewStringFromAsciiChecked(str.str().c_str()));
- return -1;
- }
-
- int32_t retval = CompileAndRunWasmModule(isolate, result.val);
- delete result.val;
- return retval;
-}
-
-int32_t CompileAndRunWasmModule(Isolate* isolate, const WasmModule* module) {
- ErrorThrower thrower(isolate, "CompileAndRunWasmModule");
- WasmModuleInstance instance(module);
- Handle<FixedArray> code_table = module->CompileFunctions(isolate);
-
- if (code_table.is_null()) return -1;
-
- for (uint32_t i = 0; i < module->functions.size(); ++i) {
- Handle<Code> code = Handle<Code>(Code::cast(code_table->get(i)));
- instance.function_code[i] = code;
- }
-
- // Allocate and initialize the linear memory.
- if (!AllocateMemory(&thrower, isolate, &instance)) {
- return -1;
- }
- LoadDataSegments(module, instance.mem_start, instance.mem_size);
-
- // Allocate the globals area if necessary.
- if (!AllocateGlobals(&thrower, isolate, &instance)) {
- return -1;
- }
-
- ModuleEnv module_env;
- module_env.module = module;
- module_env.instance = &instance;
- module_env.origin = module->origin;
- InitializePlaceholders(isolate->factory(), &module_env.placeholders,
- module->functions.size());
- if (module->export_table.size() == 0) {
- thrower.Error("WASM.compileRun() failed: no exported functions");
- return -2;
- }
-
- // Compile all functions.
- for (const WasmFunction& func : module->functions) {
- // Compile the function and install it in the linker.
- Handle<Code> code = compiler::WasmCompilationUnit::CompileWasmFunction(
- &thrower, isolate, &module_env, &func);
- if (!code.is_null()) instance.function_code[func.func_index] = code;
- if (thrower.error()) return -1;
- }
-
- LinkModuleFunctions(isolate, instance.function_code);
-
- // Wrap the main code so it can be called as a JS function.
- uint32_t main_index = module->export_table.back().func_index;
- Handle<Code> main_code = instance.function_code[main_index];
- Handle<String> name = isolate->factory()->NewStringFromStaticChars("main");
- Handle<JSObject> module_object = Handle<JSObject>(0, isolate);
- Handle<JSFunction> jsfunc = compiler::CompileJSToWasmWrapper(
- isolate, &module_env, name, main_code, module_object, main_index);
-
- // Call the JS function.
- Handle<Object> undefined = isolate->factory()->undefined_value();
- MaybeHandle<Object> retval =
- Execution::Call(isolate, jsfunc, undefined, 0, nullptr);
-
- // The result should be a number.
- if (retval.is_null()) {
- thrower.Error("WASM.compileRun() failed: Invocation was null");
- return -1;
- }
- Handle<Object> result = retval.ToHandleChecked();
- if (result->IsSmi()) {
- return Smi::cast(*result)->value();
- }
- if (result->IsHeapNumber()) {
- return static_cast<int32_t>(HeapNumber::cast(*result)->value());
- }
- thrower.Error("WASM.compileRun() failed: Return value should be number");
- return -1;
-}
-
Handle<Object> GetWasmFunctionNameOrNull(Isolate* isolate, Handle<Object> wasm,
uint32_t func_index) {
if (!wasm->IsUndefined(isolate)) {
@@ -1126,6 +1026,74 @@ WasmDebugInfo* GetDebugInfo(JSObject* wasm) {
return *new_info;
}
+namespace testing {
+
+int32_t CompileAndRunWasmModule(Isolate* isolate, const byte* module_start,
+ const byte* module_end, bool asm_js) {
+ HandleScope scope(isolate);
+ Zone zone(isolate->allocator());
+ ErrorThrower thrower(isolate, "CompileAndRunWasmModule");
+
+ // Decode the module, but don't verify function bodies, since we'll
+ // be compiling them anyway.
+ ModuleResult decoding_result =
+ DecodeWasmModule(isolate, &zone, module_start, module_end, false,
+ asm_js ? kAsmJsOrigin : kWasmOrigin);
+ if (decoding_result.failed()) {
+ // Module verification failed. throw.
+ thrower.Error("WASM.compileRun() failed: %s",
+ decoding_result.error_msg.get());
ahaas 2016/06/23 13:49:19 Should you not return here?
Mircea Trofin 2016/06/23 15:04:14 Good catch - yes, we should.
+ }
+ std::unique_ptr<const WasmModule> module(decoding_result.val);
+
+ if (module->import_table.size() > 0) {
+ thrower.Error("Not supported: module has imports.");
+ }
+ if (module->export_table.size() == 0) {
+ thrower.Error("Not supported: module has no exports.");
+ }
+
+ if (thrower.error()) return -1;
+
+ Handle<JSObject> instance =
+ module
+ ->Instantiate(isolate, Handle<JSReceiver>::null(),
+ Handle<JSArrayBuffer>::null())
+ .ToHandleChecked();
+
+ Handle<Name> exports = isolate->factory()->InternalizeUtf8String("exports");
+ Handle<JSObject> exports_object = Handle<JSObject>::cast(
+ JSObject::GetProperty(instance, exports).ToHandleChecked());
+ Handle<Name> main_name = isolate->factory()->NewStringFromStaticChars("main");
+ PropertyDescriptor desc;
+ Maybe<bool> property_found = JSReceiver::GetOwnPropertyDescriptor(
+ isolate, exports_object, main_name, &desc);
+ if (!property_found.FromMaybe(false)) return -1;
+
+ Handle<JSFunction> main_export = Handle<JSFunction>::cast(desc.value());
+
+ // Call the JS function.
+ Handle<Object> undefined = isolate->factory()->undefined_value();
+ MaybeHandle<Object> retval =
+ Execution::Call(isolate, main_export, undefined, 0, nullptr);
+
+ // The result should be a number.
+ if (retval.is_null()) {
+ thrower.Error("WASM.compileRun() failed: Invocation was null");
+ return -1;
+ }
+ Handle<Object> result = retval.ToHandleChecked();
+ if (result->IsSmi()) {
+ return Smi::cast(*result)->value();
+ }
+ if (result->IsHeapNumber()) {
+ return static_cast<int32_t>(HeapNumber::cast(*result)->value());
+ }
+ thrower.Error("WASM.compileRun() failed: Return value should be number");
+ return -1;
+}
+
+} // namespace testing
} // namespace wasm
} // namespace internal
} // namespace v8
« no previous file with comments | « src/wasm/wasm-module.h ('k') | test/cctest/wasm/test-run-wasm-module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698