OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/builtins/builtins-utils.h" | 5 #include "src/builtins/builtins-utils.h" |
6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stub-assembler.h" | 8 #include "src/code-stub-assembler.h" |
9 #include "src/property-descriptor.h" | 9 #include "src/property-descriptor.h" |
10 | 10 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 // 1. Let to be ? ToObject(target). | 155 // 1. Let to be ? ToObject(target). |
156 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, target, | 156 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, target, |
157 Object::ToObject(isolate, target)); | 157 Object::ToObject(isolate, target)); |
158 Handle<JSReceiver> to = Handle<JSReceiver>::cast(target); | 158 Handle<JSReceiver> to = Handle<JSReceiver>::cast(target); |
159 // 2. If only one argument was passed, return to. | 159 // 2. If only one argument was passed, return to. |
160 if (args.length() == 2) return *to; | 160 if (args.length() == 2) return *to; |
161 // 3. Let sources be the List of argument values starting with the | 161 // 3. Let sources be the List of argument values starting with the |
162 // second argument. | 162 // second argument. |
163 // 4. For each element nextSource of sources, in ascending index order, | 163 // 4. For each element nextSource of sources, in ascending index order, |
164 for (int i = 2; i < args.length(); ++i) { | 164 for (int i = 2; i < args.length(); ++i) { |
165 Handle<Object> next_source = args.at<Object>(i); | 165 Handle<Object> next_source = args.at(i); |
166 Maybe<bool> fast_assign = FastAssign(to, next_source); | 166 Maybe<bool> fast_assign = FastAssign(to, next_source); |
167 if (fast_assign.IsNothing()) return isolate->heap()->exception(); | 167 if (fast_assign.IsNothing()) return isolate->heap()->exception(); |
168 if (fast_assign.FromJust()) continue; | 168 if (fast_assign.FromJust()) continue; |
169 // 4a. If nextSource is undefined or null, let keys be an empty List. | 169 // 4a. If nextSource is undefined or null, let keys be an empty List. |
170 // 4b. Else, | 170 // 4b. Else, |
171 // 4b i. Let from be ToObject(nextSource). | 171 // 4b i. Let from be ToObject(nextSource). |
172 // Only non-empty strings and JSReceivers have enumerable properties. | 172 // Only non-empty strings and JSReceivers have enumerable properties. |
173 Handle<JSReceiver> from = | 173 Handle<JSReceiver> from = |
174 Object::ToObject(isolate, next_source).ToHandleChecked(); | 174 Object::ToObject(isolate, next_source).ToHandleChecked(); |
175 // 4b ii. Let keys be ? from.[[OwnPropertyKeys]](). | 175 // 4b ii. Let keys be ? from.[[OwnPropertyKeys]](). |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 { | 551 { |
552 a.Return( | 552 a.Return( |
553 a.CallRuntime(Runtime::kObjectCreate, context, prototype, properties)); | 553 a.CallRuntime(Runtime::kObjectCreate, context, prototype, properties)); |
554 } | 554 } |
555 } | 555 } |
556 | 556 |
557 // ES6 section 19.1.2.3 Object.defineProperties | 557 // ES6 section 19.1.2.3 Object.defineProperties |
558 BUILTIN(ObjectDefineProperties) { | 558 BUILTIN(ObjectDefineProperties) { |
559 HandleScope scope(isolate); | 559 HandleScope scope(isolate); |
560 DCHECK_EQ(3, args.length()); | 560 DCHECK_EQ(3, args.length()); |
561 Handle<Object> target = args.at<Object>(1); | 561 Handle<Object> target = args.at(1); |
562 Handle<Object> properties = args.at<Object>(2); | 562 Handle<Object> properties = args.at(2); |
563 | 563 |
564 RETURN_RESULT_OR_FAILURE( | 564 RETURN_RESULT_OR_FAILURE( |
565 isolate, JSReceiver::DefineProperties(isolate, target, properties)); | 565 isolate, JSReceiver::DefineProperties(isolate, target, properties)); |
566 } | 566 } |
567 | 567 |
568 // ES6 section 19.1.2.4 Object.defineProperty | 568 // ES6 section 19.1.2.4 Object.defineProperty |
569 BUILTIN(ObjectDefineProperty) { | 569 BUILTIN(ObjectDefineProperty) { |
570 HandleScope scope(isolate); | 570 HandleScope scope(isolate); |
571 DCHECK_EQ(4, args.length()); | 571 DCHECK_EQ(4, args.length()); |
572 Handle<Object> target = args.at<Object>(1); | 572 Handle<Object> target = args.at(1); |
573 Handle<Object> key = args.at<Object>(2); | 573 Handle<Object> key = args.at(2); |
574 Handle<Object> attributes = args.at<Object>(3); | 574 Handle<Object> attributes = args.at(3); |
575 | 575 |
576 return JSReceiver::DefineProperty(isolate, target, key, attributes); | 576 return JSReceiver::DefineProperty(isolate, target, key, attributes); |
577 } | 577 } |
578 | 578 |
579 namespace { | 579 namespace { |
580 | 580 |
581 template <AccessorComponent which_accessor> | 581 template <AccessorComponent which_accessor> |
582 Object* ObjectDefineAccessor(Isolate* isolate, Handle<Object> object, | 582 Object* ObjectDefineAccessor(Isolate* isolate, Handle<Object> object, |
583 Handle<Object> name, Handle<Object> accessor) { | 583 Handle<Object> name, Handle<Object> accessor) { |
584 // 1. Let O be ? ToObject(this value). | 584 // 1. Let O be ? ToObject(this value). |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 | 664 |
665 return isolate->heap()->undefined_value(); | 665 return isolate->heap()->undefined_value(); |
666 } | 666 } |
667 | 667 |
668 } // namespace | 668 } // namespace |
669 | 669 |
670 // ES6 B.2.2.2 a.k.a. | 670 // ES6 B.2.2.2 a.k.a. |
671 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__ | 671 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__ |
672 BUILTIN(ObjectDefineGetter) { | 672 BUILTIN(ObjectDefineGetter) { |
673 HandleScope scope(isolate); | 673 HandleScope scope(isolate); |
674 Handle<Object> object = args.at<Object>(0); // Receiver. | 674 Handle<Object> object = args.at(0); // Receiver. |
675 Handle<Object> name = args.at<Object>(1); | 675 Handle<Object> name = args.at(1); |
676 Handle<Object> getter = args.at<Object>(2); | 676 Handle<Object> getter = args.at(2); |
677 return ObjectDefineAccessor<ACCESSOR_GETTER>(isolate, object, name, getter); | 677 return ObjectDefineAccessor<ACCESSOR_GETTER>(isolate, object, name, getter); |
678 } | 678 } |
679 | 679 |
680 // ES6 B.2.2.3 a.k.a. | 680 // ES6 B.2.2.3 a.k.a. |
681 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__ | 681 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__ |
682 BUILTIN(ObjectDefineSetter) { | 682 BUILTIN(ObjectDefineSetter) { |
683 HandleScope scope(isolate); | 683 HandleScope scope(isolate); |
684 Handle<Object> object = args.at<Object>(0); // Receiver. | 684 Handle<Object> object = args.at(0); // Receiver. |
685 Handle<Object> name = args.at<Object>(1); | 685 Handle<Object> name = args.at(1); |
686 Handle<Object> setter = args.at<Object>(2); | 686 Handle<Object> setter = args.at(2); |
687 return ObjectDefineAccessor<ACCESSOR_SETTER>(isolate, object, name, setter); | 687 return ObjectDefineAccessor<ACCESSOR_SETTER>(isolate, object, name, setter); |
688 } | 688 } |
689 | 689 |
690 // ES6 B.2.2.4 a.k.a. | 690 // ES6 B.2.2.4 a.k.a. |
691 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__ | 691 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__ |
692 BUILTIN(ObjectLookupGetter) { | 692 BUILTIN(ObjectLookupGetter) { |
693 HandleScope scope(isolate); | 693 HandleScope scope(isolate); |
694 Handle<Object> object = args.at<Object>(0); | 694 Handle<Object> object = args.at(0); |
695 Handle<Object> name = args.at<Object>(1); | 695 Handle<Object> name = args.at(1); |
696 return ObjectLookupAccessor(isolate, object, name, ACCESSOR_GETTER); | 696 return ObjectLookupAccessor(isolate, object, name, ACCESSOR_GETTER); |
697 } | 697 } |
698 | 698 |
699 // ES6 B.2.2.5 a.k.a. | 699 // ES6 B.2.2.5 a.k.a. |
700 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__ | 700 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__ |
701 BUILTIN(ObjectLookupSetter) { | 701 BUILTIN(ObjectLookupSetter) { |
702 HandleScope scope(isolate); | 702 HandleScope scope(isolate); |
703 Handle<Object> object = args.at<Object>(0); | 703 Handle<Object> object = args.at(0); |
704 Handle<Object> name = args.at<Object>(1); | 704 Handle<Object> name = args.at(1); |
705 return ObjectLookupAccessor(isolate, object, name, ACCESSOR_SETTER); | 705 return ObjectLookupAccessor(isolate, object, name, ACCESSOR_SETTER); |
706 } | 706 } |
707 | 707 |
708 // ES6 section 19.1.2.5 Object.freeze ( O ) | 708 // ES6 section 19.1.2.5 Object.freeze ( O ) |
709 BUILTIN(ObjectFreeze) { | 709 BUILTIN(ObjectFreeze) { |
710 HandleScope scope(isolate); | 710 HandleScope scope(isolate); |
711 Handle<Object> object = args.atOrUndefined(isolate, 1); | 711 Handle<Object> object = args.atOrUndefined(isolate, 1); |
712 if (object->IsJSReceiver()) { | 712 if (object->IsJSReceiver()) { |
713 MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), | 713 MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), |
714 FROZEN, Object::THROW_ON_ERROR), | 714 FROZEN, Object::THROW_ON_ERROR), |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 // 1. Let O be ? RequireObjectCoercible(this value). | 783 // 1. Let O be ? RequireObjectCoercible(this value). |
784 Handle<Object> object = args.receiver(); | 784 Handle<Object> object = args.receiver(); |
785 if (object->IsNull(isolate) || object->IsUndefined(isolate)) { | 785 if (object->IsNull(isolate) || object->IsUndefined(isolate)) { |
786 THROW_NEW_ERROR_RETURN_FAILURE( | 786 THROW_NEW_ERROR_RETURN_FAILURE( |
787 isolate, NewTypeError(MessageTemplate::kCalledOnNullOrUndefined, | 787 isolate, NewTypeError(MessageTemplate::kCalledOnNullOrUndefined, |
788 isolate->factory()->NewStringFromAsciiChecked( | 788 isolate->factory()->NewStringFromAsciiChecked( |
789 "set Object.prototype.__proto__"))); | 789 "set Object.prototype.__proto__"))); |
790 } | 790 } |
791 | 791 |
792 // 2. If Type(proto) is neither Object nor Null, return undefined. | 792 // 2. If Type(proto) is neither Object nor Null, return undefined. |
793 Handle<Object> proto = args.at<Object>(1); | 793 Handle<Object> proto = args.at(1); |
794 if (!proto->IsNull(isolate) && !proto->IsJSReceiver()) { | 794 if (!proto->IsNull(isolate) && !proto->IsJSReceiver()) { |
795 return isolate->heap()->undefined_value(); | 795 return isolate->heap()->undefined_value(); |
796 } | 796 } |
797 | 797 |
798 // 3. If Type(O) is not Object, return undefined. | 798 // 3. If Type(O) is not Object, return undefined. |
799 if (!object->IsJSReceiver()) return isolate->heap()->undefined_value(); | 799 if (!object->IsJSReceiver()) return isolate->heap()->undefined_value(); |
800 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); | 800 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); |
801 | 801 |
802 // 4. Let status be ? O.[[SetPrototypeOf]](proto). | 802 // 4. Let status be ? O.[[SetPrototypeOf]](proto). |
803 // 5. If status is false, throw a TypeError exception. | 803 // 5. If status is false, throw a TypeError exception. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 | 858 |
859 // ES6 section 19.1.2.8 Object.getOwnPropertySymbols ( O ) | 859 // ES6 section 19.1.2.8 Object.getOwnPropertySymbols ( O ) |
860 BUILTIN(ObjectGetOwnPropertySymbols) { | 860 BUILTIN(ObjectGetOwnPropertySymbols) { |
861 return GetOwnPropertyKeys(isolate, args, SKIP_STRINGS); | 861 return GetOwnPropertyKeys(isolate, args, SKIP_STRINGS); |
862 } | 862 } |
863 | 863 |
864 // ES#sec-object.is Object.is ( value1, value2 ) | 864 // ES#sec-object.is Object.is ( value1, value2 ) |
865 BUILTIN(ObjectIs) { | 865 BUILTIN(ObjectIs) { |
866 SealHandleScope shs(isolate); | 866 SealHandleScope shs(isolate); |
867 DCHECK_EQ(3, args.length()); | 867 DCHECK_EQ(3, args.length()); |
868 Handle<Object> value1 = args.at<Object>(1); | 868 Handle<Object> value1 = args.at(1); |
869 Handle<Object> value2 = args.at<Object>(2); | 869 Handle<Object> value2 = args.at(2); |
870 return isolate->heap()->ToBoolean(value1->SameValue(*value2)); | 870 return isolate->heap()->ToBoolean(value1->SameValue(*value2)); |
871 } | 871 } |
872 | 872 |
873 // ES6 section 19.1.2.11 Object.isExtensible ( O ) | 873 // ES6 section 19.1.2.11 Object.isExtensible ( O ) |
874 BUILTIN(ObjectIsExtensible) { | 874 BUILTIN(ObjectIsExtensible) { |
875 HandleScope scope(isolate); | 875 HandleScope scope(isolate); |
876 Handle<Object> object = args.atOrUndefined(isolate, 1); | 876 Handle<Object> object = args.atOrUndefined(isolate, 1); |
877 Maybe<bool> result = | 877 Maybe<bool> result = |
878 object->IsJSReceiver() | 878 object->IsJSReceiver() |
879 ? JSReceiver::IsExtensible(Handle<JSReceiver>::cast(object)) | 879 ? JSReceiver::IsExtensible(Handle<JSReceiver>::cast(object)) |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1073 | 1073 |
1074 Node* constructor = assembler.Parameter(Descriptor::kLeft); | 1074 Node* constructor = assembler.Parameter(Descriptor::kLeft); |
1075 Node* object = assembler.Parameter(Descriptor::kRight); | 1075 Node* object = assembler.Parameter(Descriptor::kRight); |
1076 Node* context = assembler.Parameter(Descriptor::kContext); | 1076 Node* context = assembler.Parameter(Descriptor::kContext); |
1077 | 1077 |
1078 assembler.Return(assembler.OrdinaryHasInstance(context, constructor, object)); | 1078 assembler.Return(assembler.OrdinaryHasInstance(context, constructor, object)); |
1079 } | 1079 } |
1080 | 1080 |
1081 } // namespace internal | 1081 } // namespace internal |
1082 } // namespace v8 | 1082 } // namespace v8 |
OLD | NEW |