| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 6035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6046 ShouldThrow should_throw) { | 6046 ShouldThrow should_throw) { |
| 6047 Isolate* isolate = it->isolate(); | 6047 Isolate* isolate = it->isolate(); |
| 6048 // == OrdinaryDefineOwnProperty (O, P, Desc) == | 6048 // == OrdinaryDefineOwnProperty (O, P, Desc) == |
| 6049 // 1. Let current be O.[[GetOwnProperty]](P). | 6049 // 1. Let current be O.[[GetOwnProperty]](P). |
| 6050 // 2. ReturnIfAbrupt(current). | 6050 // 2. ReturnIfAbrupt(current). |
| 6051 PropertyDescriptor current; | 6051 PropertyDescriptor current; |
| 6052 if (!GetOwnPropertyDescriptor(it, ¤t) && | 6052 if (!GetOwnPropertyDescriptor(it, ¤t) && |
| 6053 isolate->has_pending_exception()) { | 6053 isolate->has_pending_exception()) { |
| 6054 return false; | 6054 return false; |
| 6055 } | 6055 } |
| 6056 // TODO(jkummerow/verwaest): It would be nice if we didn't have to reset | |
| 6057 // the iterator every time. Currently, the reasons why we need it are: | |
| 6058 // - handle interceptors correctly | |
| 6059 // - handle accessors correctly (which might change the holder's map) | |
| 6060 it->Restart(); | |
| 6061 // 3. Let extensible be the value of the [[Extensible]] internal slot of O. | 6056 // 3. Let extensible be the value of the [[Extensible]] internal slot of O. |
| 6062 Handle<JSObject> object = Handle<JSObject>::cast(it->GetReceiver()); | 6057 Handle<JSObject> object = Handle<JSObject>::cast(it->GetReceiver()); |
| 6063 bool extensible = JSObject::IsExtensible(object); | 6058 bool extensible = JSObject::IsExtensible(object); |
| 6064 | 6059 |
| 6065 bool desc_is_data_descriptor = PropertyDescriptor::IsDataDescriptor(desc); | 6060 bool desc_is_data_descriptor = PropertyDescriptor::IsDataDescriptor(desc); |
| 6066 bool desc_is_accessor_descriptor = | 6061 bool desc_is_accessor_descriptor = |
| 6067 PropertyDescriptor::IsAccessorDescriptor(desc); | 6062 PropertyDescriptor::IsAccessorDescriptor(desc); |
| 6068 bool desc_is_generic_descriptor = | 6063 bool desc_is_generic_descriptor = |
| 6069 PropertyDescriptor::IsGenericDescriptor(desc); | 6064 PropertyDescriptor::IsGenericDescriptor(desc); |
| 6070 | 6065 |
| 6071 // == ValidateAndApplyPropertyDescriptor (O, P, extensible, Desc, current) == | 6066 // == ValidateAndApplyPropertyDescriptor (O, P, extensible, Desc, current) == |
| 6072 // 2. If current is undefined, then | 6067 // 2. If current is undefined, then |
| 6073 if (current.is_empty()) { | 6068 if (current.is_empty()) { |
| 6074 // 2a. If extensible is false, return false. | 6069 // 2a. If extensible is false, return false. |
| 6075 if (!extensible) { | 6070 if (!extensible) { |
| 6076 if (should_throw == THROW_ON_ERROR) { | 6071 if (should_throw == THROW_ON_ERROR) { |
| 6077 isolate->Throw(*isolate->factory()->NewTypeError( | 6072 isolate->Throw(*isolate->factory()->NewTypeError( |
| 6078 MessageTemplate::kDefineDisallowed, it->GetName())); | 6073 MessageTemplate::kDefineDisallowed, it->GetName())); |
| 6079 } | 6074 } |
| 6080 return false; | 6075 return false; |
| 6081 } | 6076 } |
| 6077 // We have to reset the LookupIterator to handle interceptors properly. |
| 6078 Map* map = Handle<HeapObject>::cast(object)->map(); |
| 6079 if ((it->IsElement() && map->has_indexed_interceptor()) || |
| 6080 (!it->IsElement() && map->has_named_interceptor())) { |
| 6081 it->Restart(); |
| 6082 } |
| 6083 |
| 6082 // 2c. If IsGenericDescriptor(Desc) or IsDataDescriptor(Desc) is true, then: | 6084 // 2c. If IsGenericDescriptor(Desc) or IsDataDescriptor(Desc) is true, then: |
| 6083 // (This is equivalent to !IsAccessorDescriptor(desc).) | 6085 // (This is equivalent to !IsAccessorDescriptor(desc).) |
| 6084 DCHECK((desc_is_generic_descriptor || desc_is_data_descriptor) == | 6086 DCHECK((desc_is_generic_descriptor || desc_is_data_descriptor) == |
| 6085 !desc_is_accessor_descriptor); | 6087 !desc_is_accessor_descriptor); |
| 6086 if (!desc_is_accessor_descriptor) { | 6088 if (!desc_is_accessor_descriptor) { |
| 6087 // 2c i. If O is not undefined, create an own data property named P of | 6089 // 2c i. If O is not undefined, create an own data property named P of |
| 6088 // object O whose [[Value]], [[Writable]], [[Enumerable]] and | 6090 // object O whose [[Value]], [[Writable]], [[Enumerable]] and |
| 6089 // [[Configurable]] attribute values are described by Desc. If the value | 6091 // [[Configurable]] attribute values are described by Desc. If the value |
| 6090 // of an attribute field of Desc is absent, the attribute of the newly | 6092 // of an attribute field of Desc is absent, the attribute of the newly |
| 6091 // created property is set to its default value. | 6093 // created property is set to its default value. |
| (...skipping 11738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17830 if (cell->value() != *new_value) { | 17832 if (cell->value() != *new_value) { |
| 17831 cell->set_value(*new_value); | 17833 cell->set_value(*new_value); |
| 17832 Isolate* isolate = cell->GetIsolate(); | 17834 Isolate* isolate = cell->GetIsolate(); |
| 17833 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 17835 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 17834 isolate, DependentCode::kPropertyCellChangedGroup); | 17836 isolate, DependentCode::kPropertyCellChangedGroup); |
| 17835 } | 17837 } |
| 17836 } | 17838 } |
| 17837 | 17839 |
| 17838 } // namespace internal | 17840 } // namespace internal |
| 17839 } // namespace v8 | 17841 } // namespace v8 |
| OLD | NEW |