[webkit-changes] cvs commit: JavaScriptCore/kjs internal.cpp internal.h nodes.cpp nodes.h

Maciej mjs at opensource.apple.com
Fri Aug 26 16:46:29 PDT 2005


mjs         05/08/26 16:46:28

  Modified:    .        ChangeLog
               kjs      internal.cpp internal.h nodes.cpp nodes.h
  Log:
          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):
  
  Revision  Changes    Path
  1.809     +19 -0     JavaScriptCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/ChangeLog,v
  retrieving revision 1.808
  retrieving revision 1.809
  diff -u -r1.808 -r1.809
  --- ChangeLog	26 Aug 2005 23:42:16 -0000	1.808
  +++ ChangeLog	26 Aug 2005 23:46:25 -0000	1.809
  @@ -2,6 +2,25 @@
   
           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):
  +
  +2005-08-26  Maciej Stachowiak  <mjs at apple.com>
  +
  +        Reviewed by John.
  +
   	- fixed <rdar://problem/4232452> many many leaks in kjsyyparse on some well-formed JavaScript (can repro on sony.com, webkit tests)
           
   	Fixed by changing the refcounting scheme for nodes. Instead of each node implementing a custom ref and
  
  
  
  1.66      +31 -1     JavaScriptCore/kjs/internal.cpp
  
  Index: internal.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/internal.cpp,v
  retrieving revision 1.65
  retrieving revision 1.66
  diff -u -r1.65 -r1.66
  --- internal.cpp	26 Aug 2005 23:42:17 -0000	1.65
  +++ internal.cpp	26 Aug 2005 23:46:27 -0000	1.66
  @@ -350,6 +350,35 @@
   static SharedPtr<ProgramNode> *progNode;
   int Parser::sid = 0;
   
  +const int initialCapacity = 64;
  +const int growthFactor = 2;
  +
  +static int numNewNodes;
  +static int newNodesCapacity;
  +static Node **newNodes;
  +
  +void Parser::saveNewNode(Node *node)
  +{
  +  if (numNewNodes == newNodesCapacity) {
  +    newNodesCapacity = (newNodesCapacity == 0) ? initialCapacity : newNodesCapacity * growthFactor;
  +    newNodes = (Node **)realloc(newNodes, sizeof(Node *) * newNodesCapacity);
  +  }
  +
  +  newNodes[numNewNodes++] = node;
  +}
  +
  +static void clearNewNodes()
  +{
  +  for (int i = 0; i < numNewNodes; i++) {
  +    if (newNodes[i]->refcount() == 0)
  +      delete newNodes[i];
  +  }
  +  delete newNodes;
  +  newNodes = 0;
  +  numNewNodes = 0;
  +  newNodesCapacity = 0;
  +}
  +
   SharedPtr<ProgramNode> Parser::parse(const UString &sourceURL, int startingLineNumber,
                                        const UChar *code, unsigned int length, int *sourceId,
                                        int *errLine, UString *errMsg)
  @@ -375,6 +404,8 @@
     SharedPtr<ProgramNode> prog = *progNode;
     *progNode = 0;
   
  +  clearNewNodes();
  +
     if (parseError || lexError) {
       int eline = Lexer::curr()->lineNo();
       if (errLine)
  @@ -392,7 +423,6 @@
     *progNode = prog;
   }
   
  -
   // ------------------------------ InterpreterImp -------------------------------
   
   InterpreterImp* InterpreterImp::s_hook = 0L;
  
  
  
  1.36      +3 -0      JavaScriptCore/kjs/internal.h
  
  Index: internal.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/internal.h,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- internal.h	26 Aug 2005 23:42:17 -0000	1.35
  +++ internal.h	26 Aug 2005 23:46:27 -0000	1.36
  @@ -38,6 +38,7 @@
   
   namespace KJS {
   
  +  class Node;
     class ProgramNode;
     class FunctionBodyNode;
     class FunctionPrototypeImp;
  @@ -200,6 +201,8 @@
                                                     int *errLine = 0, UString *errMsg = 0);
       static void accept(ProgramNode *prog);
   
  +    static void saveNewNode(Node *node);
  +
       static int sid;
     };
   
  
  
  
  1.78      +1 -0      JavaScriptCore/kjs/nodes.cpp
  
  Index: nodes.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/nodes.cpp,v
  retrieving revision 1.77
  retrieving revision 1.78
  diff -u -r1.77 -r1.78
  --- nodes.cpp	26 Aug 2005 23:42:17 -0000	1.77
  +++ nodes.cpp	26 Aug 2005 23:46:27 -0000	1.78
  @@ -99,6 +99,7 @@
     line = Lexer::curr()->lineNo();
     sourceURL = Lexer::curr()->sourceURL();
     m_refcount = 0;
  +  Parser::saveNewNode(this);
   }
   
   Node::~Node()
  
  
  
  1.29      +1 -0      JavaScriptCore/kjs/nodes.h
  
  Index: nodes.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/nodes.h,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- nodes.h	26 Aug 2005 23:42:17 -0000	1.28
  +++ nodes.h	26 Aug 2005 23:46:27 -0000	1.29
  @@ -94,6 +94,7 @@
       // reference counting mechanism
       void ref() { ++m_refcount; }
       void deref() { --m_refcount; if (!m_refcount) delete this; }
  +    unsigned int refcount() { return m_refcount; }
   
     protected:
       ValueImp *throwError(ExecState *exec, ErrorType e, const char *msg);
  
  
  



More information about the webkit-changes mailing list