Changeset 12593 in webkit for trunk/JavaScriptCore/kjs/nodes.h
- Timestamp:
- Feb 5, 2006, 11:49:05 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.h
r12317 r12593 96 96 virtual bool isGroupNode() const { return false; } 97 97 98 virtual void breakCycle() { } 99 98 100 protected: 99 101 Completion createErrorCompletion(ExecState *, ErrorType, const char *msg); … … 221 223 public: 222 224 // 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); } 224 226 ElementNode(ElementNode *l, int e, Node *n) 225 227 : next(l->next), elision(e), node(n) { l->next = this; } … … 227 229 virtual void streamTo(SourceStream &s) const; 228 230 PassRefPtr<ElementNode> releaseNext() { return next.release(); } 231 virtual void breakCycle(); 229 232 private: 230 233 friend class ArrayNode; … … 238 241 ArrayNode(int e) : element(0), elision(e), opt(true) { } 239 242 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; } 241 244 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; } 243 246 JSValue *evaluate(ExecState *exec); 244 247 virtual void streamTo(SourceStream &s) const; … … 278 281 // list pointer is tail of a circular list, cracked in the ObjectLiteralNode ctor 279 282 PropertyListNode(PropertyNode *n) 280 : node(n), next(this) { }283 : node(n), next(this) { Parser::noteNodeCycle(this); } 281 284 PropertyListNode(PropertyNode *n, PropertyListNode *l) 282 285 : node(n), next(l->next) { l->next = this; } … … 284 287 virtual void streamTo(SourceStream &s) const; 285 288 PassRefPtr<PropertyListNode> releaseNext() { return next.release(); } 289 virtual void breakCycle(); 286 290 private: 287 291 friend class ObjectLiteralNode; … … 293 297 public: 294 298 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; } 296 300 JSValue *evaluate(ExecState *exec); 297 301 virtual void streamTo(SourceStream &s) const; … … 335 339 public: 336 340 // 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); } 338 342 ArgumentListNode(ArgumentListNode *l, Node *e) 339 343 : next(l->next), expr(e) { l->next = this; } … … 342 346 virtual void streamTo(SourceStream &s) const; 343 347 PassRefPtr<ArgumentListNode> releaseNext() { return next.release(); } 348 virtual void breakCycle(); 344 349 private: 345 350 friend class ArgumentsNode; … … 352 357 ArgumentsNode() : list(0) { } 353 358 ArgumentsNode(ArgumentListNode *l) 354 : list(l->next) { l->next = 0; }359 : list(l->next) { Parser::removeNodeCycle(list.get()); l->next = 0; } 355 360 JSValue *evaluate(ExecState *exec); 356 361 List evaluateList(ExecState *exec); … … 747 752 virtual void streamTo(SourceStream &s) const; 748 753 PassRefPtr<StatListNode> releaseNext() { return next.release(); } 754 virtual void breakCycle(); 749 755 private: 750 756 friend class CaseClauseNode; … … 778 784 public: 779 785 // 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); } 781 787 VarDeclListNode(VarDeclListNode *l, VarDeclNode *v) 782 788 : next(l->next), var(v) { l->next = this; } … … 785 791 virtual void streamTo(SourceStream &s) const; 786 792 PassRefPtr<VarDeclListNode> releaseNext() { return next.release(); } 793 virtual void breakCycle(); 787 794 private: 788 795 friend class ForNode; … … 794 801 class VarStatementNode : public StatementNode { 795 802 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; } 797 804 virtual Completion execute(ExecState *exec); 798 805 virtual void processVarDecls(ExecState *exec); … … 868 875 expr1(e1), expr2(e2), expr3(e3), statement(s) {} 869 876 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; } 871 878 virtual Completion execute(ExecState *exec); 872 879 virtual void processVarDecls(ExecState *exec); … … 939 946 CaseClauseNode(Node *e) : expr(e), next(0) { } 940 947 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; } 942 949 JSValue *evaluate(ExecState *exec); 943 950 Completion evalStatements(ExecState *exec); … … 952 959 public: 953 960 // 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); } 955 962 ClauseListNode(ClauseListNode *n, CaseClauseNode *c) 956 963 : clause(c), next(n->next) { n->next = this; } … … 961 968 virtual void streamTo(SourceStream &s) const; 962 969 PassRefPtr<ClauseListNode> releaseNext() { return next.release(); } 970 virtual void breakCycle(); 963 971 private: 964 972 friend class CaseBlockNode; … … 1028 1036 public: 1029 1037 // 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); } 1031 1039 ParameterNode(ParameterNode *next, const Identifier &i) 1032 1040 : id(i), next(next->next) { next->next = this; } … … 1036 1044 virtual void streamTo(SourceStream &s) const; 1037 1045 PassRefPtr<ParameterNode> releaseNext() { return next.release(); } 1046 virtual void breakCycle(); 1038 1047 private: 1039 1048 friend class FuncDeclNode; … … 1053 1062 public: 1054 1063 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; } } 1056 1065 virtual JSValue *evaluate(ExecState *); 1057 1066 virtual void streamTo(SourceStream &) const; … … 1069 1078 : ident(i), param(0), body(b) { } 1070 1079 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; } 1072 1081 virtual Completion execute(ExecState *); 1073 1082 virtual void processFuncDecl(ExecState *); … … 1092 1101 virtual void streamTo(SourceStream &s) const; 1093 1102 PassRefPtr<SourceElementsNode> releaseNext() { return next.release(); } 1103 virtual void breakCycle(); 1094 1104 private: 1095 1105 friend class BlockNode;
Note:
See TracChangeset
for help on using the changeset viewer.