Ignore:
Timestamp:
Aug 26, 2005, 4:46:27 PM (20 years ago)
Author:
mjs
Message:

Reviewed by John.

<rdar://problem/4224911> many many leaks in kjsyyparse with malformed Javascript

Record all nodes that are created during parsing, and delete any
that are left floating with a refcount of 0.

  • kjs/internal.cpp: (KJS::Parser::saveNewNode): (KJS::clearNewNodes): (KJS::Parser::parse):
  • kjs/internal.h:
  • kjs/nodes.cpp: (Node::Node):
  • kjs/nodes.h: (KJS::Node::refcount):
File:
1 edited

Legend:

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

    r10352 r10354  
    351351int Parser::sid = 0;
    352352
     353const int initialCapacity = 64;
     354const int growthFactor = 2;
     355
     356static int numNewNodes;
     357static int newNodesCapacity;
     358static Node **newNodes;
     359
     360void Parser::saveNewNode(Node *node)
     361{
     362  if (numNewNodes == newNodesCapacity) {
     363    newNodesCapacity = (newNodesCapacity == 0) ? initialCapacity : newNodesCapacity * growthFactor;
     364    newNodes = (Node **)realloc(newNodes, sizeof(Node *) * newNodesCapacity);
     365  }
     366
     367  newNodes[numNewNodes++] = node;
     368}
     369
     370static void clearNewNodes()
     371{
     372  for (int i = 0; i < numNewNodes; i++) {
     373    if (newNodes[i]->refcount() == 0)
     374      delete newNodes[i];
     375  }
     376  delete newNodes;
     377  newNodes = 0;
     378  numNewNodes = 0;
     379  newNodesCapacity = 0;
     380}
     381
    353382SharedPtr<ProgramNode> Parser::parse(const UString &sourceURL, int startingLineNumber,
    354383                                     const UChar *code, unsigned int length, int *sourceId,
     
    376405  *progNode = 0;
    377406
     407  clearNewNodes();
     408
    378409  if (parseError || lexError) {
    379410    int eline = Lexer::curr()->lineNo();
     
    392423  *progNode = prog;
    393424}
    394 
    395425
    396426// ------------------------------ InterpreterImp -------------------------------
Note: See TracChangeset for help on using the changeset viewer.