Changeset 40993 in webkit for trunk/JavaScriptCore/bytecompiler


Ignore:
Timestamp:
Feb 13, 2009, 3:28:04 PM (16 years ago)
Author:
[email protected]
Message:

JavaScriptCore:

2009-02-13 Geoffrey Garen <[email protected]>

Reviewed by Darin Adler.


Fixed <rdar://problem/6584057> Optimize sort by JS numeric comparison
function not to run the comparison function


  • bytecode/CodeBlock.cpp: (JSC::CodeBlock::CodeBlock):
  • bytecode/CodeBlock.h: (JSC::CodeBlock::setIsNumericCompareFunction): (JSC::CodeBlock::isNumericCompareFunction): Added the ability to track whether a CodeBlock performs a sort-like numeric comparison.
  • bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): Set the isNumericCompareFunction bit after compiling.
  • parser/Nodes.cpp: (JSC::FunctionBodyNode::emitBytecode): Fixed a bug that caused us to codegen an extra return at the end of all functions (eek!), since this made it harder / weirder to detect the numeric comparison pattern in bytecode.
  • runtime/ArrayPrototype.cpp: (JSC::arrayProtoFuncSort): Use the isNumericCompareFunction bit to do a faster sort if we can.
  • runtime/FunctionConstructor.cpp: (JSC::extractFunctionBody): (JSC::constructFunction):
  • runtime/FunctionConstructor.h: Renamed and exported extractFunctionBody for use in initializing lazyNumericCompareFunction.
  • runtime/JSArray.cpp: (JSC::compareNumbersForQSort): (JSC::compareByStringPairForQSort): (JSC::JSArray::sortNumeric): (JSC::JSArray::sort):
  • runtime/JSArray.h: Added a fast numeric sort. Renamed ArrayQSortPair to be more specific since we do different kinds of qsort now.
  • runtime/JSGlobalData.cpp: (JSC::JSGlobalData::JSGlobalData): (JSC::JSGlobalData::numericCompareFunction): (JSC::JSGlobalData::ClientData::~ClientData):
  • runtime/JSGlobalData.h: Added helper data for computing the isNumericCompareFunction bit.

LayoutTests:

2009-02-13 Geoffrey Garen <[email protected]>

Reviewed by Sam Weinig.


Added a test for an edge case in <rdar://problem/6584057>.

  • fast/js/resources/sort-non-numbers.js: Added.
  • fast/js/sort-non-numbers.html: Added.
  • fast/js/sort-non-numbers-expected.txt: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

    r40846 r40993  
    146146    m_codeBlock->setInstructionCount(m_codeBlock->instructions().size());
    147147
    148     if (s_dumpsGeneratedCode) {
    149         JSGlobalObject* globalObject = m_scopeChain->globalObject();
    150         m_codeBlock->dump(globalObject->globalExec());
    151     }
     148    if (s_dumpsGeneratedCode)
     149        m_codeBlock->dump(m_scopeChain->globalObject()->globalExec());
    152150#endif
    153151
    154152    if ((m_codeType == FunctionCode && !m_codeBlock->needsFullScopeChain() && !m_codeBlock->usesArguments()) || m_codeType == EvalCode)
    155153        symbolTable().clear();
     154       
     155    m_codeBlock->setIsNumericCompareFunction(instructions() == m_globalData->numericCompareFunction(m_scopeChain->globalObject()->globalExec()));
    156156
    157157#if !ENABLE(OPCODE_SAMPLING)
Note: See TracChangeset for help on using the changeset viewer.