| Index: src/wasm/wasm-js.cc
|
| diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc
|
| index 80d8bdb2369e1b87e4fbf3427c19660f4a3e3bb6..7944a621e677e65796d9a50100913e783be1b5d1 100644
|
| --- a/src/wasm/wasm-js.cc
|
| +++ b/src/wasm/wasm-js.cc
|
| @@ -126,7 +126,8 @@ void CompileRun(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| }
|
|
|
|
|
| -v8::internal::wasm::WasmModuleIndex* TranslateAsmModule(i::ParseInfo* info) {
|
| +v8::internal::wasm::WasmModuleIndex* TranslateAsmModule(i::ParseInfo* info,
|
| + ErrorThrower* thrower) {
|
| info->set_global();
|
| info->set_lazy(false);
|
| info->set_allow_lazy_parsing(false);
|
| @@ -142,6 +143,7 @@ v8::internal::wasm::WasmModuleIndex* TranslateAsmModule(i::ParseInfo* info) {
|
| v8::internal::AsmTyper typer(info->isolate(), info->zone(), *(info->script()),
|
| info->literal());
|
| if (!typer.Validate()) {
|
| + thrower->Error("Asm.js validation failed: %s", typer.error_message());
|
| return nullptr;
|
| }
|
|
|
| @@ -162,7 +164,7 @@ void AsmCompileRun(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| return;
|
| }
|
| if (!args[0]->IsString()) {
|
| - thrower.Error("Invalid argument count");
|
| + thrower.Error("Asm module text should be a string");
|
| return;
|
| }
|
|
|
| @@ -172,9 +174,8 @@ void AsmCompileRun(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| i::Handle<i::Script> script = factory->NewScript(Utils::OpenHandle(*source));
|
| i::ParseInfo info(&zone, script);
|
|
|
| - auto module = TranslateAsmModule(&info);
|
| + auto module = TranslateAsmModule(&info, &thrower);
|
| if (module == nullptr) {
|
| - thrower.Error("Asm.js validation failed");
|
| return;
|
| }
|
|
|
| @@ -184,42 +185,35 @@ void AsmCompileRun(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| }
|
|
|
|
|
| -// TODO(aseemgarg): deal with arraybuffer and foreign functions
|
| -void InstantiateModuleFromAsm(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - HandleScope scope(args.GetIsolate());
|
| +void InstantiateModuleCommon(const v8::FunctionCallbackInfo<v8::Value>& args,
|
| + const byte* start, const byte* end,
|
| + ErrorThrower* thrower, bool must_decode) {
|
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate());
|
| - ErrorThrower thrower(isolate, "WASM.instantiateModuleFromAsm()");
|
|
|
| - if (args.Length() != 1) {
|
| - thrower.Error("Invalid argument count");
|
| - return;
|
| - }
|
| - if (!args[0]->IsString()) {
|
| - thrower.Error("Invalid argument count");
|
| - return;
|
| + i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null();
|
| + if (args.Length() > 2 && args[2]->IsArrayBuffer()) {
|
| + Local<Object> obj = Local<Object>::Cast(args[2]);
|
| + i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj);
|
| + memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj));
|
| }
|
|
|
| - i::Factory* factory = isolate->factory();
|
| + // Decode but avoid a redundant pass over function bodies for verification.
|
| + // Verification will happen during compilation.
|
| i::Zone zone;
|
| - Local<String> source = Local<String>::Cast(args[0]);
|
| - i::Handle<i::Script> script = factory->NewScript(Utils::OpenHandle(*source));
|
| - i::ParseInfo info(&zone, script);
|
| -
|
| - auto module = TranslateAsmModule(&info);
|
| - if (module == nullptr) {
|
| - thrower.Error("Asm.js validation failed");
|
| - return;
|
| - }
|
| -
|
| - i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null();
|
| internal::wasm::ModuleResult result = internal::wasm::DecodeWasmModule(
|
| - isolate, &zone, module->Begin(), module->End(), false, false);
|
| + isolate, &zone, start, end, false, false);
|
|
|
| - if (result.failed()) {
|
| - thrower.Failed("", result);
|
| + if (result.failed() && must_decode) {
|
| + thrower->Error("Asm.js converted module failed to decode");
|
| + } else if (result.failed()) {
|
| + thrower->Failed("", result);
|
| } else {
|
| // Success. Instantiate the module and return the object.
|
| i::Handle<i::JSObject> ffi = i::Handle<i::JSObject>::null();
|
| + if (args.Length() > 1 && args[1]->IsObject()) {
|
| + Local<Object> obj = Local<Object>::Cast(args[1]);
|
| + ffi = i::Handle<i::JSObject>::cast(v8::Utils::OpenHandle(*obj));
|
| + }
|
|
|
| i::MaybeHandle<i::JSObject> object =
|
| result.val->Instantiate(isolate, ffi, memory);
|
| @@ -233,46 +227,40 @@ void InstantiateModuleFromAsm(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| }
|
|
|
|
|
| -void InstantiateModule(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| +void InstantiateModuleFromAsm(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| HandleScope scope(args.GetIsolate());
|
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate());
|
| - ErrorThrower thrower(isolate, "WASM.instantiateModule()");
|
| -
|
| - RawBuffer buffer = GetRawBufferArgument(thrower, args);
|
| - if (buffer.start == nullptr) return;
|
| + ErrorThrower thrower(isolate, "WASM.instantiateModuleFromAsm()");
|
|
|
| - i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null();
|
| - if (args.Length() > 2 && args[2]->IsArrayBuffer()) {
|
| - Local<Object> obj = Local<Object>::Cast(args[2]);
|
| - i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj);
|
| - memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj));
|
| + if (!args[0]->IsString()) {
|
| + thrower.Error("Asm module text should be a string");
|
| + return;
|
| }
|
|
|
| - // Decode but avoid a redundant pass over function bodies for verification.
|
| - // Verification will happen during compilation.
|
| + i::Factory* factory = isolate->factory();
|
| i::Zone zone;
|
| - internal::wasm::ModuleResult result = internal::wasm::DecodeWasmModule(
|
| - isolate, &zone, buffer.start, buffer.end, false, false);
|
| + Local<String> source = Local<String>::Cast(args[0]);
|
| + i::Handle<i::Script> script = factory->NewScript(Utils::OpenHandle(*source));
|
| + i::ParseInfo info(&zone, script);
|
|
|
| - if (result.failed()) {
|
| - thrower.Failed("", result);
|
| - } else {
|
| - // Success. Instantiate the module and return the object.
|
| - i::Handle<i::JSObject> ffi = i::Handle<i::JSObject>::null();
|
| - if (args.Length() > 1 && args[1]->IsObject()) {
|
| - Local<Object> obj = Local<Object>::Cast(args[1]);
|
| - ffi = i::Handle<i::JSObject>::cast(v8::Utils::OpenHandle(*obj));
|
| - }
|
| + auto module = TranslateAsmModule(&info, &thrower);
|
| + if (module == nullptr) {
|
| + return;
|
| + }
|
|
|
| - i::MaybeHandle<i::JSObject> object =
|
| - result.val->Instantiate(isolate, ffi, memory);
|
| + InstantiateModuleCommon(args, module->Begin(), module->End(), &thrower, true);
|
| +}
|
|
|
| - if (!object.is_null()) {
|
| - args.GetReturnValue().Set(v8::Utils::ToLocal(object.ToHandleChecked()));
|
| - }
|
| - }
|
|
|
| - if (result.val) delete result.val;
|
| +void InstantiateModule(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| + HandleScope scope(args.GetIsolate());
|
| + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate());
|
| + ErrorThrower thrower(isolate, "WASM.instantiateModule()");
|
| +
|
| + RawBuffer buffer = GetRawBufferArgument(thrower, args);
|
| + if (buffer.start == nullptr) return;
|
| +
|
| + InstantiateModuleCommon(args, buffer.start, buffer.end, &thrower, false);
|
| }
|
| } // namespace
|
|
|
|
|