Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(619)

Unified Diff: src/objects-inl.h

Issue 1153583006: Use LookupIterator for GetElementAttributes and friends (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index aaa06ad5914caa4a8a167d0f47ad62dbde08aa0a..8d75a751248064ff1c9d7444b04b559f3afbffdc 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1189,15 +1189,6 @@ Handle<Object> Object::GetPrototypeSkipHiddenPrototypes(
}
-MaybeHandle<Object> Object::GetPropertyOrElement(Handle<Object> object,
- Handle<Name> name) {
- uint32_t index;
- Isolate* isolate = name->GetIsolate();
- if (name->AsArrayIndex(&index)) return GetElement(isolate, object, index);
- return GetProperty(object, name);
-}
-
-
MaybeHandle<Object> Object::GetProperty(Isolate* isolate,
Handle<Object> object,
const char* name) {
@@ -6961,12 +6952,24 @@ String* String::GetForwardedInternalizedString() {
}
+MaybeHandle<Object> Object::GetPropertyOrElement(Handle<Object> object,
+ Handle<Name> name) {
+ uint32_t index;
+ LookupIterator it = name->AsArrayIndex(&index)
+ ? LookupIterator(name->GetIsolate(), object, index)
+ : LookupIterator(object, name);
+ return GetProperty(&it);
+}
+
+
Maybe<bool> JSReceiver::HasProperty(Handle<JSReceiver> object,
Handle<Name> name) {
+ // Call the "has" trap on proxies.
if (object->IsJSProxy()) {
Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
return JSProxy::HasPropertyWithHandler(proxy, name);
}
+
Maybe<PropertyAttributes> result = GetPropertyAttributes(object, name);
return result.IsJust() ? Just(result.FromJust() != ABSENT) : Nothing<bool>();
}
@@ -6974,34 +6977,80 @@ Maybe<bool> JSReceiver::HasProperty(Handle<JSReceiver> object,
Maybe<bool> JSReceiver::HasOwnProperty(Handle<JSReceiver> object,
Handle<Name> name) {
+ // Call the "has" trap on proxies.
if (object->IsJSProxy()) {
Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
return JSProxy::HasPropertyWithHandler(proxy, name);
}
+
Maybe<PropertyAttributes> result = GetOwnPropertyAttributes(object, name);
return result.IsJust() ? Just(result.FromJust() != ABSENT) : Nothing<bool>();
}
Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes(
- Handle<JSReceiver> object, Handle<Name> key) {
- uint32_t index;
- if (object->IsJSObject() && key->AsArrayIndex(&index)) {
- return GetElementAttribute(object, index);
- }
- LookupIterator it(object, key);
+ Handle<JSReceiver> object, Handle<Name> name) {
+ uint32_t index = 0;
+ LookupIterator it = name->AsArrayIndex(&index)
+ ? LookupIterator(name->GetIsolate(), object, index)
+ : LookupIterator(object, name);
return GetPropertyAttributes(&it);
}
-Maybe<PropertyAttributes> JSReceiver::GetElementAttribute(
- Handle<JSReceiver> object, uint32_t index) {
+Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes(
+ Handle<JSReceiver> object, Handle<Name> name) {
+ uint32_t index = 0;
+ LookupIterator::Configuration c = LookupIterator::HIDDEN;
+ LookupIterator it = name->AsArrayIndex(&index)
+ ? LookupIterator(name->GetIsolate(), object, index, c)
+ : LookupIterator(object, name, c);
+ return GetPropertyAttributes(&it);
+}
+
+
+Maybe<bool> JSReceiver::HasElement(Handle<JSReceiver> object, uint32_t index) {
+ // Call the "has" trap on proxies.
+ if (object->IsJSProxy()) {
+ Isolate* isolate = object->GetIsolate();
+ Handle<Name> name = isolate->factory()->Uint32ToString(index);
+ Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
+ return JSProxy::HasPropertyWithHandler(proxy, name);
+ }
+
+ Maybe<PropertyAttributes> result = GetElementAttributes(object, index);
+ return result.IsJust() ? Just(result.FromJust() != ABSENT) : Nothing<bool>();
+}
+
+
+Maybe<bool> JSReceiver::HasOwnElement(Handle<JSReceiver> object,
+ uint32_t index) {
+ // Call the "has" trap on proxies.
if (object->IsJSProxy()) {
- return JSProxy::GetElementAttributeWithHandler(
- Handle<JSProxy>::cast(object), object, index);
+ Isolate* isolate = object->GetIsolate();
+ Handle<Name> name = isolate->factory()->Uint32ToString(index);
+ Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
+ return JSProxy::HasPropertyWithHandler(proxy, name);
}
- return JSObject::GetElementAttributeWithReceiver(
- Handle<JSObject>::cast(object), object, index, true);
+
+ Maybe<PropertyAttributes> result = GetOwnElementAttributes(object, index);
+ return result.IsJust() ? Just(result.FromJust() != ABSENT) : Nothing<bool>();
+}
+
+
+Maybe<PropertyAttributes> JSReceiver::GetElementAttributes(
+ Handle<JSReceiver> object, uint32_t index) {
+ Isolate* isolate = object->GetIsolate();
+ LookupIterator it(isolate, object, index);
+ return GetPropertyAttributes(&it);
+}
+
+
+Maybe<PropertyAttributes> JSReceiver::GetOwnElementAttributes(
+ Handle<JSReceiver> object, uint32_t index) {
+ Isolate* isolate = object->GetIsolate();
+ LookupIterator it(isolate, object, index, LookupIterator::HIDDEN);
+ return GetPropertyAttributes(&it);
}
@@ -7031,40 +7080,6 @@ Object* JSReceiver::GetIdentityHash() {
}
-Maybe<bool> JSReceiver::HasElement(Handle<JSReceiver> object, uint32_t index) {
- if (object->IsJSProxy()) {
- Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
- return JSProxy::HasElementWithHandler(proxy, index);
- }
- Maybe<PropertyAttributes> result = JSObject::GetElementAttributeWithReceiver(
- Handle<JSObject>::cast(object), object, index, true);
- return result.IsJust() ? Just(result.FromJust() != ABSENT) : Nothing<bool>();
-}
-
-
-Maybe<bool> JSReceiver::HasOwnElement(Handle<JSReceiver> object,
- uint32_t index) {
- if (object->IsJSProxy()) {
- Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
- return JSProxy::HasElementWithHandler(proxy, index);
- }
- Maybe<PropertyAttributes> result = JSObject::GetElementAttributeWithReceiver(
- Handle<JSObject>::cast(object), object, index, false);
- return result.IsJust() ? Just(result.FromJust() != ABSENT) : Nothing<bool>();
-}
-
-
-Maybe<PropertyAttributes> JSReceiver::GetOwnElementAttribute(
- Handle<JSReceiver> object, uint32_t index) {
- if (object->IsJSProxy()) {
- return JSProxy::GetElementAttributeWithHandler(
- Handle<JSProxy>::cast(object), object, index);
- }
- return JSObject::GetElementAttributeWithReceiver(
- Handle<JSObject>::cast(object), object, index, false);
-}
-
-
bool AccessorInfo::all_can_read() {
return BooleanBit::get(flag(), kAllCanReadBit);
}
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698