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

Side by Side Diff: src/objects.cc

Issue 1418303002: Revert of OrdinaryDefineOwnProperty: always reset the LookupIterator before storing. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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, &current) && 6052 if (!GetOwnPropertyDescriptor(it, &current) &&
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698