Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: src/objects.cc

Issue 2807333003: [api] Add DefineProperty() method that skips interceptors.
Patch Set: Change enum to enum class Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | test/cctest/test-api-interceptors.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 6117 matching lines...) Expand 10 before | Expand all | Expand 10 after
6128 LanguageMode language_mode) { 6128 LanguageMode language_mode) {
6129 LookupIterator it = LookupIterator::PropertyOrElement( 6129 LookupIterator it = LookupIterator::PropertyOrElement(
6130 name->GetIsolate(), object, name, object, LookupIterator::OWN); 6130 name->GetIsolate(), object, name, object, LookupIterator::OWN);
6131 return DeleteProperty(&it, language_mode); 6131 return DeleteProperty(&it, language_mode);
6132 } 6132 }
6133 6133
6134 // ES6 19.1.2.4 6134 // ES6 19.1.2.4
6135 // static 6135 // static
6136 Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object, 6136 Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object,
6137 Handle<Object> key, 6137 Handle<Object> key,
6138 Handle<Object> attributes) { 6138 Handle<Object> attributes,
6139 CallInterceptors call_interceptors) {
6139 // 1. If Type(O) is not Object, throw a TypeError exception. 6140 // 1. If Type(O) is not Object, throw a TypeError exception.
6140 if (!object->IsJSReceiver()) { 6141 if (!object->IsJSReceiver()) {
6141 Handle<String> fun_name = 6142 Handle<String> fun_name =
6142 isolate->factory()->InternalizeUtf8String("Object.defineProperty"); 6143 isolate->factory()->InternalizeUtf8String("Object.defineProperty");
6143 THROW_NEW_ERROR_RETURN_FAILURE( 6144 THROW_NEW_ERROR_RETURN_FAILURE(
6144 isolate, NewTypeError(MessageTemplate::kCalledOnNonObject, fun_name)); 6145 isolate, NewTypeError(MessageTemplate::kCalledOnNonObject, fun_name));
6145 } 6146 }
6146 // 2. Let key be ToPropertyKey(P). 6147 // 2. Let key be ToPropertyKey(P).
6147 // 3. ReturnIfAbrupt(key). 6148 // 3. ReturnIfAbrupt(key).
6148 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key, ToPropertyKey(isolate, key)); 6149 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key, ToPropertyKey(isolate, key));
6149 // 4. Let desc be ToPropertyDescriptor(Attributes). 6150 // 4. Let desc be ToPropertyDescriptor(Attributes).
6150 // 5. ReturnIfAbrupt(desc). 6151 // 5. ReturnIfAbrupt(desc).
6151 PropertyDescriptor desc; 6152 PropertyDescriptor desc;
6152 if (!PropertyDescriptor::ToPropertyDescriptor(isolate, attributes, &desc)) { 6153 if (!PropertyDescriptor::ToPropertyDescriptor(isolate, attributes, &desc)) {
6153 return isolate->heap()->exception(); 6154 return isolate->heap()->exception();
6154 } 6155 }
6155 // 6. Let success be DefinePropertyOrThrow(O,key, desc). 6156 // 6. Let success be DefinePropertyOrThrow(O,key, desc).
6156 Maybe<bool> success = DefineOwnProperty( 6157 Maybe<bool> success =
6157 isolate, Handle<JSReceiver>::cast(object), key, &desc, THROW_ON_ERROR); 6158 DefineOwnProperty(isolate, Handle<JSReceiver>::cast(object), key, &desc,
6159 THROW_ON_ERROR, call_interceptors);
6158 // 7. ReturnIfAbrupt(success). 6160 // 7. ReturnIfAbrupt(success).
6159 MAYBE_RETURN(success, isolate->heap()->exception()); 6161 MAYBE_RETURN(success, isolate->heap()->exception());
6160 CHECK(success.FromJust()); 6162 CHECK(success.FromJust());
6161 // 8. Return O. 6163 // 8. Return O.
6162 return *object; 6164 return *object;
6163 } 6165 }
6164 6166
6165
6166 // ES6 19.1.2.3.1 6167 // ES6 19.1.2.3.1
6167 // static 6168 // static
6168 MaybeHandle<Object> JSReceiver::DefineProperties(Isolate* isolate, 6169 MaybeHandle<Object> JSReceiver::DefineProperties(Isolate* isolate,
6169 Handle<Object> object, 6170 Handle<Object> object,
6170 Handle<Object> properties) { 6171 Handle<Object> properties) {
6171 // 1. If Type(O) is not Object, throw a TypeError exception. 6172 // 1. If Type(O) is not Object, throw a TypeError exception.
6172 if (!object->IsJSReceiver()) { 6173 if (!object->IsJSReceiver()) {
6173 Handle<String> fun_name = 6174 Handle<String> fun_name =
6174 isolate->factory()->InternalizeUtf8String("Object.defineProperties"); 6175 isolate->factory()->InternalizeUtf8String("Object.defineProperties");
6175 THROW_NEW_ERROR(isolate, 6176 THROW_NEW_ERROR(isolate,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
6239 // 9. Return o. 6240 // 9. Return o.
6240 return object; 6241 return object;
6241 } 6242 }
6242 6243
6243 6244
6244 // static 6245 // static
6245 Maybe<bool> JSReceiver::DefineOwnProperty(Isolate* isolate, 6246 Maybe<bool> JSReceiver::DefineOwnProperty(Isolate* isolate,
6246 Handle<JSReceiver> object, 6247 Handle<JSReceiver> object,
6247 Handle<Object> key, 6248 Handle<Object> key,
6248 PropertyDescriptor* desc, 6249 PropertyDescriptor* desc,
6249 ShouldThrow should_throw) { 6250 ShouldThrow should_throw,
6251 CallInterceptors call_interceptors) {
6250 if (object->IsJSArray()) { 6252 if (object->IsJSArray()) {
6251 return JSArray::DefineOwnProperty(isolate, Handle<JSArray>::cast(object), 6253 return JSArray::DefineOwnProperty(isolate, Handle<JSArray>::cast(object),
6252 key, desc, should_throw); 6254 key, desc, should_throw,
6255 call_interceptors);
6253 } 6256 }
6254 if (object->IsJSProxy()) { 6257 if (object->IsJSProxy()) {
6255 return JSProxy::DefineOwnProperty(isolate, Handle<JSProxy>::cast(object), 6258 return JSProxy::DefineOwnProperty(isolate, Handle<JSProxy>::cast(object),
6256 key, desc, should_throw); 6259 key, desc, should_throw,
6260 call_interceptors);
6257 } 6261 }
6258 if (object->IsJSTypedArray()) { 6262 if (object->IsJSTypedArray()) {
6259 return JSTypedArray::DefineOwnProperty( 6263 return JSTypedArray::DefineOwnProperty(
6260 isolate, Handle<JSTypedArray>::cast(object), key, desc, should_throw); 6264 isolate, Handle<JSTypedArray>::cast(object), key, desc, should_throw,
6265 call_interceptors);
6261 } 6266 }
6262 // TODO(neis): Special case for JSModuleNamespace? 6267 // TODO(neis): Special case for JSModuleNamespace?
6263 6268
6264 // OrdinaryDefineOwnProperty, by virtue of calling 6269 // OrdinaryDefineOwnProperty, by virtue of calling
6265 // DefineOwnPropertyIgnoreAttributes, can handle arguments 6270 // DefineOwnPropertyIgnoreAttributes, can handle arguments
6266 // (ES#sec-arguments-exotic-objects-defineownproperty-p-desc). 6271 // (ES#sec-arguments-exotic-objects-defineownproperty-p-desc).
6267 return OrdinaryDefineOwnProperty(isolate, Handle<JSObject>::cast(object), key, 6272 return OrdinaryDefineOwnProperty(isolate, Handle<JSObject>::cast(object), key,
6268 desc, should_throw); 6273 desc, should_throw, call_interceptors);
6269 } 6274 }
6270 6275
6271
6272 // static 6276 // static
6273 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate, 6277 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(
6274 Handle<JSObject> object, 6278 Isolate* isolate, Handle<JSObject> object, Handle<Object> key,
6275 Handle<Object> key, 6279 PropertyDescriptor* desc, ShouldThrow should_throw,
6276 PropertyDescriptor* desc, 6280 CallInterceptors call_interceptors) {
6277 ShouldThrow should_throw) {
6278 bool success = false; 6281 bool success = false;
6279 DCHECK(key->IsName() || key->IsNumber()); // |key| is a PropertyKey... 6282 DCHECK(key->IsName() || key->IsNumber()); // |key| is a PropertyKey...
6283
6284 LookupIterator::Configuration iterator_config = LookupIterator::OWN;
6285 if (call_interceptors == CallInterceptors::kSkip) {
6286 iterator_config = LookupIterator::OWN_SKIP_INTERCEPTOR;
6287 }
6288
6280 LookupIterator it = LookupIterator::PropertyOrElement( 6289 LookupIterator it = LookupIterator::PropertyOrElement(
6281 isolate, object, key, &success, LookupIterator::OWN); 6290 isolate, object, key, &success, iterator_config);
6291
6282 DCHECK(success); // ...so creating a LookupIterator can't fail. 6292 DCHECK(success); // ...so creating a LookupIterator can't fail.
6283 6293
6284 // Deal with access checks first. 6294 // Deal with access checks first.
6285 if (it.state() == LookupIterator::ACCESS_CHECK) { 6295 if (it.state() == LookupIterator::ACCESS_CHECK) {
6286 if (!it.HasAccess()) { 6296 if (!it.HasAccess()) {
6287 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); 6297 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>());
6288 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); 6298 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>());
6289 return Just(true); 6299 return Just(true);
6290 } 6300 }
6291 it.Next(); 6301 it.Next();
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
6668 bool PropertyKeyToArrayIndex(Handle<Object> index_obj, uint32_t* output) { 6678 bool PropertyKeyToArrayIndex(Handle<Object> index_obj, uint32_t* output) {
6669 return PropertyKeyToArrayLength(index_obj, output) && *output != kMaxUInt32; 6679 return PropertyKeyToArrayLength(index_obj, output) && *output != kMaxUInt32;
6670 } 6680 }
6671 6681
6672 6682
6673 // ES6 9.4.2.1 6683 // ES6 9.4.2.1
6674 // static 6684 // static
6675 Maybe<bool> JSArray::DefineOwnProperty(Isolate* isolate, Handle<JSArray> o, 6685 Maybe<bool> JSArray::DefineOwnProperty(Isolate* isolate, Handle<JSArray> o,
6676 Handle<Object> name, 6686 Handle<Object> name,
6677 PropertyDescriptor* desc, 6687 PropertyDescriptor* desc,
6678 ShouldThrow should_throw) { 6688 ShouldThrow should_throw,
6689 CallInterceptors call_interceptors) {
6679 // 1. Assert: IsPropertyKey(P) is true. ("P" is |name|.) 6690 // 1. Assert: IsPropertyKey(P) is true. ("P" is |name|.)
6680 // 2. If P is "length", then: 6691 // 2. If P is "length", then:
6681 // TODO(jkummerow): Check if we need slow string comparison. 6692 // TODO(jkummerow): Check if we need slow string comparison.
6682 if (*name == isolate->heap()->length_string()) { 6693 if (*name == isolate->heap()->length_string()) {
6683 // 2a. Return ArraySetLength(A, Desc). 6694 // 2a. Return ArraySetLength(A, Desc).
6684 return ArraySetLength(isolate, o, desc, should_throw); 6695 return ArraySetLength(isolate, o, desc, should_throw, call_interceptors);
6685 } 6696 }
6686 // 3. Else if P is an array index, then: 6697 // 3. Else if P is an array index, then:
6687 uint32_t index = 0; 6698 uint32_t index = 0;
6688 if (PropertyKeyToArrayIndex(name, &index)) { 6699 if (PropertyKeyToArrayIndex(name, &index)) {
6689 // 3a. Let oldLenDesc be OrdinaryGetOwnProperty(A, "length"). 6700 // 3a. Let oldLenDesc be OrdinaryGetOwnProperty(A, "length").
6690 PropertyDescriptor old_len_desc; 6701 PropertyDescriptor old_len_desc;
6691 Maybe<bool> success = GetOwnPropertyDescriptor( 6702 Maybe<bool> success = GetOwnPropertyDescriptor(
6692 isolate, o, isolate->factory()->length_string(), &old_len_desc); 6703 isolate, o, isolate->factory()->length_string(), &old_len_desc);
6693 // 3b. (Assert) 6704 // 3b. (Assert)
6694 DCHECK(success.FromJust()); 6705 DCHECK(success.FromJust());
6695 USE(success); 6706 USE(success);
6696 // 3c. Let oldLen be oldLenDesc.[[Value]]. 6707 // 3c. Let oldLen be oldLenDesc.[[Value]].
6697 uint32_t old_len = 0; 6708 uint32_t old_len = 0;
6698 CHECK(old_len_desc.value()->ToArrayLength(&old_len)); 6709 CHECK(old_len_desc.value()->ToArrayLength(&old_len));
6699 // 3d. Let index be ToUint32(P). 6710 // 3d. Let index be ToUint32(P).
6700 // (Already done above.) 6711 // (Already done above.)
6701 // 3e. (Assert) 6712 // 3e. (Assert)
6702 // 3f. If index >= oldLen and oldLenDesc.[[Writable]] is false, 6713 // 3f. If index >= oldLen and oldLenDesc.[[Writable]] is false,
6703 // return false. 6714 // return false.
6704 if (index >= old_len && old_len_desc.has_writable() && 6715 if (index >= old_len && old_len_desc.has_writable() &&
6705 !old_len_desc.writable()) { 6716 !old_len_desc.writable()) {
6706 RETURN_FAILURE(isolate, should_throw, 6717 RETURN_FAILURE(isolate, should_throw,
6707 NewTypeError(MessageTemplate::kDefineDisallowed, name)); 6718 NewTypeError(MessageTemplate::kDefineDisallowed, name));
6708 } 6719 }
6709 // 3g. Let succeeded be OrdinaryDefineOwnProperty(A, P, Desc). 6720 // 3g. Let succeeded be OrdinaryDefineOwnProperty(A, P, Desc).
6710 Maybe<bool> succeeded = 6721 Maybe<bool> succeeded = OrdinaryDefineOwnProperty(
6711 OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw); 6722 isolate, o, name, desc, should_throw, call_interceptors);
6712 // 3h. Assert: succeeded is not an abrupt completion. 6723 // 3h. Assert: succeeded is not an abrupt completion.
6713 // In our case, if should_throw == THROW_ON_ERROR, it can be! 6724 // In our case, if should_throw == THROW_ON_ERROR, it can be!
6714 // 3i. If succeeded is false, return false. 6725 // 3i. If succeeded is false, return false.
6715 if (succeeded.IsNothing() || !succeeded.FromJust()) return succeeded; 6726 if (succeeded.IsNothing() || !succeeded.FromJust()) return succeeded;
6716 // 3j. If index >= oldLen, then: 6727 // 3j. If index >= oldLen, then:
6717 if (index >= old_len) { 6728 if (index >= old_len) {
6718 // 3j i. Set oldLenDesc.[[Value]] to index + 1. 6729 // 3j i. Set oldLenDesc.[[Value]] to index + 1.
6719 old_len_desc.set_value(isolate->factory()->NewNumberFromUint(index + 1)); 6730 old_len_desc.set_value(isolate->factory()->NewNumberFromUint(index + 1));
6720 // 3j ii. Let succeeded be 6731 // 3j ii. Let succeeded be
6721 // OrdinaryDefineOwnProperty(A, "length", oldLenDesc). 6732 // OrdinaryDefineOwnProperty(A, "length", oldLenDesc).
6722 succeeded = OrdinaryDefineOwnProperty(isolate, o, 6733 succeeded = OrdinaryDefineOwnProperty(
6723 isolate->factory()->length_string(), 6734 isolate, o, isolate->factory()->length_string(), &old_len_desc,
6724 &old_len_desc, should_throw); 6735 should_throw, call_interceptors);
6725 // 3j iii. Assert: succeeded is true. 6736 // 3j iii. Assert: succeeded is true.
6726 DCHECK(succeeded.FromJust()); 6737 DCHECK(succeeded.FromJust());
6727 USE(succeeded); 6738 USE(succeeded);
6728 } 6739 }
6729 // 3k. Return true. 6740 // 3k. Return true.
6730 return Just(true); 6741 return Just(true);
6731 } 6742 }
6732 6743
6733 // 4. Return OrdinaryDefineOwnProperty(A, P, Desc). 6744 // 4. Return OrdinaryDefineOwnProperty(A, P, Desc).
6734 return OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw); 6745 return OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw,
6746 call_interceptors);
6735 } 6747 }
6736 6748
6737 6749
6738 // Part of ES6 9.4.2.4 ArraySetLength. 6750 // Part of ES6 9.4.2.4 ArraySetLength.
6739 // static 6751 // static
6740 bool JSArray::AnythingToArrayLength(Isolate* isolate, 6752 bool JSArray::AnythingToArrayLength(Isolate* isolate,
6741 Handle<Object> length_object, 6753 Handle<Object> length_object,
6742 uint32_t* output) { 6754 uint32_t* output) {
6743 // Fast path: check numbers and strings that can be converted directly 6755 // Fast path: check numbers and strings that can be converted directly
6744 // and unobservably. 6756 // and unobservably.
(...skipping 24 matching lines...) Expand all
6769 } 6781 }
6770 CHECK(uint32_v->ToArrayLength(output)); 6782 CHECK(uint32_v->ToArrayLength(output));
6771 return true; 6783 return true;
6772 } 6784 }
6773 6785
6774 6786
6775 // ES6 9.4.2.4 6787 // ES6 9.4.2.4
6776 // static 6788 // static
6777 Maybe<bool> JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a, 6789 Maybe<bool> JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a,
6778 PropertyDescriptor* desc, 6790 PropertyDescriptor* desc,
6779 ShouldThrow should_throw) { 6791 ShouldThrow should_throw,
6792 CallInterceptors call_interceptors) {
6780 // 1. If the [[Value]] field of Desc is absent, then 6793 // 1. If the [[Value]] field of Desc is absent, then
6781 if (!desc->has_value()) { 6794 if (!desc->has_value()) {
6782 // 1a. Return OrdinaryDefineOwnProperty(A, "length", Desc). 6795 // 1a. Return OrdinaryDefineOwnProperty(A, "length", Desc).
6783 return OrdinaryDefineOwnProperty( 6796 return OrdinaryDefineOwnProperty(isolate, a,
6784 isolate, a, isolate->factory()->length_string(), desc, should_throw); 6797 isolate->factory()->length_string(), desc,
6798 should_throw, call_interceptors);
6785 } 6799 }
6786 // 2. Let newLenDesc be a copy of Desc. 6800 // 2. Let newLenDesc be a copy of Desc.
6787 // (Actual copying is not necessary.) 6801 // (Actual copying is not necessary.)
6788 PropertyDescriptor* new_len_desc = desc; 6802 PropertyDescriptor* new_len_desc = desc;
6789 // 3. - 7. Convert Desc.[[Value]] to newLen. 6803 // 3. - 7. Convert Desc.[[Value]] to newLen.
6790 uint32_t new_len = 0; 6804 uint32_t new_len = 0;
6791 if (!AnythingToArrayLength(isolate, desc->value(), &new_len)) { 6805 if (!AnythingToArrayLength(isolate, desc->value(), &new_len)) {
6792 DCHECK(isolate->has_pending_exception()); 6806 DCHECK(isolate->has_pending_exception());
6793 return Nothing<bool>(); 6807 return Nothing<bool>();
6794 } 6808 }
6795 // 8. Set newLenDesc.[[Value]] to newLen. 6809 // 8. Set newLenDesc.[[Value]] to newLen.
6796 // (Done below, if needed.) 6810 // (Done below, if needed.)
6797 // 9. Let oldLenDesc be OrdinaryGetOwnProperty(A, "length"). 6811 // 9. Let oldLenDesc be OrdinaryGetOwnProperty(A, "length").
6798 PropertyDescriptor old_len_desc; 6812 PropertyDescriptor old_len_desc;
6799 Maybe<bool> success = GetOwnPropertyDescriptor( 6813 Maybe<bool> success = GetOwnPropertyDescriptor(
6800 isolate, a, isolate->factory()->length_string(), &old_len_desc); 6814 isolate, a, isolate->factory()->length_string(), &old_len_desc);
6801 // 10. (Assert) 6815 // 10. (Assert)
6802 DCHECK(success.FromJust()); 6816 DCHECK(success.FromJust());
6803 USE(success); 6817 USE(success);
6804 // 11. Let oldLen be oldLenDesc.[[Value]]. 6818 // 11. Let oldLen be oldLenDesc.[[Value]].
6805 uint32_t old_len = 0; 6819 uint32_t old_len = 0;
6806 CHECK(old_len_desc.value()->ToArrayLength(&old_len)); 6820 CHECK(old_len_desc.value()->ToArrayLength(&old_len));
6807 // 12. If newLen >= oldLen, then 6821 // 12. If newLen >= oldLen, then
6808 if (new_len >= old_len) { 6822 if (new_len >= old_len) {
6809 // 8. Set newLenDesc.[[Value]] to newLen. 6823 // 8. Set newLenDesc.[[Value]] to newLen.
6810 // 12a. Return OrdinaryDefineOwnProperty(A, "length", newLenDesc). 6824 // 12a. Return OrdinaryDefineOwnProperty(A, "length", newLenDesc).
6811 new_len_desc->set_value(isolate->factory()->NewNumberFromUint(new_len)); 6825 new_len_desc->set_value(isolate->factory()->NewNumberFromUint(new_len));
6812 return OrdinaryDefineOwnProperty(isolate, a, 6826 return OrdinaryDefineOwnProperty(
6813 isolate->factory()->length_string(), 6827 isolate, a, isolate->factory()->length_string(), new_len_desc,
6814 new_len_desc, should_throw); 6828 should_throw, call_interceptors);
6815 } 6829 }
6816 // 13. If oldLenDesc.[[Writable]] is false, return false. 6830 // 13. If oldLenDesc.[[Writable]] is false, return false.
6817 if (!old_len_desc.writable()) { 6831 if (!old_len_desc.writable()) {
6818 RETURN_FAILURE(isolate, should_throw, 6832 RETURN_FAILURE(isolate, should_throw,
6819 NewTypeError(MessageTemplate::kRedefineDisallowed, 6833 NewTypeError(MessageTemplate::kRedefineDisallowed,
6820 isolate->factory()->length_string())); 6834 isolate->factory()->length_string()));
6821 } 6835 }
6822 // 14. If newLenDesc.[[Writable]] is absent or has the value true, 6836 // 14. If newLenDesc.[[Writable]] is absent or has the value true,
6823 // let newWritable be true. 6837 // let newWritable be true.
6824 bool new_writable = false; 6838 bool new_writable = false;
6825 if (!new_len_desc->has_writable() || new_len_desc->writable()) { 6839 if (!new_len_desc->has_writable() || new_len_desc->writable()) {
6826 new_writable = true; 6840 new_writable = true;
6827 } else { 6841 } else {
6828 // 15. Else, 6842 // 15. Else,
6829 // 15a. Need to defer setting the [[Writable]] attribute to false in case 6843 // 15a. Need to defer setting the [[Writable]] attribute to false in case
6830 // any elements cannot be deleted. 6844 // any elements cannot be deleted.
6831 // 15b. Let newWritable be false. (It's initialized as "false" anyway.) 6845 // 15b. Let newWritable be false. (It's initialized as "false" anyway.)
6832 // 15c. Set newLenDesc.[[Writable]] to true. 6846 // 15c. Set newLenDesc.[[Writable]] to true.
6833 // (Not needed.) 6847 // (Not needed.)
6834 } 6848 }
6835 // Most of steps 16 through 19 is implemented by JSArray::SetLength. 6849 // Most of steps 16 through 19 is implemented by JSArray::SetLength.
6836 JSArray::SetLength(a, new_len); 6850 JSArray::SetLength(a, new_len);
6837 // Steps 19d-ii, 20. 6851 // Steps 19d-ii, 20.
6838 if (!new_writable) { 6852 if (!new_writable) {
6839 PropertyDescriptor readonly; 6853 PropertyDescriptor readonly;
6840 readonly.set_writable(false); 6854 readonly.set_writable(false);
6841 Maybe<bool> success = OrdinaryDefineOwnProperty( 6855 Maybe<bool> success = OrdinaryDefineOwnProperty(
6842 isolate, a, isolate->factory()->length_string(), &readonly, 6856 isolate, a, isolate->factory()->length_string(), &readonly,
6843 should_throw); 6857 should_throw, call_interceptors);
6844 DCHECK(success.FromJust()); 6858 DCHECK(success.FromJust());
6845 USE(success); 6859 USE(success);
6846 } 6860 }
6847 uint32_t actual_new_len = 0; 6861 uint32_t actual_new_len = 0;
6848 CHECK(a->length()->ToArrayLength(&actual_new_len)); 6862 CHECK(a->length()->ToArrayLength(&actual_new_len));
6849 // Steps 19d-v, 21. Return false if there were non-deletable elements. 6863 // Steps 19d-v, 21. Return false if there were non-deletable elements.
6850 bool result = actual_new_len == new_len; 6864 bool result = actual_new_len == new_len;
6851 if (!result) { 6865 if (!result) {
6852 RETURN_FAILURE( 6866 RETURN_FAILURE(
6853 isolate, should_throw, 6867 isolate, should_throw,
6854 NewTypeError(MessageTemplate::kStrictDeleteProperty, 6868 NewTypeError(MessageTemplate::kStrictDeleteProperty,
6855 isolate->factory()->NewNumberFromUint(actual_new_len - 1), 6869 isolate->factory()->NewNumberFromUint(actual_new_len - 1),
6856 a)); 6870 a));
6857 } 6871 }
6858 return Just(result); 6872 return Just(result);
6859 } 6873 }
6860 6874
6861 6875
6862 // ES6 9.5.6 6876 // ES6 9.5.6
6863 // static 6877 // static
6864 Maybe<bool> JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy, 6878 Maybe<bool> JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy,
6865 Handle<Object> key, 6879 Handle<Object> key,
6866 PropertyDescriptor* desc, 6880 PropertyDescriptor* desc,
6867 ShouldThrow should_throw) { 6881 ShouldThrow should_throw,
6882 CallInterceptors call_interceptors) {
6868 STACK_CHECK(isolate, Nothing<bool>()); 6883 STACK_CHECK(isolate, Nothing<bool>());
6869 if (key->IsSymbol() && Handle<Symbol>::cast(key)->IsPrivate()) { 6884 if (key->IsSymbol() && Handle<Symbol>::cast(key)->IsPrivate()) {
6870 return SetPrivateProperty(isolate, proxy, Handle<Symbol>::cast(key), desc, 6885 return SetPrivateProperty(isolate, proxy, Handle<Symbol>::cast(key), desc,
6871 should_throw); 6886 should_throw);
6872 } 6887 }
6873 Handle<String> trap_name = isolate->factory()->defineProperty_string(); 6888 Handle<String> trap_name = isolate->factory()->defineProperty_string();
6874 // 1. Assert: IsPropertyKey(P) is true. 6889 // 1. Assert: IsPropertyKey(P) is true.
6875 DCHECK(key->IsName() || key->IsNumber()); 6890 DCHECK(key->IsName() || key->IsNumber());
6876 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. 6891 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
6877 Handle<Object> handler(proxy->handler(), isolate); 6892 Handle<Object> handler(proxy->handler(), isolate);
6878 // 3. If handler is null, throw a TypeError exception. 6893 // 3. If handler is null, throw a TypeError exception.
6879 // 4. Assert: Type(handler) is Object. 6894 // 4. Assert: Type(handler) is Object.
6880 if (proxy->IsRevoked()) { 6895 if (proxy->IsRevoked()) {
6881 isolate->Throw(*isolate->factory()->NewTypeError( 6896 isolate->Throw(*isolate->factory()->NewTypeError(
6882 MessageTemplate::kProxyRevoked, trap_name)); 6897 MessageTemplate::kProxyRevoked, trap_name));
6883 return Nothing<bool>(); 6898 return Nothing<bool>();
6884 } 6899 }
6885 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. 6900 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
6886 Handle<JSReceiver> target(proxy->target(), isolate); 6901 Handle<JSReceiver> target(proxy->target(), isolate);
6887 // 6. Let trap be ? GetMethod(handler, "defineProperty"). 6902 // 6. Let trap be ? GetMethod(handler, "defineProperty").
6888 Handle<Object> trap; 6903 Handle<Object> trap;
6889 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 6904 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
6890 isolate, trap, 6905 isolate, trap,
6891 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), 6906 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name),
6892 Nothing<bool>()); 6907 Nothing<bool>());
6893 // 7. If trap is undefined, then: 6908 // 7. If trap is undefined, then:
6894 if (trap->IsUndefined(isolate)) { 6909 if (trap->IsUndefined(isolate)) {
6895 // 7a. Return target.[[DefineOwnProperty]](P, Desc). 6910 // 7a. Return target.[[DefineOwnProperty]](P, Desc).
6896 return JSReceiver::DefineOwnProperty(isolate, target, key, desc, 6911 return JSReceiver::DefineOwnProperty(isolate, target, key, desc,
6897 should_throw); 6912 should_throw, call_interceptors);
6898 } 6913 }
6899 // 8. Let descObj be FromPropertyDescriptor(Desc). 6914 // 8. Let descObj be FromPropertyDescriptor(Desc).
6900 Handle<Object> desc_obj = desc->ToObject(isolate); 6915 Handle<Object> desc_obj = desc->ToObject(isolate);
6901 // 9. Let booleanTrapResult be 6916 // 9. Let booleanTrapResult be
6902 // ToBoolean(? Call(trap, handler, «target, P, descObj»)). 6917 // ToBoolean(? Call(trap, handler, «target, P, descObj»)).
6903 Handle<Name> property_name = 6918 Handle<Name> property_name =
6904 key->IsName() 6919 key->IsName()
6905 ? Handle<Name>::cast(key) 6920 ? Handle<Name>::cast(key)
6906 : Handle<Name>::cast(isolate->factory()->NumberToString(key)); 6921 : Handle<Name>::cast(isolate->factory()->NumberToString(key));
6907 // Do not leak private property names. 6922 // Do not leak private property names.
(...skipping 10202 matching lines...) Expand 10 before | Expand all | Expand 10 after
17110 } 17125 }
17111 } 17126 }
17112 *index = result; 17127 *index = result;
17113 return true; 17128 return true;
17114 } 17129 }
17115 17130
17116 } // anonymous namespace 17131 } // anonymous namespace
17117 17132
17118 // ES#sec-integer-indexed-exotic-objects-defineownproperty-p-desc 17133 // ES#sec-integer-indexed-exotic-objects-defineownproperty-p-desc
17119 // static 17134 // static
17120 Maybe<bool> JSTypedArray::DefineOwnProperty(Isolate* isolate, 17135 Maybe<bool> JSTypedArray::DefineOwnProperty(
17121 Handle<JSTypedArray> o, 17136 Isolate* isolate, Handle<JSTypedArray> o, Handle<Object> key,
17122 Handle<Object> key, 17137 PropertyDescriptor* desc, ShouldThrow should_throw,
17123 PropertyDescriptor* desc, 17138 CallInterceptors call_interceptors) {
17124 ShouldThrow should_throw) {
17125 // 1. Assert: IsPropertyKey(P) is true. 17139 // 1. Assert: IsPropertyKey(P) is true.
17126 DCHECK(key->IsName() || key->IsNumber()); 17140 DCHECK(key->IsName() || key->IsNumber());
17127 // 2. Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot. 17141 // 2. Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
17128 // 3. If Type(P) is String, then 17142 // 3. If Type(P) is String, then
17129 if (key->IsString() || key->IsSmi()) { 17143 if (key->IsString() || key->IsSmi()) {
17130 // 3a. Let numericIndex be ! CanonicalNumericIndexString(P) 17144 // 3a. Let numericIndex be ! CanonicalNumericIndexString(P)
17131 // 3b. If numericIndex is not undefined, then 17145 // 3b. If numericIndex is not undefined, then
17132 Handle<Object> numeric_index; 17146 Handle<Object> numeric_index;
17133 if (CanonicalNumericIndexString(isolate, key, &numeric_index)) { 17147 if (CanonicalNumericIndexString(isolate, key, &numeric_index)) {
17134 // 3b i. If IsInteger(numericIndex) is false, return false. 17148 // 3b i. If IsInteger(numericIndex) is false, return false.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
17175 RETURN_ON_EXCEPTION_VALUE(isolate, 17189 RETURN_ON_EXCEPTION_VALUE(isolate,
17176 SetOwnElementIgnoreAttributes( 17190 SetOwnElementIgnoreAttributes(
17177 o, index, value, desc->ToAttributes()), 17191 o, index, value, desc->ToAttributes()),
17178 Nothing<bool>()); 17192 Nothing<bool>());
17179 } 17193 }
17180 // 3b xi. Return true. 17194 // 3b xi. Return true.
17181 return Just(true); 17195 return Just(true);
17182 } 17196 }
17183 } 17197 }
17184 // 4. Return ! OrdinaryDefineOwnProperty(O, P, Desc). 17198 // 4. Return ! OrdinaryDefineOwnProperty(O, P, Desc).
17185 return OrdinaryDefineOwnProperty(isolate, o, key, desc, should_throw); 17199 return OrdinaryDefineOwnProperty(isolate, o, key, desc, should_throw,
17200 call_interceptors);
17186 } 17201 }
17187 17202
17188 ExternalArrayType JSTypedArray::type() { 17203 ExternalArrayType JSTypedArray::type() {
17189 switch (elements()->map()->instance_type()) { 17204 switch (elements()->map()->instance_type()) {
17190 #define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \ 17205 #define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \
17191 case FIXED_##TYPE##_ARRAY_TYPE: \ 17206 case FIXED_##TYPE##_ARRAY_TYPE: \
17192 return kExternal##Type##Array; 17207 return kExternal##Type##Array;
17193 17208
17194 TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE) 17209 TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE)
17195 #undef INSTANCE_TYPE_TO_ARRAY_TYPE 17210 #undef INSTANCE_TYPE_TO_ARRAY_TYPE
(...skipping 3189 matching lines...) Expand 10 before | Expand all | Expand 10 after
20385 // not 20400 // not
20386 // depend on this. 20401 // depend on this.
20387 return DICTIONARY_ELEMENTS; 20402 return DICTIONARY_ELEMENTS;
20388 } 20403 }
20389 DCHECK_LE(kind, LAST_ELEMENTS_KIND); 20404 DCHECK_LE(kind, LAST_ELEMENTS_KIND);
20390 return kind; 20405 return kind;
20391 } 20406 }
20392 } 20407 }
20393 } // namespace internal 20408 } // namespace internal
20394 } // namespace v8 20409 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | test/cctest/test-api-interceptors.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698