Skip to content
  • oliver@apple.com's avatar
    2011-06-17 Oliver Hunt <oliver@apple.com> · 0cd29253
    oliver@apple.com authored
            Reviewed by Gavin Barraclough.
    
            JSONP is unnecessarily slow
            https://bugs.webkit.org/show_bug.cgi?id=62920
    
            JSONP has unfortunately become a fairly common idiom online, yet
            it triggers very poor performance in JSC as we end up doing codegen
            for a large number of property accesses that will
               * only be run once, so the vast amount of logic we dump to handle
                 caching of accesses is unnecessary.
               * We are doing codegen that is directly proportional to just
                 creating the object in the first place.
    
            This patch extends the use of the literal parser to JSONP-like structures
            in global code, handling a number of different forms I have seen online.
            In an extreme case this improves performance of JSONP by more than 2x
            due to removal of code generation and execution time, and a few optimisations
            that I made to the parser itself.
    
            * API/JSValueRef.cpp:
            (JSValueMakeFromJSONString):
            * interpreter/Interpreter.cpp:
            (JSC::Interpreter::callEval):
            (JSC::Interpreter::execute):
            * parser/Lexer.cpp:
            (JSC::Lexer::isKeyword):
            * parser/Lexer.h:
            * runtime/JSGlobalObjectFunctions.cpp:
            (JSC::globalFuncEval):
            * runtime/JSONObject.cpp:
            (JSC::JSONProtoFuncParse):
            * runtime/LiteralParser.cpp:
            (JSC::LiteralParser::tryJSONPParse):
            (JSC::LiteralParser::makeIdentifier):
            (JSC::LiteralParser::Lexer::lex):
            (JSC::LiteralParser::Lexer::next):
            (JSC::isSafeStringCharacter):
            (JSC::LiteralParser::Lexer::lexString):
            (JSC::LiteralParser::Lexer::lexNumber):
            (JSC::LiteralParser::parse):
            * runtime/LiteralParser.h:
            (JSC::LiteralParser::LiteralParser):
            (JSC::LiteralParser::tryLiteralParse):
            (JSC::LiteralParser::Lexer::Lexer):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@89184 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    0cd29253