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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 5319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5330 } | 5330 } |
5331 return Just(true); | 5331 return Just(true); |
5332 } | 5332 } |
5333 } | 5333 } |
5334 } | 5334 } |
5335 | 5335 |
5336 return AddDataProperty(it, value, attributes, should_throw, | 5336 return AddDataProperty(it, value, attributes, should_throw, |
5337 CERTAINLY_NOT_STORE_FROM_KEYED); | 5337 CERTAINLY_NOT_STORE_FROM_KEYED); |
5338 } | 5338 } |
5339 | 5339 |
5340 | |
5341 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( | 5340 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( |
5342 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, | 5341 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, |
5343 PropertyAttributes attributes, AccessorInfoHandling handling) { | 5342 PropertyAttributes attributes) { |
5344 DCHECK(!value->IsTheHole()); | 5343 DCHECK(!value->IsTheHole()); |
5345 LookupIterator it(object, name, LookupIterator::OWN); | 5344 LookupIterator it(object, name, LookupIterator::OWN); |
5346 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); | 5345 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes); |
| 5346 } |
| 5347 |
| 5348 MaybeHandle<Object> JSObject::SetOwnElementIgnoreAttributes( |
| 5349 Handle<JSObject> object, uint32_t index, Handle<Object> value, |
| 5350 PropertyAttributes attributes) { |
| 5351 Isolate* isolate = object->GetIsolate(); |
| 5352 LookupIterator it(isolate, object, index, LookupIterator::OWN); |
| 5353 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes); |
| 5354 } |
| 5355 |
| 5356 MaybeHandle<Object> JSObject::DefinePropertyOrElementIgnoreAttributes( |
| 5357 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, |
| 5358 PropertyAttributes attributes) { |
| 5359 Isolate* isolate = object->GetIsolate(); |
| 5360 LookupIterator it = LookupIterator::PropertyOrElement(isolate, object, name, |
| 5361 LookupIterator::OWN); |
| 5362 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes); |
5347 } | 5363 } |
5348 | 5364 |
5349 | 5365 |
5350 MaybeHandle<Object> JSObject::SetOwnElementIgnoreAttributes( | |
5351 Handle<JSObject> object, uint32_t index, Handle<Object> value, | |
5352 PropertyAttributes attributes, AccessorInfoHandling handling) { | |
5353 Isolate* isolate = object->GetIsolate(); | |
5354 LookupIterator it(isolate, object, index, LookupIterator::OWN); | |
5355 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); | |
5356 } | |
5357 | |
5358 | |
5359 MaybeHandle<Object> JSObject::DefinePropertyOrElementIgnoreAttributes( | |
5360 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, | |
5361 PropertyAttributes attributes, AccessorInfoHandling handling) { | |
5362 Isolate* isolate = object->GetIsolate(); | |
5363 LookupIterator it = LookupIterator::PropertyOrElement(isolate, object, name, | |
5364 LookupIterator::OWN); | |
5365 return DefineOwnPropertyIgnoreAttributes(&it, value, attributes, handling); | |
5366 } | |
5367 | |
5368 | |
5369 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( | 5366 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
5370 LookupIterator* it) { | 5367 LookupIterator* it) { |
5371 Isolate* isolate = it->isolate(); | 5368 Isolate* isolate = it->isolate(); |
5372 // Make sure that the top context does not change when doing | 5369 // Make sure that the top context does not change when doing |
5373 // callbacks or interceptor calls. | 5370 // callbacks or interceptor calls. |
5374 AssertNoContextChange ncc(isolate); | 5371 AssertNoContextChange ncc(isolate); |
5375 HandleScope scope(isolate); | 5372 HandleScope scope(isolate); |
5376 | 5373 |
5377 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 5374 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
5378 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 5375 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
(...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6587 // created property is set to its default value. | 6584 // created property is set to its default value. |
6588 if (it != NULL) { | 6585 if (it != NULL) { |
6589 if (!desc->has_writable()) desc->set_writable(false); | 6586 if (!desc->has_writable()) desc->set_writable(false); |
6590 if (!desc->has_enumerable()) desc->set_enumerable(false); | 6587 if (!desc->has_enumerable()) desc->set_enumerable(false); |
6591 if (!desc->has_configurable()) desc->set_configurable(false); | 6588 if (!desc->has_configurable()) desc->set_configurable(false); |
6592 Handle<Object> value( | 6589 Handle<Object> value( |
6593 desc->has_value() | 6590 desc->has_value() |
6594 ? desc->value() | 6591 ? desc->value() |
6595 : Handle<Object>::cast(isolate->factory()->undefined_value())); | 6592 : Handle<Object>::cast(isolate->factory()->undefined_value())); |
6596 MaybeHandle<Object> result = | 6593 MaybeHandle<Object> result = |
6597 JSObject::DefineOwnPropertyIgnoreAttributes( | 6594 JSObject::DefineOwnPropertyIgnoreAttributes(it, value, |
6598 it, value, desc->ToAttributes(), JSObject::DONT_FORCE_FIELD); | 6595 desc->ToAttributes()); |
6599 if (result.is_null()) return Nothing<bool>(); | 6596 if (result.is_null()) return Nothing<bool>(); |
6600 } | 6597 } |
6601 } else { | 6598 } else { |
6602 // 2d. Else Desc must be an accessor Property Descriptor, | 6599 // 2d. Else Desc must be an accessor Property Descriptor, |
6603 DCHECK(desc_is_accessor_descriptor); | 6600 DCHECK(desc_is_accessor_descriptor); |
6604 // 2d i. If O is not undefined, create an own accessor property named P | 6601 // 2d i. If O is not undefined, create an own accessor property named P |
6605 // of object O whose [[Get]], [[Set]], [[Enumerable]] and | 6602 // of object O whose [[Get]], [[Set]], [[Enumerable]] and |
6606 // [[Configurable]] attribute values are described by Desc. If the value | 6603 // [[Configurable]] attribute values are described by Desc. If the value |
6607 // of an attribute field of Desc is absent, the attribute of the newly | 6604 // of an attribute field of Desc is absent, the attribute of the newly |
6608 // created property is set to its default value. | 6605 // created property is set to its default value. |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6780 } else { | 6777 } else { |
6781 attrs = static_cast<PropertyAttributes>( | 6778 attrs = static_cast<PropertyAttributes>( |
6782 attrs | (current->writable() ? NONE : READ_ONLY)); | 6779 attrs | (current->writable() ? NONE : READ_ONLY)); |
6783 } | 6780 } |
6784 Handle<Object> value( | 6781 Handle<Object> value( |
6785 desc->has_value() ? desc->value() | 6782 desc->has_value() ? desc->value() |
6786 : current->has_value() | 6783 : current->has_value() |
6787 ? current->value() | 6784 ? current->value() |
6788 : Handle<Object>::cast( | 6785 : Handle<Object>::cast( |
6789 isolate->factory()->undefined_value())); | 6786 isolate->factory()->undefined_value())); |
6790 MaybeHandle<Object> result = JSObject::DefineOwnPropertyIgnoreAttributes( | 6787 MaybeHandle<Object> result = |
6791 it, value, attrs, JSObject::DONT_FORCE_FIELD); | 6788 JSObject::DefineOwnPropertyIgnoreAttributes(it, value, attrs); |
6792 if (result.is_null()) return Nothing<bool>(); | 6789 if (result.is_null()) return Nothing<bool>(); |
6793 } else { | 6790 } else { |
6794 DCHECK(desc_is_accessor_descriptor || | 6791 DCHECK(desc_is_accessor_descriptor || |
6795 (desc_is_generic_descriptor && | 6792 (desc_is_generic_descriptor && |
6796 PropertyDescriptor::IsAccessorDescriptor(current))); | 6793 PropertyDescriptor::IsAccessorDescriptor(current))); |
6797 Handle<Object> getter( | 6794 Handle<Object> getter( |
6798 desc->has_get() | 6795 desc->has_get() |
6799 ? desc->get() | 6796 ? desc->get() |
6800 : current->has_get() | 6797 : current->has_get() |
6801 ? current->get() | 6798 ? current->get() |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6845 DCHECK(it->GetReceiver()->IsJSObject()); | 6842 DCHECK(it->GetReceiver()->IsJSObject()); |
6846 MAYBE_RETURN(JSReceiver::GetPropertyAttributes(it), Nothing<bool>()); | 6843 MAYBE_RETURN(JSReceiver::GetPropertyAttributes(it), Nothing<bool>()); |
6847 | 6844 |
6848 if (it->IsFound()) { | 6845 if (it->IsFound()) { |
6849 if (!it->IsConfigurable()) return Just(false); | 6846 if (!it->IsConfigurable()) return Just(false); |
6850 } else { | 6847 } else { |
6851 if (!JSObject::IsExtensible(Handle<JSObject>::cast(it->GetReceiver()))) | 6848 if (!JSObject::IsExtensible(Handle<JSObject>::cast(it->GetReceiver()))) |
6852 return Just(false); | 6849 return Just(false); |
6853 } | 6850 } |
6854 | 6851 |
6855 RETURN_ON_EXCEPTION_VALUE( | 6852 RETURN_ON_EXCEPTION_VALUE(it->isolate(), |
6856 it->isolate(), | 6853 DefineOwnPropertyIgnoreAttributes(it, value, NONE), |
6857 DefineOwnPropertyIgnoreAttributes(it, value, NONE, DONT_FORCE_FIELD), | 6854 Nothing<bool>()); |
6858 Nothing<bool>()); | |
6859 | 6855 |
6860 return Just(true); | 6856 return Just(true); |
6861 } | 6857 } |
6862 | 6858 |
6863 | 6859 |
6864 // TODO(jkummerow): Consider unification with FastAsArrayLength() in | 6860 // TODO(jkummerow): Consider unification with FastAsArrayLength() in |
6865 // accessors.cc. | 6861 // accessors.cc. |
6866 bool PropertyKeyToArrayLength(Handle<Object> value, uint32_t* length) { | 6862 bool PropertyKeyToArrayLength(Handle<Object> value, uint32_t* length) { |
6867 DCHECK(value->IsNumber() || value->IsName()); | 6863 DCHECK(value->IsNumber() || value->IsName()); |
6868 if (value->ToArrayLength(length)) return true; | 6864 if (value->ToArrayLength(length)) return true; |
(...skipping 12880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19749 if (cell->value() != *new_value) { | 19745 if (cell->value() != *new_value) { |
19750 cell->set_value(*new_value); | 19746 cell->set_value(*new_value); |
19751 Isolate* isolate = cell->GetIsolate(); | 19747 Isolate* isolate = cell->GetIsolate(); |
19752 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19748 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
19753 isolate, DependentCode::kPropertyCellChangedGroup); | 19749 isolate, DependentCode::kPropertyCellChangedGroup); |
19754 } | 19750 } |
19755 } | 19751 } |
19756 | 19752 |
19757 } // namespace internal | 19753 } // namespace internal |
19758 } // namespace v8 | 19754 } // namespace v8 |
OLD | NEW |