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