Changeset 27210 in webkit for trunk/JavaScriptCore/kjs/nodes.h


Ignore:
Timestamp:
Oct 28, 2007, 10:32:23 PM (18 years ago)
Author:
ggaren
Message:

Reviewed by Darin Adler.


Added FunctionCallResolveNode, PostfixResolveNode, and DeleteResolveNode
to the AST transfom that replaces slow resolve nodes with fast local
variable alternatives.


2.5% speedup on SunSpider.


Also added some missing copyright notices.


  • kjs/nodes.cpp: (KJS::FunctionCallResolveNode::optimizeVariableAccess): (KJS::FunctionCallResolveNode::evaluate): (KJS::LocalVarFunctionCallNode::evaluate): (KJS::PostfixResolveNode::optimizeVariableAccess): (KJS::PostfixResolveNode::evaluate): (KJS::LocalVarPostfixNode::evaluate): (KJS::DeleteResolveNode::optimizeVariableAccess): (KJS::DeleteResolveNode::evaluate): (KJS::LocalVarDeleteNode::evaluate):
  • kjs/nodes.h: (KJS::FunctionCallResolveNode::): (KJS::LocalVarFunctionCallNode::LocalVarFunctionCallNode): (KJS::PostfixResolveNode::): (KJS::LocalVarPostfixNode::LocalVarPostfixNode): (KJS::DeleteResolveNode::): (KJS::LocalVarDeleteNode::LocalVarDeleteNode):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.h

    r27206 r27210  
    44 *  Copyright (C) 2001 Peter Kelly ([email protected])
    55 *  Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
     6 *  Copyright (C) 2007 Cameron Zwarich ([email protected])
     7 *  Copyright (C) 2007 Maks Orlovich
    68 *
    79 *  This library is free software; you can redistribute it and/or
     
    294296  public:
    295297    // Overwrites a ResolveNode in place.
    296     LocalVarAccessNode(size_t i)
     298    LocalVarAccessNode(size_t i) KJS_FAST_CALL
    297299        : ResolveNode(PlacementNewAdopt)
    298300    {
     
    483485  class FunctionCallResolveNode : public Node {
    484486  public:
    485     FunctionCallResolveNode(const Identifier& i, ArgumentsNode *a) KJS_FAST_CALL : ident(i), args(a) {}
     487    FunctionCallResolveNode(const Identifier& i, ArgumentsNode* a) KJS_FAST_CALL
     488        : ident(i)
     489        , args(a)
     490    {
     491    }
     492
     493    FunctionCallResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     494        : Node(PlacementNewAdopt)
     495        , ident(PlacementNewAdopt)
     496        , args(PlacementNewAdopt)
     497    {
     498    }
     499
    486500    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    487501    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    488502    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    489503    virtual Precedence precedence() const { return PrecCall; }
    490   private:
     504
     505  protected:
    491506    Identifier ident;
    492507    RefPtr<ArgumentsNode> args;
     508    size_t index; // Used by LocalVarFunctionCallNode.
     509  };
     510
     511  class LocalVarFunctionCallNode : public FunctionCallResolveNode {
     512  public:
     513    LocalVarFunctionCallNode(size_t i) KJS_FAST_CALL
     514        : FunctionCallResolveNode(PlacementNewAdopt)
     515    {
     516        ASSERT(i != missingSymbolMarker());
     517        index = i;
     518    }
     519
     520    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    493521  };
    494522
     
    522550  public:
    523551    PostfixResolveNode(const Identifier& i, Operator o) KJS_FAST_CALL : m_ident(i), m_oper(o) {}
     552
     553    PostfixResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     554        : Node(PlacementNewAdopt)
     555        , m_ident(PlacementNewAdopt)
     556    {
     557    }
     558
     559    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    524560    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    525561    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    526562    virtual Precedence precedence() const { return PrecPostfix; }
    527   private:
     563
     564  protected:
    528565    Identifier m_ident;
    529566    Operator m_oper;
     567    size_t index; // Used by LocalVarPostfixNode.
     568  };
     569
     570  class LocalVarPostfixNode : public PostfixResolveNode {
     571  public:
     572    LocalVarPostfixNode(size_t i) KJS_FAST_CALL
     573        : PostfixResolveNode(PlacementNewAdopt)
     574    {
     575        ASSERT(i != missingSymbolMarker());
     576        index = i;
     577    }
     578
     579    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    530580  };
    531581
     
    570620  public:
    571621    DeleteResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
     622    DeleteResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     623        : Node(PlacementNewAdopt)
     624        , m_ident(PlacementNewAdopt)
     625    {
     626    }
     627
     628    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    572629    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    573630    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    575632  private:
    576633    Identifier m_ident;
     634  };
     635
     636  class LocalVarDeleteNode : public DeleteResolveNode {
     637  public:
     638    LocalVarDeleteNode() KJS_FAST_CALL
     639        : DeleteResolveNode(PlacementNewAdopt)
     640    {
     641    }
     642
     643    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    577644  };
    578645
Note: See TracChangeset for help on using the changeset viewer.