2008-06-30 Geoffrey Garen <ggaren@apple.com>
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Jul 2008 07:01:51 +0000 (07:01 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Jul 2008 07:01:51 +0000 (07:01 +0000)
        Reviewed by Oliver Hunt.

        Fixed a global object leak caused by the switch to one register file.

        Don't unconditionally mark the register file, since that logically
        makes all global variables GC roots, even when their global object is
        no longer reachable.

        Instead, make the global object associated with the register file
        responsible for marking the register file.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@34907 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/VM/Machine.h
JavaScriptCore/kjs/JSGlobalData.cpp
JavaScriptCore/kjs/JSGlobalObject.cpp
JavaScriptCore/kjs/collector.cpp
JavaScriptCore/kjs/collector.h

index b68c719..13099cb 100644 (file)
@@ -2,6 +2,19 @@
 
         Reviewed by Oliver Hunt.
         
+        Fixed a global object leak caused by the switch to one register file.
+        
+        Don't unconditionally mark the register file, since that logically
+        makes all global variables GC roots, even when their global object is
+        no longer reachable.
+        
+        Instead, make the global object associated with the register file
+        responsible for marking the register file.
+
+2008-06-30  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Oliver Hunt.
+        
         Removed the "registerBase" abstraction. Since the register file never
         reallocates, we can keep direct pointers into it, instead of
         <registerBase, offset> tuples.
index 174ed52..38c97af 100644 (file)
@@ -117,7 +117,6 @@ namespace KJS {
             m_timeoutTime = 0;
             m_timeoutCheckCount = 0;
         }
-        void mark(Heap* heap) { m_registerFile.mark(heap); }
 
     private:
         enum ExecutionFlag { Normal, InitializeAndReturn };
index 35c7a07..9565337 100644 (file)
@@ -58,7 +58,7 @@ extern const HashTable stringTable;
 
 JSGlobalData::JSGlobalData()
     : machine(new Machine)
-    , heap(new Heap(machine))
+    , heap(new Heap)
 #if USE(MULTIPLE_THREADS)
     , arrayTable(new HashTable(KJS::arrayTable))
     , dateTable(new HashTable(KJS::dateTable))
index 10e5322..d74e73b 100644 (file)
@@ -346,6 +346,10 @@ void JSGlobalObject::mark()
     for (HashSet<ProgramCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it)
         (*it)->mark();
 
+    RegisterFile& registerFile = globalData()->machine->registerFile();
+    if (registerFile.globalObject() == this)
+        registerFile.mark(globalData()->heap);
+
     markIfNeeded(d()->globalExec->exception());
 
     markIfNeeded(d()->regExpConstructor);
index a2646dc..e3846c9 100644 (file)
@@ -90,9 +90,8 @@ const size_t ALLOCATIONS_PER_COLLECTION = 4000;
 
 static void freeHeap(CollectorHeap*);
 
-Heap::Heap(Machine* machine)
+Heap::Heap()
     : m_markListSet(0)
-    , m_machine(machine)
 {
     memset(&primaryHeap, 0, sizeof(CollectorHeap));
     memset(&numberHeap, 0, sizeof(CollectorHeap));
@@ -908,7 +907,6 @@ bool Heap::collect()
 
     markStackObjectsConservatively();
     markProtectedObjects();
-    m_machine->mark(this);
     if (m_markListSet && m_markListSet->size())
         ArgList::markLists(*m_markListSet);
 
index fbb15c3..5698f78 100644 (file)
@@ -107,7 +107,7 @@ namespace KJS {
 
         friend class Machine;
         friend class JSGlobalData;
-        Heap(Machine*);
+        Heap();
         ~Heap();
 
         void recordExtraCost(size_t);
@@ -123,7 +123,6 @@ namespace KJS {
         CollectorHeap numberHeap;
         ProtectCountSet protectedValues;
         HashSet<ArgList*>* m_markListSet;
-        Machine* m_machine;
     };
 
     // tunable parameters