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


Ignore:
Timestamp:
Feb 5, 2006, 11:49:05 PM (19 years ago)
Author:
mjs
Message:

Reviewed by Anders.


  • kjs/internal.cpp: (KJS::Parser::noteNodeCycle): (KJS::Parser::removeNodeCycle): (KJS::clearNewNodes):
  • kjs/internal.h:
  • kjs/nodes.cpp: (ElementNode::breakCycle): (PropertyListNode::breakCycle): (ArgumentListNode::breakCycle): (StatListNode::StatListNode): (StatListNode::breakCycle): (VarDeclListNode::breakCycle): (BlockNode::BlockNode): (ClauseListNode::breakCycle): (CaseBlockNode::CaseBlockNode): (ParameterNode::breakCycle): (SourceElementsNode::SourceElementsNode): (SourceElementsNode::breakCycle):
  • kjs/nodes.h: (KJS::Node::breakCycle): (KJS::ElementNode::ElementNode): (KJS::ArrayNode::ArrayNode): (KJS::PropertyListNode::PropertyListNode): (KJS::ObjectLiteralNode::ObjectLiteralNode): (KJS::ArgumentListNode::ArgumentListNode): (KJS::ArgumentsNode::ArgumentsNode): (KJS::VarDeclListNode::VarDeclListNode): (KJS::VarStatementNode::VarStatementNode): (KJS::ForNode::ForNode): (KJS::CaseClauseNode::CaseClauseNode): (KJS::ClauseListNode::ClauseListNode): (KJS::ParameterNode::ParameterNode): (KJS::FuncExprNode::FuncExprNode): (KJS::FuncDeclNode::FuncDeclNode):
File:
1 edited

Legend:

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

    r12317 r12593  
    9696    virtual bool isGroupNode() const { return false; }
    9797
     98    virtual void breakCycle() { }
     99
    98100  protected:
    99101    Completion createErrorCompletion(ExecState *, ErrorType, const char *msg);
     
    221223  public:
    222224    // list pointer is tail of a circular list, cracked in the ArrayNode ctor
    223     ElementNode(int e, Node *n) : next(this), elision(e), node(n) { }
     225    ElementNode(int e, Node *n) : next(this), elision(e), node(n) { Parser::noteNodeCycle(this); }
    224226    ElementNode(ElementNode *l, int e, Node *n)
    225227      : next(l->next), elision(e), node(n) { l->next = this; }
     
    227229    virtual void streamTo(SourceStream &s) const;
    228230    PassRefPtr<ElementNode> releaseNext() { return next.release(); }
     231    virtual void breakCycle();
    229232  private:
    230233    friend class ArrayNode;
     
    238241    ArrayNode(int e) : element(0), elision(e), opt(true) { }
    239242    ArrayNode(ElementNode *ele)
    240       : element(ele->next), elision(0), opt(false) { ele->next = 0; }
     243      : element(ele->next), elision(0), opt(false) { Parser::removeNodeCycle(element.get()); ele->next = 0; }
    241244    ArrayNode(int eli, ElementNode *ele)
    242       : element(ele->next), elision(eli), opt(true) { ele->next = 0; }
     245      : element(ele->next), elision(eli), opt(true) { Parser::removeNodeCycle(element.get()); ele->next = 0; }
    243246    JSValue *evaluate(ExecState *exec);
    244247    virtual void streamTo(SourceStream &s) const;
     
    278281    // list pointer is tail of a circular list, cracked in the ObjectLiteralNode ctor
    279282    PropertyListNode(PropertyNode *n)
    280       : node(n), next(this) { }
     283      : node(n), next(this) { Parser::noteNodeCycle(this); }
    281284    PropertyListNode(PropertyNode *n, PropertyListNode *l)
    282285      : node(n), next(l->next) { l->next = this; }
     
    284287    virtual void streamTo(SourceStream &s) const;
    285288    PassRefPtr<PropertyListNode> releaseNext() { return next.release(); }
     289    virtual void breakCycle();
    286290  private:
    287291    friend class ObjectLiteralNode;
     
    293297  public:
    294298    ObjectLiteralNode() : list(0) { }
    295     ObjectLiteralNode(PropertyListNode *l) : list(l->next) { l->next = 0; }
     299    ObjectLiteralNode(PropertyListNode *l) : list(l->next) { Parser::removeNodeCycle(list.get()); l->next = 0; }
    296300    JSValue *evaluate(ExecState *exec);
    297301    virtual void streamTo(SourceStream &s) const;
     
    335339  public:
    336340    // list pointer is tail of a circular list, cracked in the ArgumentsNode ctor
    337     ArgumentListNode(Node *e) : next(this), expr(e) { }
     341    ArgumentListNode(Node *e) : next(this), expr(e) { Parser::noteNodeCycle(this); }
    338342    ArgumentListNode(ArgumentListNode *l, Node *e)
    339343      : next(l->next), expr(e) { l->next = this; }
     
    342346    virtual void streamTo(SourceStream &s) const;
    343347    PassRefPtr<ArgumentListNode> releaseNext() { return next.release(); }
     348    virtual void breakCycle();
    344349  private:
    345350    friend class ArgumentsNode;
     
    352357    ArgumentsNode() : list(0) { }
    353358    ArgumentsNode(ArgumentListNode *l)
    354       : list(l->next) { l->next = 0; }
     359      : list(l->next) { Parser::removeNodeCycle(list.get()); l->next = 0; }
    355360    JSValue *evaluate(ExecState *exec);
    356361    List evaluateList(ExecState *exec);
     
    747752    virtual void streamTo(SourceStream &s) const;
    748753    PassRefPtr<StatListNode> releaseNext() { return next.release(); }
     754    virtual void breakCycle();
    749755  private:
    750756    friend class CaseClauseNode;
     
    778784  public:
    779785    // list pointer is tail of a circular list, cracked in the ForNode/VarStatementNode ctor
    780     VarDeclListNode(VarDeclNode *v) : next(this), var(v) {}
     786    VarDeclListNode(VarDeclNode *v) : next(this), var(v) { Parser::noteNodeCycle(this); }
    781787    VarDeclListNode(VarDeclListNode *l, VarDeclNode *v)
    782788      : next(l->next), var(v) { l->next = this; }
     
    785791    virtual void streamTo(SourceStream &s) const;
    786792    PassRefPtr<VarDeclListNode> releaseNext() { return next.release(); }
     793    virtual void breakCycle();
    787794  private:
    788795    friend class ForNode;
     
    794801  class VarStatementNode : public StatementNode {
    795802  public:
    796     VarStatementNode(VarDeclListNode *l) : next(l->next) { l->next = 0; }
     803    VarStatementNode(VarDeclListNode *l) : next(l->next) { Parser::removeNodeCycle(next.get()); l->next = 0; }
    797804    virtual Completion execute(ExecState *exec);
    798805    virtual void processVarDecls(ExecState *exec);
     
    868875      expr1(e1), expr2(e2), expr3(e3), statement(s) {}
    869876    ForNode(VarDeclListNode *e1, Node *e2, Node *e3, StatementNode *s) :
    870       expr1(e1->next), expr2(e2), expr3(e3), statement(s) { e1->next = 0; }
     877      expr1(e1->next), expr2(e2), expr3(e3), statement(s) { Parser::removeNodeCycle(expr1.get()); e1->next = 0; }
    871878    virtual Completion execute(ExecState *exec);
    872879    virtual void processVarDecls(ExecState *exec);
     
    939946    CaseClauseNode(Node *e) : expr(e), next(0) { }
    940947    CaseClauseNode(Node *e, StatListNode *l)
    941       : expr(e), next(l->next) { l->next = 0; }
     948      : expr(e), next(l->next) { Parser::removeNodeCycle(next.get()); l->next = 0; }
    942949    JSValue *evaluate(ExecState *exec);
    943950    Completion evalStatements(ExecState *exec);
     
    952959  public:
    953960    // list pointer is tail of a circular list, cracked in the CaseBlockNode ctor
    954     ClauseListNode(CaseClauseNode *c) : clause(c), next(this) { }
     961    ClauseListNode(CaseClauseNode *c) : clause(c), next(this) { Parser::noteNodeCycle(this); }
    955962    ClauseListNode(ClauseListNode *n, CaseClauseNode *c)
    956963      : clause(c), next(n->next) { n->next = this; }
     
    961968    virtual void streamTo(SourceStream &s) const;
    962969    PassRefPtr<ClauseListNode> releaseNext() { return next.release(); }
     970    virtual void breakCycle();
    963971  private:
    964972    friend class CaseBlockNode;
     
    10281036  public:
    10291037    // list pointer is tail of a circular list, cracked in the FuncDeclNode/FuncExprNode ctor
    1030     ParameterNode(const Identifier &i) : id(i), next(this) { }
     1038    ParameterNode(const Identifier &i) : id(i), next(this) { Parser::noteNodeCycle(this); }
    10311039    ParameterNode(ParameterNode *next, const Identifier &i)
    10321040      : id(i), next(next->next) { next->next = this; }
     
    10361044    virtual void streamTo(SourceStream &s) const;
    10371045    PassRefPtr<ParameterNode> releaseNext() { return next.release(); }
     1046    virtual void breakCycle();
    10381047  private:
    10391048    friend class FuncDeclNode;
     
    10531062  public:
    10541063    FuncExprNode(const Identifier &i, FunctionBodyNode *b, ParameterNode *p = 0)
    1055       : ident(i), param(p ? p->next : 0), body(b) { if (p) p->next = 0; }
     1064      : ident(i), param(p ? p->next : 0), body(b) { if (p) { Parser::removeNodeCycle(param.get()); p->next = 0; } }
    10561065    virtual JSValue *evaluate(ExecState *);
    10571066    virtual void streamTo(SourceStream &) const;
     
    10691078      : ident(i), param(0), body(b) { }
    10701079    FuncDeclNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
    1071       : ident(i), param(p->next), body(b) { p->next = 0; }
     1080      : ident(i), param(p->next), body(b) { Parser::removeNodeCycle(param.get()); p->next = 0; }
    10721081    virtual Completion execute(ExecState *);
    10731082    virtual void processFuncDecl(ExecState *);
     
    10921101    virtual void streamTo(SourceStream &s) const;
    10931102    PassRefPtr<SourceElementsNode> releaseNext() { return next.release(); }
     1103    virtual void breakCycle();
    10941104  private:
    10951105    friend class BlockNode;
Note: See TracChangeset for help on using the changeset viewer.