| 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 |
| 30 namespace { | 32 namespace { |
| 31 i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { | 33 i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { |
| 32 return isolate->factory()->NewStringFromAsciiChecked(str); | 34 return isolate->factory()->NewStringFromAsciiChecked(str); |
| 33 } | 35 } |
| 34 Local<String> v8_str(Isolate* isolate, const char* str) { | 36 Local<String> v8_str(Isolate* isolate, const char* str) { |
| 35 return Utils::ToLocal(v8_str(reinterpret_cast<i::Isolate*>(isolate), str)); | 37 return Utils::ToLocal(v8_str(reinterpret_cast<i::Isolate*>(isolate), str)); |
| 36 } | 38 } |
| 37 | 39 |
| 38 struct RawBuffer { | 40 struct RawBuffer { |
| 39 const byte* start; | 41 const byte* start; |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 Local<Context> context = isolate->GetCurrentContext(); | 504 Local<Context> context = isolate->GetCurrentContext(); |
| 503 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 505 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); |
| 504 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), | 506 if (!BrandCheck(isolate, Utils::OpenHandle(*args.This()), |
| 505 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), | 507 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), |
| 506 "Receiver is not a WebAssembly.Memory")) { | 508 "Receiver is not a WebAssembly.Memory")) { |
| 507 return; | 509 return; |
| 508 } | 510 } |
| 509 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 511 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 510 i::Handle<i::JSObject> receiver = | 512 i::Handle<i::JSObject> receiver = |
| 511 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); | 513 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); |
| 512 i::Handle<i::Object> buffer(receiver->GetInternalField(0), i_isolate); | 514 i::Handle<i::Object> buffer( |
| 515 receiver->GetInternalField(kWasmMemoryBufferFieldIndex), i_isolate); |
| 513 DCHECK(buffer->IsJSArrayBuffer()); | 516 DCHECK(buffer->IsJSArrayBuffer()); |
| 514 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 517 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 515 return_value.Set(Utils::ToLocal(buffer)); | 518 return_value.Set(Utils::ToLocal(buffer)); |
| 516 } | 519 } |
| 517 } // namespace | 520 } // namespace |
| 518 | 521 |
| 519 i::Handle<i::JSObject> i::WasmJs::CreateWasmMemoryObject( | 522 i::Handle<i::JSObject> i::WasmJs::CreateWasmMemoryObject( |
| 520 i::Isolate* i_isolate, i::Handle<i::JSArrayBuffer> buffer, bool has_maximum, | 523 i::Isolate* i_isolate, i::Handle<i::JSArrayBuffer> buffer, bool has_maximum, |
| 521 int maximum) { | 524 int maximum) { |
| 522 i::Handle<i::JSFunction> memory_ctor( | 525 i::Handle<i::JSFunction> memory_ctor( |
| 523 i_isolate->native_context()->wasm_memory_constructor()); | 526 i_isolate->native_context()->wasm_memory_constructor()); |
| 524 i::Handle<i::JSObject> memory_obj = | 527 i::Handle<i::JSObject> memory_obj = |
| 525 i_isolate->factory()->NewJSObject(memory_ctor); | 528 i_isolate->factory()->NewJSObject(memory_ctor); |
| 526 memory_obj->SetInternalField(0, *buffer); | 529 memory_obj->SetInternalField(kWasmMemoryBufferFieldIndex, *buffer); |
| 527 memory_obj->SetInternalField( | 530 memory_obj->SetInternalField( |
| 528 1, has_maximum | 531 1, has_maximum |
| 529 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) | 532 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) |
| 530 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); | 533 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); |
| 531 i::Handle<i::Symbol> memory_sym( | 534 i::Handle<i::Symbol> memory_sym( |
| 532 i_isolate->native_context()->wasm_memory_sym()); | 535 i_isolate->native_context()->wasm_memory_sym()); |
| 533 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check(); | 536 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check(); |
| 534 return memory_obj; | 537 return memory_obj; |
| 535 } | 538 } |
| 536 | 539 |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 &in_object_properties); | 733 &in_object_properties); |
| 731 | 734 |
| 732 int unused_property_fields = in_object_properties - pre_allocated; | 735 int unused_property_fields = in_object_properties - pre_allocated; |
| 733 Handle<Map> map = Map::CopyInitialMap( | 736 Handle<Map> map = Map::CopyInitialMap( |
| 734 prev_map, instance_size, in_object_properties, unused_property_fields); | 737 prev_map, instance_size, in_object_properties, unused_property_fields); |
| 735 | 738 |
| 736 context->set_wasm_function_map(*map); | 739 context->set_wasm_function_map(*map); |
| 737 } | 740 } |
| 738 } | 741 } |
| 739 | 742 |
| 743 bool WasmJs::IsWasmMemoryObject(Isolate* isolate, Handle<Object> value) { |
| 744 if (value->IsJSObject()) { |
| 745 i::Handle<i::JSObject> object = i::Handle<i::JSObject>::cast(value); |
| 746 i::Handle<i::Symbol> sym(isolate->context()->wasm_memory_sym(), isolate); |
| 747 Maybe<bool> has_brand = i::JSObject::HasOwnProperty(object, sym); |
| 748 if (has_brand.IsNothing()) return false; |
| 749 if (has_brand.ToChecked()) return true; |
| 750 } |
| 751 return false; |
| 752 } |
| 753 |
| 754 Handle<JSArrayBuffer> WasmJs::GetWasmMemoryArrayBuffer(Isolate* isolate, |
| 755 Handle<Object> value) { |
| 756 DCHECK(IsWasmMemoryObject(isolate, value)); |
| 757 Handle<Object> buf( |
| 758 JSObject::cast(*value)->GetInternalField(kWasmMemoryBufferFieldIndex), |
| 759 isolate); |
| 760 return Handle<JSArrayBuffer>::cast(buf); |
| 761 } |
| 740 } // namespace internal | 762 } // namespace internal |
| 741 } // namespace v8 | 763 } // namespace v8 |
| OLD | NEW |