Commit 859ee844 authored by Andreas Haas's avatar Andreas Haas Committed by Commit Bot

[wasm] Move ScheduledErrorThrower to wasm-api.h

The ScheduledErrorThrower is also needed in the wasm-async fuzzer so I
moved the implementation from wasm-js.cc to wasm-api.[h|cc].

R=clemensh@chromium.org

Bug: chromium:749838
Change-Id: I49d7438d1ec0281285ce0c64ba462c22001be08e
Reviewed-on: https://chromium-review.googlesource.com/591447
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Reviewed-by: 's avatarClemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#47112}
parent 808e90a9
...@@ -1997,6 +1997,8 @@ v8_source_set("v8_base") { ...@@ -1997,6 +1997,8 @@ v8_source_set("v8_base") {
"src/wasm/signature-map.h", "src/wasm/signature-map.h",
"src/wasm/streaming-decoder.cc", "src/wasm/streaming-decoder.cc",
"src/wasm/streaming-decoder.h", "src/wasm/streaming-decoder.h",
"src/wasm/wasm-api.cc",
"src/wasm/wasm-api.h",
"src/wasm/wasm-code-specialization.cc", "src/wasm/wasm-code-specialization.cc",
"src/wasm/wasm-code-specialization.h", "src/wasm/wasm-code-specialization.h",
"src/wasm/wasm-debug.cc", "src/wasm/wasm-debug.cc",
......
...@@ -1440,6 +1440,8 @@ ...@@ -1440,6 +1440,8 @@
'wasm/signature-map.h', 'wasm/signature-map.h',
'wasm/streaming-decoder.cc', 'wasm/streaming-decoder.cc',
'wasm/streaming-decoder.h', 'wasm/streaming-decoder.h',
'wasm/wasm-api.cc',
'wasm/wasm-api.h',
'wasm/wasm-code-specialization.h', 'wasm/wasm-code-specialization.h',
'wasm/wasm-code-specialization.cc', 'wasm/wasm-code-specialization.cc',
'wasm/wasm-debug.cc', 'wasm/wasm-debug.cc',
......
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/wasm/wasm-api.h"
#include "src/isolate-inl.h"
#include "src/isolate.h"
namespace v8 {
namespace internal {
namespace wasm {
ScheduledErrorThrower::~ScheduledErrorThrower() {
// There should never be both a pending and a scheduled exception.
DCHECK(!isolate()->has_scheduled_exception() ||
!isolate()->has_pending_exception());
// Don't throw another error if there is already a scheduled error.
if (isolate()->has_scheduled_exception()) {
Reset();
} else if (isolate()->has_pending_exception()) {
Reset();
isolate()->OptionalRescheduleException(false);
} else if (error()) {
isolate()->ScheduleThrow(*Reify());
}
}
} // namespace wasm
} // namespace internal
} // namespace v8
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_WASM_API_H_
#define V8_WASM_API_H_
#include "src/wasm/wasm-result.h"
namespace v8 {
namespace internal {
namespace wasm {
// Like an ErrorThrower, but turns all pending exceptions into scheduled
// exceptions when going out of scope. Use this in API methods.
// Note that pending exceptions are not necessarily created by the ErrorThrower,
// but e.g. by the wasm start function. There might also be a scheduled
// exception, created by another API call (e.g. v8::Object::Get). But there
// should never be both pending and scheduled exceptions.
class V8_EXPORT_PRIVATE ScheduledErrorThrower : public ErrorThrower {
public:
ScheduledErrorThrower(v8::Isolate* isolate, const char* context)
: ScheduledErrorThrower(reinterpret_cast<Isolate*>(isolate), context) {}
ScheduledErrorThrower(Isolate* isolate, const char* context)
: ErrorThrower(isolate, context) {}
~ScheduledErrorThrower();
};
} // namespace wasm
} // namespace internal
} // namespace v8
#endif // V8_WASM_API_H_
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "src/parsing/parse-info.h" #include "src/parsing/parse-info.h"
#include "src/wasm/module-decoder.h" #include "src/wasm/module-decoder.h"
#include "src/wasm/wasm-api.h"
#include "src/wasm/wasm-js.h" #include "src/wasm/wasm-js.h"
#include "src/wasm/wasm-limits.h" #include "src/wasm/wasm-limits.h"
#include "src/wasm/wasm-module.h" #include "src/wasm/wasm-module.h"
...@@ -40,35 +41,6 @@ namespace { ...@@ -40,35 +41,6 @@ namespace {
} \ } \
} while (false) } while (false)
// Like an ErrorThrower, but turns all pending exceptions into scheduled
// exceptions when going out of scope. Use this in API methods.
// Note that pending exceptions are not necessarily created by the ErrorThrower,
// but e.g. by the wasm start function. There might also be a scheduled
// exception, created by another API call (e.g. v8::Object::Get). But there
// should never be both pending and scheduled exceptions.
class ScheduledErrorThrower : public ErrorThrower {
public:
ScheduledErrorThrower(v8::Isolate* isolate, const char* context)
: ScheduledErrorThrower(reinterpret_cast<i::Isolate*>(isolate), context) {
}
ScheduledErrorThrower(i::Isolate* isolate, const char* context)
: ErrorThrower(isolate, context) {}
~ScheduledErrorThrower() {
// There should never be both a pending and a scheduled exception.
DCHECK(!isolate()->has_scheduled_exception() ||
!isolate()->has_pending_exception());
// Don't throw another error if there is already a scheduled error.
if (isolate()->has_scheduled_exception()) {
Reset();
} else if (isolate()->has_pending_exception()) {
Reset();
isolate()->OptionalRescheduleException(false);
} else if (error()) {
isolate()->ScheduleThrow(*Reify());
}
}
};
i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) {
return isolate->factory()->NewStringFromAsciiChecked(str); return isolate->factory()->NewStringFromAsciiChecked(str);
} }
...@@ -164,7 +136,7 @@ void WebAssemblyCompile(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -164,7 +136,7 @@ void WebAssemblyCompile(const v8::FunctionCallbackInfo<v8::Value>& args) {
MicrotasksScope runs_microtasks(isolate, MicrotasksScope::kRunMicrotasks); MicrotasksScope runs_microtasks(isolate, MicrotasksScope::kRunMicrotasks);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.compile()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.compile()");
Local<Context> context = isolate->GetCurrentContext(); Local<Context> context = isolate->GetCurrentContext();
ASSIGN(Promise::Resolver, resolver, Promise::Resolver::New(context)); ASSIGN(Promise::Resolver, resolver, Promise::Resolver::New(context));
...@@ -187,7 +159,7 @@ void WebAssemblyValidate(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -187,7 +159,7 @@ void WebAssemblyValidate(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.validate()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.validate()");
auto bytes = GetFirstArgumentAsBytes(args, &thrower); auto bytes = GetFirstArgumentAsBytes(args, &thrower);
...@@ -208,7 +180,7 @@ void WebAssemblyModule(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -208,7 +180,7 @@ void WebAssemblyModule(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (i_isolate->wasm_module_callback()(args)) return; if (i_isolate->wasm_module_callback()(args)) return;
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Module()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Module()");
auto bytes = GetFirstArgumentAsBytes(args, &thrower); auto bytes = GetFirstArgumentAsBytes(args, &thrower);
...@@ -228,7 +200,8 @@ void WebAssemblyModuleImports(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -228,7 +200,8 @@ void WebAssemblyModuleImports(const v8::FunctionCallbackInfo<v8::Value>& args) {
HandleScope scope(args.GetIsolate()); HandleScope scope(args.GetIsolate());
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Module.imports()"); i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly.Module.imports()");
auto maybe_module = GetFirstArgumentAsModule(args, &thrower); auto maybe_module = GetFirstArgumentAsModule(args, &thrower);
if (thrower.error()) return; if (thrower.error()) return;
...@@ -241,7 +214,8 @@ void WebAssemblyModuleExports(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -241,7 +214,8 @@ void WebAssemblyModuleExports(const v8::FunctionCallbackInfo<v8::Value>& args) {
HandleScope scope(args.GetIsolate()); HandleScope scope(args.GetIsolate());
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Module.exports()"); i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly.Module.exports()");
auto maybe_module = GetFirstArgumentAsModule(args, &thrower); auto maybe_module = GetFirstArgumentAsModule(args, &thrower);
if (thrower.error()) return; if (thrower.error()) return;
...@@ -255,8 +229,8 @@ void WebAssemblyModuleCustomSections( ...@@ -255,8 +229,8 @@ void WebAssemblyModuleCustomSections(
HandleScope scope(args.GetIsolate()); HandleScope scope(args.GetIsolate());
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
ScheduledErrorThrower thrower(i_isolate, i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly.Module.customSections()"); "WebAssembly.Module.customSections()");
auto maybe_module = GetFirstArgumentAsModule(args, &thrower); auto maybe_module = GetFirstArgumentAsModule(args, &thrower);
if (thrower.error()) return; if (thrower.error()) return;
...@@ -286,7 +260,8 @@ MaybeLocal<Value> WebAssemblyInstantiateImpl(Isolate* isolate, ...@@ -286,7 +260,8 @@ MaybeLocal<Value> WebAssemblyInstantiateImpl(Isolate* isolate,
i::MaybeHandle<i::Object> instance_object; i::MaybeHandle<i::Object> instance_object;
{ {
ScheduledErrorThrower thrower(i_isolate, "WebAssembly Instantiation"); i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly Instantiation");
i::MaybeHandle<i::JSReceiver> maybe_imports = i::MaybeHandle<i::JSReceiver> maybe_imports =
GetValueAsImports(ffi, &thrower); GetValueAsImports(ffi, &thrower);
if (thrower.error()) return {}; if (thrower.error()) return {};
...@@ -366,7 +341,7 @@ void WebAssemblyInstance(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -366,7 +341,7 @@ void WebAssemblyInstance(const v8::FunctionCallbackInfo<v8::Value>& args) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
if (i_isolate->wasm_instance_callback()(args)) return; if (i_isolate->wasm_instance_callback()(args)) return;
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Instance()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Instance()");
GetFirstArgumentAsModule(args, &thrower); GetFirstArgumentAsModule(args, &thrower);
if (thrower.error()) return; if (thrower.error()) return;
...@@ -416,7 +391,8 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -416,7 +391,8 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
MicrotasksScope runs_microtasks(isolate, MicrotasksScope::kRunMicrotasks); MicrotasksScope runs_microtasks(isolate, MicrotasksScope::kRunMicrotasks);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.instantiate()"); i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly.instantiate()");
HandleScope scope(isolate); HandleScope scope(isolate);
...@@ -502,7 +478,7 @@ void WebAssemblyTable(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -502,7 +478,7 @@ void WebAssemblyTable(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Module()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Module()");
if (args.Length() < 1 || !args[0]->IsObject()) { if (args.Length() < 1 || !args[0]->IsObject()) {
thrower.TypeError("Argument 0 must be a table descriptor"); thrower.TypeError("Argument 0 must be a table descriptor");
return; return;
...@@ -555,7 +531,7 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -555,7 +531,7 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory()");
if (args.Length() < 1 || !args[0]->IsObject()) { if (args.Length() < 1 || !args[0]->IsObject()) {
thrower.TypeError("Argument 0 must be a memory descriptor"); thrower.TypeError("Argument 0 must be a memory descriptor");
return; return;
...@@ -644,7 +620,8 @@ void WebAssemblyTableGetLength( ...@@ -644,7 +620,8 @@ void WebAssemblyTableGetLength(
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.length()"); i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly.Table.length()");
EXTRACT_THIS(receiver, WasmTableObject); EXTRACT_THIS(receiver, WasmTableObject);
args.GetReturnValue().Set( args.GetReturnValue().Set(
v8::Number::New(isolate, receiver->current_length())); v8::Number::New(isolate, receiver->current_length()));
...@@ -655,7 +632,7 @@ void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -655,7 +632,7 @@ void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.grow()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.grow()");
Local<Context> context = isolate->GetCurrentContext(); Local<Context> context = isolate->GetCurrentContext();
EXTRACT_THIS(receiver, WasmTableObject); EXTRACT_THIS(receiver, WasmTableObject);
...@@ -700,7 +677,7 @@ void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -700,7 +677,7 @@ void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.get()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.get()");
Local<Context> context = isolate->GetCurrentContext(); Local<Context> context = isolate->GetCurrentContext();
EXTRACT_THIS(receiver, WasmTableObject); EXTRACT_THIS(receiver, WasmTableObject);
i::Handle<i::FixedArray> array(receiver->functions(), i_isolate); i::Handle<i::FixedArray> array(receiver->functions(), i_isolate);
...@@ -721,7 +698,7 @@ void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -721,7 +698,7 @@ void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.set()"); i::wasm::ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.set()");
Local<Context> context = isolate->GetCurrentContext(); Local<Context> context = isolate->GetCurrentContext();
EXTRACT_THIS(receiver, WasmTableObject); EXTRACT_THIS(receiver, WasmTableObject);
...@@ -755,7 +732,8 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -755,7 +732,8 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.grow()"); i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly.Memory.grow()");
Local<Context> context = isolate->GetCurrentContext(); Local<Context> context = isolate->GetCurrentContext();
EXTRACT_THIS(receiver, WasmMemoryObject); EXTRACT_THIS(receiver, WasmMemoryObject);
...@@ -798,7 +776,8 @@ void WebAssemblyMemoryGetBuffer( ...@@ -798,7 +776,8 @@ void WebAssemblyMemoryGetBuffer(
v8::Isolate* isolate = args.GetIsolate(); v8::Isolate* isolate = args.GetIsolate();
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
HandleScope scope(isolate); HandleScope scope(isolate);
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.buffer"); i::wasm::ScheduledErrorThrower thrower(i_isolate,
"WebAssembly.Memory.buffer");
EXTRACT_THIS(receiver, WasmMemoryObject); EXTRACT_THIS(receiver, WasmMemoryObject);
i::Handle<i::Object> buffer_obj(receiver->array_buffer(), i_isolate); i::Handle<i::Object> buffer_obj(receiver->array_buffer(), i_isolate);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "src/isolate.h" #include "src/isolate.h"
#include "src/objects-inl.h" #include "src/objects-inl.h"
#include "src/objects.h" #include "src/objects.h"
#include "src/wasm/wasm-api.h"
#include "src/wasm/wasm-module.h" #include "src/wasm/wasm-module.h"
#include "test/common/wasm/flag-utils.h" #include "test/common/wasm/flag-utils.h"
#include "test/common/wasm/wasm-module-runner.h" #include "test/common/wasm/wasm-module-runner.h"
...@@ -59,7 +60,7 @@ void InstantiateCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -59,7 +60,7 @@ void InstantiateCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
ErrorThrower thrower(i_isolate, "WebAssembly Instantiation"); ScheduledErrorThrower thrower(i_isolate, "WebAssembly Instantiation");
i::Handle<i::WasmModuleObject> module_obj = ToWasmModuleObjectUnchecked( i::Handle<i::WasmModuleObject> module_obj = ToWasmModuleObjectUnchecked(
v8::Utils::OpenHandle(v8::Object::Cast(*module))); v8::Utils::OpenHandle(v8::Object::Cast(*module)));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment