Author: [EMAIL PROTECTED]
Date: Mon Dec  8 02:29:03 2008
New Revision: 934

Modified:
    branches/bleeding_edge/src/objects.cc
    branches/bleeding_edge/src/objects.h

Log:
Make sure to set property attributes in GetProperty in the case of
failed access checks.

Added assert to GetPropertyWithReceiver which was hit by our tests in
debug mode.
Review URL: http://codereview.chromium.org/13242

Modified: branches/bleeding_edge/src/objects.cc
==============================================================================
--- branches/bleeding_edge/src/objects.cc       (original)
+++ branches/bleeding_edge/src/objects.cc       Mon Dec  8 02:29:03 2008
@@ -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

Modified: branches/bleeding_edge/src/objects.h
==============================================================================
--- branches/bleeding_edge/src/objects.h        (original)
+++ branches/bleeding_edge/src/objects.h        Mon Dec  8 02:29:03 2008
@@ -1185,7 +1185,8 @@
    // Used from Object::GetProperty().
    Object* GetPropertyWithFailedAccessCheck(Object* receiver,
                                             LookupResult* result,
-                                           String* name);
+                                           String* name,
+                                           PropertyAttributes* attributes);
    Object* GetPropertyWithInterceptor(JSObject* receiver,
                                       String* name,
                                       PropertyAttributes* attributes);

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to