[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