Reviewed by Oliver Hunt.
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Dec 2007 02:18:11 +0000 (02:18 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Dec 2007 02:18:11 +0000 (02:18 +0000)
commit170c278b9fd8b45e6864587da70d98bb6a5e7167
tree57c2fb1f597e11f34e5f1c73bb3c127c41d83712
parent296da1addb577db15d9bff3e80caac6899b7f916
    Reviewed by Oliver Hunt.

        AST optimization: Avoid NULL-checking ForNode's child nodes.

        0.6% speedup on SunSpider.

        This is a proof of concept patch that demonstrates how to optimize
        grammar productions with optional components, like

            for (optional; optional; optional) {
                ...
            }

        The parser emits NULL for an optional component that is not present.

        Instead of checking for a NULL child at execution time, a node that
        expects an optional component to be present more often than not checks
        for a NULL child at construction time, and substitutes a viable
        alternative node in its place.

        (We'd like the parser to start emitting NULL a lot more once we teach
        it to emit NULL for certain no-op productions like EmptyStatement and
        VariableStatement, so, as a foundation, it's important for nodes with
        NULL optional components to be fast.)

        * kjs/Parser.cpp:
        (KJS::Parser::didFinishParsing): Check for NULL SourceElements. Also,
        moved didFinishParsing into the .cpp file because adding a branch while
        it was in the header file caused a substantial and inexplicable
        performance regression. (Did I mention that GCC is crazy?)

        * kjs/grammar.y:

        * kjs/nodes.cpp:
        (KJS::BlockNode::BlockNode): Check for NULL SourceElements.
        (KJS::ForNode::optimizeVariableAccess): No need to check for NULL here.
        (KJS::ForNode::execute): No need to check for NULL here.
        * kjs/nodes.h:
        (KJS::ForNode::): Check for NULL SourceElements. Substitute a TrueNode
        because it's semantically harmless, and it evaluates to boolean in an
        efficient manner.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28923 268f45cc-cd09-0410-ab3c-d52691b4dbfc
JavaScriptCore/ChangeLog
JavaScriptCore/kjs/Parser.cpp
JavaScriptCore/kjs/Parser.h
JavaScriptCore/kjs/grammar.y
JavaScriptCore/kjs/nodes.cpp
JavaScriptCore/kjs/nodes.h