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


Ignore:
Timestamp:
Jan 27, 2008, 1:38:01 AM (17 years ago)
Author:
Darin Adler
Message:

JavaScriptCore:

Reviewed by Oliver.

  • fix <rdar://problem/5657450> REGRESSION: const is broken

Test: fast/js/const.html

SunSpider said this was 0.3% slower. And I saw some Shark samples in
JSGlobalObject::put -- not a lot but a few. We may be able to regain the
speed, but for now we will take that small hit for correctness sake.

  • kjs/JSGlobalObject.cpp: (KJS::JSGlobalObject::put): Pass the checkReadOnly flag in to symbolTablePut instead of passing attributes.
  • kjs/JSVariableObject.h: (KJS::JSVariableObject::symbolTablePut): Removed the code to set attributes here, since we only set attributes when creating a property. Added the code to check read-only here, since we need that to implement const!
  • kjs/function.cpp: (KJS::ActivationImp::put): Pass the checkReadOnly flag in to symbolTablePut instead of passing attributes.
  • kjs/nodes.cpp: (KJS::isConstant): Added. (KJS::PostIncResolveNode::optimizeVariableAccess): Create a PostIncConstNode if optimizing for a local variable and the variable is constant. (KJS::PostDecResolveNode::optimizeVariableAccess): Ditto. But PostDecConstNode. (KJS::PreIncResolveNode::optimizeVariableAccess): Ditto. But PreIncConstNode. (KJS::PreDecResolveNode::optimizeVariableAccess): Ditto. But PreDecConstNode. (KJS::PreIncConstNode::evaluate): Return the value + 1. (KJS::PreDecConstNode::evaluate): Return the value - 1. (KJS::PostIncConstNode::evaluate): Return the value converted to a number. (KJS::PostDecConstNode::evaluate): Ditto. (KJS::ReadModifyResolveNode::optimizeVariableAccess): Create a ReadModifyConstNode if optimizing for a local variable and the variable is constant. (KJS::AssignResolveNode::optimizeVariableAccess): Ditto. But AssignConstNode. (KJS::ScopeNode::optimizeVariableAccess): Pass the local storage to the node optimizeVariableAccess functions, since that's where we need to look to figure out if a variable is constant. (KJS::FunctionBodyNode::processDeclarations): Moved the call to optimizeVariableAccess until after localStorage is set up. (KJS::ProgramNode::processDeclarations): Ditto.
  • kjs/nodes.h: Fixed the IsConstant and HasInitializer values. They are used as flag masks, so a value of 0 will not work for IsConstant. Changed the first parameter to optimizeVariableAccess to be a const reference to a symbol table and added a const reference to local storage. Added classes for const versions of local variable access: PostIncConstNode, PostDecConstNode, PreIncConstNode, PreDecConstNode, ReadModifyConstNode, and AssignConstNode.
  • kjs/object.cpp: (KJS::JSObject::put): Tweaked comments a bit, and changed the checkReadOnly expression to match the form used at the two other call sites.

LayoutTests:

Reviewed by Oliver.

  • tests for <rdar://problem/5657450> REGRESSION: const is broken
  • fast/js/const-expected.txt: Updated with results that express success rather than failure, and to include the many new tests I added.
  • fast/js/kde/const-expected.txt: Ditto.
  • fast/js/resources/const.js: Added many new tests, covering the various cases of const in globals, function locals, the slow case inside eval, the different node types, and the values of the expressions.
File:
1 edited

Legend:

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

    r29815 r29818  
    9090  struct DeclarationStacks {
    9191      typedef Vector<Node*, 16> NodeStack;
    92       enum { IsConstant, HasInitializer } VarAttrs;
     92      enum { IsConstant = 1, HasInitializer = 2 } VarAttrs;
    9393      typedef Vector<std::pair<Identifier, unsigned>, 16> VarStack;
    9494      typedef Vector<FuncDeclNode*, 16> FunctionStack;
     
    125125  class Node : public ParserRefCounted {
    126126  public:
     127    typedef DeclarationStacks::NodeStack NodeStack;
     128    typedef DeclarationStacks::VarStack VarStack;
     129    typedef DeclarationStacks::FunctionStack FunctionStack;
     130
    127131    Node() KJS_FAST_CALL;
    128132    Node(PlacementNewAdoptType placementAdopt) KJS_FAST_CALL
     
    138142
    139143    // Used for iterative, depth-first traversal of the node tree. Does not cross function call boundaries.
    140     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL { }
     144    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL { }
    141145
    142146  protected:
     
    324328    }
    325329
    326     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     330    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    327331
    328332    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    369373    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    370374    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    371     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     375    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    372376
    373377    PassRefPtr<ElementNode> releaseNext() KJS_FAST_CALL { return next.release(); }
     
    389393    ArrayNode(int eli, ElementNode* ele) KJS_FAST_CALL
    390394      : element(ele), elision(eli), opt(true) { }
    391     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     395    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    392396    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    393397    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    404408    PropertyNode(const Identifier& n, ExpressionNode* a, Type t) KJS_FAST_CALL
    405409      : m_name(n), assign(a), type(t) { }
    406     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     410    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    407411    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    408412    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    424428    PropertyListNode(PropertyNode* n, PropertyListNode* l) KJS_FAST_CALL
    425429      : node(n) { l->next = this; }
    426     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     430    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    427431    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    428432    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    441445    ObjectLiteralNode() KJS_FAST_CALL { }
    442446    ObjectLiteralNode(PropertyListNode* l) KJS_FAST_CALL : list(l) { }
    443     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     447    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    444448    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    445449    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    453457  public:
    454458    BracketAccessorNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : expr1(e1), expr2(e2) {}
    455     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     459    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    456460    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    457461    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    476480  public:
    477481    DotAccessorNode(ExpressionNode* e, const Identifier& s) KJS_FAST_CALL : expr(e), ident(s) { }
    478     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     482    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    479483    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    480484    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    501505    ArgumentListNode(ArgumentListNode* l, ExpressionNode* e) KJS_FAST_CALL
    502506      : expr(e) { l->next = this; }
    503     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     507    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    504508    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    505509    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    519523    ArgumentsNode(ArgumentListNode* l) KJS_FAST_CALL
    520524      : listNode(l) { }
    521     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     525    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    522526    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    523527    virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    533537    NewExprNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
    534538    NewExprNode(ExpressionNode* e, ArgumentsNode* a) KJS_FAST_CALL : expr(e), args(a) {}
    535     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     539    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    536540    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    537541    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    550554  public:
    551555    FunctionCallValueNode(ExpressionNode* e, ArgumentsNode* a) KJS_FAST_CALL : expr(e), args(a) {}
    552     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     556    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    553557    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    554558    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    574578    }
    575579
    576     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     580    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    577581    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    578582    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    611615  public:
    612616    FunctionCallBracketNode(ExpressionNode* b, ExpressionNode* s, ArgumentsNode* a) KJS_FAST_CALL : base(b), subscript(s), args(a) {}
    613     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     617    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    614618    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    615619    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    624628  public:
    625629    FunctionCallDotNode(ExpressionNode* b, const Identifier& i, ArgumentsNode* a) KJS_FAST_CALL : base(b), ident(i), args(a) {}
    626     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     630    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    627631    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    628632    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    663667    }
    664668
    665     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     669    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    666670    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    667671    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    668672    virtual Precedence precedence() const { return PrecPostfix; }
    669673    virtual void optimizeForUnnecessaryResult();
    670 
    671674  };
    672675
     
    684687  };
    685688
     689  class PostIncConstNode : public PostIncResolveNode {
     690  public:
     691    PostIncConstNode(size_t i) KJS_FAST_CALL
     692        : PostIncResolveNode(PlacementNewAdopt)
     693    {
     694        ASSERT(i != missingSymbolMarker());
     695        m_index = i;
     696    }
     697    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     698  };
     699
    686700  class PostDecResolveNode : public PrePostResolveNode {
    687701  public:
     
    693707    }
    694708
    695     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     709    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    696710    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    697711    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    719733  };
    720734
     735  class PostDecConstNode : public PostDecResolveNode {
     736  public:
     737    PostDecConstNode(size_t i) KJS_FAST_CALL
     738        : PostDecResolveNode(PlacementNewAdopt)
     739    {
     740        ASSERT(i != missingSymbolMarker());
     741        m_index = i;
     742    }
     743    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     744  };
     745
    721746  class PostfixBracketNode : public ExpressionNode {
    722747  public:
    723748    PostfixBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : m_base(b), m_subscript(s) {}
    724     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     749    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    725750    virtual Precedence precedence() const { return PrecPostfix; }
    726751  protected:
     
    746771  public:
    747772    PostfixDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {}
    748     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     773    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    749774    virtual Precedence precedence() const { return PrecPostfix; }
    750775  protected:
     
    787812    }
    788813
    789     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     814    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    790815    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    791816    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    808833  public:
    809834    DeleteBracketNode(ExpressionNode* base, ExpressionNode* subscript) KJS_FAST_CALL : m_base(base), m_subscript(subscript) {}
    810     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     835    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    811836    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    812837    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    820845  public:
    821846    DeleteDotNode(ExpressionNode* base, const Identifier& i) KJS_FAST_CALL : m_base(base), m_ident(i) {}
    822     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     847    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    823848    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    824849    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    832857  public:
    833858    DeleteValueNode(ExpressionNode* e) KJS_FAST_CALL : m_expr(e) {}
    834     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     859    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    835860    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    836861    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    843868  public:
    844869    VoidNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
    845     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     870    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    846871    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    847872    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    863888    }
    864889
    865     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     890    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    866891   
    867892    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    892917  public:
    893918    TypeOfValueNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(StringType), m_expr(e) {}
    894     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     919    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    895920    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    896921    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    912937    }
    913938   
    914     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     939    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    915940
    916941    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    931956  };
    932957 
     958  class PreIncConstNode : public PreIncResolveNode {
     959  public:
     960    PreIncConstNode(size_t i) KJS_FAST_CALL
     961        : PreIncResolveNode(PlacementNewAdopt)
     962    {
     963        ASSERT(i != missingSymbolMarker());
     964        m_index = i;
     965    }
     966    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     967  };
     968
    933969  class PreDecResolveNode : public PrePostResolveNode {
    934970  public:
     
    943979    }
    944980   
    945     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     981    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    946982
    947983    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    962998  };
    963999 
     1000  class PreDecConstNode : public PreDecResolveNode {
     1001  public:
     1002    PreDecConstNode(size_t i) KJS_FAST_CALL
     1003        : PreDecResolveNode(PlacementNewAdopt)
     1004    {
     1005        ASSERT(i != missingSymbolMarker());
     1006        m_index = i;
     1007    }
     1008    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1009  };
     1010
    9641011  class PrefixBracketNode : public ExpressionNode {
    9651012  public:
    9661013    PrefixBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : m_base(b), m_subscript(s) {}
    9671014   
    968     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1015    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    9691016    virtual Precedence precedence() const { return PrecUnary; }
    9701017  protected:
     
    9901037  public:
    9911038    PrefixDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {}
    992     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1039    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    9931040    virtual Precedence precedence() const { return PrecPostfix; }
    9941041  protected:
     
    10251072  public:
    10261073    UnaryPlusNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), m_expr(e) {}
    1027     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1074    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    10281075    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10291076    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    10401087  public:
    10411088    NegateNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {}
    1042     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1089    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    10431090    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10441091    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    10521099  public:
    10531100    BitwiseNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {}
    1054     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1101    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    10551102    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10561103    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    10681115  public:
    10691116    LogicalNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(BooleanType), expr(e) {}
    1070     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1117    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    10711118    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10721119    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    10801127  public:
    10811128      MultNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    1082       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1129      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    10831130      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    10841131      virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    10971144  public:
    10981145      DivNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    1099       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1146      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    11001147      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11011148      virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    11131160  public:
    11141161      ModNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    1115       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1162      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    11161163      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11171164      virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    11301177  public:
    11311178    AddNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : term1(t1), term2(t2) {}
    1132     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1179    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    11331180    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11341181    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    11771224  public:
    11781225      SubNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    1179       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1226      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    11801227      virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11811228      virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    11941241    LeftShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL
    11951242      : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    1196     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1243    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    11971244    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11981245    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    12111258    RightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL
    12121259      : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    1213     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1260    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    12141261    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12151262    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    12281275    UnsignedRightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL
    12291276      : ExpressionNode(NumberType), term1(t1), term2(t2) {}
    1230     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1277    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    12311278    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12321279    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    12451292    LessNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    12461293      : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1247     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1294    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    12481295    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12491296    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    12811328    GreaterNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12821329      expr1(e1), expr2(e2) {}
    1283     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1330    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    12841331    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    12851332    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    12961343    LessEqNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    12971344      expr1(e1), expr2(e2) {}
    1298     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1345    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    12991346    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13001347    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    13111358    GreaterEqNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    13121359      expr1(e1), expr2(e2) {}
    1313     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1360    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    13141361    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13151362    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    13261373    InstanceOfNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    13271374        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1328     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1375    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    13291376    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13301377    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    13401387    InNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    13411388      expr1(e1), expr2(e2) {}
    1342     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1389    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    13431390    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13441391    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    13541401    EqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    13551402        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1356     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1403    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    13571404    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13581405    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    13691416    NotEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    13701417        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1371     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1418    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    13721419    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13731420    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    13841431    StrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    13851432        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1386     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1433    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    13871434    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    13881435    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    13991446    NotStrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    14001447        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1401     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1448    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    14021449    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14031450    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    14141461    BitAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    14151462        : ExpressionNode(NumberType), expr1(e1), expr2(e2) {}
    1416     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1463    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    14171464    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14181465    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    14321479    BitOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    14331480        : ExpressionNode(NumberType), expr1(e1), expr2(e2) {}
    1434     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1481    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    14351482    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14361483    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    14501497    BitXOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    14511498        : ExpressionNode(NumberType), expr1(e1), expr2(e2) {}
    1452     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1499    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    14531500    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14541501    virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
     
    14711518    LogicalAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    14721519        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1473     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1520    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    14741521    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14751522    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    14861533    LogicalOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL
    14871534        : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {}
    1488     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1535    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    14891536    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    14901537    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    15041551    ConditionalNode(ExpressionNode*  l, ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :
    15051552      logical(l), expr1(e1), expr2(e2) {}
    1506     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1553    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    15071554    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    15081555    virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
     
    15341581    }
    15351582
    1536     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1583    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    15371584    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    15381585    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    15571604  };
    15581605
     1606  class ReadModifyConstNode : public ReadModifyResolveNode {
     1607  public:
     1608    ReadModifyConstNode(size_t i) KJS_FAST_CALL
     1609        : ReadModifyResolveNode(PlacementNewAdopt)
     1610    {
     1611        ASSERT(i != missingSymbolMarker());
     1612        m_index = i;
     1613    }
     1614    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1615  };
     1616
    15591617    class AssignResolveNode : public ExpressionNode {
    15601618  public:
     
    15721630    }
    15731631
    1574     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1632    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    15751633    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    15761634    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    15941652  };
    15951653
     1654  class AssignConstNode : public AssignResolveNode {
     1655  public:
     1656    AssignConstNode() KJS_FAST_CALL
     1657        : AssignResolveNode(PlacementNewAdopt)
     1658    {
     1659    }   
     1660    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     1661  };
     1662
    15961663    class ReadModifyBracketNode : public ExpressionNode {
    15971664  public:
    15981665    ReadModifyBracketNode(ExpressionNode*  base, ExpressionNode*  subscript, Operator oper, ExpressionNode*  right) KJS_FAST_CALL
    15991666      : m_base(base), m_subscript(subscript), m_oper(oper), m_right(right) {}
    1600     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1667    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    16011668    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    16021669    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    16131680    AssignBracketNode(ExpressionNode*  base, ExpressionNode*  subscript, ExpressionNode*  right) KJS_FAST_CALL
    16141681      : m_base(base), m_subscript(subscript), m_right(right) {}
    1615     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1682    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    16161683    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    16171684    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    16271694    AssignDotNode(ExpressionNode*  base, const Identifier& ident, ExpressionNode*  right) KJS_FAST_CALL
    16281695      : m_base(base), m_ident(ident), m_right(right) {}
    1629     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1696    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    16301697    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    16311698    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    16411708    ReadModifyDotNode(ExpressionNode*  base, const Identifier& ident, Operator oper, ExpressionNode*  right) KJS_FAST_CALL
    16421709      : m_base(base), m_ident(ident), m_oper(oper), m_right(right) {}
    1643     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1710    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    16441711    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    16451712    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    16711738        e1->optimizeForUnnecessaryResult();
    16721739    }
    1673     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1740    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    16741741    virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    16751742    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    16831750  public:
    16841751    ConstDeclNode(const Identifier& id, ExpressionNode* in) KJS_FAST_CALL;
    1685     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1752    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    16861753    virtual KJS::JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    16871754    void evaluateSingle(ExecState*) KJS_FAST_CALL;
     
    17001767  public:
    17011768    ConstStatementNode(ConstDeclNode* l) KJS_FAST_CALL : next(l) { }
    1702     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1769    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17031770    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    17041771    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17241791  public:
    17251792    BlockNode(SourceElements* children) KJS_FAST_CALL;
    1726     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1793    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17271794    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    17281795    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17421809  public:
    17431810    ExprStatementNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { }
    1744     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1811    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17451812    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    17461813    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17521819  public:
    17531820    VarStatementNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { }
    1754     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1821    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17551822    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    17561823    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17631830    IfNode(ExpressionNode* e, StatementNode *s) KJS_FAST_CALL
    17641831      : m_condition(e), m_ifBlock(s) { }
    1765     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1832    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17661833    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    17671834    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17751842        IfElseNode(ExpressionNode* e, StatementNode* ifBlock, StatementNode* elseBlock) KJS_FAST_CALL
    17761843            : IfNode(e, ifBlock), m_elseBlock(elseBlock) { }
    1777         virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1844        virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17781845        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    17791846        virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17851852  public:
    17861853    DoWhileNode(StatementNode *s, ExpressionNode* e) KJS_FAST_CALL : statement(s), expr(e) { }
    1787     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1854    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17881855    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    17891856    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    17961863  public:
    17971864    WhileNode(ExpressionNode* e, StatementNode *s) KJS_FAST_CALL : expr(e), statement(s) { }
    1798     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1865    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    17991866    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    18001867    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    18221889    }
    18231890
    1824     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1891    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    18251892    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    18261893    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    18371904    ForInNode(ExpressionNode*  l, ExpressionNode* e, StatementNode *s) KJS_FAST_CALL;
    18381905    ForInNode(const Identifier &i, ExpressionNode *in, ExpressionNode* e, StatementNode *s) KJS_FAST_CALL;
    1839     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1906    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    18401907    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    18411908    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    18721939  public:
    18731940    ReturnNode(ExpressionNode* v) KJS_FAST_CALL : value(v) {}
    1874     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1941    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    18751942    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    18761943    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    18821949  public:
    18831950    WithNode(ExpressionNode* e, StatementNode* s) KJS_FAST_CALL : expr(e), statement(s) { }
    1884     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1951    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    18851952    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    18861953    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    18931960  public:
    18941961    LabelNode(const Identifier &l, StatementNode *s) KJS_FAST_CALL : label(l), statement(s) { }
    1895     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1962    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    18961963    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    18971964    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    19041971  public:
    19051972    ThrowNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}
    1906     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1973    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    19071974    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    19081975    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    19151982    TryNode(StatementNode *b, const Identifier &e, StatementNode *c, StatementNode *f) KJS_FAST_CALL
    19161983      : tryBlock(b), exceptionIdent(e), catchBlock(c), finallyBlock(f) { }
    1917     virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     1984    virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    19181985    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    19191986    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    19442011  class ScopeNode : public BlockNode {
    19452012  public:
    1946     ScopeNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;
     2013    ScopeNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
    19472014
    19482015    int sourceId() const KJS_FAST_CALL { return m_sourceId; }
     
    19532020    void optimizeVariableAccess(ExecState*) KJS_FAST_CALL;
    19542021
    1955     DeclarationStacks::VarStack m_varStack;
    1956     DeclarationStacks::FunctionStack m_functionStack;
     2022    VarStack m_varStack;
     2023    FunctionStack m_functionStack;
    19572024
    19582025  private:
     
    19632030  class ProgramNode : public ScopeNode {
    19642031  public:
    1965     static ProgramNode* create(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;
     2032    static ProgramNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
    19662033    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    19672034   
    19682035  private:
    1969     ProgramNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;
     2036    ProgramNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
    19702037    void initializeSymbolTable(ExecState*) KJS_FAST_CALL;
    19712038    ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL;
     
    19772044  class EvalNode : public ScopeNode {
    19782045  public:
    1979     static EvalNode* create(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;
     2046    static EvalNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
    19802047    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    19812048   
    19822049  private:
    1983     EvalNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;
     2050    EvalNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
    19842051    ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL;
    19852052  };
     
    19872054  class FunctionBodyNode : public ScopeNode {
    19882055  public:
    1989     static FunctionBodyNode* create(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;
     2056    static FunctionBodyNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
    19902057
    19912058    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
     
    19972064
    19982065  protected:
    1999     FunctionBodyNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;
     2066    FunctionBodyNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
    20002067
    20012068  private:
     
    20462113      CaseClauseNode(ExpressionNode* e, SourceElements* children) KJS_FAST_CALL
    20472114      : expr(e) { if (children) children->releaseContentsIntoVector(m_children); }
    2048       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     2115      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    20492116      virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    20502117      virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    20632130      ClauseListNode(ClauseListNode* n, CaseClauseNode* c) KJS_FAST_CALL
    20642131      : clause(c) { n->next = this; }
    2065       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     2132      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    20662133      CaseClauseNode* getClause() const KJS_FAST_CALL { return clause.get(); }
    20672134      ClauseListNode* getNext() const KJS_FAST_CALL { return next.get(); }
     
    20782145  public:
    20792146      CaseBlockNode(ClauseListNode* l1, CaseClauseNode* d, ClauseListNode* l2) KJS_FAST_CALL;
    2080       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     2147      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    20812148      JSValue* executeBlock(ExecState*, JSValue *input) KJS_FAST_CALL;
    20822149      virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    20912158  public:
    20922159      SwitchNode(ExpressionNode* e, CaseBlockNode *b) KJS_FAST_CALL : expr(e), block(b) { }
    2093       virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     2160      virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    20942161      virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    20952162      virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     
    21042171        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    21052172        virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    2106         virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     2173        virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
    21072174    private:
    21082175        RefPtr<StatementNode> m_statement;
Note: See TracChangeset for help on using the changeset viewer.