Commit 51334bb8 authored by Daniel Clifford's avatar Daniel Clifford Committed by Commit Bot

Add JSReceiver method for detecting complex elements

Change-Id: Id34d21437b3881d829526b89058f26741bee7acc
Reviewed-on: https://chromium-review.googlesource.com/695327Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Commit-Queue: Daniel Clifford <danno@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48277}
parent fa3b73ff
...@@ -19062,6 +19062,16 @@ bool JSReceiver::HasProxyInPrototype(Isolate* isolate) { ...@@ -19062,6 +19062,16 @@ bool JSReceiver::HasProxyInPrototype(Isolate* isolate) {
return false; return false;
} }
bool JSReceiver::HasComplexElements() {
if (IsJSProxy()) return true;
JSObject* this_object = JSObject::cast(this);
if (this_object->HasIndexedInterceptor()) {
return true;
}
if (!this_object->HasDictionaryElements()) return false;
return this_object->element_dictionary()->HasComplexElements();
}
MaybeHandle<Name> FunctionTemplateInfo::TryGetCachedPropertyName( MaybeHandle<Name> FunctionTemplateInfo::TryGetCachedPropertyName(
Isolate* isolate, Handle<Object> getter) { Isolate* isolate, Handle<Object> getter) {
if (getter->IsFunctionTemplateInfo()) { if (getter->IsFunctionTemplateInfo()) {
......
...@@ -2190,6 +2190,8 @@ class JSReceiver: public HeapObject { ...@@ -2190,6 +2190,8 @@ class JSReceiver: public HeapObject {
bool HasProxyInPrototype(Isolate* isolate); bool HasProxyInPrototype(Isolate* isolate);
bool HasComplexElements();
private: private:
DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver); DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver);
}; };
......
...@@ -354,15 +354,12 @@ RUNTIME_FUNCTION(Runtime_GetArrayKeys) { ...@@ -354,15 +354,12 @@ RUNTIME_FUNCTION(Runtime_GetArrayKeys) {
ALL_PROPERTIES); ALL_PROPERTIES);
for (PrototypeIterator iter(isolate, array, kStartAtReceiver); for (PrototypeIterator iter(isolate, array, kStartAtReceiver);
!iter.IsAtEnd(); iter.Advance()) { !iter.IsAtEnd(); iter.Advance()) {
if (PrototypeIterator::GetCurrent(iter)->IsJSProxy() || Handle<JSReceiver> current(PrototypeIterator::GetCurrent<JSReceiver>(iter));
PrototypeIterator::GetCurrent<JSObject>(iter) if (current->HasComplexElements()) {
->HasIndexedInterceptor()) {
// Bail out if we find a proxy or interceptor, likely not worth
// collecting keys in that case.
return *isolate->factory()->NewNumberFromUint(length); return *isolate->factory()->NewNumberFromUint(length);
} }
Handle<JSObject> current = PrototypeIterator::GetCurrent<JSObject>(iter); accumulator.CollectOwnElementIndices(array,
accumulator.CollectOwnElementIndices(array, current); Handle<JSObject>::cast(current));
} }
// Erase any keys >= length. // Erase any keys >= length.
Handle<FixedArray> keys = Handle<FixedArray> keys =
...@@ -517,15 +514,7 @@ RUNTIME_FUNCTION(Runtime_HasComplexElements) { ...@@ -517,15 +514,7 @@ RUNTIME_FUNCTION(Runtime_HasComplexElements) {
CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0); CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0);
for (PrototypeIterator iter(isolate, array, kStartAtReceiver); for (PrototypeIterator iter(isolate, array, kStartAtReceiver);
!iter.IsAtEnd(); iter.Advance()) { !iter.IsAtEnd(); iter.Advance()) {
if (PrototypeIterator::GetCurrent(iter)->IsJSProxy()) { if (PrototypeIterator::GetCurrent<JSReceiver>(iter)->HasComplexElements()) {
return isolate->heap()->true_value();
}
Handle<JSObject> current = PrototypeIterator::GetCurrent<JSObject>(iter);
if (current->HasIndexedInterceptor()) {
return isolate->heap()->true_value();
}
if (!current->HasDictionaryElements()) continue;
if (current->element_dictionary()->HasComplexElements()) {
return isolate->heap()->true_value(); return isolate->heap()->true_value();
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment