| 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/assert-scope.h" | 7 #include "src/assert-scope.h" |
| 8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/execution.h" | 9 #include "src/execution.h" |
| 10 #include "src/factory.h" | 10 #include "src/factory.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 Reset(); | 62 Reset(); |
| 63 } else if (isolate()->has_pending_exception()) { | 63 } else if (isolate()->has_pending_exception()) { |
| 64 Reset(); | 64 Reset(); |
| 65 isolate()->OptionalRescheduleException(false); | 65 isolate()->OptionalRescheduleException(false); |
| 66 } else if (error()) { | 66 } else if (error()) { |
| 67 isolate()->ScheduleThrow(*Reify()); | 67 isolate()->ScheduleThrow(*Reify()); |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 }; | 70 }; |
| 71 | 71 |
| 72 // TODO(titzer): move brand check to the respective types, and don't throw | |
| 73 // in it, rather, use a provided ErrorThrower, or let caller handle it. | |
| 74 static bool HasBrand(i::Handle<i::Object> value, i::Handle<i::Symbol> sym) { | |
| 75 if (!value->IsJSObject()) return false; | |
| 76 i::Handle<i::JSObject> object = i::Handle<i::JSObject>::cast(value); | |
| 77 Maybe<bool> has_brand = i::JSObject::HasOwnProperty(object, sym); | |
| 78 return has_brand.FromMaybe(false); | |
| 79 } | |
| 80 | |
| 81 static bool BrandCheck(i::Handle<i::Object> value, i::Handle<i::Symbol> sym, | |
| 82 ErrorThrower* thrower, const char* msg) { | |
| 83 return HasBrand(value, sym) ? true : (thrower->TypeError("%s", msg), false); | |
| 84 } | |
| 85 | |
| 86 i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { | 72 i::Handle<i::String> v8_str(i::Isolate* isolate, const char* str) { |
| 87 return isolate->factory()->NewStringFromAsciiChecked(str); | 73 return isolate->factory()->NewStringFromAsciiChecked(str); |
| 88 } | 74 } |
| 89 Local<String> v8_str(Isolate* isolate, const char* str) { | 75 Local<String> v8_str(Isolate* isolate, const char* str) { |
| 90 return Utils::ToLocal(v8_str(reinterpret_cast<i::Isolate*>(isolate), str)); | 76 return Utils::ToLocal(v8_str(reinterpret_cast<i::Isolate*>(isolate), str)); |
| 91 } | 77 } |
| 92 | 78 |
| 93 i::MaybeHandle<i::WasmModuleObject> GetFirstArgumentAsModule( | 79 i::MaybeHandle<i::WasmModuleObject> GetFirstArgumentAsModule( |
| 94 const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) { | 80 const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) { |
| 95 v8::Isolate* isolate = args.GetIsolate(); | |
| 96 if (args.Length() < 1) { | 81 if (args.Length() < 1) { |
| 97 thrower->TypeError("Argument 0 must be a WebAssembly.Module"); | 82 thrower->TypeError("Argument 0 must be a WebAssembly.Module"); |
| 98 return {}; | 83 return {}; |
| 99 } | 84 } |
| 100 | 85 |
| 101 Local<Context> context = isolate->GetCurrentContext(); | 86 i::Handle<i::Object> arg0 = Utils::OpenHandle(*args[0]); |
| 102 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 87 if (!arg0->IsWasmModuleObject()) { |
| 103 if (!BrandCheck(Utils::OpenHandle(*args[0]), | 88 thrower->TypeError("Argument 0 must be a WebAssembly.Module"); |
| 104 i::handle(i_context->wasm_module_sym()), thrower, | |
| 105 "Argument 0 must be a WebAssembly.Module")) { | |
| 106 return {}; | 89 return {}; |
| 107 } | 90 } |
| 108 | 91 |
| 109 Local<Object> module_obj = Local<Object>::Cast(args[0]); | 92 Local<Object> module_obj = Local<Object>::Cast(args[0]); |
| 110 return i::Handle<i::WasmModuleObject>::cast( | 93 return i::Handle<i::WasmModuleObject>::cast( |
| 111 v8::Utils::OpenHandle(*module_obj)); | 94 v8::Utils::OpenHandle(*module_obj)); |
| 112 } | 95 } |
| 113 | 96 |
| 114 i::wasm::ModuleWireBytes GetFirstArgumentAsBytes( | 97 i::wasm::ModuleWireBytes GetFirstArgumentAsBytes( |
| 115 const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) { | 98 const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) { |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) { | 414 void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 432 v8::Isolate* isolate = args.GetIsolate(); | 415 v8::Isolate* isolate = args.GetIsolate(); |
| 433 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 416 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 434 MicrotasksScope runs_microtasks(isolate, MicrotasksScope::kRunMicrotasks); | 417 MicrotasksScope runs_microtasks(isolate, MicrotasksScope::kRunMicrotasks); |
| 435 | 418 |
| 436 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.instantiate()"); | 419 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.instantiate()"); |
| 437 | 420 |
| 438 HandleScope scope(isolate); | 421 HandleScope scope(isolate); |
| 439 | 422 |
| 440 Local<Context> context = isolate->GetCurrentContext(); | 423 Local<Context> context = isolate->GetCurrentContext(); |
| 441 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | |
| 442 | 424 |
| 443 ASSIGN(Promise::Resolver, resolver, Promise::Resolver::New(context)); | 425 ASSIGN(Promise::Resolver, resolver, Promise::Resolver::New(context)); |
| 444 Local<Promise> module_promise = resolver->GetPromise(); | 426 Local<Promise> module_promise = resolver->GetPromise(); |
| 445 args.GetReturnValue().Set(module_promise); | 427 args.GetReturnValue().Set(module_promise); |
| 446 | 428 |
| 447 if (args.Length() < 1) { | 429 if (args.Length() < 1) { |
| 448 thrower.TypeError( | 430 thrower.TypeError( |
| 449 "Argument 0 must be provided and must be either a buffer source or a " | 431 "Argument 0 must be provided and must be either a buffer source or a " |
| 450 "WebAssembly.Module object"); | 432 "WebAssembly.Module object"); |
| 451 auto maybe = resolver->Reject(context, Utils::ToLocal(thrower.Reify())); | 433 auto maybe = resolver->Reject(context, Utils::ToLocal(thrower.Reify())); |
| 452 CHECK_IMPLIES(!maybe.FromMaybe(false), | 434 CHECK_IMPLIES(!maybe.FromMaybe(false), |
| 453 i_isolate->has_scheduled_exception()); | 435 i_isolate->has_scheduled_exception()); |
| 454 return; | 436 return; |
| 455 } | 437 } |
| 456 | 438 |
| 457 Local<Value> first_arg_value = args[0]; | 439 Local<Value> first_arg_value = args[0]; |
| 458 i::Handle<i::Object> first_arg = Utils::OpenHandle(*first_arg_value); | 440 i::Handle<i::Object> first_arg = Utils::OpenHandle(*first_arg_value); |
| 459 if (!first_arg->IsJSObject()) { | 441 if (!first_arg->IsJSObject()) { |
| 460 thrower.TypeError( | 442 thrower.TypeError( |
| 461 "Argument 0 must be a buffer source or a WebAssembly.Module object"); | 443 "Argument 0 must be a buffer source or a WebAssembly.Module object"); |
| 462 auto maybe = resolver->Reject(context, Utils::ToLocal(thrower.Reify())); | 444 auto maybe = resolver->Reject(context, Utils::ToLocal(thrower.Reify())); |
| 463 CHECK_IMPLIES(!maybe.FromMaybe(false), | 445 CHECK_IMPLIES(!maybe.FromMaybe(false), |
| 464 i_isolate->has_scheduled_exception()); | 446 i_isolate->has_scheduled_exception()); |
| 465 return; | 447 return; |
| 466 } | 448 } |
| 467 | 449 |
| 468 FunctionCallback instantiator = nullptr; | 450 FunctionCallback instantiator = nullptr; |
| 469 if (HasBrand(first_arg, i::Handle<i::Symbol>(i_context->wasm_module_sym()))) { | 451 if (first_arg->IsWasmModuleObject()) { |
| 470 module_promise = resolver->GetPromise(); | 452 module_promise = resolver->GetPromise(); |
| 471 if (!resolver->Resolve(context, first_arg_value).IsJust()) return; | 453 if (!resolver->Resolve(context, first_arg_value).IsJust()) return; |
| 472 instantiator = WebAssemblyInstantiateImplCallback; | 454 instantiator = WebAssemblyInstantiateImplCallback; |
| 473 } else { | 455 } else { |
| 474 ASSIGN(Function, async_compile, Function::New(context, WebAssemblyCompile)); | 456 ASSIGN(Function, async_compile, Function::New(context, WebAssemblyCompile)); |
| 475 ASSIGN(Value, async_compile_retval, | 457 ASSIGN(Value, async_compile_retval, |
| 476 async_compile->Call(context, args.Holder(), 1, &first_arg_value)); | 458 async_compile->Call(context, args.Holder(), 1, &first_arg_value)); |
| 477 module_promise = Local<Promise>::Cast(async_compile_retval); | 459 module_promise = Local<Promise>::Cast(async_compile_retval); |
| 478 instantiator = WebAssemblyInstantiateToPairCallback; | 460 instantiator = WebAssemblyInstantiateToPairCallback; |
| 479 } | 461 } |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 i::wasm::NewArrayBuffer(i_isolate, size, i::FLAG_wasm_guard_pages); | 587 i::wasm::NewArrayBuffer(i_isolate, size, i::FLAG_wasm_guard_pages); |
| 606 if (buffer.is_null()) { | 588 if (buffer.is_null()) { |
| 607 thrower.RangeError("could not allocate memory"); | 589 thrower.RangeError("could not allocate memory"); |
| 608 return; | 590 return; |
| 609 } | 591 } |
| 610 i::Handle<i::JSObject> memory_obj = | 592 i::Handle<i::JSObject> memory_obj = |
| 611 i::WasmMemoryObject::New(i_isolate, buffer, maximum); | 593 i::WasmMemoryObject::New(i_isolate, buffer, maximum); |
| 612 args.GetReturnValue().Set(Utils::ToLocal(memory_obj)); | 594 args.GetReturnValue().Set(Utils::ToLocal(memory_obj)); |
| 613 } | 595 } |
| 614 | 596 |
| 597 #define NAME_OF_WasmMemoryObject "WebAssembly.Memory" |
| 598 #define NAME_OF_WasmModuleObject "WebAssembly.Module" |
| 599 #define NAME_OF_WasmInstanceObject "WebAssembly.Instance" |
| 600 #define NAME_OF_WasmTableObject "WebAssembly.Table" |
| 601 |
| 602 #define EXTRACT_THIS(var, WasmType) \ |
| 603 i::Handle<i::WasmType> var; \ |
| 604 { \ |
| 605 i::Handle<i::Object> this_arg = Utils::OpenHandle(*args.This()); \ |
| 606 if (!this_arg->Is##WasmType()) { \ |
| 607 thrower.TypeError("Receiver is not a " NAME_OF_##WasmType); \ |
| 608 return; \ |
| 609 } \ |
| 610 var = i::Handle<i::WasmType>::cast(this_arg); \ |
| 611 } |
| 612 |
| 615 void WebAssemblyTableGetLength( | 613 void WebAssemblyTableGetLength( |
| 616 const v8::FunctionCallbackInfo<v8::Value>& args) { | 614 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 617 v8::Isolate* isolate = args.GetIsolate(); | 615 v8::Isolate* isolate = args.GetIsolate(); |
| 618 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 616 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 619 HandleScope scope(isolate); | 617 HandleScope scope(isolate); |
| 620 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.length()"); | 618 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.length()"); |
| 621 Local<Context> context = isolate->GetCurrentContext(); | 619 EXTRACT_THIS(receiver, WasmTableObject); |
| 622 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | |
| 623 if (!BrandCheck(Utils::OpenHandle(*args.This()), | |
| 624 i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, | |
| 625 "Receiver is not a WebAssembly.Table")) { | |
| 626 return; | |
| 627 } | |
| 628 auto receiver = | |
| 629 i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); | |
| 630 args.GetReturnValue().Set( | 620 args.GetReturnValue().Set( |
| 631 v8::Number::New(isolate, receiver->current_length())); | 621 v8::Number::New(isolate, receiver->current_length())); |
| 632 } | 622 } |
| 633 | 623 |
| 634 // WebAssembly.Table.grow(num) -> num | 624 // WebAssembly.Table.grow(num) -> num |
| 635 void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { | 625 void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 636 v8::Isolate* isolate = args.GetIsolate(); | 626 v8::Isolate* isolate = args.GetIsolate(); |
| 637 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 627 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 638 HandleScope scope(isolate); | 628 HandleScope scope(isolate); |
| 639 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.grow()"); | 629 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.grow()"); |
| 640 Local<Context> context = isolate->GetCurrentContext(); | 630 Local<Context> context = isolate->GetCurrentContext(); |
| 641 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 631 EXTRACT_THIS(receiver, WasmTableObject); |
| 642 if (!BrandCheck(Utils::OpenHandle(*args.This()), | |
| 643 i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, | |
| 644 "Receiver is not a WebAssembly.Table")) { | |
| 645 return; | |
| 646 } | |
| 647 | 632 |
| 648 auto receiver = | |
| 649 i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); | |
| 650 i::Handle<i::FixedArray> old_array(receiver->functions(), i_isolate); | 633 i::Handle<i::FixedArray> old_array(receiver->functions(), i_isolate); |
| 651 int old_size = old_array->length(); | 634 int old_size = old_array->length(); |
| 652 int64_t new_size64 = 0; | 635 int64_t new_size64 = 0; |
| 653 if (args.Length() > 0 && !args[0]->IntegerValue(context).To(&new_size64)) { | 636 if (args.Length() > 0 && !args[0]->IntegerValue(context).To(&new_size64)) { |
| 654 return; | 637 return; |
| 655 } | 638 } |
| 656 new_size64 += old_size; | 639 new_size64 += old_size; |
| 657 | 640 |
| 658 int64_t max_size64 = receiver->maximum_length(); | 641 int64_t max_size64 = receiver->maximum_length(); |
| 659 if (max_size64 < 0 || | 642 if (max_size64 < 0 || |
| (...skipping 24 matching lines...) Expand all Loading... |
| 684 return_value.Set(old_size); | 667 return_value.Set(old_size); |
| 685 } | 668 } |
| 686 | 669 |
| 687 // WebAssembly.Table.get(num) -> JSFunction | 670 // WebAssembly.Table.get(num) -> JSFunction |
| 688 void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) { | 671 void WebAssemblyTableGet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 689 v8::Isolate* isolate = args.GetIsolate(); | 672 v8::Isolate* isolate = args.GetIsolate(); |
| 690 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 673 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 691 HandleScope scope(isolate); | 674 HandleScope scope(isolate); |
| 692 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.get()"); | 675 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.get()"); |
| 693 Local<Context> context = isolate->GetCurrentContext(); | 676 Local<Context> context = isolate->GetCurrentContext(); |
| 694 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 677 EXTRACT_THIS(receiver, WasmTableObject); |
| 695 if (!BrandCheck(Utils::OpenHandle(*args.This()), | |
| 696 i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, | |
| 697 "Receiver is not a WebAssembly.Table")) { | |
| 698 return; | |
| 699 } | |
| 700 | |
| 701 auto receiver = | |
| 702 i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); | |
| 703 i::Handle<i::FixedArray> array(receiver->functions(), i_isolate); | 678 i::Handle<i::FixedArray> array(receiver->functions(), i_isolate); |
| 704 int i = 0; | 679 int i = 0; |
| 705 if (args.Length() > 0 && !args[0]->Int32Value(context).To(&i)) return; | 680 if (args.Length() > 0 && !args[0]->Int32Value(context).To(&i)) return; |
| 706 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 681 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 707 if (i < 0 || i >= array->length()) { | 682 if (i < 0 || i >= array->length()) { |
| 708 thrower.RangeError("index out of bounds"); | 683 thrower.RangeError("index out of bounds"); |
| 709 return; | 684 return; |
| 710 } | 685 } |
| 711 | 686 |
| 712 i::Handle<i::Object> value(array->get(i), i_isolate); | 687 i::Handle<i::Object> value(array->get(i), i_isolate); |
| 713 return_value.Set(Utils::ToLocal(value)); | 688 return_value.Set(Utils::ToLocal(value)); |
| 714 } | 689 } |
| 715 | 690 |
| 716 // WebAssembly.Table.set(num, JSFunction) | 691 // WebAssembly.Table.set(num, JSFunction) |
| 717 void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) { | 692 void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 718 v8::Isolate* isolate = args.GetIsolate(); | 693 v8::Isolate* isolate = args.GetIsolate(); |
| 719 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 694 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 720 HandleScope scope(isolate); | 695 HandleScope scope(isolate); |
| 721 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.set()"); | 696 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Table.set()"); |
| 722 Local<Context> context = isolate->GetCurrentContext(); | 697 Local<Context> context = isolate->GetCurrentContext(); |
| 723 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 698 EXTRACT_THIS(receiver, WasmTableObject); |
| 724 if (!BrandCheck(Utils::OpenHandle(*args.This()), | 699 |
| 725 i::Handle<i::Symbol>(i_context->wasm_table_sym()), &thrower, | |
| 726 "Receiver is not a WebAssembly.Table")) { | |
| 727 return; | |
| 728 } | |
| 729 if (args.Length() < 2) { | 700 if (args.Length() < 2) { |
| 730 thrower.TypeError("Argument 1 must be null or a function"); | 701 thrower.TypeError("Argument 1 must be null or a function"); |
| 731 return; | 702 return; |
| 732 } | 703 } |
| 733 | 704 |
| 734 // {This} parameter. | |
| 735 auto receiver = | |
| 736 i::Handle<i::WasmTableObject>::cast(Utils::OpenHandle(*args.This())); | |
| 737 | |
| 738 // Parameter 0. | 705 // Parameter 0. |
| 739 int32_t index; | 706 int32_t index; |
| 740 if (!args[0]->Int32Value(context).To(&index)) return; | 707 if (!args[0]->Int32Value(context).To(&index)) return; |
| 741 | 708 |
| 742 // Parameter 1. | 709 // Parameter 1. |
| 743 i::Handle<i::Object> value = Utils::OpenHandle(*args[1]); | 710 i::Handle<i::Object> value = Utils::OpenHandle(*args[1]); |
| 744 if (!value->IsNull(i_isolate) && | 711 if (!value->IsNull(i_isolate) && |
| 745 (!value->IsJSFunction() || | 712 (!value->IsJSFunction() || |
| 746 i::Handle<i::JSFunction>::cast(value)->code()->kind() != | 713 i::Handle<i::JSFunction>::cast(value)->code()->kind() != |
| 747 i::Code::JS_TO_WASM_FUNCTION)) { | 714 i::Code::JS_TO_WASM_FUNCTION)) { |
| 748 thrower.TypeError("Argument 1 must be null or a WebAssembly function"); | 715 thrower.TypeError("Argument 1 must be null or a WebAssembly function"); |
| 749 return; | 716 return; |
| 750 } | 717 } |
| 751 | 718 |
| 752 i::wasm::TableSet(&thrower, i_isolate, receiver, index, | 719 i::wasm::TableSet(&thrower, i_isolate, receiver, index, |
| 753 value->IsNull(i_isolate) | 720 value->IsNull(i_isolate) |
| 754 ? i::Handle<i::JSFunction>::null() | 721 ? i::Handle<i::JSFunction>::null() |
| 755 : i::Handle<i::JSFunction>::cast(value)); | 722 : i::Handle<i::JSFunction>::cast(value)); |
| 756 } | 723 } |
| 757 | 724 |
| 758 // WebAssembly.Memory.grow(num) -> num | 725 // WebAssembly.Memory.grow(num) -> num |
| 759 void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { | 726 void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 760 v8::Isolate* isolate = args.GetIsolate(); | 727 v8::Isolate* isolate = args.GetIsolate(); |
| 761 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 728 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 762 HandleScope scope(isolate); | 729 HandleScope scope(isolate); |
| 763 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.grow()"); | 730 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.grow()"); |
| 764 Local<Context> context = isolate->GetCurrentContext(); | 731 Local<Context> context = isolate->GetCurrentContext(); |
| 765 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 732 EXTRACT_THIS(receiver, WasmMemoryObject); |
| 766 if (!BrandCheck(Utils::OpenHandle(*args.This()), | 733 |
| 767 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), &thrower, | |
| 768 "Receiver is not a WebAssembly.Memory")) { | |
| 769 return; | |
| 770 } | |
| 771 int64_t delta_size = 0; | 734 int64_t delta_size = 0; |
| 772 if (args.Length() < 1 || !args[0]->IntegerValue(context).To(&delta_size)) { | 735 if (args.Length() < 1 || !args[0]->IntegerValue(context).To(&delta_size)) { |
| 773 thrower.TypeError("Argument 0 required, must be numeric value of pages"); | 736 thrower.TypeError("Argument 0 required, must be numeric value of pages"); |
| 774 return; | 737 return; |
| 775 } | 738 } |
| 776 i::Handle<i::WasmMemoryObject> receiver = | |
| 777 i::Handle<i::WasmMemoryObject>::cast(Utils::OpenHandle(*args.This())); | |
| 778 int64_t max_size64 = receiver->maximum_pages(); | 739 int64_t max_size64 = receiver->maximum_pages(); |
| 779 if (max_size64 < 0 || | 740 if (max_size64 < 0 || |
| 780 max_size64 > static_cast<int64_t>(i::FLAG_wasm_max_mem_pages)) { | 741 max_size64 > static_cast<int64_t>(i::FLAG_wasm_max_mem_pages)) { |
| 781 max_size64 = i::FLAG_wasm_max_mem_pages; | 742 max_size64 = i::FLAG_wasm_max_mem_pages; |
| 782 } | 743 } |
| 783 i::Handle<i::JSArrayBuffer> old_buffer(receiver->array_buffer()); | 744 i::Handle<i::JSArrayBuffer> old_buffer(receiver->array_buffer()); |
| 784 uint32_t old_size = | 745 uint32_t old_size = |
| 785 old_buffer->byte_length()->Number() / i::wasm::kSpecMaxWasmMemoryPages; | 746 old_buffer->byte_length()->Number() / i::wasm::kSpecMaxWasmMemoryPages; |
| 786 int64_t new_size64 = old_size + delta_size; | 747 int64_t new_size64 = old_size + delta_size; |
| 787 if (delta_size < 0 || max_size64 < new_size64 || new_size64 < old_size) { | 748 if (delta_size < 0 || max_size64 < new_size64 || new_size64 < old_size) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 801 return_value.Set(ret); | 762 return_value.Set(ret); |
| 802 } | 763 } |
| 803 | 764 |
| 804 // WebAssembly.Memory.buffer -> ArrayBuffer | 765 // WebAssembly.Memory.buffer -> ArrayBuffer |
| 805 void WebAssemblyMemoryGetBuffer( | 766 void WebAssemblyMemoryGetBuffer( |
| 806 const v8::FunctionCallbackInfo<v8::Value>& args) { | 767 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 807 v8::Isolate* isolate = args.GetIsolate(); | 768 v8::Isolate* isolate = args.GetIsolate(); |
| 808 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 769 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 809 HandleScope scope(isolate); | 770 HandleScope scope(isolate); |
| 810 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.buffer"); | 771 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory.buffer"); |
| 811 Local<Context> context = isolate->GetCurrentContext(); | 772 EXTRACT_THIS(receiver, WasmMemoryObject); |
| 812 i::Handle<i::Context> i_context = Utils::OpenHandle(*context); | 773 |
| 813 if (!BrandCheck(Utils::OpenHandle(*args.This()), | |
| 814 i::Handle<i::Symbol>(i_context->wasm_memory_sym()), &thrower, | |
| 815 "Receiver is not a WebAssembly.Memory")) { | |
| 816 return; | |
| 817 } | |
| 818 i::Handle<i::WasmMemoryObject> receiver = | |
| 819 i::Handle<i::WasmMemoryObject>::cast(Utils::OpenHandle(*args.This())); | |
| 820 i::Handle<i::Object> buffer(receiver->array_buffer(), i_isolate); | 774 i::Handle<i::Object> buffer(receiver->array_buffer(), i_isolate); |
| 821 DCHECK(buffer->IsJSArrayBuffer()); | 775 DCHECK(buffer->IsJSArrayBuffer()); |
| 822 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 776 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 823 return_value.Set(Utils::ToLocal(buffer)); | 777 return_value.Set(Utils::ToLocal(buffer)); |
| 824 } | 778 } |
| 825 } // namespace | 779 } // namespace |
| 826 | 780 |
| 827 // TODO(titzer): we use the API to create the function template because the | 781 // TODO(titzer): we use the API to create the function template because the |
| 828 // internal guts are too ugly to replicate here. | 782 // internal guts are too ugly to replicate here. |
| 829 static i::Handle<i::FunctionTemplateInfo> NewTemplate(i::Isolate* i_isolate, | 783 static i::Handle<i::FunctionTemplateInfo> NewTemplate(i::Isolate* i_isolate, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 JSFunction::CalculateInstanceSizeHelper(instance_type, embedder_fields, | 837 JSFunction::CalculateInstanceSizeHelper(instance_type, embedder_fields, |
| 884 in_object_properties, &instance_size, | 838 in_object_properties, &instance_size, |
| 885 &in_object_properties); | 839 &in_object_properties); |
| 886 | 840 |
| 887 int unused_property_fields = in_object_properties - pre_allocated; | 841 int unused_property_fields = in_object_properties - pre_allocated; |
| 888 Handle<Map> map = Map::CopyInitialMap( | 842 Handle<Map> map = Map::CopyInitialMap( |
| 889 prev_map, instance_size, in_object_properties, unused_property_fields); | 843 prev_map, instance_size, in_object_properties, unused_property_fields); |
| 890 | 844 |
| 891 context->set_wasm_function_map(*map); | 845 context->set_wasm_function_map(*map); |
| 892 | 846 |
| 893 // Install symbols. | |
| 894 | |
| 895 Factory* factory = isolate->factory(); | 847 Factory* factory = isolate->factory(); |
| 896 // Create private symbols. | |
| 897 Handle<Symbol> module_sym = factory->NewPrivateSymbol(); | |
| 898 context->set_wasm_module_sym(*module_sym); | |
| 899 | |
| 900 Handle<Symbol> instance_sym = factory->NewPrivateSymbol(); | |
| 901 context->set_wasm_instance_sym(*instance_sym); | |
| 902 | |
| 903 Handle<Symbol> table_sym = factory->NewPrivateSymbol(); | |
| 904 context->set_wasm_table_sym(*table_sym); | |
| 905 | |
| 906 Handle<Symbol> memory_sym = factory->NewPrivateSymbol(); | |
| 907 context->set_wasm_memory_sym(*memory_sym); | |
| 908 | 848 |
| 909 // Install the JS API. | 849 // Install the JS API. |
| 910 | 850 |
| 911 // Setup WebAssembly | 851 // Setup WebAssembly |
| 912 Handle<String> name = v8_str(isolate, "WebAssembly"); | 852 Handle<String> name = v8_str(isolate, "WebAssembly"); |
| 913 Handle<JSFunction> cons = factory->NewFunction(isolate->strict_function_map(), | 853 Handle<JSFunction> cons = factory->NewFunction(isolate->strict_function_map(), |
| 914 name, MaybeHandle<Code>()); | 854 name, MaybeHandle<Code>()); |
| 915 JSFunction::SetPrototype(cons, isolate->initial_object_prototype()); | 855 JSFunction::SetPrototype(cons, isolate->initial_object_prototype()); |
| 916 cons->shared()->set_instance_class_name(*name); | 856 cons->shared()->set_instance_class_name(*name); |
| 917 Handle<JSObject> webassembly = factory->NewJSObject(cons, TENURED); | 857 Handle<JSObject> webassembly = factory->NewJSObject(cons, TENURED); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1010 compile_error, attributes); | 950 compile_error, attributes); |
| 1011 Handle<JSFunction> link_error( | 951 Handle<JSFunction> link_error( |
| 1012 isolate->native_context()->wasm_link_error_function()); | 952 isolate->native_context()->wasm_link_error_function()); |
| 1013 JSObject::AddProperty(webassembly, isolate->factory()->LinkError_string(), | 953 JSObject::AddProperty(webassembly, isolate->factory()->LinkError_string(), |
| 1014 link_error, attributes); | 954 link_error, attributes); |
| 1015 Handle<JSFunction> runtime_error( | 955 Handle<JSFunction> runtime_error( |
| 1016 isolate->native_context()->wasm_runtime_error_function()); | 956 isolate->native_context()->wasm_runtime_error_function()); |
| 1017 JSObject::AddProperty(webassembly, isolate->factory()->RuntimeError_string(), | 957 JSObject::AddProperty(webassembly, isolate->factory()->RuntimeError_string(), |
| 1018 runtime_error, attributes); | 958 runtime_error, attributes); |
| 1019 } | 959 } |
| 1020 | |
| 1021 bool WasmJs::IsWasmMemoryObject(Isolate* isolate, Handle<Object> value) { | |
| 1022 i::Handle<i::Symbol> symbol(isolate->context()->wasm_memory_sym(), isolate); | |
| 1023 return HasBrand(value, symbol); | |
| 1024 } | |
| 1025 | |
| 1026 bool WasmJs::IsWasmTableObject(Isolate* isolate, Handle<Object> value) { | |
| 1027 i::Handle<i::Symbol> symbol(isolate->context()->wasm_table_sym(), isolate); | |
| 1028 return HasBrand(value, symbol); | |
| 1029 } | |
| 1030 } // namespace internal | 960 } // namespace internal |
| 1031 } // namespace v8 | 961 } // namespace v8 |
| OLD | NEW |