Re-adjust access failure log messages for %GetOwnProperty.
authorrossberg@chromium.org <rossberg@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 19 Nov 2012 17:59:11 +0000 (17:59 +0000)
committerrossberg@chromium.org <rossberg@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 19 Nov 2012 17:59:11 +0000 (17:59 +0000)
R=mstarzinger@chromium.org
BUG=

Review URL: https://codereview.chromium.org/11418062

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13006 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/runtime.cc

index f6a72c83e7f9f4ea36b35799ec14065b6ee77f90..0b91d9958f7424e1d19bdcf44dc20fb6c7eb74dc 100644 (file)
@@ -1002,22 +1002,29 @@ static bool CheckGenericAccess(
 }
 
 
-static bool CheckElementAccess(
+enum AccessCheckResult {
+  ACCESS_FORBIDDEN,
+  ACCESS_ALLOWED,
+  ACCESS_ABSENT
+};
+
+
+static AccessCheckResult CheckElementAccess(
     JSObject* obj,
     uint32_t index,
     v8::AccessType access_type) {
   // TODO(1095): we should traverse hidden prototype hierachy as well.
   if (CheckGenericAccess(
           obj, obj, index, access_type, &Isolate::MayIndexedAccess)) {
-    return true;
+    return ACCESS_ALLOWED;
   }
 
   obj->GetIsolate()->ReportFailedAccessCheck(obj, access_type);
-  return false;
+  return ACCESS_FORBIDDEN;
 }
 
 
-static bool CheckPropertyAccess(
+static AccessCheckResult CheckPropertyAccess(
     JSObject* obj,
     String* name,
     v8::AccessType access_type) {
@@ -1029,9 +1036,10 @@ static bool CheckPropertyAccess(
   LookupResult lookup(obj->GetIsolate());
   obj->LocalLookup(name, &lookup);
 
+  if (!lookup.IsProperty()) return ACCESS_ABSENT;
   if (CheckGenericAccess<Object*>(
           obj, lookup.holder(), name, access_type, &Isolate::MayNamedAccess)) {
-    return true;
+    return ACCESS_ALLOWED;
   }
 
   // Access check callback denied the access, but some properties
@@ -1041,7 +1049,7 @@ static bool CheckPropertyAccess(
   switch (lookup.type()) {
     case CALLBACKS:
       if (CheckAccessException(lookup.GetCallbackObject(), access_type)) {
-        return true;
+        return ACCESS_ALLOWED;
       }
       break;
     case INTERCEPTOR:
@@ -1050,7 +1058,7 @@ static bool CheckPropertyAccess(
       lookup.holder()->LookupRealNamedProperty(name, &lookup);
       if (lookup.IsProperty() && lookup.IsPropertyCallbacks()) {
         if (CheckAccessException(lookup.GetCallbackObject(), access_type)) {
-          return true;
+          return ACCESS_ALLOWED;
         }
       }
       break;
@@ -1059,7 +1067,7 @@ static bool CheckPropertyAccess(
   }
 
   obj->GetIsolate()->ReportFailedAccessCheck(obj, access_type);
-  return false;
+  return ACCESS_FORBIDDEN;
 }
 
 
@@ -1080,6 +1088,14 @@ static MaybeObject* GetOwnProperty(Isolate* isolate,
                                    Handle<JSObject> obj,
                                    Handle<String> name) {
   Heap* heap = isolate->heap();
+  // Due to some WebKit tests, we want to make sure that we do not log
+  // more than one access failure here.
+  switch (CheckPropertyAccess(*obj, *name, v8::ACCESS_HAS)) {
+    case ACCESS_FORBIDDEN: return heap->false_value();
+    case ACCESS_ALLOWED: break;
+    case ACCESS_ABSENT: return heap->undefined_value();
+  }
+
   PropertyAttributes attrs = obj->GetLocalPropertyAttribute(*name);
   if (attrs == ABSENT) return heap->undefined_value();
   AccessorPair* accessors = obj->GetLocalPropertyAccessorPair(*name);