Index: src/lookup.cc |
diff --git a/src/lookup.cc b/src/lookup.cc |
index d275890a3dc168eab9da03ebf91e0b491189e77f..d1516c05fcdf96d43b2a8453acb796c6aa168fd3 100644 |
--- a/src/lookup.cc |
+++ b/src/lookup.cc |
@@ -120,8 +120,9 @@ bool LookupIterator::HasProperty() { |
return false; |
} |
} else { |
- property_details_ = holder_map_->instance_descriptors()->GetDetails( |
- number_); |
+ // Can't use descriptor_number() yet because has_property_ is still false. |
+ property_details_ = |
+ holder_map_->instance_descriptors()->GetDetails(number_); |
} |
switch (property_details_.type()) { |
@@ -146,9 +147,10 @@ bool LookupIterator::HasProperty() { |
void LookupIterator::PrepareForDataProperty(Handle<Object> value) { |
ASSERT(has_property_); |
- ASSERT(HolderIsReceiver()); |
+ ASSERT(HolderIsReceiverOrHiddenPrototype()); |
if (property_encoding_ == DICTIONARY) return; |
- holder_map_ = Map::PrepareForDataProperty(holder_map_, number_, value); |
+ holder_map_ = |
+ Map::PrepareForDataProperty(holder_map_, descriptor_number(), value); |
JSObject::MigrateToMap(GetHolder<JSObject>(), holder_map_); |
// Reload property information. |
if (holder_map_->is_dictionary_map()) { |
@@ -163,7 +165,7 @@ void LookupIterator::PrepareForDataProperty(Handle<Object> value) { |
void LookupIterator::TransitionToDataProperty( |
Handle<Object> value, PropertyAttributes attributes, |
Object::StoreFromKeyed store_mode) { |
- ASSERT(!has_property_ || !HolderIsReceiver()); |
+ ASSERT(!has_property_ || !HolderIsReceiverOrHiddenPrototype()); |
// Can only be called when the receiver is a JSObject. JSProxy has to be |
// handled via a trap. Adding properties to primitive values is not |
@@ -194,7 +196,7 @@ void LookupIterator::TransitionToDataProperty( |
} |
-bool LookupIterator::HolderIsReceiver() const { |
+bool LookupIterator::HolderIsReceiverOrHiddenPrototype() const { |
ASSERT(has_property_ || state_ == INTERCEPTOR || state_ == JSPROXY); |
DisallowHeapAllocation no_gc; |
Handle<Object> receiver = GetReceiver(); |
@@ -228,8 +230,8 @@ Handle<Object> LookupIterator::FetchValue() const { |
break; |
case DESCRIPTOR: |
if (property_details_.type() == v8::internal::FIELD) { |
- FieldIndex field_index = FieldIndex::ForDescriptor( |
- *holder_map_, number_); |
+ FieldIndex field_index = |
+ FieldIndex::ForDescriptor(*holder_map_, number_); |
return JSObject::FastPropertyAt( |
holder, property_details_.representation(), field_index); |
} |
@@ -239,6 +241,23 @@ Handle<Object> LookupIterator::FetchValue() const { |
} |
+FieldIndex LookupIterator::GetFieldIndex() const { |
+ ASSERT_EQ(PROPERTY, state_); |
+ int index = |
+ holder_map()->instance_descriptors()->GetFieldIndex(descriptor_number()); |
+ bool is_double = representation().IsDouble(); |
+ return FieldIndex::ForPropertyIndex(*holder_map(), index, is_double); |
+} |
+ |
+ |
+Handle<PropertyCell> LookupIterator::GetPropertyCell() const { |
+ Handle<JSObject> holder = GetHolder<JSObject>(); |
+ Handle<GlobalObject> global = Handle<GlobalObject>::cast(holder); |
+ Object* value = global->property_dictionary()->ValueAt(dictionary_entry()); |
+ return Handle<PropertyCell>(PropertyCell::cast(value)); |
+} |
+ |
+ |
Handle<Object> LookupIterator::GetAccessors() const { |
ASSERT(has_property_); |
ASSERT_EQ(ACCESSOR, property_kind_); |
@@ -262,13 +281,13 @@ void LookupIterator::WriteDataValue(Handle<Object> value) { |
NameDictionary* property_dictionary = holder->property_dictionary(); |
if (holder->IsGlobalObject()) { |
Handle<PropertyCell> cell( |
- PropertyCell::cast(property_dictionary->ValueAt(number_))); |
+ PropertyCell::cast(property_dictionary->ValueAt(dictionary_entry()))); |
PropertyCell::SetValueInferType(cell, value); |
} else { |
- property_dictionary->ValueAtPut(number_, *value); |
+ property_dictionary->ValueAtPut(dictionary_entry(), *value); |
} |
} else if (property_details_.type() == v8::internal::FIELD) { |
- holder->WriteToField(number_, *value); |
+ holder->WriteToField(descriptor_number(), *value); |
} else { |
ASSERT_EQ(v8::internal::CONSTANT, property_details_.type()); |
} |