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

Unified Diff: src/objects.cc

Issue 1943303002: Make it possible to set a getter and a setter at the same time (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | test/cctest/test-field-type-tracking.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 23a31bcb54abf3dbea188c0b545f39ddd141d831..3fe712029b79790f0f0bf75b4f7f15126daae7b2 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -8283,14 +8283,7 @@ MaybeHandle<Object> JSObject::DefineAccessor(LookupIterator* it,
getter->IsFunctionTemplateInfo());
DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull() ||
getter->IsFunctionTemplateInfo());
- // At least one of the accessors needs to be a new value.
- DCHECK(!getter->IsNull() || !setter->IsNull());
- if (!getter->IsNull()) {
- it->TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes);
- }
- if (!setter->IsNull()) {
- it->TransitionToAccessorProperty(ACCESSOR_SETTER, setter, attributes);
- }
+ it->TransitionToAccessorProperty(getter, setter, attributes);
return isolate->factory()->undefined_value();
}
@@ -9088,13 +9081,14 @@ Handle<Map> Map::ReconfigureExistingProperty(Handle<Map> map, int descriptor,
return new_map;
}
-Handle<Map> Map::TransitionToAccessorProperty(Handle<Map> map,
+Handle<Map> Map::TransitionToAccessorProperty(Isolate* isolate, Handle<Map> map,
Handle<Name> name, int descriptor,
- AccessorComponent component,
- Handle<Object> accessor,
+ Handle<Object> getter,
+ Handle<Object> setter,
PropertyAttributes attributes) {
+ // At least one of the accessors needs to be a new value.
+ DCHECK(!getter->IsNull() || !setter->IsNull());
DCHECK(name->IsUniqueName());
- Isolate* isolate = name->GetIsolate();
// Dictionary maps can always have additional data properties.
if (map->is_dictionary_map()) return map;
@@ -9123,7 +9117,7 @@ Handle<Map> Map::TransitionToAccessorProperty(Handle<Map> map,
}
Handle<AccessorPair> pair = Handle<AccessorPair>::cast(maybe_pair);
- if (pair->get(component) != *accessor) {
+ if (!pair->Equals(*getter, *setter)) {
return Map::Normalize(map, mode, "TransitionToDifferentAccessor");
}
@@ -9150,10 +9144,19 @@ Handle<Map> Map::TransitionToAccessorProperty(Handle<Map> map,
return Map::Normalize(map, mode, "AccessorsOverwritingNonPair");
}
- Object* current = Handle<AccessorPair>::cast(maybe_pair)->get(component);
- if (current == *accessor) return map;
+ Handle<AccessorPair> current_pair = Handle<AccessorPair>::cast(maybe_pair);
+ if (current_pair->Equals(*getter, *setter)) return map;
- if (!current->IsNull()) {
+ bool overwriting_accessor = false;
+ if (!getter->IsNull() && !current_pair->get(ACCESSOR_GETTER)->IsNull() &&
+ current_pair->get(ACCESSOR_GETTER) != *getter) {
+ overwriting_accessor = true;
+ }
+ if (!setter->IsNull() && !current_pair->get(ACCESSOR_SETTER)->IsNull() &&
+ current_pair->get(ACCESSOR_SETTER) != *setter) {
+ overwriting_accessor = true;
+ }
+ if (overwriting_accessor) {
return Map::Normalize(map, mode, "AccessorsOverwritingAccessors");
}
@@ -9165,7 +9168,8 @@ Handle<Map> Map::TransitionToAccessorProperty(Handle<Map> map,
pair = isolate->factory()->NewAccessorPair();
}
- pair->set(component, *accessor);
+ pair->SetComponents(*getter, *setter);
+
TransitionFlag flag = INSERT_TRANSITION;
AccessorConstantDescriptor new_desc(name, pair, attributes);
return Map::CopyInsertDescriptor(map, &new_desc, flag);
« no previous file with comments | « src/objects.h ('k') | test/cctest/test-field-type-tracking.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698