diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/bytecode/ArrayProfile.cpp | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/bytecode/ArrayProfile.cpp')
-rw-r--r-- | Source/JavaScriptCore/bytecode/ArrayProfile.cpp | 131 |
1 files changed, 63 insertions, 68 deletions
diff --git a/Source/JavaScriptCore/bytecode/ArrayProfile.cpp b/Source/JavaScriptCore/bytecode/ArrayProfile.cpp index 7ea31da10..b8ade2223 100644 --- a/Source/JavaScriptCore/bytecode/ArrayProfile.cpp +++ b/Source/JavaScriptCore/bytecode/ArrayProfile.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Apple Inc. All rights reserved. + * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -24,10 +24,11 @@ */ #include "config.h" -#include "JSCellInlines.h" #include "ArrayProfile.h" #include "CodeBlock.h" +#include "JSCInlines.h" +#include <wtf/CommaPrinter.h> #include <wtf/StringExtras.h> #include <wtf/StringPrintStream.h> @@ -36,7 +37,7 @@ namespace JSC { void dumpArrayModes(PrintStream& out, ArrayModes arrayModes) { if (!arrayModes) { - out.print("0:<empty>"); + out.print("<empty>"); return; } @@ -45,84 +46,90 @@ void dumpArrayModes(PrintStream& out, ArrayModes arrayModes) return; } - out.print(arrayModes, ":"); - + CommaPrinter comma("|"); if (arrayModes & asArrayModes(NonArray)) - out.print("NonArray"); + out.print(comma, "NonArray"); if (arrayModes & asArrayModes(NonArrayWithInt32)) - out.print("NonArrayWithInt32"); + out.print(comma, "NonArrayWithInt32"); if (arrayModes & asArrayModes(NonArrayWithDouble)) - out.print("NonArrayWithDouble"); + out.print(comma, "NonArrayWithDouble"); if (arrayModes & asArrayModes(NonArrayWithContiguous)) - out.print("NonArrayWithContiguous"); + out.print(comma, "NonArrayWithContiguous"); if (arrayModes & asArrayModes(NonArrayWithArrayStorage)) - out.print("NonArrayWithArrayStorage"); + out.print(comma, "NonArrayWithArrayStorage"); if (arrayModes & asArrayModes(NonArrayWithSlowPutArrayStorage)) - out.print("NonArrayWithSlowPutArrayStorage"); + out.print(comma, "NonArrayWithSlowPutArrayStorage"); if (arrayModes & asArrayModes(ArrayClass)) - out.print("ArrayClass"); + out.print(comma, "ArrayClass"); if (arrayModes & asArrayModes(ArrayWithUndecided)) - out.print("ArrayWithUndecided"); + out.print(comma, "ArrayWithUndecided"); if (arrayModes & asArrayModes(ArrayWithInt32)) - out.print("ArrayWithInt32"); + out.print(comma, "ArrayWithInt32"); if (arrayModes & asArrayModes(ArrayWithDouble)) - out.print("ArrayWithDouble"); + out.print(comma, "ArrayWithDouble"); if (arrayModes & asArrayModes(ArrayWithContiguous)) - out.print("ArrayWithContiguous"); + out.print(comma, "ArrayWithContiguous"); if (arrayModes & asArrayModes(ArrayWithArrayStorage)) - out.print("ArrayWithArrayStorage"); + out.print(comma, "ArrayWithArrayStorage"); if (arrayModes & asArrayModes(ArrayWithSlowPutArrayStorage)) - out.print("ArrayWithSlowPutArrayStorage"); + out.print(comma, "ArrayWithSlowPutArrayStorage"); + + if (arrayModes & Int8ArrayMode) + out.print(comma, "Int8ArrayMode"); + if (arrayModes & Int16ArrayMode) + out.print(comma, "Int16ArrayMode"); + if (arrayModes & Int32ArrayMode) + out.print(comma, "Int32ArrayMode"); + if (arrayModes & Uint8ArrayMode) + out.print(comma, "Uint8ArrayMode"); + if (arrayModes & Uint8ClampedArrayMode) + out.print(comma, "Uint8ClampedArrayMode"); + if (arrayModes & Uint16ArrayMode) + out.print(comma, "Uint16ArrayMode"); + if (arrayModes & Uint32ArrayMode) + out.print(comma, "Uint32ArrayMode"); + if (arrayModes & Float32ArrayMode) + out.print(comma, "Float32ArrayMode"); + if (arrayModes & Float64ArrayMode) + out.print(comma, "Float64ArrayMode"); } -ArrayModes ArrayProfile::updatedObservedArrayModes() const +void ArrayProfile::computeUpdatedPrediction(const ConcurrentJITLocker& locker, CodeBlock* codeBlock) { - if (m_lastSeenStructure) - return m_observedArrayModes | arrayModeFromStructure(m_lastSeenStructure); - return m_observedArrayModes; + if (!m_lastSeenStructureID) + return; + + Structure* lastSeenStructure = codeBlock->heap()->structureIDTable().get(m_lastSeenStructureID); + computeUpdatedPrediction(locker, codeBlock, lastSeenStructure); + m_lastSeenStructureID = 0; } -void ArrayProfile::computeUpdatedPrediction(CodeBlock* codeBlock, OperationInProgress operation) +void ArrayProfile::computeUpdatedPrediction(const ConcurrentJITLocker&, CodeBlock* codeBlock, Structure* lastSeenStructure) { - 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 (!structureIsPolymorphic()) { - if (!m_expectedStructure) - m_expectedStructure = m_lastSeenStructure; - else if (m_expectedStructure != m_lastSeenStructure) { - 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; - } + m_observedArrayModes |= arrayModeFromStructure(lastSeenStructure); - if (hasTwoOrMoreBitsSet(m_observedArrayModes)) { - 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 (!m_didPerformFirstRunPruning + && hasTwoOrMoreBitsSet(m_observedArrayModes)) { + m_observedArrayModes = arrayModeFromStructure(lastSeenStructure); + m_didPerformFirstRunPruning = true; } - if (operation == Collection - && expectedStructure() - && !Heap::isMarked(m_expectedStructure)) { - if (verbose) - dataLog(*codeBlock, " bc#", m_bytecodeOffset, ": making structure during GC\n"); - m_expectedStructure = polymorphicStructure(); - } + m_mayInterceptIndexedAccesses |= + lastSeenStructure->typeInfo().interceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero(); + JSGlobalObject* globalObject = codeBlock->globalObject(); + if (!globalObject->isOriginalArrayStructure(lastSeenStructure) + && !globalObject->isOriginalTypedArrayStructure(lastSeenStructure)) + m_usesOriginalArrayStructures = false; } -CString ArrayProfile::briefDescription(CodeBlock* codeBlock) +CString ArrayProfile::briefDescription(const ConcurrentJITLocker& locker, CodeBlock* codeBlock) +{ + computeUpdatedPrediction(locker, codeBlock); + return briefDescriptionWithoutUpdating(locker); +} + +CString ArrayProfile::briefDescriptionWithoutUpdating(const ConcurrentJITLocker&) { - computeUpdatedPrediction(codeBlock); - StringPrintStream out; bool hasPrinted = false; @@ -134,18 +141,6 @@ CString ArrayProfile::briefDescription(CodeBlock* codeBlock) 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(", "); |