| Index: src/wasm/wasm-js.cc
|
| diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc
|
| index 20c6d9bb69910cb15ae93ccad99dc0b3a21b5be4..da7b3628e7a688ff4623d11f54451a0e463d538b 100644
|
| --- a/src/wasm/wasm-js.cc
|
| +++ b/src/wasm/wasm-js.cc
|
| @@ -108,26 +108,16 @@ static bool ValidateModule(v8::Isolate* isolate,
|
|
|
| // TODO(wasm): move brand check to the respective types, and don't throw
|
| // in it, rather, use a provided ErrorThrower, or let caller handle it.
|
| -static bool BrandCheck(Isolate* isolate, i::Handle<i::Object> value,
|
| - i::Handle<i::Symbol> sym) {
|
| +static bool HasBrand(i::Handle<i::Object> value, i::Handle<i::Symbol> sym) {
|
| if (!value->IsJSObject()) return false;
|
| i::Handle<i::JSObject> object = i::Handle<i::JSObject>::cast(value);
|
| Maybe<bool> has_brand = i::JSObject::HasOwnProperty(object, sym);
|
| - if (has_brand.IsNothing()) return false;
|
| - return has_brand.ToChecked();
|
| + return !has_brand.IsNothing() && has_brand.ToChecked();
|
| }
|
|
|
| -static bool BrandCheck(Isolate* isolate, i::Handle<i::Object> value,
|
| +static bool BrandCheck(ErrorThrower* thrower, i::Handle<i::Object> value,
|
| i::Handle<i::Symbol> sym, const char* msg) {
|
| - if (value->IsJSObject()) {
|
| - i::Handle<i::JSObject> object = i::Handle<i::JSObject>::cast(value);
|
| - Maybe<bool> has_brand = i::JSObject::HasOwnProperty(object, sym);
|
| - if (has_brand.IsNothing()) return false;
|
| - if (has_brand.ToChecked()) return true;
|
| - }
|
| - v8::Local<v8::Value> e = v8::Exception::TypeError(v8_str(isolate, msg));
|
| - isolate->ThrowException(e);
|
| - return false;
|
| + return HasBrand(value, sym) ? true : (thrower->TypeError("%s", msg), false);
|
| }
|
|
|
| void WebAssemblyCompile(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| @@ -233,17 +223,17 @@ MaybeLocal<Value> InstantiateModuleImpl(
|
|
|
| namespace {
|
| i::MaybeHandle<i::WasmModuleObject> GetFirstArgumentAsModule(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower& thrower) {
|
| + const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| i::MaybeHandle<i::WasmModuleObject> nothing;
|
| if (args.Length() < 1) {
|
| - thrower.TypeError("Argument 0 must be a WebAssembly.Module");
|
| + thrower->TypeError("Argument 0 must be a WebAssembly.Module");
|
| return nothing;
|
| }
|
|
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| - if (!BrandCheck(isolate, Utils::OpenHandle(*args[0]),
|
| + if (!BrandCheck(thrower, Utils::OpenHandle(*args[0]),
|
| i::Handle<i::Symbol>(i_context->wasm_module_sym()),
|
| "Argument 0 must be a WebAssembly.Module")) {
|
| return nothing;
|
| @@ -261,7 +251,7 @@ void WebAssemblyModuleImports(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| ErrorThrower thrower(i_isolate, "WebAssembly.Module.imports()");
|
|
|
| - auto maybe_module = GetFirstArgumentAsModule(args, thrower);
|
| + auto maybe_module = GetFirstArgumentAsModule(args, &thrower);
|
|
|
| if (!maybe_module.is_null()) {
|
| auto imports =
|
| @@ -274,10 +264,9 @@ void WebAssemblyModuleExports(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| HandleScope scope(args.GetIsolate());
|
| v8::Isolate* isolate = args.GetIsolate();
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| -
|
| ErrorThrower thrower(i_isolate, "WebAssembly.Module.exports()");
|
|
|
| - auto maybe_module = GetFirstArgumentAsModule(args, thrower);
|
| + auto maybe_module = GetFirstArgumentAsModule(args, &thrower);
|
|
|
| if (!maybe_module.is_null()) {
|
| auto exports =
|
| @@ -291,10 +280,9 @@ void WebAssemblyModuleCustomSections(
|
| HandleScope scope(args.GetIsolate());
|
| v8::Isolate* isolate = args.GetIsolate();
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| -
|
| ErrorThrower thrower(i_isolate, "WebAssembly.Module.customSections()");
|
|
|
| - auto maybe_module = GetFirstArgumentAsModule(args, thrower);
|
| + auto maybe_module = GetFirstArgumentAsModule(args, &thrower);
|
|
|
| if (args.Length() < 2) {
|
| thrower.TypeError("Argument 1 must be a string");
|
| @@ -321,10 +309,9 @@ void WebAssemblyInstance(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| HandleScope scope(args.GetIsolate());
|
| v8::Isolate* isolate = args.GetIsolate();
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| -
|
| ErrorThrower thrower(i_isolate, "WebAssembly.Instance()");
|
|
|
| - auto maybe_module = GetFirstArgumentAsModule(args, thrower);
|
| + auto maybe_module = GetFirstArgumentAsModule(args, &thrower);
|
|
|
| if (!maybe_module.is_null()) {
|
| MaybeLocal<Value> instance = InstantiateModuleImpl(
|
| @@ -341,9 +328,9 @@ void WebAssemblyInstance(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + ErrorThrower thrower(i_isolate, "WebAssembly.instantiate()");
|
|
|
| HandleScope scope(isolate);
|
| - ErrorThrower thrower(i_isolate, "WebAssembly.instantiate()");
|
|
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| @@ -368,8 +355,8 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| resolver->Reject(context, Utils::ToLocal(thrower.Reify()));
|
| return;
|
| }
|
| - bool want_pair = !BrandCheck(
|
| - isolate, first_arg, i::Handle<i::Symbol>(i_context->wasm_module_sym()));
|
| + bool want_pair =
|
| + !HasBrand(first_arg, i::Handle<i::Symbol>(i_context->wasm_module_sym()));
|
| i::Handle<i::WasmModuleObject> module_obj;
|
| if (want_pair) {
|
| i::MaybeHandle<i::WasmModuleObject> maybe_module_obj =
|
| @@ -543,9 +530,11 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| void WebAssemblyTableGetLength(
|
| const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| + ErrorThrower thrower(reinterpret_cast<i::Isolate*>(isolate),
|
| + "WebAssembly.Table.length()");
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| - if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()),
|
| + if (!BrandCheck(&thrower, Utils::OpenHandle(*args.This()),
|
| i::Handle<i::Symbol>(i_context->wasm_table_sym()),
|
| "Receiver is not a WebAssembly.Table")) {
|
| return;
|
| @@ -558,9 +547,11 @@ void WebAssemblyTableGetLength(
|
|
|
| void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| + ErrorThrower thrower(reinterpret_cast<i::Isolate*>(isolate),
|
| + "WebAssembly.Table.grow()");
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| - if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()),
|
| + if (!BrandCheck(&thrower, Utils::OpenHandle(*args.This()),
|
| i::Handle<i::Symbol>(i_context->wasm_table_sym()),
|
| "Receiver is not a WebAssembly.Table")) {
|
| return;
|
| @@ -584,10 +575,8 @@ void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| }
|
|
|
| if (new_size64 < old_size || new_size64 > max_size64) {
|
| - v8::Local<v8::Value> e = v8::Exception::RangeError(
|
| - v8_str(isolate, new_size64 < old_size ? "trying to shrink table"
|
| - : "maximum table size exceeded"));
|
| - isolate->ThrowException(e);
|
| + thrower.RangeError(new_size64 < old_size ? "trying to shrink table"
|
| + : "maximum table size exceeded");
|
| return;
|
| }
|
|
|
| @@ -611,15 +600,16 @@ void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
|
| void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + ErrorThrower thrower(i_isolate, "WebAssembly.Table.get()");
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| - if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()),
|
| + if (!BrandCheck(&thrower, Utils::OpenHandle(*args.This()),
|
| i::Handle<i::Symbol>(i_context->wasm_table_sym()),
|
| "Receiver is not a WebAssembly.Table")) {
|
| return;
|
| }
|
|
|
| - i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| auto receiver =
|
| i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This()));
|
| i::Handle<i::FixedArray> array(receiver->functions(), i_isolate);
|
| @@ -627,9 +617,7 @@ void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| if (args.Length() > 0 && !args[0]->Int32Value(context).To(&i)) return;
|
| v8::ReturnValue<v8::Value> return_value = args.GetReturnValue();
|
| if (i < 0 || i >= array->length()) {
|
| - v8::Local<v8::Value> e =
|
| - v8::Exception::RangeError(v8_str(isolate, "index out of bounds"));
|
| - isolate->ThrowException(e);
|
| + thrower.RangeError("index out of bounds");
|
| return;
|
| }
|
|
|
| @@ -640,17 +628,16 @@ void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + ErrorThrower thrower(i_isolate, "WebAssembly.Table.set()");
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| - if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()),
|
| + if (!BrandCheck(&thrower, Utils::OpenHandle(*args.This()),
|
| i::Handle<i::Symbol>(i_context->wasm_table_sym()),
|
| "Receiver is not a WebAssembly.Table")) {
|
| return;
|
| }
|
| if (args.Length() < 2) {
|
| - v8::Local<v8::Value> e = v8::Exception::TypeError(
|
| - v8_str(isolate, "Argument 1 must be null or a function"));
|
| - isolate->ThrowException(e);
|
| + thrower.TypeError("Argument 1 must be null or a function");
|
| return;
|
| }
|
| i::Handle<i::Object> value = Utils::OpenHandle(*args[1]);
|
| @@ -658,9 +645,7 @@ void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| (!value->IsJSFunction() ||
|
| i::Handle<i::JSFunction>::cast(value)->code()->kind() !=
|
| i::Code::JS_TO_WASM_FUNCTION)) {
|
| - v8::Local<v8::Value> e = v8::Exception::TypeError(
|
| - v8_str(isolate, "Argument 1 must be null or a WebAssembly function"));
|
| - isolate->ThrowException(e);
|
| + thrower.TypeError("Argument 1 must be null or a WebAssembly function");
|
| return;
|
| }
|
|
|
| @@ -670,9 +655,7 @@ void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| int i;
|
| if (!args[0]->Int32Value(context).To(&i)) return;
|
| if (i < 0 || i >= array->length()) {
|
| - v8::Local<v8::Value> e =
|
| - v8::Exception::RangeError(v8_str(isolate, "index out of bounds"));
|
| - isolate->ThrowException(e);
|
| + thrower.RangeError("index out of bounds");
|
| return;
|
| }
|
|
|
| @@ -691,18 +674,18 @@ void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
|
| void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + ErrorThrower thrower(i_isolate, "WebAssembly.Memory.grow()");
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| - if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()),
|
| + if (!BrandCheck(&thrower, Utils::OpenHandle(*args.This()),
|
| i::Handle<i::Symbol>(i_context->wasm_memory_sym()),
|
| "Receiver is not a WebAssembly.Memory")) {
|
| return;
|
| }
|
| int64_t delta_size = 0;
|
| if (args.Length() < 1 || !args[0]->IntegerValue(context).To(&delta_size)) {
|
| - v8::Local<v8::Value> e = v8::Exception::TypeError(
|
| - v8_str(isolate, "Argument 0 required, must be numeric value of pages"));
|
| - isolate->ThrowException(e);
|
| + thrower.TypeError("Argument 0 required, must be numeric value of pages");
|
| return;
|
| }
|
| i::Handle<i::WasmMemoryObject> receiver =
|
| @@ -717,19 +700,14 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| old_buffer->byte_length()->Number() / i::wasm::kSpecMaxWasmMemoryPages;
|
| int64_t new_size64 = old_size + delta_size;
|
| if (delta_size < 0 || max_size64 < new_size64 || new_size64 < old_size) {
|
| - v8::Local<v8::Value> e = v8::Exception::RangeError(v8_str(
|
| - isolate, new_size64 < old_size ? "trying to shrink memory"
|
| - : "maximum memory size exceeded"));
|
| - isolate->ThrowException(e);
|
| + thrower.RangeError(new_size64 < old_size ? "trying to shrink memory"
|
| + : "maximum memory size exceeded");
|
| return;
|
| }
|
| - i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| int32_t ret = i::wasm::GrowWebAssemblyMemory(
|
| i_isolate, receiver, static_cast<uint32_t>(delta_size));
|
| if (ret == -1) {
|
| - v8::Local<v8::Value> e = v8::Exception::RangeError(
|
| - v8_str(isolate, "Unable to grow instance memory."));
|
| - isolate->ThrowException(e);
|
| + thrower.RangeError("Unable to grow instance memory.");
|
| return;
|
| }
|
| v8::ReturnValue<v8::Value> return_value = args.GetReturnValue();
|
| @@ -739,14 +717,15 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| void WebAssemblyMemoryGetBuffer(
|
| const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| v8::Isolate* isolate = args.GetIsolate();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + ErrorThrower thrower(i_isolate, "WebAssembly.Memory.buffer");
|
| Local<Context> context = isolate->GetCurrentContext();
|
| i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
|
| - if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()),
|
| + if (!BrandCheck(&thrower, Utils::OpenHandle(*args.This()),
|
| i::Handle<i::Symbol>(i_context->wasm_memory_sym()),
|
| "Receiver is not a WebAssembly.Memory")) {
|
| return;
|
| }
|
| - i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| i::Handle<i::WasmMemoryObject> receiver =
|
| i::Handle<i::WasmMemoryObject>::cast(Utils::OpenHandle(*args.This()));
|
| i::Handle<i::Object> buffer(receiver->buffer(), i_isolate);
|
| @@ -951,16 +930,6 @@ void WasmJs::Install(Isolate* isolate) {
|
| runtime_error, attributes);
|
| }
|
|
|
| -static bool HasBrand(i::Handle<i::Object> value, i::Handle<i::Symbol> symbol) {
|
| - if (value->IsJSObject()) {
|
| - i::Handle<i::JSObject> object = i::Handle<i::JSObject>::cast(value);
|
| - Maybe<bool> has_brand = i::JSObject::HasOwnProperty(object, symbol);
|
| - if (has_brand.IsNothing()) return false;
|
| - if (has_brand.ToChecked()) return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| bool WasmJs::IsWasmMemoryObject(Isolate* isolate, Handle<Object> value) {
|
| i::Handle<i::Symbol> symbol(isolate->context()->wasm_memory_sym(), isolate);
|
| return HasBrand(value, symbol);
|
|
|