Chromium Code Reviews| 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" |
| 11 #include "src/ast/ast.h" | 11 #include "src/ast/ast.h" |
| 12 #include "src/execution.h" | 12 #include "src/execution.h" |
| 13 #include "src/factory.h" | 13 #include "src/factory.h" |
| 14 #include "src/handles.h" | 14 #include "src/handles.h" |
| 15 #include "src/isolate.h" | 15 #include "src/isolate.h" |
| 16 #include "src/objects.h" | 16 #include "src/objects.h" |
| 17 #include "src/parsing/parse-info.h" | 17 #include "src/parsing/parse-info.h" |
| 18 | 18 |
| 19 #include "src/wasm/module-decoder.h" | 19 #include "src/wasm/module-decoder.h" |
| 20 #include "src/wasm/wasm-js.h" | 20 #include "src/wasm/wasm-js.h" |
| 21 #include "src/wasm/wasm-module.h" | 21 #include "src/wasm/wasm-module.h" |
| 22 #include "src/wasm/wasm-result.h" | 22 #include "src/wasm/wasm-result.h" |
| 23 | 23 |
| 24 typedef uint8_t byte; | 24 typedef uint8_t byte; |
| 25 | 25 |
| 26 using v8::internal::wasm::ErrorThrower; | 26 using v8::internal::wasm::ErrorThrower; |
| 27 | 27 |
| 28 namespace v8 { | 28 namespace v8 { |
| 29 | 29 |
| 30 static const int kWasmMemoryBufferFieldIndex = 0; | |
| 31 static const int kWasmMemoryMaximumFieldIndex = 1; | |
| 32 static const int kWasmTableArrayFieldIndex = 0; | 30 static const int kWasmTableArrayFieldIndex = 0; |
| 33 static const int kWasmTableMaximumFieldIndex = 1; | 31 static const int kWasmTableMaximumFieldIndex = 1; |
| 34 | 32 |
| 33 enum WasmMemoryObjectData { | |
| 34 kWasmMemoryBuffer, | |
| 35 kWasmMemoryMaximum, | |
| 36 kWasmMemoryInstanceObject | |
| 37 }; | |
| 38 | |
| 35 namespace { | 39 namespace { |
| 36 i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { | 40 i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { |
| 37 return isolate->factory()->NewStringFromAsciiChecked(str); | 41 return isolate->factory()->NewStringFromAsciiChecked(str); |
| 38 } | 42 } |
| 39 Local<String> v8_str(Isolate* isolate, const char* str) { | 43 Local<String> v8_str(Isolate* isolate, const char* str) { |
| 40 return Utils::ToLocal(v8_str(reinterpret_cast<i::Isolate*>(isolate), str)); | 44 return Utils::ToLocal(v8_str(reinterpret_cast<i::Isolate*>(isolate), str)); |
| 41 } | 45 } |
| 42 | 46 |
| 43 struct RawBuffer { | 47 struct RawBuffer { |
| 44 const byte* start; | 48 const byte* start; |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 568 | 572 |
| 569 void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { | 573 void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 570 v8::Isolate* isolate = args.GetIsolate(); | 574 v8::Isolate* isolate = args.GetIsolate(); |
| 571 Local<Context> context = isolate->GetCurrentContext(); | 575 Local<Context> context = isolate->GetCurrentContext(); |
| 572 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 576 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| 573 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), | 577 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| 574 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), | 578 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), |
| 575 "Receiver is not a WebAssembly.Memory")) { | 579 "Receiver is not a WebAssembly.Memory")) { |
| 576 return; | 580 return; |
| 577 } | 581 } |
| 582 if (args.Length() < 1 || !args[0]->IsUint32()) { | |
| 583 v8::Local<v8::Value> e = v8::Exception::TypeError( | |
| 584 v8_str(isolate, "Argument 0 must be numeric value of pages")); | |
| 585 isolate->ThrowException(e); | |
| 586 return; | |
| 587 } | |
| 578 | 588 |
| 579 // TODO(rossberg): grow memory. | 589 uint32_t delta = args[0]->Uint32Value(context).FromJust(); |
|
bradnelson
2016/10/17 22:23:26
Still not groking from before.
If you use ToUint32
gdeepti
2016/10/18 02:34:17
ToUint32(&delta) method can be used only on intern
bradnelson
2016/10/18 04:29:38
Ah ok.
| |
| 580 v8::Local<v8::Value> e = | 590 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 581 v8::Exception::TypeError(v8_str(isolate, "Memory#grow unimplemented")); | 591 i::Handle<i::JSObject> receiver = |
| 582 isolate->ThrowException(e); | 592 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); |
| 593 i::Handle<i::Object> instance_object(receiver->GetInternalField(2), | |
|
bradnelson
2016/10/17 22:13:24
where's this 2 come from?
gdeepti
2016/10/18 02:34:17
From the internal field of the memory object, repl
| |
| 594 i_isolate); | |
| 595 i::Handle<i::JSObject> instance( | |
| 596 i::Handle<i::JSObject>::cast(instance_object)); | |
| 597 | |
| 598 // TODO(gdeepti) Implement growing memory when shared by different | |
| 599 // instances. | |
| 600 uint32_t ret = internal::wasm::GrowInstanceMemory(i_isolate, instance, delta); | |
| 601 if (ret == -1) { | |
|
bradnelson
2016/10/17 22:13:25
unsigned, compared to -1 ?
gdeepti
2016/10/18 02:34:17
Oops, fixed. For the tests I currently have, the c
| |
| 602 v8::Local<v8::Value> e = v8::Exception::Error( | |
| 603 v8_str(isolate, "Unable to grow instance memory.")); | |
| 604 isolate->ThrowException(e); | |
| 605 return; | |
| 606 } | |
| 607 i::MaybeHandle<i::JSArrayBuffer> buffer = | |
| 608 internal::wasm::GetInstanceMemory(i_isolate, instance); | |
| 609 if (buffer.is_null()) { | |
| 610 v8::Local<v8::Value> e = v8::Exception::Error( | |
| 611 v8_str(isolate, "WebAssembly.Memory buffer object not set.")); | |
| 612 isolate->ThrowException(e); | |
| 613 return; | |
| 614 } | |
| 615 receiver->SetInternalField(kWasmMemoryBuffer, *buffer.ToHandleChecked()); | |
| 616 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | |
| 617 return_value.Set(ret); | |
| 583 } | 618 } |
| 584 | 619 |
| 585 void WebAssemblyMemoryGetBuffer( | 620 void WebAssemblyMemoryGetBuffer( |
| 586 const v8::FunctionCallbackInfo<v8::Value>& args) { | 621 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 587 v8::Isolate* isolate = args.GetIsolate(); | 622 v8::Isolate* isolate = args.GetIsolate(); |
| 588 Local<Context> context = isolate->GetCurrentContext(); | 623 Local<Context> context = isolate->GetCurrentContext(); |
| 589 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 624 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| 590 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), | 625 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| 591 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), | 626 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), |
| 592 "Receiver is not a WebAssembly.Memory")) { | 627 "Receiver is not a WebAssembly.Memory")) { |
| 593 return; | 628 return; |
| 594 } | 629 } |
| 595 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 630 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 596 i::Handle<i::JSObject> receiver = | 631 i::Handle<i::JSObject> receiver = |
| 597 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); | 632 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); |
| 598 i::Handle<i::Object> buffer( | 633 i::Handle<i::Object> buffer(receiver->GetInternalField(kWasmMemoryBuffer), |
| 599 receiver->GetInternalField(kWasmMemoryBufferFieldIndex), i_isolate); | 634 i_isolate); |
| 600 DCHECK(buffer->IsJSArrayBuffer()); | 635 DCHECK(buffer->IsJSArrayBuffer()); |
| 601 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 636 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 602 return_value.Set(Utils::ToLocal(buffer)); | 637 return_value.Set(Utils::ToLocal(buffer)); |
| 603 } | 638 } |
| 604 } // namespace | 639 } // namespace |
| 605 | 640 |
| 606 i::Handle<i::JSObject> i::WasmJs::CreateWasmMemoryObject( | 641 i::Handle<i::JSObject> i::WasmJs::CreateWasmMemoryObject( |
| 607 i::Isolate* i_isolate, i::Handle<i::JSArrayBuffer> buffer, bool has_maximum, | 642 i::Isolate* i_isolate, i::Handle<i::JSArrayBuffer> buffer, bool has_maximum, |
| 608 int maximum) { | 643 int maximum) { |
| 609 i::Handle<i::JSFunction> memory_ctor( | 644 i::Handle<i::JSFunction> memory_ctor( |
| 610 i_isolate->native_context()->wasm_memory_constructor()); | 645 i_isolate->native_context()->wasm_memory_constructor()); |
| 611 i::Handle<i::JSObject> memory_obj = | 646 i::Handle<i::JSObject> memory_obj = |
| 612 i_isolate->factory()->NewJSObject(memory_ctor); | 647 i_isolate->factory()->NewJSObject(memory_ctor); |
| 613 memory_obj->SetInternalField(kWasmMemoryBufferFieldIndex, *buffer); | 648 memory_obj->SetInternalField(kWasmMemoryBuffer, *buffer); |
| 614 memory_obj->SetInternalField( | 649 memory_obj->SetInternalField( |
| 615 kWasmMemoryMaximumFieldIndex, | 650 kWasmMemoryMaximum, |
| 616 has_maximum | 651 has_maximum |
| 617 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) | 652 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) |
| 618 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); | 653 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); |
| 619 i::Handle<i::Symbol> memory_sym( | 654 i::Handle<i::Symbol> memory_sym( |
| 620 i_isolate->native_context()->wasm_memory_sym()); | 655 i_isolate->native_context()->wasm_memory_sym()); |
| 621 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check(); | 656 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check(); |
| 622 return memory_obj; | 657 return memory_obj; |
| 623 } | 658 } |
| 624 | 659 |
| 625 // TODO(titzer): we use the API to create the function template because the | 660 // TODO(titzer): we use the API to create the function template because the |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 736 InstallFunc(isolate, table_proto, "get", WebAssemblyTableGet); | 771 InstallFunc(isolate, table_proto, "get", WebAssemblyTableGet); |
| 737 InstallFunc(isolate, table_proto, "set", WebAssemblyTableSet); | 772 InstallFunc(isolate, table_proto, "set", WebAssemblyTableSet); |
| 738 | 773 |
| 739 // Setup Memory | 774 // Setup Memory |
| 740 Handle<JSFunction> memory_constructor = | 775 Handle<JSFunction> memory_constructor = |
| 741 InstallFunc(isolate, wasm_object, "Memory", WebAssemblyMemory); | 776 InstallFunc(isolate, wasm_object, "Memory", WebAssemblyMemory); |
| 742 context->set_wasm_memory_constructor(*memory_constructor); | 777 context->set_wasm_memory_constructor(*memory_constructor); |
| 743 Handle<JSObject> memory_proto = | 778 Handle<JSObject> memory_proto = |
| 744 factory->NewJSObject(memory_constructor, TENURED); | 779 factory->NewJSObject(memory_constructor, TENURED); |
| 745 map = isolate->factory()->NewMap( | 780 map = isolate->factory()->NewMap( |
| 746 i::JS_OBJECT_TYPE, i::JSObject::kHeaderSize + 2 * i::kPointerSize); | 781 i::JS_OBJECT_TYPE, i::JSObject::kHeaderSize + 3 * i::kPointerSize); |
|
bradnelson
2016/10/17 22:13:24
Add a size enum item above so this can have a name
gdeepti
2016/10/18 02:34:17
Done.
| |
| 747 JSFunction::SetInitialMap(memory_constructor, map, memory_proto); | 782 JSFunction::SetInitialMap(memory_constructor, map, memory_proto); |
| 748 JSObject::AddProperty(memory_proto, isolate->factory()->constructor_string(), | 783 JSObject::AddProperty(memory_proto, isolate->factory()->constructor_string(), |
| 749 memory_constructor, DONT_ENUM); | 784 memory_constructor, DONT_ENUM); |
| 750 InstallFunc(isolate, memory_proto, "grow", WebAssemblyMemoryGrow); | 785 InstallFunc(isolate, memory_proto, "grow", WebAssemblyMemoryGrow); |
| 751 InstallGetter(isolate, memory_proto, "buffer", WebAssemblyMemoryGetBuffer); | 786 InstallGetter(isolate, memory_proto, "buffer", WebAssemblyMemoryGetBuffer); |
| 752 | 787 |
| 753 // Setup errors | 788 // Setup errors |
| 754 attributes = static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); | 789 attributes = static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); |
| 755 Handle<JSFunction> compile_error( | 790 Handle<JSFunction> compile_error( |
| 756 isolate->native_context()->wasm_compile_error_function()); | 791 isolate->native_context()->wasm_compile_error_function()); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 844 if (has_brand.IsNothing()) return false; | 879 if (has_brand.IsNothing()) return false; |
| 845 if (has_brand.ToChecked()) return true; | 880 if (has_brand.ToChecked()) return true; |
| 846 } | 881 } |
| 847 return false; | 882 return false; |
| 848 } | 883 } |
| 849 | 884 |
| 850 Handle<JSArrayBuffer> WasmJs::GetWasmMemoryArrayBuffer(Isolate* isolate, | 885 Handle<JSArrayBuffer> WasmJs::GetWasmMemoryArrayBuffer(Isolate* isolate, |
| 851 Handle<Object> value) { | 886 Handle<Object> value) { |
| 852 DCHECK(IsWasmMemoryObject(isolate, value)); | 887 DCHECK(IsWasmMemoryObject(isolate, value)); |
| 853 Handle<Object> buf( | 888 Handle<Object> buf( |
| 854 JSObject::cast(*value)->GetInternalField(kWasmMemoryBufferFieldIndex), | 889 JSObject::cast(*value)->GetInternalField(kWasmMemoryBuffer), isolate); |
| 855 isolate); | |
| 856 return Handle<JSArrayBuffer>::cast(buf); | 890 return Handle<JSArrayBuffer>::cast(buf); |
| 857 } | 891 } |
| 858 } // namespace internal | 892 } // namespace internal |
| 859 } // namespace v8 | 893 } // namespace v8 |
| OLD | NEW |