diff options
author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
tree | e367e64a75991c554930278175d403c072de6bb8 /Source/JavaScriptCore/bytecode/ArrayProfile.cpp | |
parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
download | qtwebkit-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.cpp | 150 |
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 |