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


Ignore:
Timestamp:
Nov 8, 2007, 9:48:49 PM (18 years ago)
Author:
Darin Adler
Message:

Reviewed by Oliver.

1% improvement of SunSpider

  • kjs/JSImmediate.h: Eliminate the now-unneeded FPBitValues struct template. (KJS::JSImmediate::from): Overload for most numeric types; many types can do fewer branches and checks. (KJS::JSImmediate::getUInt32): Removed unneeded check for undefined. (KJS::JSImmediate::getTruncatedInt32): Ditto. (KJS::JSImmediate::getTruncatedUInt32): Ditto. There's no difference any more between getUInt32 and getTruncatedUInt32, so that's worth a rename and merge later.
  • kjs/grammar.y: Update since fromDouble is now just from.
  • kjs/nodes.h: Ditto.
  • kjs/value.h: (KJS::jsNumber): Overload for most numeric types.
File:
1 edited

Legend:

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

    r27623 r27632  
    1 // -*- c-basic-offset: 2 -*-
    21/*
    32 *  Copyright (C) 1999-2000 Harri Porten ([email protected])
     
    112111  };
    113112
    114   class Node {
     113  class Node : Noncopyable {
    115114  public:
    116115    Node() KJS_FAST_CALL;
     
    136135    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL { }
    137136
    138     // Used to optimize those nodes that do extra work when returning a result, even if the result has no semantic relevance
    139     virtual void optimizeForUnnecessaryResult() { }
    140      
    141137  protected:
    142138    Completion createErrorCompletion(ExecState *, ErrorType, const char *msg) KJS_FAST_CALL;
     
    160156    int m_line : 31;
    161157    bool m_mayHaveDeclarations : 1;
    162   private:
    163     // disallow assignment
    164     Node& operator=(const Node&) KJS_FAST_CALL;
    165     Node(const Node &other) KJS_FAST_CALL;
    166158  };
    167159   
     
    187179        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL = 0;
    188180        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
    189     };
     181
     182        // Used to optimize those nodes that do extra work when returning a result, even if the result has no semantic relevance
     183        virtual void optimizeForUnnecessaryResult() { }
     184   };
    190185
    191186  class StatementNode : public Node {
     
    240235  class ImmediateNumberNode : public NumberNode {
    241236  public:
    242       ImmediateNumberNode(JSValue* v, double d) KJS_FAST_CALL : NumberNode(d), m_value(v) { ASSERT(v == JSImmediate::fromDouble(d)); }
     237      ImmediateNumberNode(JSValue* v, double d) KJS_FAST_CALL : NumberNode(d), m_value(v) { ASSERT(v == JSImmediate::from(d)); }
    243238      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    244239     
    245       virtual void setValue(double d) KJS_FAST_CALL { m_double = d; m_value = JSImmediate::fromDouble(d); ASSERT(m_value); }
     240      virtual void setValue(double d) KJS_FAST_CALL { m_double = d; m_value = JSImmediate::from(d); ASSERT(m_value); }
    246241  private:
    247242      JSValue* m_value;
     
    322317  };
    323318
    324   class ElementNode : public ExpressionNode {
     319  class ElementNode : public Node {
    325320  public:
    326321    ElementNode(int e, ExpressionNode* n) KJS_FAST_CALL : elision(e), node(n) { }
    327322    ElementNode(ElementNode* l, int e, ExpressionNode* n) KJS_FAST_CALL
    328323      : elision(e), node(n) { l->next = this; }
    329     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    330     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    331     virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     324    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     325    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     326    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     327
    332328    PassRefPtr<ElementNode> releaseNext() KJS_FAST_CALL { return next.release(); }
    333     virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     329
     330    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     331
    334332  private:
    335333    friend class ArrayNode;
     
    356354  };
    357355
    358   class PropertyNode : public ExpressionNode {
     356  class PropertyNode : public Node {
    359357  public:
    360358    enum Type { Constant, Getter, Setter };
     
    362360      : m_name(n), assign(a), type(t) { }
    363361    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    364     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    365     virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     362    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     363    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     364
     365    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     366    const Identifier& name() const { return m_name; }
     367
     368  private:
    366369    friend class PropertyListNode;
    367     virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    368     const Identifier& name() const { return m_name; }
    369   private:
    370370    Identifier m_name;
    371371    RefPtr<ExpressionNode> assign;
     
    373373  };
    374374 
    375   class PropertyListNode : public ExpressionNode {
     375  class PropertyListNode : public Node {
    376376  public:
    377377    PropertyListNode(PropertyNode* n) KJS_FAST_CALL
     
    380380      : node(n) { l->next = this; }
    381381    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    382     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    383     virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     382    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     383    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     384
     385    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    384386    PassRefPtr<PropertyListNode> releaseNext() KJS_FAST_CALL { return next.release(); }
    385     virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     387
    386388  private:
    387389    friend class ObjectLiteralNode;
     
    440442  };
    441443
    442   class ArgumentListNode : public ExpressionNode {
     444  class ArgumentListNode : public Node {
    443445  public:
    444446    ArgumentListNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { }
     
    446448      : expr(e) { l->next = this; }
    447449    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    448     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     450    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     451    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     452
    449453    void evaluateList(ExecState*, List&) KJS_FAST_CALL;
    450     virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    451454    PassRefPtr<ArgumentListNode> releaseNext() KJS_FAST_CALL { return next.release(); }
    452     virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     455
    453456  private:
    454457    friend class ArgumentsNode;
     
    457460  };
    458461
    459   class ArgumentsNode : public ExpressionNode {
     462  class ArgumentsNode : public Node {
    460463  public:
    461464    ArgumentsNode() KJS_FAST_CALL { }
     
    463466      : listNode(l) { }
    464467    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    465     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     468    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     469    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     470
    466471    void evaluateList(ExecState* exec, List& list) KJS_FAST_CALL { if (listNode) listNode->evaluateList(exec, list); }
    467     virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    468     virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     472
    469473  private:
    470474    RefPtr<ArgumentListNode> listNode;
     
    560564  };
    561565
    562     class PrePostResolveNode : public ExpressionNode {
     566  class PrePostResolveNode : public ExpressionNode {
    563567  public:
    564568    PrePostResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
     
    634638  };
    635639
    636     class PostfixBracketNode : public ExpressionNode {
     640  class PostfixBracketNode : public ExpressionNode {
    637641  public:
    638642    PostfixBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : m_base(b), m_subscript(s) {}
Note: See TracChangeset for help on using the changeset viewer.