Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index 91d90a21554ceda86620763d80f3717a8c57ee8e..8ebc2829f09cc37edf831a4014f5ed64775d31a3 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -143,10 +143,9 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
| if (it->isolate()->has_pending_exception()) return maybe_result; |
| break; |
| } |
| - case LookupIterator::ACCESS_CHECK: { |
| + case LookupIterator::ACCESS_CHECK: |
| if (it->HasAccess(v8::ACCESS_GET)) break; |
| return JSObject::GetPropertyWithFailedAccessCheck(it); |
| - } |
| case LookupIterator::PROPERTY: |
| if (it->HasProperty()) { |
| switch (it->property_kind()) { |
| @@ -567,6 +566,8 @@ MaybeHandle<Object> Object::SetPropertyWithDefinedSetter( |
| static bool FindAllCanReadHolder(LookupIterator* it) { |
| + it->skip_interceptor(); |
| + it->skip_access_checks(); |
|
Igor Sheludko
2014/06/12 13:27:53
Naming suggestions:
1) either skip_interceptorS()
|
| for (; it->IsFound(); it->Next()) { |
| if (it->state() == LookupIterator::PROPERTY && |
| it->HasProperty() && |
| @@ -596,17 +597,11 @@ MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( |
| } |
| -PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( |
| - Handle<JSObject> object, |
| - LookupResult* result, |
| - Handle<Name> name, |
| - bool check_prototype) { |
| - LookupIterator::Configuration configuration = check_prototype |
| - ? LookupIterator::CHECK_DERIVED |
| - : LookupIterator::CHECK_OWN_REAL; |
| - LookupIterator it(object, name, object, configuration); |
| - if (FindAllCanReadHolder(&it)) return it.property_details().attributes(); |
| - it.isolate()->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
| +PropertyAttributes JSObject::GetPropertyAttributesWithFailedAccessCheck( |
| + LookupIterator* it) { |
| + Handle<JSObject> checked = Handle<JSObject>::cast(it->GetHolder()); |
| + if (FindAllCanReadHolder(it)) return it->property_details().attributes(); |
| + it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_HAS); |
| // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
| return ABSENT; |
| } |
| @@ -3069,8 +3064,8 @@ MaybeHandle<Object> JSObject::SetPropertyViaPrototypes( |
| *done = result.IsReadOnly(); |
| break; |
| case INTERCEPTOR: { |
| - PropertyAttributes attr = GetPropertyAttributeWithInterceptor( |
| - handle(result.holder()), object, name, true); |
| + LookupIterator it(object, name, handle(result.holder())); |
| + PropertyAttributes attr = GetPropertyAttributes(&it); |
| *done = !!(attr & READ_ONLY); |
| break; |
| } |
| @@ -3727,9 +3722,9 @@ MaybeHandle<Object> JSProxy::DeleteElementWithHandler( |
| } |
| -PropertyAttributes JSProxy::GetPropertyAttributeWithHandler( |
| +PropertyAttributes JSProxy::GetPropertyAttributesWithHandler( |
| Handle<JSProxy> proxy, |
| - Handle<JSReceiver> receiver, |
| + Handle<Object> receiver, |
| Handle<Name> name) { |
| Isolate* isolate = proxy->GetIsolate(); |
| HandleScope scope(isolate); |
| @@ -3811,7 +3806,7 @@ PropertyAttributes JSProxy::GetElementAttributeWithHandler( |
| uint32_t index) { |
| Isolate* isolate = proxy->GetIsolate(); |
| Handle<String> name = isolate->factory()->Uint32ToString(index); |
| - return GetPropertyAttributeWithHandler(proxy, receiver, name); |
| + return GetPropertyAttributesWithHandler(proxy, receiver, name); |
| } |
| @@ -4353,142 +4348,87 @@ MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( |
| } |
| -PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( |
| - Handle<JSObject> object, |
| - Handle<JSObject> receiver, |
| - Handle<Name> name, |
| - bool check_prototype) { |
| - // Check own property, ignore interceptor. |
| - Isolate* isolate = object->GetIsolate(); |
| - LookupResult result(isolate); |
| - object->LookupOwnRealNamedProperty(name, &result); |
| - if (result.IsFound()) return result.GetAttributes(); |
| - |
| - if (check_prototype) { |
| - // Continue searching via the prototype chain. |
| - Handle<Object> proto(object->GetPrototype(), isolate); |
| - if (!proto->IsNull()) { |
| - return JSReceiver::GetPropertyAttributeWithReceiver( |
| - Handle<JSObject>::cast(proto), receiver, name); |
| - } |
| - } |
| - return ABSENT; |
| -} |
| - |
| - |
| -PropertyAttributes JSObject::GetPropertyAttributeWithInterceptor( |
| - Handle<JSObject> object, |
| - Handle<JSObject> receiver, |
| - Handle<Name> name, |
| - bool check_prototype) { |
| +Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
| + Handle<JSObject> holder, |
| + Handle<Object> receiver, |
| + Handle<Name> name) { |
| // TODO(rossberg): Support symbols in the API. |
| - if (name->IsSymbol()) return ABSENT; |
| + if (name->IsSymbol()) return Maybe<PropertyAttributes>(ABSENT); |
| - Isolate* isolate = object->GetIsolate(); |
| + Isolate* isolate = holder->GetIsolate(); |
| HandleScope scope(isolate); |
| // Make sure that the top context does not change when doing |
| // callbacks or interceptor calls. |
| AssertNoContextChange ncc(isolate); |
| - Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| + Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| PropertyCallbackArguments args( |
| - isolate, interceptor->data(), *receiver, *object); |
| + isolate, interceptor->data(), *receiver, *holder); |
| if (!interceptor->query()->IsUndefined()) { |
| v8::NamedPropertyQueryCallback query = |
| v8::ToCData<v8::NamedPropertyQueryCallback>(interceptor->query()); |
| LOG(isolate, |
| - ApiNamedPropertyAccess("interceptor-named-has", *object, *name)); |
| + ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); |
| v8::Handle<v8::Integer> result = |
| args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); |
| if (!result.IsEmpty()) { |
| ASSERT(result->IsInt32()); |
| - return static_cast<PropertyAttributes>(result->Int32Value()); |
| + return Maybe<PropertyAttributes>( |
| + static_cast<PropertyAttributes>(result->Int32Value())); |
| } |
| } else if (!interceptor->getter()->IsUndefined()) { |
| v8::NamedPropertyGetterCallback getter = |
| v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); |
| LOG(isolate, |
| - ApiNamedPropertyAccess("interceptor-named-get-has", *object, *name)); |
| + ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); |
| v8::Handle<v8::Value> result = |
| args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name))); |
| - if (!result.IsEmpty()) return DONT_ENUM; |
| + if (!result.IsEmpty()) return Maybe<PropertyAttributes>(DONT_ENUM); |
| } |
| - return GetPropertyAttributePostInterceptor( |
| - object, receiver, name, check_prototype); |
| + return Maybe<PropertyAttributes>(); |
| } |
| -PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver( |
| - Handle<JSReceiver> object, |
| - Handle<JSReceiver> receiver, |
| - Handle<Name> key) { |
| +PropertyAttributes JSReceiver::GetOwnPropertyAttributes( |
| + Handle<JSReceiver> object, Handle<Name> name) { |
| + // Check whether the name is an array index. |
| uint32_t index = 0; |
| - if (object->IsJSObject() && key->AsArrayIndex(&index)) { |
| - return JSObject::GetElementAttributeWithReceiver( |
| - Handle<JSObject>::cast(object), receiver, index, true); |
| + if (object->IsJSObject() && name->AsArrayIndex(&index)) { |
| + return GetOwnElementAttribute(object, index); |
| } |
| - // Named property. |
| - LookupResult lookup(object->GetIsolate()); |
| - object->Lookup(key, &lookup); |
| - return GetPropertyAttributeForResult(object, receiver, &lookup, key, true); |
| + LookupIterator it(object, name, LookupIterator::CHECK_OWN); |
| + return GetPropertyAttributes(&it); |
| } |
| -PropertyAttributes JSReceiver::GetPropertyAttributeForResult( |
| - Handle<JSReceiver> object, |
| - Handle<JSReceiver> receiver, |
| - LookupResult* lookup, |
| - Handle<Name> name, |
| - bool check_prototype) { |
| - // Check access rights if needed. |
| - if (object->IsAccessCheckNeeded()) { |
| - Heap* heap = object->GetHeap(); |
| - Handle<JSObject> obj = Handle<JSObject>::cast(object); |
| - if (!heap->isolate()->MayNamedAccess(obj, name, v8::ACCESS_HAS)) { |
| - return JSObject::GetPropertyAttributeWithFailedAccessCheck( |
| - obj, lookup, name, check_prototype); |
| - } |
| - } |
| - if (lookup->IsFound()) { |
| - switch (lookup->type()) { |
| - case NORMAL: // fall through |
| - case FIELD: |
| - case CONSTANT: |
| - case CALLBACKS: |
| - return lookup->GetAttributes(); |
| - case HANDLER: { |
| - return JSProxy::GetPropertyAttributeWithHandler( |
| - handle(lookup->proxy()), receiver, name); |
| - } |
| - case INTERCEPTOR: |
| - return JSObject::GetPropertyAttributeWithInterceptor( |
| - handle(lookup->holder()), |
| - Handle<JSObject>::cast(receiver), |
| - name, |
| - check_prototype); |
| - case NONEXISTENT: |
| +PropertyAttributes JSReceiver::GetPropertyAttributes(LookupIterator* it) { |
| + for (; it->IsFound(); it->Next()) { |
| + switch (it->state()) { |
| + case LookupIterator::NOT_FOUND: |
| UNREACHABLE(); |
| + case LookupIterator::JSPROXY: |
| + return JSProxy::GetPropertyAttributesWithHandler( |
| + it->GetJSProxy(), it->GetReceiver(), it->name()); |
| + case LookupIterator::INTERCEPTOR: { |
| + Maybe<PropertyAttributes> result = |
| + JSObject::GetPropertyAttributesWithInterceptor( |
| + it->GetHolder(), it->GetReceiver(), it->name()); |
| + if (result.has_value) return result.value; |
| + break; |
| + } |
| + case LookupIterator::ACCESS_CHECK: |
| + if (it->HasAccess(v8::ACCESS_HAS)) break; |
| + return JSObject::GetPropertyAttributesWithFailedAccessCheck(it); |
| + case LookupIterator::PROPERTY: |
| + if (it->HasProperty()) return it->property_details().attributes(); |
| + break; |
| } |
| } |
| return ABSENT; |
| } |
| -PropertyAttributes JSReceiver::GetOwnPropertyAttribute( |
| - Handle<JSReceiver> object, Handle<Name> name) { |
| - // Check whether the name is an array index. |
| - uint32_t index = 0; |
| - if (object->IsJSObject() && name->AsArrayIndex(&index)) { |
| - return GetOwnElementAttribute(object, index); |
| - } |
| - // Named property. |
| - LookupResult lookup(object->GetIsolate()); |
| - object->LookupOwn(name, &lookup, true); |
| - return GetPropertyAttributeForResult(object, object, &lookup, name, false); |
| -} |
| - |
| - |
| PropertyAttributes JSObject::GetElementAttributeWithReceiver( |
| Handle<JSObject> object, |
| Handle<JSReceiver> receiver, |
| @@ -5162,8 +5102,8 @@ void JSObject::DeleteHiddenProperty(Handle<JSObject> object, Handle<Name> key) { |
| bool JSObject::HasHiddenProperties(Handle<JSObject> object) { |
| Handle<Name> hidden = object->GetIsolate()->factory()->hidden_string(); |
| - return GetPropertyAttributePostInterceptor( |
| - object, object, hidden, false) != ABSENT; |
| + LookupIterator it(object, hidden, LookupIterator::CHECK_OWN_REAL); |
| + return GetPropertyAttributes(&it) != ABSENT; |
| } |
| @@ -5978,7 +5918,7 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( |
| ASSERT(names->get(i)->IsString()); |
| Handle<String> key_string(String::cast(names->get(i))); |
| PropertyAttributes attributes = |
| - JSReceiver::GetOwnPropertyAttribute(copy, key_string); |
| + JSReceiver::GetOwnPropertyAttributes(copy, key_string); |
| // Only deep copy fields from the object literal expression. |
| // In particular, don't try to copy the length attribute of |
| // an array. |