<?xml version="1.0"?>
<paste-with-annotations>
  <paste>
    <number>
      <integer>63191</integer>
    </number>
    <user>
      <string>ggaren</string>
    </user>
    <title>
      <string>patch to fix gmail crash</string>
    </title>
    <contents>
      <string>Index: VM/RegisterFile.h
===================================================================
--- VM/RegisterFile.h	(revision 34970)
+++ VM/RegisterFile.h	(working copy)
@@ -165,11 +165,6 @@ namespace KJS {
 
         Register* lastGlobal() { return m_base - m_numGlobals; }
 
-        void mark(Heap* heap)
-        {
-            heap-&gt;markConservatively(lastGlobal(), m_base + m_size);
-        }
-
     private:
         size_t m_size;
         const size_t m_capacity;
Index: kjs/JSGlobalData.cpp
===================================================================
--- kjs/JSGlobalData.cpp	(revision 34970)
+++ kjs/JSGlobalData.cpp	(working copy)
@@ -58,7 +58,7 @@ extern const HashTable stringTable;
 
 JSGlobalData::JSGlobalData(bool isShared)
     : machine(new Machine)
-    , heap(new Heap(isShared))
+    , heap(new Heap(machine, isShared))
 #if USE(MULTIPLE_THREADS)
     , arrayTable(new HashTable(KJS::arrayTable))
     , dateTable(new HashTable(KJS::dateTable))
Index: kjs/JSGlobalObject.cpp
===================================================================
--- kjs/JSGlobalObject.cpp	(revision 34970)
+++ kjs/JSGlobalObject.cpp	(working copy)
@@ -350,7 +350,7 @@ void JSGlobalObject::mark()
 
     RegisterFile&amp; registerFile = globalData()-&gt;machine-&gt;registerFile();
     if (registerFile.globalObject() == this)
-        registerFile.mark(globalData()-&gt;heap);
+        globalData()-&gt;heap-&gt;markConservatively(registerFile.lastGlobal(), registerFile.base());
 
     markIfNeeded(d()-&gt;globalExec-&gt;exception());
 
Index: kjs/collector.cpp
===================================================================
--- kjs/collector.cpp	(revision 34970)
+++ kjs/collector.cpp	(working copy)
@@ -92,9 +92,10 @@ const size_t ALLOCATIONS_PER_COLLECTION 
 
 static void freeHeap(CollectorHeap*);
 
-Heap::Heap(bool isShared)
+Heap::Heap(Machine* machine, bool isShared)
     : m_markListSet(0)
     , m_isShared(isShared)
+    , m_machine(machine)
 {
     memset(&amp;primaryHeap, 0, sizeof(CollectorHeap));
     memset(&amp;numberHeap, 0, sizeof(CollectorHeap));
@@ -944,6 +945,7 @@ bool Heap::collect()
     markProtectedObjects();
     if (m_markListSet &amp;&amp; m_markListSet-&gt;size())
         ArgList::markLists(*m_markListSet);
+    markConservatively(m_machine-&gt;registerFile().base(), m_machine-&gt;registerFile().base() + m_machine-&gt;registerFile().size());
 
     JAVASCRIPTCORE_GC_MARKED();
 
Index: kjs/collector.h
===================================================================
--- kjs/collector.h	(revision 34970)
+++ kjs/collector.h	(working copy)
@@ -111,7 +111,7 @@ namespace KJS {
         static size_t cellOffset(const JSCell*);
 
         friend class JSGlobalData;
-        Heap(bool isShared);
+        Heap(Machine*, bool isShared);
         ~Heap();
 
         void recordExtraCost(size_t);
@@ -132,6 +132,8 @@ namespace KJS {
         HashSet&lt;ArgList*&gt;* m_markListSet;
 
         bool m_isShared;
+        
+        Machine* m_machine;
     };
 
     // tunable parameters
</string>
    </contents>
    <universal-time>
      <integer>3424053815</integer>
    </universal-time>
    <channel>
      <string>#webkit</string>
    </channel>
    <colorization-mode>
      <string></string>
    </colorization-mode>
    <maybe-spam>
      <null/>
    </maybe-spam>
    <is-unicode>
      <keyword>TRUE</keyword>
    </is-unicode>
  </paste>
  <annotation>
    <number>
      <integer>1</integer>
    </number>
    <user>
      <string>ggaren</string>
    </user>
    <title>
      <string>latest patch version</string>
    </title>
    <contents>
      <string>Index: VM/RegisterFile.h
===================================================================
--- VM/RegisterFile.h	(revision 34970)
+++ VM/RegisterFile.h	(working copy)
@@ -164,11 +164,9 @@ namespace KJS {
         size_t maxGlobals() { return m_maxGlobals; }
 
         Register* lastGlobal() { return m_base - m_numGlobals; }
-
-        void mark(Heap* heap)
-        {
-            heap-&gt;markConservatively(lastGlobal(), m_base + m_size);
-        }
+        
+        void markGlobals(Heap* heap) { heap-&gt;markConservatively(lastGlobal(), m_base); }
+        void markCallFrames(Heap* heap) { heap-&gt;markConservatively(m_base, m_base + m_size); }
 
     private:
         size_t m_size;
Index: kjs/JSGlobalData.cpp
===================================================================
--- kjs/JSGlobalData.cpp	(revision 34970)
+++ kjs/JSGlobalData.cpp	(working copy)
@@ -58,7 +58,7 @@ extern const HashTable stringTable;
 
 JSGlobalData::JSGlobalData(bool isShared)
     : machine(new Machine)
-    , heap(new Heap(isShared))
+    , heap(new Heap(machine, isShared))
 #if USE(MULTIPLE_THREADS)
     , arrayTable(new HashTable(KJS::arrayTable))
     , dateTable(new HashTable(KJS::dateTable))
Index: kjs/JSGlobalObject.cpp
===================================================================
--- kjs/JSGlobalObject.cpp	(revision 34970)
+++ kjs/JSGlobalObject.cpp	(working copy)
@@ -350,7 +350,7 @@ void JSGlobalObject::mark()
 
     RegisterFile&amp; registerFile = globalData()-&gt;machine-&gt;registerFile();
     if (registerFile.globalObject() == this)
-        registerFile.mark(globalData()-&gt;heap);
+        registerFile.markGlobals(globalData()-&gt;heap);
 
     markIfNeeded(d()-&gt;globalExec-&gt;exception());
 
Index: kjs/collector.cpp
===================================================================
--- kjs/collector.cpp	(revision 34970)
+++ kjs/collector.cpp	(working copy)
@@ -92,9 +92,10 @@ const size_t ALLOCATIONS_PER_COLLECTION 
 
 static void freeHeap(CollectorHeap*);
 
-Heap::Heap(bool isShared)
+Heap::Heap(Machine* machine, bool isShared)
     : m_markListSet(0)
     , m_isShared(isShared)
+    , m_machine(machine)
 {
     memset(&amp;primaryHeap, 0, sizeof(CollectorHeap));
     memset(&amp;numberHeap, 0, sizeof(CollectorHeap));
@@ -944,6 +945,7 @@ bool Heap::collect()
     markProtectedObjects();
     if (m_markListSet &amp;&amp; m_markListSet-&gt;size())
         ArgList::markLists(*m_markListSet);
+    m_machine-&gt;registerFile().markCallFrames(this);
 
     JAVASCRIPTCORE_GC_MARKED();
 
Index: kjs/collector.h
===================================================================
--- kjs/collector.h	(revision 34970)
+++ kjs/collector.h	(working copy)
@@ -111,7 +111,7 @@ namespace KJS {
         static size_t cellOffset(const JSCell*);
 
         friend class JSGlobalData;
-        Heap(bool isShared);
+        Heap(Machine*, bool isShared);
         ~Heap();
 
         void recordExtraCost(size_t);
@@ -132,6 +132,8 @@ namespace KJS {
         HashSet&lt;ArgList*&gt;* m_markListSet;
 
         bool m_isShared;
+        
+        Machine* m_machine;
     };
 
     // tunable parameters
</string>
    </contents>
    <universal-time>
      <integer>3424055341</integer>
    </universal-time>
    <channel>
      <string>#webkit</string>
    </channel>
    <colorization-mode>
      <string></string>
    </colorization-mode>
    <maybe-spam>
      <null/>
    </maybe-spam>
    <is-unicode>
      <keyword>TRUE</keyword>
    </is-unicode>
  </annotation>
</paste-with-annotations>