Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index f6a72c83e7f9f4ea36b35799ec14065b6ee77f90..40e3125155e5434df988b565be395f9bdfb72c9a 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -1002,22 +1002,29 @@ static bool CheckGenericAccess( |
| } |
| -static bool CheckElementAccess( |
| +enum access_check_result { |
|
Michael Starzinger
2012/11/19 14:35:03
Rename this to AccessCheckResult.
rossberg
2012/11/19 17:58:49
Done.
|
| + ACCESS_FORBIDDEN, |
| + ACCESS_ALLOWED, |
| + ACCESS_ABSENT, |
| +}; |
| + |
| + |
| +static access_check_result 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 access_check_result 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 an |
|
Michael Starzinger
2012/11/19 14:35:03
s/do not log an access failure/do not log more tha
rossberg
2012/11/19 17:58:49
Done.
|
| + // access failure if the property does not exist. |
| + 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); |