Changeset 2735 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp


Ignore:
Timestamp:
Nov 18, 2002, 1:45:10 PM (23 years ago)
Author:
mjs
Message:

Change ArgumentListNode operations to be iterative instead of
recursive. This probably fixes 3095446 (Crash in
KJS::ArgumentListNode::ref()) but I can't reproduce it myself so
I'm not 100% sure. I think the original bug was a stack overflow
and this change would remove that possibility.

  • kjs/nodes.cpp: (ArgumentListNode::ref): Make iterative. (ArgumentListNode::deref): Make iterative. (ArgumentListNode::evaluateList): Make iterative.
File:
1 edited

Legend:

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

    r1850 r2735  
    551551void ArgumentListNode::ref()
    552552{
    553   Node::ref();
    554   if ( expr )
    555     expr->ref();
    556   if ( list )
    557     list->ref();
     553  ArgumentListNode *l = this;
     554
     555  while (l != NULL) {
     556    l->Node::ref();
     557    if ( l->expr )
     558      l->expr->ref();
     559    l = l->list;
     560  }
    558561}
    559562
     
    562565  if ( expr && expr->deref() )
    563566    delete expr;
    564   if ( list && list->deref() )
    565     delete list;
     567
     568  ArgumentListNode *l = this->list;
     569
     570  while (l != NULL) {
     571    if ( l->expr && l->expr->deref() )
     572      delete l->expr;
     573   
     574    ArgumentListNode *next = l->list;
     575
     576    if (l->Node::deref()) {
     577      l->list = NULL;
     578      delete l;
     579    }
     580
     581    l = next;
     582  }
     583
    566584  return Node::deref();
    567585}
     
    577595{
    578596  List l;
    579   if (list) {
    580     l = list->evaluateList(exec);
     597
     598  ArgumentListNode *n = this;
     599
     600  while (n != NULL) {
     601    Value v = n->expr->evaluate(exec);
    581602    KJS_CHECKEXCEPTIONLIST
    582   }
    583 
    584   Value v = expr->evaluate(exec);
    585   KJS_CHECKEXCEPTIONLIST
    586 
    587   l.append(v);
     603
     604    l.append(v);
     605
     606    n = n->list;
     607  }
    588608
    589609  return l;
Note: See TracChangeset for help on using the changeset viewer.