Reviewed by Maciej Stachowiak, Darin Adler.
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Oct 2007 02:00:57 +0000 (02:00 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Oct 2007 02:00:57 +0000 (02:00 +0000)
commit23f59f8fc347a29851e12848a1107362f48cf991
treeaf400df8052ffb042407a9d3aae0dd44e4b7821b
parent63e74bf6e08ee7721585b2dabd71c7a3fe9e5d13
    Reviewed by Maciej Stachowiak, Darin Adler.

        Much supporting work done by Maciej Stachowiak, Maks Orlovich, and
        Cameron Zwarich.

        AST transfom to replace slow resolve nodes with fast local variable
        alternatives that do direct memory access. Currently, only ResolveNode
        provides a fast local variable alternative. 6 others are soon to come.

        16.7% speedup on SunSpider.

        Most of this patch is just scaffolding to support iterating all the
        resolve nodes in the AST through optimizeResolveNodes(). In
        optimizeResolveNodes(), most classes just push their child nodes onto
        the processing stack, while ResolveNodes actually replace themselves in
        the tree with more optimized alternatives, if possible.

        Here are the interesting bits:

        * kjs/nodes.h: Added PlacementNewAdoptTag, along with implementations
        in Node and ResolveNode. This tag allows you to use placement new to
        swap out a base class Node in favor of a subclass copy that holds the
        same data. (Without this tag, default initialization would NULL out
        RefPtrs, change line numbers, etc.)

        * kjs/nodes.cpp:
        (KJS::ResolveNode::evaluate): Since we're taking the slow path, ASSERT
        that the fast path is impossible, to make sure we didn't leave anything
        on the table.

        (KJS::FunctionBodyNode::optimizeResolveNodes): Here's where the AST
        transformation happens.

        (KJS::ResolveNode::optimizeResolveNodes): Here's where the ResolveNode
        optimization happens.

        * kjs/function.h: Added symbolTable() accessor for, for the sake of
        an ASSERT.

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