| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/api-natives.h" | 5 #include "src/api-natives.h" |
| 6 #include "src/api.h" | 6 #include "src/api.h" |
| 7 #include "src/asmjs/asm-js.h" | 7 #include "src/asmjs/asm-js.h" |
| 8 #include "src/asmjs/asm-typer.h" | 8 #include "src/asmjs/asm-typer.h" |
| 9 #include "src/asmjs/asm-wasm-builder.h" | 9 #include "src/asmjs/asm-wasm-builder.h" |
| 10 #include "src/assert-scope.h" | 10 #include "src/assert-scope.h" |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { | 489 void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 490 // TODO(rossberg) | 490 // TODO(rossberg) |
| 491 } | 491 } |
| 492 void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) { | 492 void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 493 // TODO(rossberg) | 493 // TODO(rossberg) |
| 494 } | 494 } |
| 495 void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) { | 495 void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 496 // TODO(rossberg) | 496 // TODO(rossberg) |
| 497 } | 497 } |
| 498 void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { | 498 void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 499 // TODO(rossberg) | 499 v8::Isolate* isolate = args.GetIsolate(); |
| 500 HandleScope scope(isolate); |
| 501 ErrorThrower thrower(reinterpret_cast<i::Isolate*>(isolate), |
| 502 "WebAssembly.Memory()"); |
| 503 if (args.Length() < 1 || !args[0]->IsUint32()) { |
| 504 thrower.RangeError("Argument 0 must be numeric value of pages"); |
| 505 return; |
| 506 } |
| 507 |
| 508 Local<Context> context = isolate->GetCurrentContext(); |
| 509 uint32_t delta = args[0]->Uint32Value(context).FromJust(); |
| 510 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| 511 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| 512 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), |
| 513 "Receiver is not WebAssembly.Memory")) { |
| 514 return; |
| 515 } |
| 516 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 517 i::Handle<i::JSObject> receiver = |
| 518 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); |
| 519 i::Handle<i::Object> instance_object(receiver->GetInternalField(2), |
| 520 i_isolate); |
| 521 |
| 522 // TODO(gdeepti) Implement growing memory when shared by different |
| 523 // instances. |
| 524 uint32_t ret = internal::wasm::GrowInstanceMemory( |
| 525 i_isolate, i::Handle<i::JSObject>::cast(instance_object), delta); |
| 526 if (ret == -1) { |
| 527 thrower.Error("Error while growing memory"); |
| 528 } |
| 529 |
| 530 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 531 return_value.Set(ret); |
| 500 } | 532 } |
| 501 void WebAssemblyMemoryGetBuffer( | 533 void WebAssemblyMemoryGetBuffer( |
| 502 const v8::FunctionCallbackInfo<v8::Value>& args) { | 534 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 503 v8::Isolate* isolate = args.GetIsolate(); | 535 v8::Isolate* isolate = args.GetIsolate(); |
| 504 Local<Context> context = isolate->GetCurrentContext(); | 536 Local<Context> context = isolate->GetCurrentContext(); |
| 505 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 537 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| 506 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), | 538 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| 507 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), | 539 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), |
| 508 "Receiver is not a WebAssembly.Memory")) { | 540 "Receiver is not a WebAssembly.Memory")) { |
| 509 return; | 541 return; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 InstallFunc(isolate, table_proto, "get", WebAssemblyTableGet); | 683 InstallFunc(isolate, table_proto, "get", WebAssemblyTableGet); |
| 652 InstallFunc(isolate, table_proto, "set", WebAssemblyTableSet); | 684 InstallFunc(isolate, table_proto, "set", WebAssemblyTableSet); |
| 653 | 685 |
| 654 // Setup Memory | 686 // Setup Memory |
| 655 Handle<JSFunction> memory_constructor = | 687 Handle<JSFunction> memory_constructor = |
| 656 InstallFunc(isolate, wasm_object, "Memory", WebAssemblyMemory); | 688 InstallFunc(isolate, wasm_object, "Memory", WebAssemblyMemory); |
| 657 context->set_wasm_memory_constructor(*memory_constructor); | 689 context->set_wasm_memory_constructor(*memory_constructor); |
| 658 Handle<JSObject> memory_proto = | 690 Handle<JSObject> memory_proto = |
| 659 factory->NewJSObject(memory_constructor, TENURED); | 691 factory->NewJSObject(memory_constructor, TENURED); |
| 660 map = isolate->factory()->NewMap( | 692 map = isolate->factory()->NewMap( |
| 661 i::JS_OBJECT_TYPE, i::JSObject::kHeaderSize + 2 * i::kPointerSize); | 693 i::JS_OBJECT_TYPE, i::JSObject::kHeaderSize + 3 * i::kPointerSize); |
| 662 JSFunction::SetInitialMap(memory_constructor, map, memory_proto); | 694 JSFunction::SetInitialMap(memory_constructor, map, memory_proto); |
| 663 JSObject::AddProperty(memory_proto, isolate->factory()->constructor_string(), | 695 JSObject::AddProperty(memory_proto, isolate->factory()->constructor_string(), |
| 664 memory_constructor, DONT_ENUM); | 696 memory_constructor, DONT_ENUM); |
| 665 InstallFunc(isolate, memory_proto, "grow", WebAssemblyMemoryGrow); | 697 InstallFunc(isolate, memory_proto, "grow", WebAssemblyMemoryGrow); |
| 666 InstallGetter(isolate, memory_proto, "buffer", WebAssemblyMemoryGetBuffer); | 698 InstallGetter(isolate, memory_proto, "buffer", WebAssemblyMemoryGetBuffer); |
| 667 } | 699 } |
| 668 | 700 |
| 669 void WasmJs::Install(Isolate* isolate, Handle<JSGlobalObject> global) { | 701 void WasmJs::Install(Isolate* isolate, Handle<JSGlobalObject> global) { |
| 670 if (!FLAG_expose_wasm && !FLAG_validate_asm) { | 702 if (!FLAG_expose_wasm && !FLAG_validate_asm) { |
| 671 return; | 703 return; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 Handle<JSArrayBuffer> WasmJs::GetWasmMemoryArrayBuffer(Isolate* isolate, | 786 Handle<JSArrayBuffer> WasmJs::GetWasmMemoryArrayBuffer(Isolate* isolate, |
| 755 Handle<Object> value) { | 787 Handle<Object> value) { |
| 756 DCHECK(IsWasmMemoryObject(isolate, value)); | 788 DCHECK(IsWasmMemoryObject(isolate, value)); |
| 757 Handle<Object> buf( | 789 Handle<Object> buf( |
| 758 JSObject::cast(*value)->GetInternalField(kWasmMemoryBufferFieldIndex), | 790 JSObject::cast(*value)->GetInternalField(kWasmMemoryBufferFieldIndex), |
| 759 isolate); | 791 isolate); |
| 760 return Handle<JSArrayBuffer>::cast(buf); | 792 return Handle<JSArrayBuffer>::cast(buf); |
| 761 } | 793 } |
| 762 } // namespace internal | 794 } // namespace internal |
| 763 } // namespace v8 | 795 } // namespace v8 |
| OLD | NEW |