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


Ignore:
Timestamp:
Nov 6, 2007, 10:03:20 PM (18 years ago)
Author:
oliver
Message:

Avoid unnecessarily boxing the result from post inc/decrement for 0.3% gain in sunspider

Reviewed by Maciej

We now convert the common 'for (...; ...; <var>++) ...' to the semantically identical
'for (...; ...; ++<var>) ...'.

File:
1 edited

Legend:

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

    r27394 r27501  
    143143    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL { }
    144144
     145    // Used to optimize those nodes that do extra work when returning a result, even if the result has no semantic relevance
     146    virtual void optimizeForUnnecessaryResult() { }
     147     
    145148  protected:
    146149    Completion createErrorCompletion(ExecState *, ErrorType, const char *msg) KJS_FAST_CALL;
     
    539542  };
    540543
    541   class PostIncResolveNode : public Node {
    542   public:
    543     PostIncResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
    544 
    545     PostIncResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     544  class PrePostResolveNode : public Node {
     545  public:
     546    PrePostResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
     547     
     548    PrePostResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    546549        : Node(PlacementNewAdopt)
    547550        , m_ident(PlacementNewAdopt)
    548551    {
    549552    }
     553     
     554  protected:
     555      Identifier m_ident;
     556      size_t m_index; // Used by LocalVarPostfixNode.     
     557  };
     558   
     559  class PostIncResolveNode : public PrePostResolveNode {
     560  public:
     561    PostIncResolveNode(const Identifier& i) KJS_FAST_CALL : PrePostResolveNode(i) {}
     562
     563    PostIncResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     564        : PrePostResolveNode(PlacementNewAdopt)
     565    {
     566    }
    550567
    551568    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     
    553570    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    554571    virtual Precedence precedence() const { return PrecPostfix; }
    555 
    556   protected:
    557     Identifier m_ident;
    558     size_t index; // Used by LocalVarPostfixNode.
     572    virtual void optimizeForUnnecessaryResult();
     573
    559574  };
    560575
     
    565580    {
    566581        ASSERT(i != missingSymbolMarker());
    567         index = i;
    568     }
    569 
    570     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    571   };
    572 
    573   class PostDecResolveNode : public Node {
    574   public:
    575     PostDecResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
     582        m_index = i;
     583    }
     584
     585    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     586    virtual void optimizeForUnnecessaryResult();
     587  };
     588
     589  class PostDecResolveNode : public PrePostResolveNode {
     590  public:
     591    PostDecResolveNode(const Identifier& i) KJS_FAST_CALL : PrePostResolveNode(i) {}
    576592
    577593    PostDecResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    578         : Node(PlacementNewAdopt)
    579         , m_ident(PlacementNewAdopt)
     594        : PrePostResolveNode(PlacementNewAdopt)
    580595    {
    581596    }
     
    585600    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    586601    virtual Precedence precedence() const { return PrecPostfix; }
    587 
    588   protected:
    589     Identifier m_ident;
    590     size_t index; // Used by LocalVarPostfixNode.
     602    virtual void optimizeForUnnecessaryResult();
    591603  };
    592604
     
    597609    {
    598610        ASSERT(i != missingSymbolMarker());
    599         index = i;
    600     }
    601 
    602     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     611        m_index = i;
     612    }
     613
     614    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     615    virtual void optimizeForUnnecessaryResult();
    603616  };
    604617
     
    792805  };
    793806
    794   class PreIncResolveNode : public Node {
     807  class PreIncResolveNode : public PrePostResolveNode {
    795808  public:
    796809    PreIncResolveNode(const Identifier &s) KJS_FAST_CALL
    797         : m_ident(s)
     810        : PrePostResolveNode(s)
    798811    {
    799812    }
    800813   
    801814    PreIncResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    802         : Node(PlacementNewAdopt)
    803         , m_ident(PlacementNewAdopt)
     815        : PrePostResolveNode(PlacementNewAdopt)
    804816    {
    805817    }
     
    810822    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    811823    virtual Precedence precedence() const { return PrecUnary; }
    812 
    813   protected:
    814     Identifier m_ident;
    815     size_t m_index; // Used by LocalVarPrefixNode.
    816824  };
    817825
     
    828836  };
    829837 
    830   class PreDecResolveNode : public Node {
     838  class PreDecResolveNode : public PrePostResolveNode {
    831839  public:
    832840    PreDecResolveNode(const Identifier &s) KJS_FAST_CALL
    833         : m_ident(s)
     841        : PrePostResolveNode(s)
    834842    {
    835843    }
    836844   
    837845    PreDecResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    838         : Node(PlacementNewAdopt)
    839         , m_ident(PlacementNewAdopt)
     846        : PrePostResolveNode(PlacementNewAdopt)
    840847    {
    841848    }
     
    846853    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    847854    virtual Precedence precedence() const { return PrecUnary; }
    848 
    849   protected:
    850     Identifier m_ident;
    851     size_t m_index; // Used by LocalVarPrefixNode.
    852855  };
    853856
     
    15621565  public:
    15631566    ForNode(Node* e1, Node* e2, Node* e3, StatementNode* s) KJS_FAST_CALL :
    1564       expr1(e1), expr2(e2), expr3(e3), statement(s) { m_mayHaveDeclarations = true; }
     1567      expr1(e1), expr2(e2), expr3(e3), statement(s)
     1568    {
     1569        m_mayHaveDeclarations = true;
     1570        if (expr3)
     1571            expr3->optimizeForUnnecessaryResult();
     1572    }
     1573
    15651574    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    15661575    virtual Completion execute(ExecState*) KJS_FAST_CALL;
Note: See TracChangeset for help on using the changeset viewer.