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


Ignore:
Timestamp:
Nov 11, 2007, 4:34:37 PM (18 years ago)
Author:
eseidel
Message:

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

Reviewed by darin.

Add simple type inferencing to the parser, and create custom
AddNode and LessNode subclasses based on inferred types.
http://bugs.webkit.org/show_bug.cgi?id=15884

SunSpider claims this is at least a 0.5% speedup.

  • JavaScriptCore.exp:
  • kjs/grammar.y:
  • kjs/internal.cpp: (KJS::NumberImp::getPrimitiveNumber): (KJS::GetterSetterImp::getPrimitiveNumber):
  • kjs/internal.h:
  • kjs/lexer.cpp: (KJS::Lexer::lex):
  • kjs/nodes.cpp: (KJS::Node::Node): (KJS::StringNode::evaluate): (KJS::StringNode::evaluateToNumber): (KJS::StringNode::evaluateToBoolean): (KJS::RegExpNode::evaluate): (KJS::UnaryPlusNode::optimizeVariableAccess): (KJS::AddNode::evaluate): (KJS::AddNode::evaluateToNumber): (KJS::AddNumbersNode::inlineEvaluateToNumber): (KJS::AddNumbersNode::evaluate): (KJS::AddNumbersNode::evaluateToNumber): (KJS::AddStringsNode::evaluate): (KJS::AddStringLeftNode::evaluate): (KJS::AddStringRightNode::evaluate): (KJS::lessThan): (KJS::lessThanEq): (KJS::LessNumbersNode::evaluate): (KJS::LessStringsNode::evaluate):
  • kjs/nodes.h: (KJS::ExpressionNode::): (KJS::RegExpNode::): (KJS::RegExpNode::precedence): (KJS::TypeOfResolveNode::): (KJS::LocalVarTypeOfNode::): (KJS::UnaryPlusNode::): (KJS::UnaryPlusNode::precedence): (KJS::AddNode::): (KJS::AddNode::precedence): (KJS::AddNumbersNode::): (KJS::AddStringLeftNode::): (KJS::AddStringRightNode::): (KJS::AddStringsNode::): (KJS::LessNode::): (KJS::LessNode::precedence): (KJS::LessNumbersNode::): (KJS::LessStringsNode::):
  • kjs/nodes2string.cpp: (KJS::StringNode::streamTo):
  • kjs/object.cpp:
  • kjs/object.h:
  • kjs/value.h: (KJS::JSValue::getPrimitiveNumber):
File:
1 edited

Legend:

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

    r27678 r27695  
    136136
    137137  protected:
     138    Node(JSType) KJS_FAST_CALL; // used by ExpressionNode
    138139    Completion createErrorCompletion(ExecState *, ErrorType, const char *msg) KJS_FAST_CALL;
    139140    Completion createErrorCompletion(ExecState *, ErrorType, const char *msg, const Identifier &) KJS_FAST_CALL;
     
    154155    Completion rethrowException(ExecState*) KJS_FAST_CALL;
    155156
    156     int m_line : 31;
     157    int m_line : 28;
    157158    bool m_mayHaveDeclarations : 1;
     159    unsigned m_expectedReturnType : 3; // JSType
    158160  };
    159161   
    160162    class ExpressionNode : public Node {
    161163    public:
    162         ExpressionNode() KJS_FAST_CALL { }
     164        ExpressionNode() KJS_FAST_CALL : Node() {}
     165        ExpressionNode(JSType expectedReturn) KJS_FAST_CALL
     166            : Node(expectedReturn) {}
    163167       
    164168        // Special constructor for cases where we overwrite an object in place.
    165169        ExpressionNode(PlacementNewAdoptType) KJS_FAST_CALL
    166             : Node(PlacementNewAdopt)
    167         {
    168         }
     170            : Node(PlacementNewAdopt) {}
    169171       
    170172        virtual bool isNumber() const KJS_FAST_CALL { return false; }
     
    173175        virtual bool isBracketAccessorNode() const KJS_FAST_CALL { return false; }
    174176        virtual bool isDotAccessorNode() const KJS_FAST_CALL { return false; }
     177       
     178        JSType expectedReturnType() const KJS_FAST_CALL { return static_cast<JSType>(m_expectedReturnType); }
    175179       
    176180        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL = 0;
     
    200204  class NullNode : public ExpressionNode {
    201205  public:
    202     NullNode() KJS_FAST_CALL { }
     206    NullNode() KJS_FAST_CALL : ExpressionNode(NullType) {}
    203207    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    204208    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    208212  class FalseNode : public ExpressionNode {
    209213  public:
    210     FalseNode() KJS_FAST_CALL { }
     214    FalseNode() KJS_FAST_CALL : ExpressionNode(BooleanType) {}
    211215    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    212216    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL { return false; }
     
    217221  class TrueNode : public ExpressionNode {
    218222  public:
    219     TrueNode() KJS_FAST_CALL { }
     223    TrueNode() KJS_FAST_CALL : ExpressionNode(BooleanType) {}
    220224    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    221225    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL { return true; }
     
    226230  class NumberNode : public ExpressionNode {
    227231  public:
    228     NumberNode(double v) KJS_FAST_CALL : m_double(v) {}
     232    NumberNode(double v) KJS_FAST_CALL : ExpressionNode(NumberType), m_double(v) {}
    229233    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    230234    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    248252      virtual void setValue(double d) KJS_FAST_CALL { m_double = d; m_value = JSImmediate::from(d); ASSERT(m_value); }
    249253  private:
    250       JSValue* m_value;
     254      JSValue* m_value; // This is never a JSCell, only JSImmediate, thus no ProtectedPtr
    251255  };
    252256
    253257  class StringNode : public ExpressionNode {
    254258  public:
    255     StringNode(const UString *v) KJS_FAST_CALL { value = *v; }
     259    StringNode(const UString* v) KJS_FAST_CALL : ExpressionNode(StringType), m_value(*v) {}
    256260    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    257261    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    261265
    262266  private:
    263     UString value;
     267    UString m_value;
    264268  };
    265269
    266270  class RegExpNode : public ExpressionNode {
    267271  public:
    268     RegExpNode(const UString &p, const UString &f) KJS_FAST_CALL
    269       : pattern(p), flags(f) { }
     272    RegExpNode(const UString& pattern, const UString& flags) KJS_FAST_CALL
     273      : m_pattern(pattern), m_flags(flags) { }
    270274    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    271275    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    272276    virtual Precedence precedence() const { return PrecPrimary; }
    273277  private:
    274     UString pattern, flags;
     278    UString m_pattern;
     279    UString m_flags;
    275280  };
    276281
     
    578583  class PrePostResolveNode : public ExpressionNode {
    579584  public:
    580     PrePostResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
     585    PrePostResolveNode(const Identifier& i) KJS_FAST_CALL : ExpressionNode(NumberType), m_ident(i) {}
    581586     
    582587    PrePostResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     
    793798  public:
    794799    TypeOfResolveNode(const Identifier &s) KJS_FAST_CALL
    795         : m_ident(s)
    796     {
    797     }
     800        : ExpressionNode(StringType), m_ident(s) {}
    798801   
    799802    TypeOfResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     
    801804        , m_ident(PlacementNewAdopt)
    802805    {
     806        m_expectedReturnType = StringType;
    803807    }
    804808
     
    820824    LocalVarTypeOfNode(size_t i) KJS_FAST_CALL
    821825        : TypeOfResolveNode(PlacementNewAdopt)
    822     {
     826    {
     827        m_expectedReturnType = StringType;
    823828        ASSERT(i != missingSymbolMarker());
    824829        m_index = i;
     
    830835  class TypeOfValueNode : public ExpressionNode {
    831836  public:
    832     TypeOfValueNode(ExpressionNode* e) KJS_FAST_CALL : m_expr(e) {}
     837    TypeOfValueNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(StringType), m_expr(e) {}
    833838    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    834839    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    971976  class UnaryPlusNode : public ExpressionNode {
    972977  public:
    973     UnaryPlusNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     978    UnaryPlusNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), m_expr(e) {}
    974979    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    975980    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    977982    virtual Precedence precedence() const { return PrecUnary; }
    978983  private:
     984    RefPtr<ExpressionNode> m_expr;
     985  };
     986
     987  class NegateNode : public ExpressionNode {
     988  public:
     989    NegateNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {}
     990    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     991    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     992    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     993    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     994    virtual Precedence precedence() const { return PrecUnary; }
     995  private:
    979996    RefPtr<ExpressionNode> expr;
    980997  };
    981998
    982   class NegateNode : public ExpressionNode {
    983   public:
    984     NegateNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
    985     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    986     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    987     virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     999  class BitwiseNotNode : public ExpressionNode {
     1000  public:
     1001    BitwiseNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {}
     1002    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1003    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    9881004    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    9891005    virtual Precedence precedence() const { return PrecUnary; }
     
    9921008  };
    9931009
    994   class BitwiseNotNode : public ExpressionNode {
    995   public:
    996     BitwiseNotNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
    997     virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    998     virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    999     virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    1000     virtual Precedence precedence() const { return PrecUnary; }
    1001   private:
    1002     RefPtr<ExpressionNode> expr;
    1003   };
    1004 
    10051010  class LogicalNotNode : public ExpressionNode {
    10061011  public:
    1007     LogicalNotNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
     1012    LogicalNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(BooleanType), expr(e) {}
    10081013    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10091014    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10171022  class MultNode : public ExpressionNode {
    10181023  public:
    1019       MultNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1024      MultNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    10201025      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10211026      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10311036  class DivNode : public ExpressionNode {
    10321037  public:
    1033       DivNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1038      DivNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    10341039      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10351040      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10451050  class ModNode : public ExpressionNode {
    10461051  public:
    1047       ModNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1052      ModNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    10481053      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10491054      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10591064  class AddNode : public ExpressionNode {
    10601065  public:
    1061     AddNode(ExpressionNode*  t1, ExpressionNode* t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1066    AddNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
    10621067    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10631068    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10651070    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    10661071    virtual Precedence precedence() const { return PrecAdditive; }
    1067   private:
     1072  protected:
     1073    AddNode(ExpressionNode* t1, ExpressionNode* t2, JSType expectedReturn) KJS_FAST_CALL : ExpressionNode(expectedReturn), term1(t1), term2(t2) {}
    10681074    RefPtr<ExpressionNode> term1;
    10691075    RefPtr<ExpressionNode> term2;
    10701076  };
    1071  
     1077
     1078    class AddNumbersNode : public AddNode {
     1079    public:
     1080        AddNumbersNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, NumberType) {}
     1081        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1082        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     1083    private:
     1084        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*) KJS_FAST_CALL;
     1085    };
     1086
     1087    class AddStringLeftNode : public AddNode {
     1088    public:
     1089        AddStringLeftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, StringType) {}
     1090        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1091    };
     1092
     1093    class AddStringRightNode : public AddNode {
     1094    public:
     1095        AddStringRightNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, StringType) {}
     1096        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1097    };
     1098
     1099    class AddStringsNode : public AddNode {
     1100    public:
     1101        AddStringsNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, StringType) {}
     1102        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1103    };
     1104
    10721105  class SubNode : public ExpressionNode {
    10731106  public:
    1074       SubNode(ExpressionNode*  t1, ExpressionNode*  t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
     1107      SubNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    10751108      virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10761109      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10861119  class LeftShiftNode : public ExpressionNode {
    10871120  public:
    1088     LeftShiftNode(ExpressionNode*  t1, ExpressionNode* t2) KJS_FAST_CALL
    1089       : term1(t1), term2(t2) {}
     1121    LeftShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL
     1122      : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    10901123    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    10911124    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    10991132  class RightShiftNode : public ExpressionNode {
    11001133  public:
    1101     RightShiftNode(ExpressionNode*  t1, ExpressionNode* t2) KJS_FAST_CALL
    1102       : term1(t1), term2(t2) {}
     1134    RightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL
     1135      : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    11031136    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    11041137    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    11121145  class UnsignedRightShiftNode : public ExpressionNode {
    11131146  public:
    1114     UnsignedRightShiftNode(ExpressionNode*  t1, ExpressionNode* t2) KJS_FAST_CALL
    1115       : term1(t1), term2(t2) {}
     1147    UnsignedRightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL
     1148      : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    11161149    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    11171150    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    11251158  class LessNode : public ExpressionNode {
    11261159  public:
    1127     LessNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    1128       expr1(e1), expr2(e2) {}
     1160    LessNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1161      : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    11291162    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    11301163    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    11321165    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    11331166    virtual Precedence precedence() const { return PrecRelational; }
    1134   private:
     1167  protected:
    11351168    RefPtr<ExpressionNode> expr1;
    11361169    RefPtr<ExpressionNode> expr2;
    11371170  };
    11381171
     1172    class LessNumbersNode : public LessNode {
     1173    public:
     1174        LessNumbersNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1175        : LessNode(e1, e2) {}
     1176        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1177    };
     1178
     1179    class LessStringsNode : public LessNode {
     1180    public:
     1181        LessStringsNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1182        : LessNode(e1, e2) {}
     1183        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1184    };
     1185
    11391186  class GreaterNode : public ExpressionNode {
    11401187  public:
     
    11811228    class InstanceOfNode : public ExpressionNode {
    11821229  public:
    1183     InstanceOfNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    1184       expr1(e1), expr2(e2) {}
     1230    InstanceOfNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1231        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    11851232    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    11861233    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    12101257  public:
    12111258    EqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    1212       : expr1(e1), expr2(e2) {}
     1259        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    12131260    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    12141261    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    12241271  public:
    12251272    NotEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    1226       : expr1(e1), expr2(e2) {}
     1273        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    12271274    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    12281275    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    12381285  public:
    12391286    StrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    1240       : expr1(e1), expr2(e2) {}
     1287        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    12411288    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    12421289    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    12521299  public:
    12531300    NotStrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    1254       : expr1(e1), expr2(e2) {}
     1301        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    12551302    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    12561303    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    12651312    class BitAndNode : public ExpressionNode {
    12661313  public:
    1267     BitAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    1268       expr1(e1), expr2(e2) {}
     1314    BitAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1315        : ExpressionNode(NumberType), expr1(e1), expr2(e2) {}
    12691316    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    12701317    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    12781325    class BitOrNode : public ExpressionNode {
    12791326  public:
    1280     BitOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    1281       expr1(e1), expr2(e2) {}
     1327    BitOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1328        : ExpressionNode(NumberType), expr1(e1), expr2(e2) {}
    12821329    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    12831330    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    12911338    class BitXOrNode : public ExpressionNode {
    12921339  public:
    1293     BitXOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    1294       expr1(e1), expr2(e2) {}
     1340    BitXOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1341        : ExpressionNode(NumberType), expr1(e1), expr2(e2) {}
    12951342    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    12961343    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    13071354    class LogicalAndNode : public ExpressionNode {
    13081355  public:
    1309     LogicalAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    1310       expr1(e1), expr2(e2) {}
     1356    LogicalAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1357        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    13111358    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    13121359    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    13211368    class LogicalOrNode : public ExpressionNode {
    13221369  public:
    1323     LogicalOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    1324       expr1(e1), expr2(e2) {}
     1370    LogicalOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
     1371        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    13251372    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    13261373    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
Note: See TracChangeset for help on using the changeset viewer.