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 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 // We'll check for that in WebAssemblyInstantiateImpl. | 465 // We'll check for that in WebAssemblyInstantiateImpl. |
466 Local<Value> data = args[1]; | 466 Local<Value> data = args[1]; |
467 ASSIGN(Function, instantiate_impl, | 467 ASSIGN(Function, instantiate_impl, |
468 Function::New(context, instantiator, data)); | 468 Function::New(context, instantiator, data)); |
469 ASSIGN(Promise, result, module_promise->Then(context, instantiate_impl)); | 469 ASSIGN(Promise, result, module_promise->Then(context, instantiate_impl)); |
470 args.GetReturnValue().Set(result); | 470 args.GetReturnValue().Set(result); |
471 } | 471 } |
472 | 472 |
473 bool GetIntegerProperty(v8::Isolate* isolate, ErrorThrower* thrower, | 473 bool GetIntegerProperty(v8::Isolate* isolate, ErrorThrower* thrower, |
474 Local<Context> context, Local<v8::Object> object, | 474 Local<Context> context, Local<v8::Object> object, |
475 Local<String> property, int* result, | 475 Local<String> property, int64_t* result, |
476 int64_t lower_bound, uint64_t upper_bound) { | 476 int64_t lower_bound, uint64_t upper_bound) { |
477 v8::MaybeLocal<v8::Value> maybe = object->Get(context, property); | 477 v8::MaybeLocal<v8::Value> maybe = object->Get(context, property); |
478 v8::Local<v8::Value> value; | 478 v8::Local<v8::Value> value; |
479 if (maybe.ToLocal(&value)) { | 479 if (maybe.ToLocal(&value)) { |
480 int64_t number; | 480 int64_t number; |
481 if (!value->IntegerValue(context).To(&number)) return false; | 481 if (!value->IntegerValue(context).To(&number)) return false; |
482 if (number < lower_bound) { | 482 if (number < lower_bound) { |
483 thrower->RangeError("Property value %" PRId64 | 483 thrower->RangeError("Property value %" PRId64 |
484 " is below the lower bound %" PRIx64, | 484 " is below the lower bound %" PRIx64, |
485 number, lower_bound); | 485 number, lower_bound); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 v8::Local<v8::String> string; | 518 v8::Local<v8::String> string; |
519 if (!value->ToString(context).ToLocal(&string)) return; | 519 if (!value->ToString(context).ToLocal(&string)) return; |
520 bool equal; | 520 bool equal; |
521 if (!string->Equals(context, v8_str(isolate, "anyfunc")).To(&equal)) return; | 521 if (!string->Equals(context, v8_str(isolate, "anyfunc")).To(&equal)) return; |
522 if (!equal) { | 522 if (!equal) { |
523 thrower.TypeError("Descriptor property 'element' must be 'anyfunc'"); | 523 thrower.TypeError("Descriptor property 'element' must be 'anyfunc'"); |
524 return; | 524 return; |
525 } | 525 } |
526 } | 526 } |
527 // The descriptor's 'initial'. | 527 // The descriptor's 'initial'. |
528 int initial = 0; | 528 int64_t initial = 0; |
529 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, | 529 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, |
530 v8_str(isolate, "initial"), &initial, 0, | 530 v8_str(isolate, "initial"), &initial, 0, |
531 i::FLAG_wasm_max_table_size)) { | 531 i::FLAG_wasm_max_table_size)) { |
532 return; | 532 return; |
533 } | 533 } |
534 // The descriptor's 'maximum'. | 534 // The descriptor's 'maximum'. |
535 int maximum = -1; | 535 int64_t maximum = -1; |
536 Local<String> maximum_key = v8_str(isolate, "maximum"); | 536 Local<String> maximum_key = v8_str(isolate, "maximum"); |
537 Maybe<bool> has_maximum = descriptor->Has(context, maximum_key); | 537 Maybe<bool> has_maximum = descriptor->Has(context, maximum_key); |
538 | 538 |
539 if (!has_maximum.IsNothing() && has_maximum.FromJust()) { | 539 if (!has_maximum.IsNothing() && has_maximum.FromJust()) { |
540 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key, | 540 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key, |
541 &maximum, initial, | 541 &maximum, initial, |
542 i::wasm::kSpecMaxWasmTableSize)) { | 542 i::wasm::kSpecMaxWasmTableSize)) { |
543 return; | 543 return; |
544 } | 544 } |
545 } | 545 } |
546 | 546 |
547 i::Handle<i::FixedArray> fixed_array; | 547 i::Handle<i::FixedArray> fixed_array; |
548 i::Handle<i::JSObject> table_obj = | 548 i::Handle<i::JSObject> table_obj = i::WasmTableObject::New( |
549 i::WasmTableObject::New(i_isolate, initial, maximum, &fixed_array); | 549 i_isolate, static_cast<uint32_t>(initial), maximum, &fixed_array); |
550 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 550 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
551 return_value.Set(Utils::ToLocal(table_obj)); | 551 return_value.Set(Utils::ToLocal(table_obj)); |
552 } | 552 } |
553 | 553 |
554 void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { | 554 void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { |
555 v8::Isolate* isolate = args.GetIsolate(); | 555 v8::Isolate* isolate = args.GetIsolate(); |
556 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 556 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
557 HandleScope scope(isolate); | 557 HandleScope scope(isolate); |
558 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory()"); | 558 ScheduledErrorThrower thrower(i_isolate, "WebAssembly.Memory()"); |
559 if (args.Length() < 1 || !args[0]->IsObject()) { | 559 if (args.Length() < 1 || !args[0]->IsObject()) { |
560 thrower.TypeError("Argument 0 must be a memory descriptor"); | 560 thrower.TypeError("Argument 0 must be a memory descriptor"); |
561 return; | 561 return; |
562 } | 562 } |
563 Local<Context> context = isolate->GetCurrentContext(); | 563 Local<Context> context = isolate->GetCurrentContext(); |
564 Local<v8::Object> descriptor = args[0]->ToObject(context).ToLocalChecked(); | 564 Local<v8::Object> descriptor = args[0]->ToObject(context).ToLocalChecked(); |
565 // The descriptor's 'initial'. | 565 // The descriptor's 'initial'. |
566 int initial = 0; | 566 int64_t initial = 0; |
567 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, | 567 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, |
568 v8_str(isolate, "initial"), &initial, 0, | 568 v8_str(isolate, "initial"), &initial, 0, |
569 i::FLAG_wasm_max_mem_pages)) { | 569 i::FLAG_wasm_max_mem_pages)) { |
570 return; | 570 return; |
571 } | 571 } |
572 // The descriptor's 'maximum'. | 572 // The descriptor's 'maximum'. |
573 int maximum = -1; | 573 int64_t maximum = -1; |
574 Local<String> maximum_key = v8_str(isolate, "maximum"); | 574 Local<String> maximum_key = v8_str(isolate, "maximum"); |
575 Maybe<bool> has_maximum = descriptor->Has(context, maximum_key); | 575 Maybe<bool> has_maximum = descriptor->Has(context, maximum_key); |
576 | 576 |
577 if (!has_maximum.IsNothing() && has_maximum.FromJust()) { | 577 if (!has_maximum.IsNothing() && has_maximum.FromJust()) { |
578 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key, | 578 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key, |
579 &maximum, initial, | 579 &maximum, initial, |
580 i::wasm::kSpecMaxWasmMemoryPages)) { | 580 i::wasm::kSpecMaxWasmMemoryPages)) { |
581 return; | 581 return; |
582 } | 582 } |
583 } | 583 } |
584 size_t size = static_cast<size_t>(i::wasm::WasmModule::kPageSize) * | 584 size_t size = static_cast<size_t>(i::wasm::WasmModule::kPageSize) * |
585 static_cast<size_t>(initial); | 585 static_cast<size_t>(initial); |
586 i::Handle<i::JSArrayBuffer> buffer = | 586 i::Handle<i::JSArrayBuffer> buffer = |
587 i::wasm::NewArrayBuffer(i_isolate, size, i::FLAG_wasm_guard_pages); | 587 i::wasm::NewArrayBuffer(i_isolate, size, i::FLAG_wasm_guard_pages); |
588 if (buffer.is_null()) { | 588 if (buffer.is_null()) { |
589 thrower.RangeError("could not allocate memory"); | 589 thrower.RangeError("could not allocate memory"); |
590 return; | 590 return; |
591 } | 591 } |
592 i::Handle<i::JSObject> memory_obj = | 592 i::Handle<i::JSObject> memory_obj = i::WasmMemoryObject::New( |
593 i::WasmMemoryObject::New(i_isolate, buffer, maximum); | 593 i_isolate, buffer, static_cast<int32_t>(maximum)); |
594 args.GetReturnValue().Set(Utils::ToLocal(memory_obj)); | 594 args.GetReturnValue().Set(Utils::ToLocal(memory_obj)); |
595 } | 595 } |
596 | 596 |
597 #define NAME_OF_WasmMemoryObject "WebAssembly.Memory" | 597 #define NAME_OF_WasmMemoryObject "WebAssembly.Memory" |
598 #define NAME_OF_WasmModuleObject "WebAssembly.Module" | 598 #define NAME_OF_WasmModuleObject "WebAssembly.Module" |
599 #define NAME_OF_WasmInstanceObject "WebAssembly.Instance" | 599 #define NAME_OF_WasmInstanceObject "WebAssembly.Instance" |
600 #define NAME_OF_WasmTableObject "WebAssembly.Table" | 600 #define NAME_OF_WasmTableObject "WebAssembly.Table" |
601 | 601 |
602 #define EXTRACT_THIS(var, WasmType) \ | 602 #define EXTRACT_THIS(var, WasmType) \ |
603 i::Handle<i::WasmType> var; \ | 603 i::Handle<i::WasmType> var; \ |
(...skipping 27 matching lines...) Expand all Loading... |
631 EXTRACT_THIS(receiver, WasmTableObject); | 631 EXTRACT_THIS(receiver, WasmTableObject); |
632 | 632 |
633 i::Handle<i::FixedArray> old_array(receiver->functions(), i_isolate); | 633 i::Handle<i::FixedArray> old_array(receiver->functions(), i_isolate); |
634 int old_size = old_array->length(); | 634 int old_size = old_array->length(); |
635 int64_t new_size64 = 0; | 635 int64_t new_size64 = 0; |
636 if (args.Length() > 0 && !args[0]->IntegerValue(context).To(&new_size64)) { | 636 if (args.Length() > 0 && !args[0]->IntegerValue(context).To(&new_size64)) { |
637 return; | 637 return; |
638 } | 638 } |
639 new_size64 += old_size; | 639 new_size64 += old_size; |
640 | 640 |
641 int64_t max_size64 = receiver->maximum_length(); | 641 int64_t max_size64 = receiver->maximum_length()->Number(); |
642 if (max_size64 < 0 || | 642 if (max_size64 < 0 || max_size64 > i::FLAG_wasm_max_table_size) { |
643 max_size64 > static_cast<int64_t>(i::FLAG_wasm_max_table_size)) { | |
644 max_size64 = i::FLAG_wasm_max_table_size; | 643 max_size64 = i::FLAG_wasm_max_table_size; |
645 } | 644 } |
646 | 645 |
647 if (new_size64 < old_size || new_size64 > max_size64) { | 646 if (new_size64 < old_size || new_size64 > max_size64) { |
648 thrower.RangeError(new_size64 < old_size ? "trying to shrink table" | 647 thrower.RangeError(new_size64 < old_size ? "trying to shrink table" |
649 : "maximum table size exceeded"); | 648 : "maximum table size exceeded"); |
650 return; | 649 return; |
651 } | 650 } |
652 | 651 |
653 int new_size = static_cast<int>(new_size64); | 652 int new_size = static_cast<int>(new_size64); |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
952 isolate->native_context()->wasm_link_error_function()); | 951 isolate->native_context()->wasm_link_error_function()); |
953 JSObject::AddProperty(webassembly, isolate->factory()->LinkError_string(), | 952 JSObject::AddProperty(webassembly, isolate->factory()->LinkError_string(), |
954 link_error, attributes); | 953 link_error, attributes); |
955 Handle<JSFunction> runtime_error( | 954 Handle<JSFunction> runtime_error( |
956 isolate->native_context()->wasm_runtime_error_function()); | 955 isolate->native_context()->wasm_runtime_error_function()); |
957 JSObject::AddProperty(webassembly, isolate->factory()->RuntimeError_string(), | 956 JSObject::AddProperty(webassembly, isolate->factory()->RuntimeError_string(), |
958 runtime_error, attributes); | 957 runtime_error, attributes); |
959 } | 958 } |
960 } // namespace internal | 959 } // namespace internal |
961 } // namespace v8 | 960 } // namespace v8 |
OLD | NEW |