Changeset 10354 in webkit for trunk/JavaScriptCore


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):
Location:
trunk/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r10352 r10354  
     12005-08-26  Maciej Stachowiak  <[email protected]>
     2
     3        Reviewed by John.
     4
     5        <rdar://problem/4224911> many many leaks in kjsyyparse with malformed Javascript       
     6
     7        Record all nodes that are created during parsing, and delete any
     8        that are left floating with a refcount of 0.
     9       
     10        * kjs/internal.cpp:
     11        (KJS::Parser::saveNewNode):
     12        (KJS::clearNewNodes):
     13        (KJS::Parser::parse):
     14        * kjs/internal.h:
     15        * kjs/nodes.cpp:
     16        (Node::Node):
     17        * kjs/nodes.h:
     18        (KJS::Node::refcount):
     19
    1202005-08-26  Maciej Stachowiak  <[email protected]>
    221
  • 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 -------------------------------
  • trunk/JavaScriptCore/kjs/internal.h

    r10352 r10354  
    3939namespace KJS {
    4040
     41  class Node;
    4142  class ProgramNode;
    4243  class FunctionBodyNode;
     
    201202    static void accept(ProgramNode *prog);
    202203
     204    static void saveNewNode(Node *node);
     205
    203206    static int sid;
    204207  };
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r10352 r10354  
    100100  sourceURL = Lexer::curr()->sourceURL();
    101101  m_refcount = 0;
     102  Parser::saveNewNode(this);
    102103}
    103104
  • trunk/JavaScriptCore/kjs/nodes.h

    r10352 r10354  
    9595    void ref() { ++m_refcount; }
    9696    void deref() { --m_refcount; if (!m_refcount) delete this; }
     97    unsigned int refcount() { return m_refcount; }
    9798
    9899  protected:
Note: See TracChangeset for help on using the changeset viewer.