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


Ignore:
Timestamp:
Nov 8, 2007, 4:43:52 PM (18 years ago)
Author:
eseidel
Message:

2007-11-08 Eric Seidel <[email protected]>

Reviewed by darin.

Add ExpressionNode subclass of Node, use it.

  • kjs/grammar.y:
  • kjs/nodes.cpp: (KJS::ForInNode::ForInNode):
  • kjs/nodes.h: (KJS::ExpressionNode::): (KJS::NullNode::): (KJS::NullNode::precedence): (KJS::BooleanNode::): (KJS::BooleanNode::precedence): (KJS::RegExpNode::): (KJS::RegExpNode::precedence): (KJS::ThisNode::): (KJS::ThisNode::precedence): (KJS::ResolveNode::): (KJS::ElementNode::): (KJS::ArrayNode::): (KJS::PropertyNode::): (KJS::PropertyNode::precedence): (KJS::PropertyNode::name): (KJS::PropertyListNode::): (KJS::ObjectLiteralNode::): (KJS::ObjectLiteralNode::precedence): (KJS::BracketAccessorNode::): (KJS::DotAccessorNode::): (KJS::DotAccessorNode::precedence): (KJS::ArgumentListNode::): (KJS::ArgumentsNode::): (KJS::NewExprNode::): (KJS::NewExprNode::precedence): (KJS::FunctionCallValueNode::): (KJS::FunctionCallValueNode::precedence): (KJS::FunctionCallResolveNode::): (KJS::FunctionCallBracketNode::): (KJS::FunctionCallBracketNode::precedence): (KJS::FunctionCallDotNode::): (KJS::FunctionCallDotNode::precedence): (KJS::PrePostResolveNode::): (KJS::PostfixBracketNode::): (KJS::PostfixBracketNode::precedence): (KJS::PostIncBracketNode::): (KJS::PostIncBracketNode::isIncrement): (KJS::PostDecBracketNode::): (KJS::PostDecBracketNode::isIncrement): (KJS::PostfixDotNode::): (KJS::PostfixDotNode::precedence): (KJS::PostIncDotNode::): (KJS::PostIncDotNode::isIncrement): (KJS::PostDecDotNode::): (KJS::PostDecDotNode::isIncrement): (KJS::PostfixErrorNode::): (KJS::PostfixErrorNode::precedence): (KJS::DeleteResolveNode::): (KJS::DeleteBracketNode::): (KJS::DeleteBracketNode::precedence): (KJS::DeleteDotNode::): (KJS::DeleteDotNode::precedence): (KJS::DeleteValueNode::): (KJS::DeleteValueNode::precedence): (KJS::VoidNode::): (KJS::VoidNode::precedence): (KJS::TypeOfResolveNode::): (KJS::TypeOfValueNode::): (KJS::PrefixBracketNode::): (KJS::PrefixBracketNode::precedence): (KJS::PreIncBracketNode::): (KJS::PreIncBracketNode::isIncrement): (KJS::PreDecBracketNode::): (KJS::PreDecBracketNode::isIncrement): (KJS::PrefixDotNode::): (KJS::PrefixDotNode::precedence): (KJS::PreIncDotNode::): (KJS::PreIncDotNode::isIncrement): (KJS::PreDecDotNode::): (KJS::PreDecDotNode::isIncrement): (KJS::PrefixErrorNode::): (KJS::PrefixErrorNode::precedence): (KJS::UnaryPlusNode::): (KJS::UnaryPlusNode::precedence): (KJS::NegateNode::): (KJS::NegateNode::precedence): (KJS::BitwiseNotNode::): (KJS::BitwiseNotNode::precedence): (KJS::LogicalNotNode::): (KJS::LogicalNotNode::precedence): (KJS::AddNode::): (KJS::AddNode::precedence): (KJS::LeftShiftNode::): (KJS::LeftShiftNode::precedence): (KJS::RightShiftNode::): (KJS::RightShiftNode::precedence): (KJS::UnsignedRightShiftNode::): (KJS::UnsignedRightShiftNode::precedence): (KJS::LessNode::): (KJS::LessNode::precedence): (KJS::GreaterNode::): (KJS::GreaterNode::precedence): (KJS::LessEqNode::): (KJS::LessEqNode::precedence): (KJS::GreaterEqNode::): (KJS::GreaterEqNode::precedence): (KJS::InstanceOfNode::): (KJS::InstanceOfNode::precedence): (KJS::InNode::): (KJS::InNode::precedence): (KJS::EqualNode::): (KJS::EqualNode::precedence): (KJS::NotEqualNode::): (KJS::NotEqualNode::precedence): (KJS::StrictEqualNode::): (KJS::StrictEqualNode::precedence): (KJS::NotStrictEqualNode::): (KJS::NotStrictEqualNode::precedence): (KJS::BitAndNode::): (KJS::BitAndNode::precedence): (KJS::BitOrNode::): (KJS::BitOrNode::precedence): (KJS::BitXOrNode::): (KJS::BitXOrNode::precedence): (KJS::LogicalAndNode::): (KJS::LogicalAndNode::precedence): (KJS::LogicalOrNode::): (KJS::LogicalOrNode::precedence): (KJS::ConditionalNode::): (KJS::ConditionalNode::precedence): (KJS::ReadModifyResolveNode::): (KJS::ReadModifyResolveNode::precedence): (KJS::AssignResolveNode::): (KJS::AssignResolveNode::precedence): (KJS::ReadModifyBracketNode::): (KJS::ReadModifyBracketNode::precedence): (KJS::AssignBracketNode::): (KJS::AssignBracketNode::precedence): (KJS::AssignDotNode::): (KJS::AssignDotNode::precedence): (KJS::ReadModifyDotNode::): (KJS::ReadModifyDotNode::precedence): (KJS::AssignErrorNode::): (KJS::AssignErrorNode::precedence): (KJS::CommaNode::): (KJS::CommaNode::precedence): (KJS::AssignExprNode::): (KJS::AssignExprNode::precedence): (KJS::ExprStatementNode::): (KJS::IfNode::): (KJS::DoWhileNode::): (KJS::WhileNode::): (KJS::ReturnNode::): (KJS::WithNode::): (KJS::ThrowNode::): (KJS::ParameterNode::): (KJS::CaseClauseNode::): (KJS::CaseClauseNode::precedence): (KJS::ClauseListNode::): (KJS::SwitchNode::):
File:
1 edited

Legend:

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

    r27589 r27622  
    118118    virtual ~Node();
    119119
    120     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL = 0;
    121     virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
    122120    UString toString() const KJS_FAST_CALL;
    123121    int lineNo() const KJS_FAST_CALL { return m_line; }
     
    127125    static void clearNewNodes() KJS_FAST_CALL;
    128126
    129     virtual bool isNumber() const KJS_FAST_CALL { return false; }
    130     virtual bool isLocation() const KJS_FAST_CALL { return false; }
    131     virtual bool isResolveNode() const KJS_FAST_CALL { return false; }
    132     virtual bool isBracketAccessorNode() const KJS_FAST_CALL { return false; }
    133     virtual bool isDotAccessorNode() const KJS_FAST_CALL { return false; }
    134 
    135127    // Serialization.
    136128    virtual void streamTo(SourceStream&) const KJS_FAST_CALL = 0;
     
    151143    Completion createErrorCompletion(ExecState *, ErrorType, const char *msg, const Identifier &) KJS_FAST_CALL;
    152144
    153     JSValue *throwError(ExecState *, ErrorType, const char *msg) KJS_FAST_CALL;
    154     JSValue* throwError(ExecState *, ErrorType, const char* msg, const char*) KJS_FAST_CALL;
    155     JSValue *throwError(ExecState *, ErrorType, const char *msg, JSValue *, Node *) KJS_FAST_CALL;
    156     JSValue *throwError(ExecState *, ErrorType, const char *msg, const Identifier &) KJS_FAST_CALL;
    157     JSValue *throwError(ExecState *, ErrorType, const char *msg, JSValue *, const Identifier &) KJS_FAST_CALL;
    158     JSValue *throwError(ExecState *, ErrorType, const char *msg, JSValue *, Node *, Node *) KJS_FAST_CALL;
    159     JSValue *throwError(ExecState *, ErrorType, const char *msg, JSValue *, Node *, const Identifier &) KJS_FAST_CALL;
    160 
    161     JSValue *throwUndefinedVariableError(ExecState *, const Identifier &) KJS_FAST_CALL;
     145    JSValue* throwError(ExecState*, ErrorType, const char* msg) KJS_FAST_CALL;
     146    JSValue* throwError(ExecState*, ErrorType, const char* msg, const char*) KJS_FAST_CALL;
     147    JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, Node*) KJS_FAST_CALL;
     148    JSValue* throwError(ExecState*, ErrorType, const char* msg, const Identifier&) KJS_FAST_CALL;
     149    JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, const Identifier&) KJS_FAST_CALL;
     150    JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, Node*, Node*) KJS_FAST_CALL;
     151    JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, Node*, const Identifier&) KJS_FAST_CALL;
     152
     153    JSValue* throwUndefinedVariableError(ExecState*, const Identifier&) KJS_FAST_CALL;
    162154
    163155    void handleException(ExecState*) KJS_FAST_CALL;
     
    173165    Node(const Node &other) KJS_FAST_CALL;
    174166  };
     167   
     168    class ExpressionNode : public Node {
     169    public:
     170        ExpressionNode() KJS_FAST_CALL
     171            : Node()
     172        {
     173        }
     174       
     175        // Special constructor for cases where we overwrite an object in place.
     176        ExpressionNode(PlacementNewAdoptType) KJS_FAST_CALL
     177            : Node(PlacementNewAdopt)
     178        {
     179        }
     180       
     181        virtual bool isNumber() const KJS_FAST_CALL { return false; }
     182        virtual bool isLocation() const KJS_FAST_CALL { return false; }
     183        virtual bool isResolveNode() const KJS_FAST_CALL { return false; }
     184        virtual bool isBracketAccessorNode() const KJS_FAST_CALL { return false; }
     185        virtual bool isDotAccessorNode() const KJS_FAST_CALL { return false; }
     186       
     187        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL = 0;
     188        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     189    };
    175190
    176191  class StatementNode : public Node {
     
    187202    LabelStack ls;
    188203  private:
    189     JSValue *evaluate(ExecState*) KJS_FAST_CALL { return jsUndefined(); }
    190204    int m_lastLine;
    191205  };
    192206
    193   class NullNode : public Node {
     207  class NullNode : public ExpressionNode {
    194208  public:
    195209    NullNode() KJS_FAST_CALL {}
    196     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     210    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    197211    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    198212    virtual Precedence precedence() const { return PrecPrimary; }
    199213  };
    200214
    201   class BooleanNode : public Node {
     215  class BooleanNode : public ExpressionNode {
    202216  public:
    203217    BooleanNode(bool v) KJS_FAST_CALL : value(v) {}
    204     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     218    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    205219    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    206220    virtual Precedence precedence() const { return PrecPrimary; }
     
    209223  };
    210224
    211   class NumberNode : public Node {
     225  class NumberNode : public ExpressionNode {
    212226  public:
    213227    NumberNode(double v) KJS_FAST_CALL : m_double(v) {}
     
    234248  };
    235249
    236   class StringNode : public Node {
     250  class StringNode : public ExpressionNode {
    237251  public:
    238252    StringNode(const UString *v) KJS_FAST_CALL { value = *v; }
     
    245259  };
    246260
    247   class RegExpNode : public Node {
     261  class RegExpNode : public ExpressionNode {
    248262  public:
    249263    RegExpNode(const UString &p, const UString &f) KJS_FAST_CALL
    250264      : pattern(p), flags(f) { }
    251     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     265    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    252266    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    253267    virtual Precedence precedence() const { return PrecPrimary; }
     
    256270  };
    257271
    258   class ThisNode : public Node {
     272  class ThisNode : public ExpressionNode {
    259273  public:
    260274    ThisNode() KJS_FAST_CALL {}
    261     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     275    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    262276    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    263277    virtual Precedence precedence() const { return PrecPrimary; }
    264278 };
    265279
    266   class ResolveNode : public Node {
     280  class ResolveNode : public ExpressionNode {
    267281  public:
    268282    ResolveNode(const Identifier &s) KJS_FAST_CALL
     
    273287    // Special constructor for cases where we overwrite an object in place.
    274288    ResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    275         : Node(PlacementNewAdopt)
    276         , ident(PlacementNewAdopt) 
     289        : ExpressionNode(PlacementNewAdopt)
     290        , ident(PlacementNewAdopt)
    277291    {
    278292    }
     
    280294    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    281295
    282     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     296    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    283297    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    284298    virtual Precedence precedence() const { return PrecPrimary; }
     
    308322  };
    309323
    310   class ElementNode : public Node {
    311   public:
    312     ElementNode(int e, Node* n) KJS_FAST_CALL : elision(e), node(n) { }
    313     ElementNode(ElementNode* l, int e, Node* n) KJS_FAST_CALL
     324  class ElementNode : public ExpressionNode {
     325  public:
     326    ElementNode(int e, ExpressionNode* n) KJS_FAST_CALL : elision(e), node(n) { }
     327    ElementNode(ElementNode* l, int e, ExpressionNode* n) KJS_FAST_CALL
    314328      : elision(e), node(n) { l->next = this; }
    315329    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    316     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     330    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    317331    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    318332    PassRefPtr<ElementNode> releaseNext() KJS_FAST_CALL { return next.release(); }
     
    322336    ListRefPtr<ElementNode> next;
    323337    int elision;
    324     RefPtr<Node> node;
    325   };
    326 
    327   class ArrayNode : public Node {
     338    RefPtr<ExpressionNode> node;
     339  };
     340
     341  class ArrayNode : public ExpressionNode {
    328342  public:
    329343    ArrayNode(int e) KJS_FAST_CALL : elision(e), opt(true) { }
    330     ArrayNode(ElementNode* ele) KJS_FAST_CALL
     344    ArrayNode(ElementNode*) KJS_FAST_CALL
    331345      : element(ele), elision(0), opt(false) { }
    332346    ArrayNode(int eli, ElementNode* ele) KJS_FAST_CALL
    333347      : element(ele), elision(eli), opt(true) { }
    334348    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    335     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     349    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    336350    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    337351    virtual Precedence precedence() const { return PrecPrimary; }
     
    342356  };
    343357
    344   class PropertyNode : public Node {
     358  class PropertyNode : public ExpressionNode {
    345359  public:
    346360    enum Type { Constant, Getter, Setter };
    347     PropertyNode(const Identifier& n, Node *a, Type t) KJS_FAST_CALL
     361    PropertyNode(const Identifier& n, ExpressionNode* a, Type t) KJS_FAST_CALL
    348362      : m_name(n), assign(a), type(t) { }
    349363    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    350     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     364    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    351365    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    352366    friend class PropertyListNode;
     
    355369  private:
    356370    Identifier m_name;
    357     RefPtr<Node> assign;
     371    RefPtr<ExpressionNode> assign;
    358372    Type type;
    359373  };
    360374 
    361   class PropertyListNode : public Node {
     375  class PropertyListNode : public ExpressionNode {
    362376  public:
    363377    PropertyListNode(PropertyNode* n) KJS_FAST_CALL
     
    366380      : node(n) { l->next = this; }
    367381    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    368     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     382    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    369383    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    370384    PassRefPtr<PropertyListNode> releaseNext() KJS_FAST_CALL { return next.release(); }
     
    376390  };
    377391
    378   class ObjectLiteralNode : public Node {
     392  class ObjectLiteralNode : public ExpressionNode {
    379393  public:
    380394    ObjectLiteralNode() KJS_FAST_CALL { }
    381395    ObjectLiteralNode(PropertyListNode* l) KJS_FAST_CALL : list(l) { }
    382396    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    383     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     397    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    384398    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    385399    virtual Precedence precedence() const { return PrecPrimary; }
     
    388402  };
    389403
    390   class BracketAccessorNode : public Node {
    391   public:
    392     BracketAccessorNode(Node *e1, Node *e2) KJS_FAST_CALL : expr1(e1), expr2(e2) {}
     404  class BracketAccessorNode : public ExpressionNode {
     405  public:
     406    BracketAccessorNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : expr1(e1), expr2(e2) {}
    393407    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    394408    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    399413    virtual bool isLocation() const KJS_FAST_CALL { return true; }
    400414    virtual bool isBracketAccessorNode() const KJS_FAST_CALL { return true; }
    401     Node *base() KJS_FAST_CALL { return expr1.get(); }
    402     Node *subscript() KJS_FAST_CALL { return expr2.get(); }
     415    ExpressionNode* base() KJS_FAST_CALL { return expr1.get(); }
     416    ExpressionNode* subscript() KJS_FAST_CALL { return expr2.get(); }
    403417
    404418  private:
    405419    ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
    406     RefPtr<Node> expr1;
    407     RefPtr<Node> expr2;
    408   };
    409 
    410   class DotAccessorNode : public Node {
    411   public:
    412     DotAccessorNode(Node *e, const Identifier &s) KJS_FAST_CALL : expr(e), ident(s) { }
    413     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    414     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     420    RefPtr<ExpressionNode> expr1;
     421    RefPtr<ExpressionNode> expr2;
     422  };
     423
     424  class DotAccessorNode : public ExpressionNode {
     425  public:
     426    DotAccessorNode(ExpressionNode* e, const Identifier& s) KJS_FAST_CALL : expr(e), ident(s) { }
     427    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     428    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    415429    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    416430    virtual Precedence precedence() const { return PrecMember; }
     
    418432    virtual bool isLocation() const KJS_FAST_CALL { return true; }
    419433    virtual bool isDotAccessorNode() const KJS_FAST_CALL { return true; }
    420     Node *base() const KJS_FAST_CALL { return expr.get(); }
     434    ExpressionNode* base() const KJS_FAST_CALL { return expr.get(); }
    421435    const Identifier& identifier() const KJS_FAST_CALL { return ident; }
    422436
    423437  private:
    424     RefPtr<Node> expr;
     438    RefPtr<ExpressionNode> expr;
    425439    Identifier ident;
    426440  };
    427441
    428   class ArgumentListNode : public Node {
    429   public:
    430     ArgumentListNode(Node* e) KJS_FAST_CALL : expr(e) { }
    431     ArgumentListNode(ArgumentListNode* l, Node* e) KJS_FAST_CALL
     442  class ArgumentListNode : public ExpressionNode {
     443  public:
     444    ArgumentListNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { }
     445    ArgumentListNode(ArgumentListNode* l, ExpressionNode* e) KJS_FAST_CALL
    432446      : expr(e) { l->next = this; }
    433447    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    434     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     448    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    435449    void evaluateList(ExecState*, List&) KJS_FAST_CALL;
    436450    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    440454    friend class ArgumentsNode;
    441455    ListRefPtr<ArgumentListNode> next;
    442     RefPtr<Node> expr;
    443   };
    444 
    445   class ArgumentsNode : public Node {
     456    RefPtr<ExpressionNode> expr;
     457  };
     458
     459  class ArgumentsNode : public ExpressionNode {
    446460  public:
    447461    ArgumentsNode() KJS_FAST_CALL { }
     
    449463      : listNode(l) { }
    450464    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    451     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     465    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    452466    void evaluateList(ExecState* exec, List& list) KJS_FAST_CALL { if (listNode) listNode->evaluateList(exec, list); }
    453467    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    457471  };
    458472
    459   class NewExprNode : public Node {
    460   public:
    461     NewExprNode(Node *e) KJS_FAST_CALL : expr(e) {}
    462     NewExprNode(Node *e, ArgumentsNode *a) KJS_FAST_CALL : expr(e), args(a) {}
    463     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    464     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     473  class NewExprNode : public ExpressionNode {
     474  public:
     475    NewExprNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     476    NewExprNode(ExpressionNode* e, ArgumentsNode* a) KJS_FAST_CALL : expr(e), args(a) {}
     477    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     478    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    465479    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    466480    virtual Precedence precedence() const { return PrecLeftHandSide; }
    467481  private:
    468     RefPtr<Node> expr;
     482    RefPtr<ExpressionNode> expr;
    469483    RefPtr<ArgumentsNode> args;
    470484  };
    471485
    472   class FunctionCallValueNode : public Node {
    473   public:
    474     FunctionCallValueNode(Node *e, ArgumentsNode *a) KJS_FAST_CALL : expr(e), args(a) {}
    475     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    476     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     486  class FunctionCallValueNode : public ExpressionNode {
     487  public:
     488    FunctionCallValueNode(ExpressionNode* e, ArgumentsNode* a) KJS_FAST_CALL : expr(e), args(a) {}
     489    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     490    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    477491    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    478492    virtual Precedence precedence() const { return PrecCall; }
    479493  private:
    480     RefPtr<Node> expr;
     494    RefPtr<ExpressionNode> expr;
    481495    RefPtr<ArgumentsNode> args;
    482496  };
    483497
    484   class FunctionCallResolveNode : public Node {
     498  class FunctionCallResolveNode : public ExpressionNode {
    485499  public:
    486500    FunctionCallResolveNode(const Identifier& i, ArgumentsNode* a) KJS_FAST_CALL
     
    491505
    492506    FunctionCallResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    493         : Node(PlacementNewAdopt)
     507        : ExpressionNode(PlacementNewAdopt)
    494508        , ident(PlacementNewAdopt)
    495509        , args(PlacementNewAdopt)
     
    498512
    499513    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    500     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     514    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    501515    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    502516    virtual Precedence precedence() const { return PrecCall; }
     
    517531    }
    518532
    519     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    520   };
    521 
    522   class FunctionCallBracketNode : public Node {
    523   public:
    524     FunctionCallBracketNode(Node *b, Node *s, ArgumentsNode *a) KJS_FAST_CALL : base(b), subscript(s), args(a) {}
    525     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    526     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     533    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     534  };
     535
     536  class FunctionCallBracketNode : public ExpressionNode {
     537  public:
     538    FunctionCallBracketNode(ExpressionNode* b, ExpressionNode* s, ArgumentsNode* a) KJS_FAST_CALL : base(b), subscript(s), args(a) {}
     539    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     540    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    527541    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    528542    virtual Precedence precedence() const { return PrecCall; }
    529543  protected:
    530     RefPtr<Node> base;
    531     RefPtr<Node> subscript;
     544    RefPtr<ExpressionNode> base;
     545    RefPtr<ExpressionNode> subscript;
    532546    RefPtr<ArgumentsNode> args;
    533547  };
    534548
    535   class FunctionCallDotNode : public Node {
    536   public:
    537     FunctionCallDotNode(Node *b, const Identifier &i, ArgumentsNode *a) KJS_FAST_CALL : base(b), ident(i), args(a) {}
    538     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    539     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     549  class FunctionCallDotNode : public ExpressionNode {
     550  public:
     551    FunctionCallDotNode(ExpressionNode* b, const Identifier& i, ArgumentsNode* a) KJS_FAST_CALL : base(b), ident(i), args(a) {}
     552    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     553    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    540554    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    541555    virtual Precedence precedence() const { return PrecCall; }
    542556  protected:
    543     RefPtr<Node> base;
     557    RefPtr<ExpressionNode> base;
    544558    Identifier ident;
    545559    RefPtr<ArgumentsNode> args;
    546560  };
    547561
    548   class PrePostResolveNode : public Node {
     562    class PrePostResolveNode : public ExpressionNode {
    549563  public:
    550564    PrePostResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
    551565     
    552566    PrePostResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    553         : Node(PlacementNewAdopt)
     567        : ExpressionNode(PlacementNewAdopt)
    554568        , m_ident(PlacementNewAdopt)
    555569    {
     
    571585
    572586    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    573     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     587    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    574588    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    575589    virtual Precedence precedence() const { return PrecPostfix; }
     
    587601    }
    588602
    589     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     603    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    590604    virtual void optimizeForUnnecessaryResult();
    591605  };
     
    601615
    602616    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    603     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     617    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    604618    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    605619    virtual Precedence precedence() const { return PrecPostfix; }
     
    616630    }
    617631
    618     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     632    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    619633    virtual void optimizeForUnnecessaryResult();
    620634  };
    621635
    622   class PostfixBracketNode : public Node {
    623   public:
    624     PostfixBracketNode(Node *b, Node *s) KJS_FAST_CALL : m_base(b), m_subscript(s) {}
     636    class PostfixBracketNode : public ExpressionNode {
     637  public:
     638    PostfixBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : m_base(b), m_subscript(s) {}
    625639    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    626640    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    628642  protected:
    629643    virtual bool isIncrement() const = 0;
    630     RefPtr<Node> m_base;
    631     RefPtr<Node> m_subscript;
     644    RefPtr<ExpressionNode> m_base;
     645    RefPtr<ExpressionNode> m_subscript;
    632646  };
    633647
    634648  class PostIncBracketNode : public PostfixBracketNode {
    635649  public:
    636     PostIncBracketNode(Node *b, Node *s) KJS_FAST_CALL : PostfixBracketNode(b, s) {}
    637     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     650    PostIncBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : PostfixBracketNode(b, s) {}
     651    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    638652  protected:
    639653    virtual bool isIncrement() const { return true; }
     
    642656  class PostDecBracketNode : public PostfixBracketNode {
    643657  public:
    644     PostDecBracketNode(Node *b, Node *s) KJS_FAST_CALL : PostfixBracketNode(b, s) {}
    645     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     658    PostDecBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : PostfixBracketNode(b, s) {}
     659    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    646660  protected:
    647661    virtual bool isIncrement() const { return false; }
    648662  };
    649663
    650   class PostfixDotNode : public Node {
    651   public:
    652     PostfixDotNode(Node *b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {}
     664    class PostfixDotNode : public ExpressionNode {
     665  public:
     666    PostfixDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {}
    653667    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    654668    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    656670  protected:
    657671    virtual bool isIncrement() const = 0;
    658     RefPtr<Node> m_base;
     672    RefPtr<ExpressionNode> m_base;
    659673    Identifier m_ident;
    660674  };
     
    662676  class PostIncDotNode : public PostfixDotNode {
    663677  public:
    664     PostIncDotNode(Node *b, const Identifier& i) KJS_FAST_CALL : PostfixDotNode(b, i) {}
    665     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     678    PostIncDotNode(ExpressionNode*  b, const Identifier& i) KJS_FAST_CALL : PostfixDotNode(b, i) {}
     679    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    666680  protected:
    667681    virtual bool isIncrement() const { return true; }
     
    670684  class PostDecDotNode : public PostfixDotNode {
    671685  public:
    672     PostDecDotNode(Node *b, const Identifier& i) KJS_FAST_CALL : PostfixDotNode(b, i) {}
    673     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     686    PostDecDotNode(ExpressionNode*  b, const Identifier& i) KJS_FAST_CALL : PostfixDotNode(b, i) {}
     687    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    674688  protected:
    675689    virtual bool isIncrement() const { return false; }
    676690  };
    677691
    678   class PostfixErrorNode : public Node {
    679   public:
    680     PostfixErrorNode(Node* e, Operator o) KJS_FAST_CALL : m_expr(e), m_oper(o) {}
    681     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     692  class PostfixErrorNode : public ExpressionNode {
     693  public:
     694    PostfixErrorNode(ExpressionNode* e, Operator o) KJS_FAST_CALL : m_expr(e), m_oper(o) {}
     695    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    682696    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    683697    virtual Precedence precedence() const { return PrecPostfix; }
    684698  private:
    685     RefPtr<Node> m_expr;
     699    RefPtr<ExpressionNode> m_expr;
    686700    Operator m_oper;
    687701  };
    688702
    689   class DeleteResolveNode : public Node {
     703  class DeleteResolveNode : public ExpressionNode {
    690704  public:
    691705    DeleteResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
    692706    DeleteResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    693         : Node(PlacementNewAdopt)
     707        : ExpressionNode(PlacementNewAdopt)
    694708        , m_ident(PlacementNewAdopt)
    695709    {
     
    697711
    698712    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    699     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     713    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    700714    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    701715    virtual Precedence precedence() const { return PrecUnary; }
     
    711725    }
    712726
    713     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    714   };
    715 
    716   class DeleteBracketNode : public Node {
    717   public:
    718     DeleteBracketNode(Node *base, Node *subscript) KJS_FAST_CALL : m_base(base), m_subscript(subscript) {}
    719     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    720     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     727    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     728  };
     729
     730  class DeleteBracketNode : public ExpressionNode {
     731  public:
     732    DeleteBracketNode(ExpressionNode* base, ExpressionNode* subscript) KJS_FAST_CALL : m_base(base), m_subscript(subscript) {}
     733    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     734    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    721735    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    722736    virtual Precedence precedence() const { return PrecUnary; }
    723737  private:
    724     RefPtr<Node> m_base;
    725     RefPtr<Node> m_subscript;
    726   };
    727 
    728   class DeleteDotNode : public Node {
    729   public:
    730     DeleteDotNode(Node *base, const Identifier& i) KJS_FAST_CALL : m_base(base), m_ident(i) {}
    731     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    732     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     738    RefPtr<ExpressionNode> m_base;
     739    RefPtr<ExpressionNode> m_subscript;
     740  };
     741
     742  class DeleteDotNode : public ExpressionNode {
     743  public:
     744    DeleteDotNode(ExpressionNode* base, const Identifier& i) KJS_FAST_CALL : m_base(base), m_ident(i) {}
     745    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     746    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    733747    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    734748    virtual Precedence precedence() const { return PrecUnary; }
    735749  private:
    736     RefPtr<Node> m_base;
     750    RefPtr<ExpressionNode> m_base;
    737751    Identifier m_ident;
    738752  };
    739753
    740   class DeleteValueNode : public Node {
    741   public:
    742     DeleteValueNode(Node *e) KJS_FAST_CALL : m_expr(e) {}
    743     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    744     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     754  class DeleteValueNode : public ExpressionNode {
     755  public:
     756    DeleteValueNode(ExpressionNode* e) KJS_FAST_CALL : m_expr(e) {}
     757    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     758    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    745759    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    746760    virtual Precedence precedence() const { return PrecUnary; }
    747761  private:
    748     RefPtr<Node> m_expr;
    749   };
    750 
    751   class VoidNode : public Node {
    752   public:
    753     VoidNode(Node *e) KJS_FAST_CALL : expr(e) {}
    754     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    755     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     762    RefPtr<ExpressionNode> m_expr;
     763  };
     764
     765  class VoidNode : public ExpressionNode {
     766  public:
     767    VoidNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     768    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     769    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    756770    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    757771    virtual Precedence precedence() const { return PrecUnary; }
    758772  private:
    759     RefPtr<Node> expr;
    760   };
    761 
    762   class TypeOfResolveNode : public Node {
     773    RefPtr<ExpressionNode> expr;
     774  };
     775
     776  class TypeOfResolveNode : public ExpressionNode {
    763777  public:
    764778    TypeOfResolveNode(const Identifier &s) KJS_FAST_CALL
     
    768782   
    769783    TypeOfResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    770         : Node(PlacementNewAdopt)
     784        : ExpressionNode(PlacementNewAdopt)
    771785        , m_ident(PlacementNewAdopt)
    772786    {
     
    775789    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    776790   
    777     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     791    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    778792    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    779793    virtual Precedence precedence() const { return PrecUnary; }
     
    795809    }
    796810
    797     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    798   };
    799 
    800   class TypeOfValueNode : public Node {
    801   public:
    802     TypeOfValueNode(Node *e) KJS_FAST_CALL : m_expr(e) {}
    803     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    804     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     811    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     812  };
     813
     814  class TypeOfValueNode : public ExpressionNode {
     815  public:
     816    TypeOfValueNode(ExpressionNode* e) KJS_FAST_CALL : m_expr(e) {}
     817    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     818    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    805819    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    806820    virtual Precedence precedence() const { return PrecUnary; }
    807821  private:
    808     RefPtr<Node> m_expr;
     822    RefPtr<ExpressionNode> m_expr;
    809823  };
    810824
     
    823837    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    824838
    825     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     839    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    826840    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    827841    virtual Precedence precedence() const { return PrecUnary; }
     
    837851    }
    838852   
    839     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     853    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    840854  };
    841855 
     
    854868    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    855869
    856     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     870    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    857871    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    858872    virtual Precedence precedence() const { return PrecUnary; }
     
    868882    }
    869883   
    870     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     884    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    871885  };
    872886 
    873   class PrefixBracketNode : public Node {
    874   public:
    875     PrefixBracketNode(Node *b, Node *s) KJS_FAST_CALL : m_base(b), m_subscript(s) {}
     887  class PrefixBracketNode : public ExpressionNode {
     888  public:
     889    PrefixBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : m_base(b), m_subscript(s) {}
    876890   
    877891    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     
    880894  protected:
    881895    virtual bool isIncrement() const = 0;
    882     RefPtr<Node> m_base;
    883     RefPtr<Node> m_subscript;
     896    RefPtr<ExpressionNode> m_base;
     897    RefPtr<ExpressionNode> m_subscript;
    884898  };
    885899 
    886900  class PreIncBracketNode : public PrefixBracketNode {
    887901  public:
    888     PreIncBracketNode(Node *b, Node *s) KJS_FAST_CALL : PrefixBracketNode(b, s) {}
    889     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     902    PreIncBracketNode(ExpressionNode*  b, ExpressionNode*  s) KJS_FAST_CALL : PrefixBracketNode(b, s) {}
     903    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    890904  protected:
    891905    bool isIncrement() const { return true; }
     
    894908  class PreDecBracketNode : public PrefixBracketNode {
    895909  public:
    896     PreDecBracketNode(Node *b, Node *s) KJS_FAST_CALL : PrefixBracketNode(b, s) {}
    897     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     910    PreDecBracketNode(ExpressionNode*  b, ExpressionNode*  s) KJS_FAST_CALL : PrefixBracketNode(b, s) {}
     911    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    898912  protected:
    899913    bool isIncrement() const { return false; }
    900914  };
    901915
    902   class PrefixDotNode : public Node {
    903   public:
    904     PrefixDotNode(Node *b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {}
     916  class PrefixDotNode : public ExpressionNode {
     917  public:
     918    PrefixDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {}
    905919    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    906920    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    908922  protected:
    909923    virtual bool isIncrement() const = 0;
    910     RefPtr<Node> m_base;
     924    RefPtr<ExpressionNode> m_base;
    911925    Identifier m_ident;
    912926  };
     
    914928  class PreIncDotNode : public PrefixDotNode {
    915929  public:
    916     PreIncDotNode(Node *b, const Identifier& i) KJS_FAST_CALL : PrefixDotNode(b, i) {}
    917     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     930    PreIncDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : PrefixDotNode(b, i) {}
     931    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    918932  protected:
    919933    virtual bool isIncrement() const { return true; }
     
    922936  class PreDecDotNode : public PrefixDotNode {
    923937  public:
    924     PreDecDotNode(Node *b, const Identifier& i) KJS_FAST_CALL : PrefixDotNode(b, i) {}
    925     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     938    PreDecDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : PrefixDotNode(b, i) {}
     939    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    926940  protected:
    927941    virtual bool isIncrement() const { return false; }
    928942  };
    929943
    930   class PrefixErrorNode : public Node {
    931   public:
    932     PrefixErrorNode(Node* e, Operator o) KJS_FAST_CALL : m_expr(e), m_oper(o) {}
    933     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     944  class PrefixErrorNode : public ExpressionNode {
     945  public:
     946    PrefixErrorNode(ExpressionNode* e, Operator o) KJS_FAST_CALL : m_expr(e), m_oper(o) {}
     947    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    934948    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    935949    virtual Precedence precedence() const { return PrecUnary; }
    936950  private:
    937     RefPtr<Node> m_expr;
     951    RefPtr<ExpressionNode> m_expr;
    938952    Operator m_oper;
    939953  };
    940954
    941   class UnaryPlusNode : public Node {
    942   public:
    943     UnaryPlusNode(Node *e) KJS_FAST_CALL : expr(e) {}
    944     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    945     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     955  class UnaryPlusNode : public ExpressionNode {
     956  public:
     957    UnaryPlusNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     958    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     959    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    946960    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    947961    virtual Precedence precedence() const { return PrecUnary; }
    948962  private:
    949     RefPtr<Node> expr;
    950   };
    951 
    952   class NegateNode : public Node {
    953   public:
    954     NegateNode(Node *e) KJS_FAST_CALL : expr(e) {}
     963    RefPtr<ExpressionNode> expr;
     964  };
     965
     966  class NegateNode : public ExpressionNode {
     967  public:
     968    NegateNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
    955969    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    956970    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    959973    virtual Precedence precedence() const { return PrecUnary; }
    960974  private:
    961     RefPtr<Node> expr;
    962   };
    963 
    964   class BitwiseNotNode : public Node {
    965   public:
    966     BitwiseNotNode(Node *e) KJS_FAST_CALL : expr(e) {}
    967     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    968     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     975    RefPtr<ExpressionNode> expr;
     976  };
     977
     978  class BitwiseNotNode : public ExpressionNode {
     979  public:
     980    BitwiseNotNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     981    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     982    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    969983    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    970984    virtual Precedence precedence() const { return PrecUnary; }
    971985  private:
    972     RefPtr<Node> expr;
    973   };
    974 
    975   class LogicalNotNode : public Node {
    976   public:
    977     LogicalNotNode(Node *e) KJS_FAST_CALL : expr(e) {}
    978     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    979     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     986    RefPtr<ExpressionNode> expr;
     987  };
     988
     989  class LogicalNotNode : public ExpressionNode {
     990  public:
     991    LogicalNotNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     992    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     993    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    980994    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    981995    virtual Precedence precedence() const { return PrecUnary; }
    982996  private:
    983     RefPtr<Node> expr;
     997    RefPtr<ExpressionNode> expr;
    984998  };
    985999 
    986   class MultNode : public Node {
    987   public:
    988       MultNode(Node *t1, Node *t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1000  class MultNode : public ExpressionNode {
     1001  public:
     1002      MultNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
    9891003      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    9901004      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    9941008  private:
    9951009      ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
    996       RefPtr<Node> term1;
    997       RefPtr<Node> term2;
     1010      RefPtr<ExpressionNode> term1;
     1011      RefPtr<ExpressionNode> term2;
    9981012  };
    9991013 
    1000   class DivNode : public Node {
    1001   public:
    1002       DivNode(Node *t1, Node *t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1014  class DivNode : public ExpressionNode {
     1015  public:
     1016      DivNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
    10031017      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10041018      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10081022  private:
    10091023      ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
    1010       RefPtr<Node> term1;
    1011       RefPtr<Node> term2;
     1024      RefPtr<ExpressionNode> term1;
     1025      RefPtr<ExpressionNode> term2;
    10121026  };
    10131027 
    1014   class ModNode : public Node {
    1015   public:
    1016       ModNode(Node *t1, Node *t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1028  class ModNode : public ExpressionNode {
     1029  public:
     1030      ModNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
    10171031      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10181032      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10221036  private:
    10231037      ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
    1024       RefPtr<Node> term1;
    1025       RefPtr<Node> term2;
    1026   };
    1027 
    1028   class AddNode : public Node {
    1029   public:
    1030     AddNode(Node *t1, Node *t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1038      RefPtr<ExpressionNode> term1;
     1039      RefPtr<ExpressionNode> term2;
     1040  };
     1041
     1042  class AddNode : public ExpressionNode {
     1043  public:
     1044    AddNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
    10311045    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10321046    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10351049    virtual Precedence precedence() const { return PrecAdditive; }
    10361050  private:
    1037     RefPtr<Node> term1;
    1038     RefPtr<Node> term2;
     1051    RefPtr<ExpressionNode> term1;
     1052    RefPtr<ExpressionNode> term2;
    10391053  };
    10401054 
    1041   class SubNode : public Node {
    1042   public:
    1043       SubNode(Node *t1, Node *t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1055  class SubNode : public ExpressionNode {
     1056  public:
     1057      SubNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
    10441058      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10451059      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10491063  private:
    10501064      ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
    1051       RefPtr<Node> term1;
    1052       RefPtr<Node> term2;
    1053   };
    1054 
    1055   class LeftShiftNode : public Node {
    1056   public:
    1057     LeftShiftNode(Node *t1, Node *t2) KJS_FAST_CALL
     1065      RefPtr<ExpressionNode> term1;
     1066      RefPtr<ExpressionNode> term2;
     1067  };
     1068
     1069  class LeftShiftNode : public ExpressionNode {
     1070  public:
     1071    LeftShiftNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL
    10581072      : term1(t1), term2(t2) {}
    10591073    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1060     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1074    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10611075    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    10621076    virtual Precedence precedence() const { return PrecShift; }
    10631077  private:
    1064     RefPtr<Node> term1;
    1065     RefPtr<Node> term2;
    1066   };
    1067 
    1068   class RightShiftNode : public Node {
    1069   public:
    1070     RightShiftNode(Node *t1, Node *t2) KJS_FAST_CALL
     1078    RefPtr<ExpressionNode> term1;
     1079    RefPtr<ExpressionNode> term2;
     1080  };
     1081
     1082  class RightShiftNode : public ExpressionNode {
     1083  public:
     1084    RightShiftNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL
    10711085      : term1(t1), term2(t2) {}
    10721086    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1073     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1087    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10741088    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    10751089    virtual Precedence precedence() const { return PrecShift; }
    10761090  private:
    1077     RefPtr<Node> term1;
    1078     RefPtr<Node> term2;
    1079   };
    1080 
    1081   class UnsignedRightShiftNode : public Node {
    1082   public:
    1083     UnsignedRightShiftNode(Node *t1, Node *t2) KJS_FAST_CALL
     1091    RefPtr<ExpressionNode> term1;
     1092    RefPtr<ExpressionNode> term2;
     1093  };
     1094
     1095  class UnsignedRightShiftNode : public ExpressionNode {
     1096  public:
     1097    UnsignedRightShiftNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL
    10841098      : term1(t1), term2(t2) {}
    10851099    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1086     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1100    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10871101    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    10881102    virtual Precedence precedence() const { return PrecShift; }
    10891103  private:
    1090     RefPtr<Node> term1;
    1091     RefPtr<Node> term2;
    1092   };
    1093 
    1094   class LessNode : public Node {
    1095   public:
    1096     LessNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1104    RefPtr<ExpressionNode> term1;
     1105    RefPtr<ExpressionNode> term2;
     1106  };
     1107
     1108  class LessNode : public ExpressionNode {
     1109  public:
     1110    LessNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    10971111      expr1(e1), expr2(e2) {}
    10981112    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1099     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1113    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11001114    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11011115    virtual Precedence precedence() const { return PrecRelational; }
    11021116  private:
    1103     RefPtr<Node> expr1;
    1104     RefPtr<Node> expr2;
    1105   };
    1106 
    1107   class GreaterNode : public Node {
    1108   public:
    1109     GreaterNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1117    RefPtr<ExpressionNode> expr1;
     1118    RefPtr<ExpressionNode> expr2;
     1119  };
     1120
     1121  class GreaterNode : public ExpressionNode {
     1122  public:
     1123    GreaterNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    11101124      expr1(e1), expr2(e2) {}
    11111125    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1112     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1126    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11131127    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11141128    virtual Precedence precedence() const { return PrecRelational; }
    11151129  private:
    1116     RefPtr<Node> expr1;
    1117     RefPtr<Node> expr2;
    1118   };
    1119 
    1120   class LessEqNode : public Node {
    1121   public:
    1122     LessEqNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1130    RefPtr<ExpressionNode> expr1;
     1131    RefPtr<ExpressionNode> expr2;
     1132  };
     1133
     1134  class LessEqNode : public ExpressionNode {
     1135  public:
     1136    LessEqNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    11231137      expr1(e1), expr2(e2) {}
    11241138    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1125     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1139    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11261140    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11271141    virtual Precedence precedence() const { return PrecRelational; }
    11281142  private:
    1129     RefPtr<Node> expr1;
    1130     RefPtr<Node> expr2;
    1131   };
    1132 
    1133   class GreaterEqNode : public Node {
    1134   public:
    1135     GreaterEqNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1143    RefPtr<ExpressionNode> expr1;
     1144    RefPtr<ExpressionNode> expr2;
     1145  };
     1146
     1147  class GreaterEqNode : public ExpressionNode {
     1148  public:
     1149    GreaterEqNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    11361150      expr1(e1), expr2(e2) {}
    11371151    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1138     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1152    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11391153    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11401154    virtual Precedence precedence() const { return PrecRelational; }
    11411155  private:
    1142     RefPtr<Node> expr1;
    1143     RefPtr<Node> expr2;
    1144   };
    1145 
    1146   class InstanceOfNode : public Node {
    1147   public:
    1148     InstanceOfNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1156    RefPtr<ExpressionNode> expr1;
     1157    RefPtr<ExpressionNode> expr2;
     1158  };
     1159
     1160    class InstanceOfNode : public ExpressionNode {
     1161  public:
     1162    InstanceOfNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    11491163      expr1(e1), expr2(e2) {}
    11501164    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1151     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1165    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11521166    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11531167    virtual Precedence precedence() const { return PrecRelational; }
    11541168  private:
    1155     RefPtr<Node> expr1;
    1156     RefPtr<Node> expr2;
    1157   };
    1158 
    1159   class InNode : public Node {
    1160   public:
    1161     InNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1169    RefPtr<ExpressionNode> expr1;
     1170    RefPtr<ExpressionNode> expr2;
     1171  };
     1172
     1173    class InNode : public ExpressionNode {
     1174  public:
     1175    InNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    11621176      expr1(e1), expr2(e2) {}
    11631177    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1164     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1178    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11651179    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11661180    virtual Precedence precedence() const { return PrecRelational; }
    11671181  private:
    1168     RefPtr<Node> expr1;
    1169     RefPtr<Node> expr2;
    1170   };
    1171 
    1172   class EqualNode : public Node {
    1173   public:
    1174     EqualNode(Node *e1, Node *e2) KJS_FAST_CALL
     1182    RefPtr<ExpressionNode> expr1;
     1183    RefPtr<ExpressionNode> expr2;
     1184  };
     1185
     1186    class EqualNode : public ExpressionNode {
     1187  public:
     1188    EqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    11751189      : expr1(e1), expr2(e2) {}
    11761190    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1177     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1191    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11781192    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11791193    virtual Precedence precedence() const { return PrecEquality; }
    11801194  private:
    1181     RefPtr<Node> expr1;
    1182     RefPtr<Node> expr2;
    1183   };
    1184 
    1185   class NotEqualNode : public Node {
    1186   public:
    1187     NotEqualNode(Node *e1, Node *e2) KJS_FAST_CALL
     1195    RefPtr<ExpressionNode> expr1;
     1196    RefPtr<ExpressionNode> expr2;
     1197  };
     1198
     1199    class NotEqualNode : public ExpressionNode {
     1200  public:
     1201    NotEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    11881202      : expr1(e1), expr2(e2) {}
    11891203    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1190     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1204    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11911205    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11921206    virtual Precedence precedence() const { return PrecEquality; }
    11931207  private:
    1194     RefPtr<Node> expr1;
    1195     RefPtr<Node> expr2;
    1196   };
    1197 
    1198   class StrictEqualNode : public Node {
    1199   public:
    1200     StrictEqualNode(Node *e1, Node *e2) KJS_FAST_CALL
     1208    RefPtr<ExpressionNode> expr1;
     1209    RefPtr<ExpressionNode> expr2;
     1210  };
     1211
     1212    class StrictEqualNode : public ExpressionNode {
     1213  public:
     1214    StrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    12011215      : expr1(e1), expr2(e2) {}
    12021216    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1203     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1217    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12041218    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    12051219    virtual Precedence precedence() const { return PrecEquality; }
    12061220  private:
    1207     RefPtr<Node> expr1;
    1208     RefPtr<Node> expr2;
    1209   };
    1210 
    1211   class NotStrictEqualNode : public Node {
    1212   public:
    1213     NotStrictEqualNode(Node *e1, Node *e2) KJS_FAST_CALL
     1221    RefPtr<ExpressionNode> expr1;
     1222    RefPtr<ExpressionNode> expr2;
     1223  };
     1224
     1225    class NotStrictEqualNode : public ExpressionNode {
     1226  public:
     1227    NotStrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    12141228      : expr1(e1), expr2(e2) {}
    12151229    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1216     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1230    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12171231    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    12181232    virtual Precedence precedence() const { return PrecEquality; }
    12191233  private:
    1220     RefPtr<Node> expr1;
    1221     RefPtr<Node> expr2;
    1222   };
    1223 
    1224   class BitAndNode : public Node {
    1225   public:
    1226     BitAndNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1234    RefPtr<ExpressionNode> expr1;
     1235    RefPtr<ExpressionNode> expr2;
     1236  };
     1237
     1238    class BitAndNode : public ExpressionNode {
     1239  public:
     1240    BitAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12271241      expr1(e1), expr2(e2) {}
    12281242    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1229     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1243    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12301244    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    12311245    virtual Precedence precedence() const { return PrecBitwiseAnd; }
    12321246  private:
    1233     RefPtr<Node> expr1;
    1234     RefPtr<Node> expr2;
    1235   };
    1236 
    1237   class BitOrNode : public Node {
    1238   public:
    1239     BitOrNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1247    RefPtr<ExpressionNode> expr1;
     1248    RefPtr<ExpressionNode> expr2;
     1249  };
     1250
     1251    class BitOrNode : public ExpressionNode {
     1252  public:
     1253    BitOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12401254      expr1(e1), expr2(e2) {}
    12411255    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1242     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1256    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12431257    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    12441258    virtual Precedence precedence() const { return PrecBitwiseOr; }
    12451259  private:
    1246     RefPtr<Node> expr1;
    1247     RefPtr<Node> expr2;
    1248   };
    1249 
    1250   class BitXOrNode : public Node {
    1251   public:
    1252     BitXOrNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1260    RefPtr<ExpressionNode> expr1;
     1261    RefPtr<ExpressionNode> expr2;
     1262  };
     1263
     1264    class BitXOrNode : public ExpressionNode {
     1265  public:
     1266    BitXOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12531267      expr1(e1), expr2(e2) {}
    12541268    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1255     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1269    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12561270    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    12571271    virtual Precedence precedence() const { return PrecBitwiseXor; }
    12581272  private:
    1259     RefPtr<Node> expr1;
    1260     RefPtr<Node> expr2;
     1273    RefPtr<ExpressionNode> expr1;
     1274    RefPtr<ExpressionNode> expr2;
    12611275  };
    12621276
     
    12641278   * expr1 && expr2, expr1 || expr2
    12651279   */
    1266   class LogicalAndNode : public Node {
    1267   public:
    1268     LogicalAndNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1280    class LogicalAndNode : public ExpressionNode {
     1281  public:
     1282    LogicalAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12691283      expr1(e1), expr2(e2) {}
    12701284    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1271     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1285    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12721286    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    12731287    virtual Precedence precedence() const { return PrecLogicalAnd; }
    12741288  private:
    1275     RefPtr<Node> expr1;
    1276     RefPtr<Node> expr2;
     1289    RefPtr<ExpressionNode> expr1;
     1290    RefPtr<ExpressionNode> expr2;
    12771291  };
    12781292 
    1279   class LogicalOrNode : public Node {
    1280   public:
    1281     LogicalOrNode(Node *e1, Node *e2) KJS_FAST_CALL :
     1293    class LogicalOrNode : public ExpressionNode {
     1294  public:
     1295    LogicalOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12821296      expr1(e1), expr2(e2) {}
    12831297    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1284     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1298    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12851299    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    12861300    virtual Precedence precedence() const { return PrecLogicalOr; }
    12871301  private:
    1288     RefPtr<Node> expr1;
    1289     RefPtr<Node> expr2;
     1302    RefPtr<ExpressionNode> expr1;
     1303    RefPtr<ExpressionNode> expr2;
    12901304  };
    12911305
     
    12931307   * The ternary operator, "logical ? expr1 : expr2"
    12941308   */
    1295   class ConditionalNode : public Node {
    1296   public:
    1297     ConditionalNode(Node *l, Node *e1, Node *e2) KJS_FAST_CALL :
     1309    class ConditionalNode : public ExpressionNode {
     1310  public:
     1311    ConditionalNode(ExpressionNode*  l, ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12981312      logical(l), expr1(e1), expr2(e2) {}
    12991313    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1300     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1314    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13011315    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    13021316    virtual Precedence precedence() const { return PrecConditional; }
    13031317  private:
    1304     RefPtr<Node> logical;
    1305     RefPtr<Node> expr1;
    1306     RefPtr<Node> expr2;
    1307   };
    1308 
    1309   class ReadModifyResolveNode : public Node {
    1310   public:
    1311     ReadModifyResolveNode(const Identifier &ident, Operator oper, Node *right) KJS_FAST_CALL
     1318    RefPtr<ExpressionNode> logical;
     1319    RefPtr<ExpressionNode> expr1;
     1320    RefPtr<ExpressionNode> expr2;
     1321  };
     1322
     1323    class ReadModifyResolveNode : public ExpressionNode {
     1324  public:
     1325    ReadModifyResolveNode(const Identifier &ident, Operator oper, ExpressionNode*  right) KJS_FAST_CALL
    13121326      : m_ident(ident)
    13131327      , m_oper(oper)
     
    13171331
    13181332    ReadModifyResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    1319       : Node(PlacementNewAdopt)
     1333      : ExpressionNode(PlacementNewAdopt)
    13201334      , m_ident(PlacementNewAdopt)
    13211335      , m_right(PlacementNewAdopt)
     
    13241338
    13251339    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1326     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1340    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13271341    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    13281342    virtual Precedence precedence() const { return PrecAssignment; }
     
    13301344    Identifier m_ident;
    13311345    Operator m_oper;
    1332     RefPtr<Node> m_right;
     1346    RefPtr<ExpressionNode> m_right;
    13331347    size_t m_index; // Used by ReadModifyLocalVarNode.
    13341348  };
     
    13431357    }
    13441358   
    1345     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    1346   };
    1347 
    1348   class AssignResolveNode : public Node {
    1349   public:
    1350      AssignResolveNode(const Identifier &ident, Node *right) KJS_FAST_CALL
     1359    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1360  };
     1361
     1362    class AssignResolveNode : public ExpressionNode {
     1363  public:
     1364     AssignResolveNode(const Identifier &ident, ExpressionNode*  right) KJS_FAST_CALL
    13511365      : m_ident(ident)
    13521366      , m_right(right)
     
    13551369
    13561370    AssignResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
    1357       : Node(PlacementNewAdopt)
     1371      : ExpressionNode(PlacementNewAdopt)
    13581372      , m_ident(PlacementNewAdopt)
    13591373      , m_right(PlacementNewAdopt)
     
    13621376
    13631377    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1364     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1378    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13651379    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    13661380    virtual Precedence precedence() const { return PrecAssignment; }
    13671381  protected:
    13681382    Identifier m_ident;
    1369     RefPtr<Node> m_right;
     1383    RefPtr<ExpressionNode> m_right;
    13701384    size_t m_index; // Used by ReadModifyLocalVarNode.
    13711385  };
     
    13801394    }
    13811395   
    1382     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    1383   };
    1384 
    1385   class ReadModifyBracketNode : public Node {
    1386   public:
    1387     ReadModifyBracketNode(Node *base, Node *subscript, Operator oper, Node *right) KJS_FAST_CALL
     1396    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1397  };
     1398
     1399    class ReadModifyBracketNode : public ExpressionNode {
     1400  public:
     1401    ReadModifyBracketNode(ExpressionNode*  base, ExpressionNode*  subscript, Operator oper, ExpressionNode*  right) KJS_FAST_CALL
    13881402      : m_base(base), m_subscript(subscript), m_oper(oper), m_right(right) {}
    13891403    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1390     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1404    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13911405    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    13921406    virtual Precedence precedence() const { return PrecAssignment; }
    13931407  protected:
    1394     RefPtr<Node> m_base;
    1395     RefPtr<Node> m_subscript;
     1408    RefPtr<ExpressionNode> m_base;
     1409    RefPtr<ExpressionNode> m_subscript;
    13961410    Operator m_oper;
    1397     RefPtr<Node> m_right;
    1398   };
    1399 
    1400   class AssignBracketNode : public Node {
    1401   public:
    1402     AssignBracketNode(Node *base, Node *subscript, Node *right) KJS_FAST_CALL
     1411    RefPtr<ExpressionNode> m_right;
     1412  };
     1413
     1414    class AssignBracketNode : public ExpressionNode {
     1415  public:
     1416    AssignBracketNode(ExpressionNode*  base, ExpressionNode*  subscript, ExpressionNode*  right) KJS_FAST_CALL
    14031417      : m_base(base), m_subscript(subscript), m_right(right) {}
    14041418    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1405     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1419    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14061420    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    14071421    virtual Precedence precedence() const { return PrecAssignment; }
    14081422  protected:
    1409     RefPtr<Node> m_base;
    1410     RefPtr<Node> m_subscript;
    1411     RefPtr<Node> m_right;
    1412   };
    1413 
    1414   class AssignDotNode : public Node {
    1415   public:
    1416     AssignDotNode(Node *base, const Identifier& ident, Node *right) KJS_FAST_CALL
     1423    RefPtr<ExpressionNode> m_base;
     1424    RefPtr<ExpressionNode> m_subscript;
     1425    RefPtr<ExpressionNode> m_right;
     1426  };
     1427
     1428    class AssignDotNode : public ExpressionNode {
     1429  public:
     1430    AssignDotNode(ExpressionNode*  base, const Identifier& ident, ExpressionNode*  right) KJS_FAST_CALL
    14171431      : m_base(base), m_ident(ident), m_right(right) {}
    14181432    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1419     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1433    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14201434    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    14211435    virtual Precedence precedence() const { return PrecAssignment; }
    14221436  protected:
    1423     RefPtr<Node> m_base;
     1437    RefPtr<ExpressionNode> m_base;
    14241438    Identifier m_ident;
    1425     RefPtr<Node> m_right;
    1426   };
    1427 
    1428   class ReadModifyDotNode : public Node {
    1429   public:
    1430     ReadModifyDotNode(Node *base, const Identifier& ident, Operator oper, Node *right) KJS_FAST_CALL
     1439    RefPtr<ExpressionNode> m_right;
     1440  };
     1441
     1442    class ReadModifyDotNode : public ExpressionNode {
     1443  public:
     1444    ReadModifyDotNode(ExpressionNode*  base, const Identifier& ident, Operator oper, ExpressionNode*  right) KJS_FAST_CALL
    14311445      : m_base(base), m_ident(ident), m_oper(oper), m_right(right) {}
    14321446    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1433     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1447    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14341448    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    14351449    virtual Precedence precedence() const { return PrecAssignment; }
    14361450  protected:
    1437     RefPtr<Node> m_base;
     1451    RefPtr<ExpressionNode> m_base;
    14381452    Identifier m_ident;
    14391453    Operator m_oper;
    1440     RefPtr<Node> m_right;
    1441   };
    1442 
    1443   class AssignErrorNode : public Node {
    1444   public:
    1445     AssignErrorNode(Node* left, Operator oper, Node* right) KJS_FAST_CALL
     1454    RefPtr<ExpressionNode> m_right;
     1455  };
     1456
     1457    class AssignErrorNode : public ExpressionNode {
     1458  public:
     1459    AssignErrorNode(ExpressionNode* left, Operator oper, ExpressionNode* right) KJS_FAST_CALL
    14461460      : m_left(left), m_oper(oper), m_right(right) {}
    1447     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1461    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14481462    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    14491463    virtual Precedence precedence() const { return PrecAssignment; }
    14501464  protected:
    1451     RefPtr<Node> m_left;
     1465    RefPtr<ExpressionNode> m_left;
    14521466    Operator m_oper;
    1453     RefPtr<Node> m_right;
    1454   };
    1455 
    1456   class CommaNode : public Node {
    1457   public:
    1458     CommaNode(Node *e1, Node *e2) KJS_FAST_CALL : expr1(e1), expr2(e2) {}
    1459     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1460     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1467    RefPtr<ExpressionNode> m_right;
     1468  };
     1469
     1470    class CommaNode : public ExpressionNode {
     1471  public:
     1472    CommaNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : expr1(e1), expr2(e2) {}
     1473    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1474    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14611475    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    14621476    virtual Precedence precedence() const { return PrecExpression; }
    14631477  private:
    1464     RefPtr<Node> expr1;
    1465     RefPtr<Node> expr2;
    1466   };
    1467 
    1468   class AssignExprNode : public Node {
    1469   public:
    1470     AssignExprNode(Node *e) KJS_FAST_CALL : expr(e) {}
    1471     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1472     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1478    RefPtr<ExpressionNode> expr1;
     1479    RefPtr<ExpressionNode> expr2;
     1480  };
     1481
     1482    class AssignExprNode : public ExpressionNode {
     1483  public:
     1484    AssignExprNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     1485    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1486    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14731487    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    14741488    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    14751489  private:
    1476     RefPtr<Node> expr;
    1477   };
    1478 
    1479   class VarDeclNode : public Node {
     1490    RefPtr<ExpressionNode> expr;
     1491  };
     1492
     1493    class VarDeclNode : public ExpressionNode {
    14801494  public:
    14811495    enum Type { Variable, Constant };
     
    15301544  class ExprStatementNode : public StatementNode {
    15311545  public:
    1532     ExprStatementNode(Node *e) KJS_FAST_CALL : expr(e) { }
     1546    ExprStatementNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { }
    15331547    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    15341548    virtual Completion execute(ExecState*) KJS_FAST_CALL;
    15351549    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    15361550  private:
    1537     RefPtr<Node> expr;
     1551    RefPtr<ExpressionNode> expr;
    15381552  };
    15391553
    15401554  class IfNode : public StatementNode {
    15411555  public:
    1542     IfNode(Node *e, StatementNode *s1, StatementNode *s2) KJS_FAST_CALL
     1556    IfNode(ExpressionNode* e, StatementNode *s1, StatementNode *s2) KJS_FAST_CALL
    15431557      : expr(e), statement1(s1), statement2(s2) { m_mayHaveDeclarations = statement1->mayHaveDeclarations() || (statement2 && statement2->mayHaveDeclarations()); }
    15441558    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     
    15471561    virtual void getDeclarations(DeclarationStacks&) KJS_FAST_CALL;
    15481562  private:
    1549     RefPtr<Node> expr;
     1563    RefPtr<ExpressionNode> expr;
    15501564    RefPtr<StatementNode> statement1;
    15511565    RefPtr<StatementNode> statement2;
     
    15541568  class DoWhileNode : public StatementNode {
    15551569  public:
    1556     DoWhileNode(StatementNode *s, Node *e) KJS_FAST_CALL : statement(s), expr(e) { m_mayHaveDeclarations = true; }
     1570    DoWhileNode(StatementNode *s, ExpressionNode* e) KJS_FAST_CALL : statement(s), expr(e) { m_mayHaveDeclarations = true; }
    15571571    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    15581572    virtual Completion execute(ExecState*) KJS_FAST_CALL;
     
    15611575  private:
    15621576    RefPtr<StatementNode> statement;
    1563     RefPtr<Node> expr;
     1577    RefPtr<ExpressionNode> expr;
    15641578  };
    15651579
    15661580  class WhileNode : public StatementNode {
    15671581  public:
    1568     WhileNode(Node *e, StatementNode *s) KJS_FAST_CALL : expr(e), statement(s) { m_mayHaveDeclarations = true; }
     1582    WhileNode(ExpressionNode* e, StatementNode *s) KJS_FAST_CALL : expr(e), statement(s) { m_mayHaveDeclarations = true; }
    15691583    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    15701584    virtual Completion execute(ExecState*) KJS_FAST_CALL;
     
    15721586    virtual void getDeclarations(DeclarationStacks&) KJS_FAST_CALL;
    15731587  private:
    1574     RefPtr<Node> expr;
     1588    RefPtr<ExpressionNode> expr;
    15751589    RefPtr<StatementNode> statement;
    15761590  };
     
    15781592  class ForNode : public StatementNode {
    15791593  public:
    1580     ForNode(Node* e1, Node* e2, Node* e3, StatementNode* s) KJS_FAST_CALL :
     1594    ForNode(ExpressionNode* e1, ExpressionNode* e2, ExpressionNode* e3, StatementNode* s) KJS_FAST_CALL :
    15811595      expr1(e1), expr2(e2), expr3(e3), statement(s)
    15821596    {
     
    15911605    virtual void getDeclarations(DeclarationStacks&) KJS_FAST_CALL;
    15921606  private:
    1593     RefPtr<Node> expr1;
    1594     RefPtr<Node> expr2;
    1595     RefPtr<Node> expr3;
     1607    RefPtr<ExpressionNode> expr1;
     1608    RefPtr<ExpressionNode> expr2;
     1609    RefPtr<ExpressionNode> expr3;
    15961610    RefPtr<StatementNode> statement;
    15971611  };
     
    15991613  class ForInNode : public StatementNode {
    16001614  public:
    1601     ForInNode(Node *l, Node *e, StatementNode *s) KJS_FAST_CALL;
    1602     ForInNode(const Identifier &i, AssignExprNode *in, Node *e, StatementNode *s) KJS_FAST_CALL;
     1615    ForInNode(ExpressionNode*  l, ExpressionNode* e, StatementNode *s) KJS_FAST_CALL;
     1616    ForInNode(const Identifier &i, AssignExprNode *in, ExpressionNode* e, StatementNode *s) KJS_FAST_CALL;
    16031617    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    16041618    virtual Completion execute(ExecState*) KJS_FAST_CALL;
     
    16081622    Identifier ident;
    16091623    RefPtr<AssignExprNode> init;
    1610     RefPtr<Node> lexpr;
    1611     RefPtr<Node> expr;
     1624    RefPtr<ExpressionNode> lexpr;
     1625    RefPtr<ExpressionNode> expr;
    16121626    RefPtr<VarDeclNode> varDecl;
    16131627    RefPtr<StatementNode> statement;
     
    16361650  class ReturnNode : public StatementNode {
    16371651  public:
    1638     ReturnNode(Node *v) KJS_FAST_CALL : value(v) {}
     1652    ReturnNode(ExpressionNode* v) KJS_FAST_CALL : value(v) {}
    16391653    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    16401654    virtual Completion execute(ExecState*) KJS_FAST_CALL;
    16411655    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    16421656  private:
    1643     RefPtr<Node> value;
     1657    RefPtr<ExpressionNode> value;
    16441658  };
    16451659
    16461660  class WithNode : public StatementNode {
    16471661  public:
    1648     WithNode(Node *e, StatementNode *s) KJS_FAST_CALL : expr(e), statement(s) { m_mayHaveDeclarations = true; }
     1662    WithNode(ExpressionNode* e, StatementNode* s) KJS_FAST_CALL : expr(e), statement(s) { m_mayHaveDeclarations = true; }
    16491663    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    16501664    virtual Completion execute(ExecState*) KJS_FAST_CALL;
     
    16521666    virtual void getDeclarations(DeclarationStacks&) KJS_FAST_CALL;
    16531667  private:
    1654     RefPtr<Node> expr;
     1668    RefPtr<ExpressionNode> expr;
    16551669    RefPtr<StatementNode> statement;
    16561670  };
     
    16701684  class ThrowNode : public StatementNode {
    16711685  public:
    1672     ThrowNode(Node *e) KJS_FAST_CALL : expr(e) {}
     1686    ThrowNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
    16731687    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    16741688    virtual Completion execute(ExecState*) KJS_FAST_CALL;
    16751689    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    16761690  private:
    1677     RefPtr<Node> expr;
     1691    RefPtr<ExpressionNode> expr;
    16781692  };
    16791693
     
    16931707  };
    16941708
    1695   class ParameterNode : public Node {
     1709    class ParameterNode : public ExpressionNode {
    16961710  public:
    16971711    ParameterNode(const Identifier& i) KJS_FAST_CALL : id(i) { }
    16981712    ParameterNode(ParameterNode* l, const Identifier& i) KJS_FAST_CALL
    16991713      : id(i) { l->next = this; }
    1700     JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1714    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    17011715    Identifier ident() KJS_FAST_CALL { return id; }
    17021716    ParameterNode *nextParam() KJS_FAST_CALL { return next.get(); }
     
    17521766  };
    17531767
    1754   class FuncExprNode : public Node {
     1768    class FuncExprNode : public ExpressionNode {
    17551769  public:
    17561770    FuncExprNode(const Identifier& i, FunctionBodyNode* b, ParameterNode* p = 0) KJS_FAST_CALL
     
    17851799  };
    17861800
    1787   class CaseClauseNode : public Node {
    1788   public:
    1789       CaseClauseNode(Node* e) KJS_FAST_CALL : expr(e) { m_mayHaveDeclarations = true; }
    1790       CaseClauseNode(Node* e, SourceElements* children) KJS_FAST_CALL
     1801    class CaseClauseNode : public ExpressionNode {
     1802  public:
     1803      CaseClauseNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { m_mayHaveDeclarations = true; }
     1804      CaseClauseNode(ExpressionNode* e, SourceElements* children) KJS_FAST_CALL
    17911805      : expr(e), m_children(children) { m_mayHaveDeclarations = true; }
    17921806      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1793       JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1807      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    17941808      Completion evalStatements(ExecState*) KJS_FAST_CALL;
    17951809      virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17971811      virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    17981812  private:
    1799       RefPtr<Node> expr;
     1813      RefPtr<ExpressionNode> expr;
    18001814      OwnPtr<SourceElements> m_children;
    18011815  };
    18021816 
    1803   class ClauseListNode : public Node {
     1817    class ClauseListNode : public ExpressionNode {
    18041818  public:
    18051819      ClauseListNode(CaseClauseNode* c) KJS_FAST_CALL : clause(c) { m_mayHaveDeclarations = true; }
     
    18071821      : clause(c) { n->next = this; m_mayHaveDeclarations = true; }
    18081822      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1809       JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1823      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    18101824      CaseClauseNode *getClause() const KJS_FAST_CALL { return clause.get(); }
    18111825      ClauseListNode *getNext() const KJS_FAST_CALL { return next.get(); }
     
    18201834  };
    18211835 
    1822   class CaseBlockNode : public Node {
     1836    class CaseBlockNode : public ExpressionNode {
    18231837  public:
    18241838      CaseBlockNode(ClauseListNode* l1, CaseClauseNode* d, ClauseListNode* l2) KJS_FAST_CALL;
    18251839      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    1826       JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1840      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    18271841      Completion evalBlock(ExecState *exec, JSValue *input) KJS_FAST_CALL;
    18281842      virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    18371851  class SwitchNode : public StatementNode {
    18381852  public:
    1839       SwitchNode(Node *e, CaseBlockNode *b) KJS_FAST_CALL : expr(e), block(b) { m_mayHaveDeclarations = true; }
     1853      SwitchNode(ExpressionNode* e, CaseBlockNode *b) KJS_FAST_CALL : expr(e), block(b) { m_mayHaveDeclarations = true; }
    18401854      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    18411855      virtual Completion execute(ExecState*) KJS_FAST_CALL;
     
    18431857      virtual void getDeclarations(DeclarationStacks&) KJS_FAST_CALL;
    18441858  private:
    1845       RefPtr<Node> expr;
     1859      RefPtr<ExpressionNode> expr;
    18461860      RefPtr<CaseBlockNode> block;
    18471861  };
Note: See TracChangeset for help on using the changeset viewer.