• ggaren@apple.com's avatar
    JavaScriptCore: · 1d4bd449
    ggaren@apple.com authored
    2009-02-13  Geoffrey Garen  <ggaren@apple.com>
    
            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  <ggaren@apple.com>
    
            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.
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@40993 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    1d4bd449
JSArray.cpp 35.5 KB