Index: src/objects.cc |
=================================================================== |
--- src/objects.cc (revision 923) |
+++ src/objects.cc (working copy) |
@@ -147,7 +147,9 @@ |
PropertyAttributes* attributes) { |
LookupResult result; |
Lookup(name, &result); |
- return GetProperty(receiver, &result, name, attributes); |
+ Object* value = GetProperty(receiver, &result, name, attributes); |
+ ASSERT(*attributes <= ABSENT); |
+ return value; |
} |
@@ -215,9 +217,11 @@ |
// Only deal with CALLBACKS and INTERCEPTOR |
-Object* JSObject::GetPropertyWithFailedAccessCheck(Object* receiver, |
- LookupResult* result, |
- String* name) { |
+Object* JSObject::GetPropertyWithFailedAccessCheck( |
+ Object* receiver, |
+ LookupResult* result, |
+ String* name, |
+ PropertyAttributes* attributes) { |
if (result->IsValid()) { |
switch (result->type()) { |
case CALLBACKS: { |
@@ -226,6 +230,7 @@ |
if (obj->IsAccessorInfo()) { |
AccessorInfo* info = AccessorInfo::cast(obj); |
if (info->all_can_read()) { |
+ *attributes = result->GetAttributes(); |
return GetPropertyWithCallback(receiver, |
result->GetCallbackObject(), |
name, |
@@ -241,7 +246,10 @@ |
LookupResult r; |
result->holder()->LookupRealNamedPropertyInPrototypes(name, &r); |
if (r.IsValid()) { |
- return GetPropertyWithFailedAccessCheck(receiver, &r, name); |
+ return GetPropertyWithFailedAccessCheck(receiver, |
+ &r, |
+ name, |
+ attributes); |
} |
break; |
} |
@@ -251,9 +259,11 @@ |
LookupResult r; |
result->holder()->LookupRealNamedProperty(name, &r); |
if (r.IsValid()) { |
- return GetPropertyWithFailedAccessCheck(receiver, &r, name); |
+ return GetPropertyWithFailedAccessCheck(receiver, |
+ &r, |
+ name, |
+ attributes); |
} |
- break; |
} |
default: { |
break; |
@@ -261,6 +271,8 @@ |
} |
} |
+ // No accessible property found. |
+ *attributes = ABSENT; |
Top::ReportFailedAccessCheck(this, v8::ACCESS_GET); |
return Heap::undefined_value(); |
} |
@@ -402,7 +414,8 @@ |
if (!Top::MayNamedAccess(checked, name, v8::ACCESS_GET)) { |
return checked->GetPropertyWithFailedAccessCheck(receiver, |
result, |
- name); |
+ name, |
+ attributes); |
} |
} |
// Stop traversing the chain once we reach the last object in the |