Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 91d90a21554ceda86620763d80f3717a8c57ee8e..10533bd68f805fdee0fe96fdb4c49bcc4e81e923 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_check(); |
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. |