summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/ArrayProfile.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2013-09-13 12:51:20 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-19 20:50:05 +0200
commitd441d6f39bb846989d95bcf5caf387b42414718d (patch)
treee367e64a75991c554930278175d403c072de6bb8 /Source/JavaScriptCore/bytecode/ArrayProfile.cpp
parent0060b2994c07842f4c59de64b5e3e430525c4b90 (diff)
downloadqtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit. Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/JavaScriptCore/bytecode/ArrayProfile.cpp')
-rw-r--r--Source/JavaScriptCore/bytecode/ArrayProfile.cpp150
1 files changed, 112 insertions, 38 deletions
diff --git a/Source/JavaScriptCore/bytecode/ArrayProfile.cpp b/Source/JavaScriptCore/bytecode/ArrayProfile.cpp
index 51baf332f..ae3c8f94a 100644
--- a/Source/JavaScriptCore/bytecode/ArrayProfile.cpp
+++ b/Source/JavaScriptCore/bytecode/ArrayProfile.cpp
@@ -28,41 +28,50 @@
#include "CodeBlock.h"
#include <wtf/StringExtras.h>
+#include <wtf/StringPrintStream.h>
namespace JSC {
-const char* arrayModesToString(ArrayModes arrayModes)
+void dumpArrayModes(PrintStream& out, ArrayModes arrayModes)
{
- if (!arrayModes)
- return "0:<empty>";
+ if (!arrayModes) {
+ out.print("0:<empty>");
+ return;
+ }
- if (arrayModes == ALL_ARRAY_MODES)
- return "TOP";
-
- bool isNonArray = !!(arrayModes & asArrayModes(NonArray));
- bool isNonArrayWithContiguous = !!(arrayModes & asArrayModes(NonArrayWithContiguous));
- bool isNonArrayWithArrayStorage = !!(arrayModes & asArrayModes(NonArrayWithArrayStorage));
- bool isNonArrayWithSlowPutArrayStorage = !!(arrayModes & asArrayModes(NonArrayWithSlowPutArrayStorage));
- bool isArray = !!(arrayModes & asArrayModes(ArrayClass));
- bool isArrayWithContiguous = !!(arrayModes & asArrayModes(ArrayWithContiguous));
- bool isArrayWithArrayStorage = !!(arrayModes & asArrayModes(ArrayWithArrayStorage));
- bool isArrayWithSlowPutArrayStorage = !!(arrayModes & asArrayModes(ArrayWithSlowPutArrayStorage));
-
- static char result[256];
- snprintf(
- result, sizeof(result),
- "%u:%s%s%s%s%s%s%s%s",
- arrayModes,
- isNonArray ? "NonArray" : "",
- isNonArrayWithContiguous ? "NonArrayWithContiguous" : "",
- isNonArrayWithArrayStorage ? " NonArrayWithArrayStorage" : "",
- isNonArrayWithSlowPutArrayStorage ? "NonArrayWithSlowPutArrayStorage" : "",
- isArray ? "ArrayClass" : "",
- isArrayWithContiguous ? "ArrayWithContiguous" : "",
- isArrayWithArrayStorage ? " ArrayWithArrayStorage" : "",
- isArrayWithSlowPutArrayStorage ? "ArrayWithSlowPutArrayStorage" : "");
-
- return result;
+ if (arrayModes == ALL_ARRAY_MODES) {
+ out.print("TOP");
+ return;
+ }
+
+ out.print(arrayModes, ":");
+
+ if (arrayModes & asArrayModes(NonArray))
+ out.print("NonArray");
+ if (arrayModes & asArrayModes(NonArrayWithInt32))
+ out.print("NonArrayWithInt32");
+ if (arrayModes & asArrayModes(NonArrayWithDouble))
+ out.print("NonArrayWithDouble");
+ if (arrayModes & asArrayModes(NonArrayWithContiguous))
+ out.print("NonArrayWithContiguous");
+ if (arrayModes & asArrayModes(NonArrayWithArrayStorage))
+ out.print("NonArrayWithArrayStorage");
+ if (arrayModes & asArrayModes(NonArrayWithSlowPutArrayStorage))
+ out.print("NonArrayWithSlowPutArrayStorage");
+ if (arrayModes & asArrayModes(ArrayClass))
+ out.print("ArrayClass");
+ if (arrayModes & asArrayModes(ArrayWithUndecided))
+ out.print("ArrayWithUndecided");
+ if (arrayModes & asArrayModes(ArrayWithInt32))
+ out.print("ArrayWithInt32");
+ if (arrayModes & asArrayModes(ArrayWithDouble))
+ out.print("ArrayWithDouble");
+ if (arrayModes & asArrayModes(ArrayWithContiguous))
+ out.print("ArrayWithContiguous");
+ if (arrayModes & asArrayModes(ArrayWithArrayStorage))
+ out.print("ArrayWithArrayStorage");
+ if (arrayModes & asArrayModes(ArrayWithSlowPutArrayStorage))
+ out.print("ArrayWithSlowPutArrayStorage");
}
ArrayModes ArrayProfile::updatedObservedArrayModes() const
@@ -74,34 +83,99 @@ ArrayModes ArrayProfile::updatedObservedArrayModes() const
void ArrayProfile::computeUpdatedPrediction(CodeBlock* codeBlock, OperationInProgress operation)
{
+ const bool verbose = false;
+
if (m_lastSeenStructure) {
m_observedArrayModes |= arrayModeFromStructure(m_lastSeenStructure);
m_mayInterceptIndexedAccesses |=
m_lastSeenStructure->typeInfo().interceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero();
if (!codeBlock->globalObject()->isOriginalArrayStructure(m_lastSeenStructure))
m_usesOriginalArrayStructures = false;
- if (!m_structureIsPolymorphic) {
+ if (!structureIsPolymorphic()) {
if (!m_expectedStructure)
m_expectedStructure = m_lastSeenStructure;
else if (m_expectedStructure != m_lastSeenStructure) {
- m_expectedStructure = 0;
- m_structureIsPolymorphic = true;
+ if (verbose)
+ dataLog(*codeBlock, " bc#", m_bytecodeOffset, ": making structure polymorphic because ", RawPointer(m_expectedStructure), " (", m_expectedStructure->classInfo()->className, ") != ", RawPointer(m_lastSeenStructure), " (", m_lastSeenStructure->classInfo()->className, ")\n");
+ m_expectedStructure = polymorphicStructure();
}
}
m_lastSeenStructure = 0;
}
if (hasTwoOrMoreBitsSet(m_observedArrayModes)) {
- m_structureIsPolymorphic = true;
- m_expectedStructure = 0;
+ if (verbose)
+ dataLog(*codeBlock, " bc#", m_bytecodeOffset, ": making structure polymorphic because two or more bits are set in m_observedArrayModes\n");
+ m_expectedStructure = polymorphicStructure();
}
if (operation == Collection
- && m_expectedStructure
+ && expectedStructure()
&& !Heap::isMarked(m_expectedStructure)) {
- m_expectedStructure = 0;
- m_structureIsPolymorphic = true;
+ if (verbose)
+ dataLog(*codeBlock, " bc#", m_bytecodeOffset, ": making structure during GC\n");
+ m_expectedStructure = polymorphicStructure();
+ }
+}
+
+CString ArrayProfile::briefDescription(CodeBlock* codeBlock)
+{
+ computeUpdatedPrediction(codeBlock);
+
+ StringPrintStream out;
+
+ bool hasPrinted = false;
+
+ if (m_observedArrayModes) {
+ if (hasPrinted)
+ out.print(", ");
+ out.print(ArrayModesDump(m_observedArrayModes));
+ hasPrinted = true;
}
+
+ if (structureIsPolymorphic()) {
+ if (hasPrinted)
+ out.print(", ");
+ out.print("struct = TOP");
+ hasPrinted = true;
+ } else if (m_expectedStructure) {
+ if (hasPrinted)
+ out.print(", ");
+ out.print("struct = ", RawPointer(m_expectedStructure));
+ hasPrinted = true;
+ }
+
+ if (m_mayStoreToHole) {
+ if (hasPrinted)
+ out.print(", ");
+ out.print("Hole");
+ hasPrinted = true;
+ }
+
+ if (m_outOfBounds) {
+ if (hasPrinted)
+ out.print(", ");
+ out.print("OutOfBounds");
+ hasPrinted = true;
+ }
+
+ if (m_mayInterceptIndexedAccesses) {
+ if (hasPrinted)
+ out.print(", ");
+ out.print("Intercept");
+ hasPrinted = true;
+ }
+
+ if (m_usesOriginalArrayStructures) {
+ if (hasPrinted)
+ out.print(", ");
+ out.print("Original");
+ hasPrinted = true;
+ }
+
+ UNUSED_PARAM(hasPrinted);
+
+ return out.toCString();
}
} // namespace JSC