Changeset 34907 in webkit


Ignore:
Timestamp:
Jul 1, 2008 12:01:51 AM (16 years ago)
Author:
ggaren@apple.com
Message:

2008-06-30 Geoffrey Garen <ggaren@apple.com>

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.

Location:
trunk/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r34906 r34907  
     12008-06-30  Geoffrey Garen  <ggaren@apple.com>
     2
     3        Reviewed by Oliver Hunt.
     4       
     5        Fixed a global object leak caused by the switch to one register file.
     6       
     7        Don't unconditionally mark the register file, since that logically
     8        makes all global variables GC roots, even when their global object is
     9        no longer reachable.
     10       
     11        Instead, make the global object associated with the register file
     12        responsible for marking the register file.
     13
    1142008-06-30  Geoffrey Garen  <ggaren@apple.com>
    215
  • trunk/JavaScriptCore/VM/Machine.h

    r34906 r34907  
    118118            m_timeoutCheckCount = 0;
    119119        }
    120         void mark(Heap* heap) { m_registerFile.mark(heap); }
    121120
    122121    private:
  • trunk/JavaScriptCore/kjs/JSGlobalData.cpp

    r34838 r34907  
    5959JSGlobalData::JSGlobalData()
    6060    : machine(new Machine)
    61     , heap(new Heap(machine))
     61    , heap(new Heap)
    6262#if USE(MULTIPLE_THREADS)
    6363    , arrayTable(new HashTable(KJS::arrayTable))
  • trunk/JavaScriptCore/kjs/JSGlobalObject.cpp

    r34906 r34907  
    347347        (*it)->mark();
    348348
     349    RegisterFile& registerFile = globalData()->machine->registerFile();
     350    if (registerFile.globalObject() == this)
     351        registerFile.mark(globalData()->heap);
     352
    349353    markIfNeeded(d()->globalExec->exception());
    350354
  • trunk/JavaScriptCore/kjs/collector.cpp

    r34839 r34907  
    9191static void freeHeap(CollectorHeap*);
    9292
    93 Heap::Heap(Machine* machine)
     93Heap::Heap()
    9494    : m_markListSet(0)
    95     , m_machine(machine)
    9695{
    9796    memset(&primaryHeap, 0, sizeof(CollectorHeap));
     
    909908    markStackObjectsConservatively();
    910909    markProtectedObjects();
    911     m_machine->mark(this);
    912910    if (m_markListSet && m_markListSet->size())
    913911        ArgList::markLists(*m_markListSet);
  • trunk/JavaScriptCore/kjs/collector.h

    r34838 r34907  
    108108        friend class Machine;
    109109        friend class JSGlobalData;
    110         Heap(Machine*);
     110        Heap();
    111111        ~Heap();
    112112
     
    124124        ProtectCountSet protectedValues;
    125125        HashSet<ArgList*>* m_markListSet;
    126         Machine* m_machine;
    127126    };
    128127
Note: See TracChangeset for help on using the changeset viewer.