Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index abd018770bbcaf37dbf552ea06ebfa6d7cc92f13..b095a63d296ba138f7a3b730152cd744343a0074 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -129,7 +129,8 @@ void Object::Lookup(Handle<Name> name, LookupResult* result) { |
} |
-MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
+MaybeHandle<Object> Object::GetPropertyHelper( |
+ LookupIterator* it, bool force_holder_as_receiver_for_accessor_callback) { |
for (; it->IsFound(); it->Next()) { |
switch (it->state()) { |
case LookupIterator::NOT_FOUND: |
@@ -150,10 +151,18 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
case LookupIterator::PROPERTY: |
if (it->HasProperty()) { |
switch (it->property_kind()) { |
- case LookupIterator::ACCESSOR: |
- return GetPropertyWithAccessor( |
- it->GetReceiver(), it->name(), |
- it->GetHolder(), it->GetAccessors()); |
+ case LookupIterator::ACCESSOR: { |
+ Handle<Object> accessors = it->GetAccessors(); |
+ Handle<Object> receiver; |
+ if (force_holder_as_receiver_for_accessor_callback && |
+ !accessors->IsAccessorPair()) { |
+ receiver = it->GetHolder(); |
+ } else { |
+ receiver = it->GetReceiver(); |
+ } |
+ return GetPropertyWithAccessor(receiver, it->name(), |
+ it->GetHolder(), accessors); |
+ } |
Toon Verwaest
2014/07/23 12:08:38
Euh, no.
What you want to do is fix a bug in Arra
|
case LookupIterator::DATA: |
return it->GetDataValue(); |
} |
@@ -165,6 +174,19 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
} |
+MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
+ return GetPropertyHelper(it, false); |
+} |
+ |
+ |
+MaybeHandle<Object> Object::GetPropertyForUnscopables(LookupIterator* it) { |
+ // TODO(arv): For unscopables we need to make sure that we use the holder as |
+ // the receiver for data properties that are implemented as callbacks |
+ // (ACCESSER && !IsAccessorPair). |
+ return GetPropertyHelper(it, true); |
+} |
+ |
+ |
bool Object::ToInt32(int32_t* value) { |
if (IsSmi()) { |
*value = Smi::cast(this)->value(); |