Index: src/wasm/wasm-js.cc |
diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc |
index 08aa7079266f72e5512e7d6a8aa251a39b79e216..67e318983a22f93f890ccded6ea9dbd0f8b60f94 100644 |
--- a/src/wasm/wasm-js.cc |
+++ b/src/wasm/wasm-js.cc |
@@ -69,20 +69,6 @@ class ScheduledErrorThrower : public ErrorThrower { |
} |
}; |
-// TODO(titzer): 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 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); |
- return has_brand.FromMaybe(false); |
-} |
- |
-static bool BrandCheck(i::Handle<i::Object> value, i::Handle<i::Symbol> sym, |
- ErrorThrower* thrower, const char* msg) { |
- return HasBrand(value, sym) ? true : (thrower->TypeError("%s", msg), false); |
-} |
- |
i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { |
return isolate->factory()->NewStringFromAsciiChecked(str); |
} |
@@ -92,17 +78,14 @@ Local<String> v8_str(Isolate* isolate, const char* str) { |
i::MaybeHandle<i::WasmModuleObject> GetFirstArgumentAsModule( |
const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) { |
- v8::Isolate* isolate = args.GetIsolate(); |
if (args.Length() < 1) { |
thrower->TypeError("Argument 0 must be a WebAssembly.Module"); |
return {}; |
} |
- Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
- if (!BrandCheck(Utils::OpenHandle(*args[0]), |
- i::handle(i_context->wasm_module_sym()), thrower, |
- "Argument 0 must be a WebAssembly.Module")) { |
+ i::Handle<i::Object> arg0 = Utils::OpenHandle(*args[0]); |
+ if (!arg0->IsWasmModuleObject()) { |
+ thrower->TypeError("Argument 0 must be a WebAssembly.Module"); |
return {}; |
} |
@@ -438,7 +421,6 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
HandleScope scope(isolate); |
Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
ASSIGN(Promise::Resolver, resolver, Promise::Resolver::New(context)); |
Local<Promise> module_promise = resolver->GetPromise(); |
@@ -466,7 +448,7 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
} |
FunctionCallback instantiator = nullptr; |
- if (HasBrand(first_arg, i::Handle<i::Symbol>(i_context->wasm_module_sym()))) { |
+ if (first_arg->IsWasmModuleObject()) { |
module_promise = resolver->GetPromise(); |
if (!resolver->Resolve(context, first_arg_value).IsJust()) return; |
instantiator = WebAssemblyInstantiateImplCallback; |
@@ -612,21 +594,29 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { |
args.GetReturnValue().Set(Utils::ToLocal(memory_obj)); |
} |
+#define NAME_OF_WasmMemoryObject "WebAssembly.Memory" |
+#define NAME_OF_WasmModuleObject "WebAssembly.Module" |
+#define NAME_OF_WasmInstanceObject "WebAssembly.Instance" |
+#define NAME_OF_WasmTableObject "WebAssembly.Table" |
+ |
+#define EXTRACT_THIS(var, WasmType) \ |
+ i::Handle<i::WasmType> var; \ |
+ { \ |
+ i::Handle<i::Object> this_arg = Utils::OpenHandle(*args.This()); \ |
+ if (!this_arg->Is##WasmType()) { \ |
+ thrower.TypeError("Receiver is not a " NAME_OF_##WasmType); \ |
+ return; \ |
+ } \ |
+ var = i::Handle<i::WasmType>::cast(this_arg); \ |
+ } |
+ |
void WebAssemblyTableGetLength( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
v8::Isolate* isolate = args.GetIsolate(); |
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
HandleScope scope(isolate); |
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.length()"); |
- Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
- if (!BrandCheck(Utils::OpenHandle(*args.This()), |
- i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, |
- "Receiver is not a WebAssembly.Table")) { |
- return; |
- } |
- auto receiver = |
- i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); |
+ EXTRACT_THIS(receiver, WasmTableObject); |
args.GetReturnValue().Set( |
v8::Number::New(isolate, receiver->current_length())); |
} |
@@ -638,15 +628,8 @@ void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
HandleScope scope(isolate); |
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.grow()"); |
Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
- if (!BrandCheck(Utils::OpenHandle(*args.This()), |
- i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, |
- "Receiver is not a WebAssembly.Table")) { |
- return; |
- } |
+ EXTRACT_THIS(receiver, WasmTableObject); |
- auto receiver = |
- i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); |
i::Handle<i::FixedArray> old_array(receiver->functions(), i_isolate); |
int old_size = old_array->length(); |
int64_t new_size64 = 0; |
@@ -691,15 +674,7 @@ void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
HandleScope scope(isolate); |
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.get()"); |
Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
- if (!BrandCheck(Utils::OpenHandle(*args.This()), |
- i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, |
- "Receiver is not a WebAssembly.Table")) { |
- return; |
- } |
- |
- auto receiver = |
- i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); |
+ EXTRACT_THIS(receiver, WasmTableObject); |
i::Handle<i::FixedArray> array(receiver->functions(), i_isolate); |
int i = 0; |
if (args.Length() > 0 && !args[0]->Int32Value(context).To(&i)) return; |
@@ -720,21 +695,13 @@ void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
HandleScope scope(isolate); |
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.set()"); |
Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
- if (!BrandCheck(Utils::OpenHandle(*args.This()), |
- i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, |
- "Receiver is not a WebAssembly.Table")) { |
- return; |
- } |
+ EXTRACT_THIS(receiver, WasmTableObject); |
+ |
if (args.Length() < 2) { |
thrower.TypeError("Argument 1 must be null or a function"); |
return; |
} |
- // {This} parameter. |
- auto receiver = |
- i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); |
- |
// Parameter 0. |
int32_t index; |
if (!args[0]->Int32Value(context).To(&index)) return; |
@@ -762,19 +729,13 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
HandleScope scope(isolate); |
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.grow()"); |
Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
- if (!BrandCheck(Utils::OpenHandle(*args.This()), |
- i::Handle<i::Symbol>(i_context->wasm_memory_sym()), &thrower, |
- "Receiver is not a WebAssembly.Memory")) { |
- return; |
- } |
+ EXTRACT_THIS(receiver, WasmMemoryObject); |
+ |
int64_t delta_size = 0; |
if (args.Length() < 1 || !args[0]->IntegerValue(context).To(&delta_size)) { |
thrower.TypeError("Argument 0 required, must be numeric value of pages"); |
return; |
} |
- i::Handle<i::WasmMemoryObject> receiver = |
- i::Handle<i::WasmMemoryObject>::cast(Utils::OpenHandle(*args.This())); |
int64_t max_size64 = receiver->maximum_pages(); |
if (max_size64 < 0 || |
max_size64 > static_cast<int64_t>(i::FLAG_wasm_max_mem_pages)) { |
@@ -808,15 +769,8 @@ void WebAssemblyMemoryGetBuffer( |
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
HandleScope scope(isolate); |
ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.buffer"); |
- Local<Context> context = isolate->GetCurrentContext(); |
- i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
- if (!BrandCheck(Utils::OpenHandle(*args.This()), |
- i::Handle<i::Symbol>(i_context->wasm_memory_sym()), &thrower, |
- "Receiver is not a WebAssembly.Memory")) { |
- return; |
- } |
- i::Handle<i::WasmMemoryObject> receiver = |
- i::Handle<i::WasmMemoryObject>::cast(Utils::OpenHandle(*args.This())); |
+ EXTRACT_THIS(receiver, WasmMemoryObject); |
+ |
i::Handle<i::Object> buffer(receiver->array_buffer(), i_isolate); |
DCHECK(buffer->IsJSArrayBuffer()); |
v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
@@ -890,21 +844,7 @@ void WasmJs::Install(Isolate* isolate) { |
context->set_wasm_function_map(*map); |
- // Install symbols. |
- |
Factory* factory = isolate->factory(); |
- // Create private symbols. |
- Handle<Symbol> module_sym = factory->NewPrivateSymbol(); |
- context->set_wasm_module_sym(*module_sym); |
- |
- Handle<Symbol> instance_sym = factory->NewPrivateSymbol(); |
- context->set_wasm_instance_sym(*instance_sym); |
- |
- Handle<Symbol> table_sym = factory->NewPrivateSymbol(); |
- context->set_wasm_table_sym(*table_sym); |
- |
- Handle<Symbol> memory_sym = factory->NewPrivateSymbol(); |
- context->set_wasm_memory_sym(*memory_sym); |
// Install the JS API. |
@@ -1017,15 +957,5 @@ void WasmJs::Install(Isolate* isolate) { |
JSObject::AddProperty(webassembly, isolate->factory()->RuntimeError_string(), |
runtime_error, attributes); |
} |
- |
-bool WasmJs::IsWasmMemoryObject(Isolate* isolate, Handle<Object> value) { |
- i::Handle<i::Symbol> symbol(isolate->context()->wasm_memory_sym(), isolate); |
- return HasBrand(value, symbol); |
-} |
- |
-bool WasmJs::IsWasmTableObject(Isolate* isolate, Handle<Object> value) { |
- i::Handle<i::Symbol> symbol(isolate->context()->wasm_table_sym(), isolate); |
- return HasBrand(value, symbol); |
-} |
} // namespace internal |
} // namespace v8 |