Commit 18f2636a authored by Simon Zünd's avatar Simon Zünd Committed by Commit Bot

[array] Add counter for sorting non-packed JSArrays.

This CL adds a counter for sorting non-packed JSArrays where
Object.prototype was modified, or the prototype of the instance
differs from Array.prototype.

This is the V8 side of the change.
The Chromium-side CL: https://crrev.com/c/1051651

R=jgruber@chromium.org

Bug: v8:7382
Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng
Change-Id: I3ce9789a5df4bb9af5d1bfc89681fcd112e28e83
Reviewed-on: https://chromium-review.googlesource.com/1051650
Commit-Queue: Simon Zünd <szuend@google.com>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53101}
parent 19953355
...@@ -7234,6 +7234,7 @@ class V8_EXPORT Isolate { ...@@ -7234,6 +7234,7 @@ class V8_EXPORT Isolate {
kErrorStackTraceLimit = 45, kErrorStackTraceLimit = 45,
kWebAssemblyInstantiation = 46, kWebAssemblyInstantiation = 46,
kDeoptimizerDisableSpeculation = 47, kDeoptimizerDisableSpeculation = 47,
kArrayPrototypeSortJSArrayModifiedPrototype = 48,
// If you add new values here, you'll also need to update Chromium's: // If you add new values here, you'll also need to update Chromium's:
// web_feature.mojom, UseCounterCallback.cpp, and enums.xml. V8 changes to // web_feature.mojom, UseCounterCallback.cpp, and enums.xml. V8 changes to
......
...@@ -2724,6 +2724,9 @@ bool JSObject::HasFastElements() { ...@@ -2724,6 +2724,9 @@ bool JSObject::HasFastElements() {
return IsFastElementsKind(GetElementsKind()); return IsFastElementsKind(GetElementsKind());
} }
bool JSObject::HasFastPackedElements() {
return IsFastPackedElementsKind(GetElementsKind());
}
bool JSObject::HasDictionaryElements() { bool JSObject::HasDictionaryElements() {
return GetElementsKind() == DICTIONARY_ELEMENTS; return GetElementsKind() == DICTIONARY_ELEMENTS;
......
...@@ -2289,6 +2289,8 @@ class JSObject: public JSReceiver { ...@@ -2289,6 +2289,8 @@ class JSObject: public JSReceiver {
inline bool HasSmiOrObjectElements(); inline bool HasSmiOrObjectElements();
// Returns true if an object has any of the "fast" elements kinds. // Returns true if an object has any of the "fast" elements kinds.
inline bool HasFastElements(); inline bool HasFastElements();
// Returns true if an object has any of the PACKED elements kinds.
inline bool HasFastPackedElements();
// Returns true if an object has elements of PACKED_DOUBLE_ELEMENTS or // Returns true if an object has elements of PACKED_DOUBLE_ELEMENTS or
// HOLEY_DOUBLE_ELEMENTS ElementsKind. // HOLEY_DOUBLE_ELEMENTS ElementsKind.
inline bool HasDoubleElements(); inline bool HasDoubleElements();
......
...@@ -319,6 +319,20 @@ RUNTIME_FUNCTION(Runtime_RemoveArrayHoles) { ...@@ -319,6 +319,20 @@ RUNTIME_FUNCTION(Runtime_RemoveArrayHoles) {
} }
} }
// Counter for sorting arrays that have non-packed elements and where either
// the ElementsProtector is invalid or the prototype does not match
// Array.prototype.
if (object->IsJSArray() &&
!Handle<JSArray>::cast(object)->HasFastPackedElements()) {
JSObject* initial_array_proto = JSObject::cast(
isolate->native_context()->get(Context::INITIAL_ARRAY_PROTOTYPE_INDEX));
if (!isolate->IsNoElementsProtectorIntact() ||
object->map()->prototype() != initial_array_proto) {
isolate->CountUsage(
v8::Isolate::kArrayPrototypeSortJSArrayModifiedPrototype);
}
}
return PrepareElementsForSort(object, limit); return PrepareElementsForSort(object, limit);
} }
......
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