Chromium Code Reviews| Index: src/wasm/wasm-js.cc |
| diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc |
| index 36f286f73cffcd58a940d74e7d06442ed8fe1f92..8c21ac5e45962a77f78f76ae6bcb5a33a6d03ec4 100644 |
| --- a/src/wasm/wasm-js.cc |
| +++ b/src/wasm/wasm-js.cc |
| @@ -482,22 +482,117 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| return_value.Set(Utils::ToLocal(memory_obj)); |
| } |
| + |
| void WebAssemblyTableGetLength( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| - // TODO(rossberg) |
| + v8::Isolate* isolate = args.GetIsolate(); |
| + Local<Context> context = isolate->GetCurrentContext(); |
| + i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| + if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
|
ahaas
2016/10/13 09:12:58
you call Utils::OpenHandle(*args.This()) twice her
rossberg
2016/10/13 12:02:07
It's just an accessor, so should be fast enough.
|
| + 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); |
| + i::Handle<i::JSObject> receiver = |
| + i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); |
| + i::Handle<i::Object> array(receiver->GetInternalField(0), i_isolate); |
|
ahaas
2016/10/13 09:12:59
Can you use a constant here instead of '0'?
rossberg
2016/10/13 12:02:07
Done (also for some other field indices).
|
| + int length = i::Handle<i::FixedArray>::cast(array)->length(); |
| + v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| + return_value.Set(v8::Number::New(isolate, length)); |
| } |
| + |
| void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| - // TODO(rossberg) |
| + v8::Isolate* isolate = args.GetIsolate(); |
| + Local<Context> context = isolate->GetCurrentContext(); |
| + i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| + if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| + i::Handle<i::Symbol>(i_context->wasm_table_sym()), |
| + "Receiver is not a WebAssembly.Table")) { |
| + return; |
| + } |
| + // TODO(rossberg): grow table and update relevant instances. |
| + v8::Local<v8::Value> e = |
| + v8::Exception::TypeError(v8_str(isolate, "Table#grow unimplemented")); |
| + isolate->ThrowException(e); |
| } |
| + |
| void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| - // TODO(rossberg) |
| + v8::Isolate* isolate = args.GetIsolate(); |
| + Local<Context> context = isolate->GetCurrentContext(); |
| + i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| + if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| + i::Handle<i::Symbol>(i_context->wasm_table_sym()), |
| + "Receiver is not a WebAssembly.Table")) { |
| + return; |
| + } |
| + if (args.Length() < 1) { |
|
ahaas
2016/10/13 09:12:58
Does the spec actually say that a TypeError should
rossberg
2016/10/13 12:02:07
Changed.
|
| + v8::Local<v8::Value> e = v8::Exception::TypeError( |
| + v8_str(isolate, "Argument 0 must be an index")); |
| + isolate->ThrowException(e); |
| + return; |
| + } |
| + |
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| + i::Handle<i::JSObject> receiver = |
| + i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); |
| + i::Handle<i::Object> array(receiver->GetInternalField(0), i_isolate); |
|
ahaas
2016/10/13 09:12:58
same here
rossberg
2016/10/13 12:02:07
Done.
|
| + int i; |
| + if (!args[0]->Int32Value(context).To(&i)) return; |
| + v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| + if (i >= 0 && i < i::Handle<i::FixedArray>::cast(array)->length()) { |
| + i::Handle<i::Object> value( |
| + i::Handle<i::FixedArray>::cast(array)->get(i), i_isolate); |
| + return_value.Set(Utils::ToLocal(value)); |
| + } |
| } |
| + |
| void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| - // TODO(rossberg) |
| + v8::Isolate* isolate = args.GetIsolate(); |
| + Local<Context> context = isolate->GetCurrentContext(); |
| + i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| + if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| + i::Handle<i::Symbol>(i_context->wasm_table_sym()), |
| + "Receiver is not a WebAssembly.Table")) { |
| + return; |
| + } |
| + if (args.Length() < 1) { |
|
ahaas
2016/10/13 09:12:59
This if is not needed, the next if also takes care
rossberg
2016/10/13 12:02:07
Obsolete.
|
| + v8::Local<v8::Value> e = v8::Exception::TypeError( |
| + v8_str(isolate, "Argument 0 must be an index")); |
| + isolate->ThrowException(e); |
| + return; |
| + } |
| + if (args.Length() < 2 || |
| + !(args[1]->IsNull() || |
| + (args[1]->IsObject() && v8::Object::Cast(*args[1])->IsCallable()))) { |
| + v8::Local<v8::Value> e = v8::Exception::TypeError( |
| + v8_str(isolate, "Argument 1 must be a null or a function")); |
| + isolate->ThrowException(e); |
| + return; |
| + } |
| + |
| + // TODO(rossberg): set table element and update relevent instances. |
| + v8::Local<v8::Value> e = |
| + v8::Exception::TypeError(v8_str(isolate, "Table#set unimplemented")); |
| + isolate->ThrowException(e); |
| } |
| + |
| void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| - // TODO(rossberg) |
| + v8::Isolate* isolate = args.GetIsolate(); |
| + Local<Context> context = isolate->GetCurrentContext(); |
| + i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| + if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| + i::Handle<i::Symbol>(i_context->wasm_memory_sym()), |
| + "Receiver is not a WebAssembly.Memory")) { |
| + return; |
| + } |
| + |
| + // TODO(rossberg): grow memory. |
| + v8::Local<v8::Value> e = |
| + v8::Exception::TypeError(v8_str(isolate, "Memory#grow unimplemented")); |
| + isolate->ThrowException(e); |
| } |
| + |
| void WebAssemblyMemoryGetBuffer( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| v8::Isolate* isolate = args.GetIsolate(); |