JSGlobalData::~JSGlobalData() { // Modified by Paul Pedriana 1/17/2009 in order to fix memory leaks. delete heap; delete machine; #if USE(MULTIPLE_THREADS) delete[] arrayTable->table; delete[] dateTable->table; delete[] mathTable->table; delete[] numberTable->table; delete[] regExpTable->table; delete[] regExpConstructorTable->table; delete[] stringTable->table; delete arrayTable; delete dateTable; delete mathTable; delete numberTable; delete regExpTable; delete regExpConstructorTable; delete stringTable; #endif delete parser; delete lexer; delete propertyNames; deleteIdentifierTable(identifierTable); delete newParserObjects; delete parserObjectExtraRefCounts; }
JSGlobalData::~JSGlobalData() { // By the time this is destroyed, heap.destroy() must already have been called. delete interpreter; #ifndef NDEBUG // Zeroing out to make the behavior more predictable when someone attempts to use a deleted instance. interpreter = 0; #endif arrayTable->deleteTable(); dateTable->deleteTable(); jsonTable->deleteTable(); mathTable->deleteTable(); numberTable->deleteTable(); objectConstructorTable->deleteTable(); regExpTable->deleteTable(); regExpConstructorTable->deleteTable(); stringTable->deleteTable(); fastDelete(const_cast<HashTable*>(arrayTable)); fastDelete(const_cast<HashTable*>(dateTable)); fastDelete(const_cast<HashTable*>(jsonTable)); fastDelete(const_cast<HashTable*>(mathTable)); fastDelete(const_cast<HashTable*>(numberTable)); fastDelete(const_cast<HashTable*>(objectConstructorTable)); fastDelete(const_cast<HashTable*>(regExpTable)); fastDelete(const_cast<HashTable*>(regExpConstructorTable)); fastDelete(const_cast<HashTable*>(stringTable)); delete parser; delete lexer; deleteAllValues(opaqueJSClassData); delete emptyList; delete propertyNames; if (globalDataType != Default) deleteIdentifierTable(identifierTable); delete clientData; delete m_regExpCache; #if ENABLE(REGEXP_TRACING) delete m_rtTraceList; #endif }
JSGlobalData::~JSGlobalData() { delete heap; delete machine; #ifndef NDEBUG // Zeroing out to make the behavior more predictable when someone attempts to use a deleted instance. heap = 0; machine = 0; #endif #if ENABLE(JSC_MULTIPLE_THREADS) arrayTable->deleteTable(); dateTable->deleteTable(); mathTable->deleteTable(); numberTable->deleteTable(); regExpTable->deleteTable(); regExpConstructorTable->deleteTable(); stringTable->deleteTable(); delete arrayTable; delete dateTable; delete mathTable; delete numberTable; delete regExpTable; delete regExpConstructorTable; delete stringTable; #endif delete parser; delete lexer; deleteAllValues(*opaqueJSClassData); delete opaqueJSClassData; delete emptyList; delete propertyNames; deleteIdentifierTable(identifierTable); delete newParserObjects; delete parserObjectExtraRefCounts; }
JSGlobalData::~JSGlobalData() { ASSERT(!m_apiLock.currentThreadIsHoldingLock()); heap.activityCallback()->didStartVMShutdown(); heap.sweeper()->didStartVMShutdown(); heap.lastChanceToFinalize(); delete interpreter; #ifndef NDEBUG interpreter = reinterpret_cast<Interpreter*>(0xbbadbeef); #endif arrayPrototypeTable->deleteTable(); arrayConstructorTable->deleteTable(); booleanPrototypeTable->deleteTable(); dateTable->deleteTable(); dateConstructorTable->deleteTable(); errorPrototypeTable->deleteTable(); globalObjectTable->deleteTable(); jsonTable->deleteTable(); mathTable->deleteTable(); numberConstructorTable->deleteTable(); numberPrototypeTable->deleteTable(); objectConstructorTable->deleteTable(); objectPrototypeTable->deleteTable(); privateNamePrototypeTable->deleteTable(); regExpTable->deleteTable(); regExpConstructorTable->deleteTable(); regExpPrototypeTable->deleteTable(); stringTable->deleteTable(); stringConstructorTable->deleteTable(); fastDelete(const_cast<HashTable*>(arrayConstructorTable)); fastDelete(const_cast<HashTable*>(arrayPrototypeTable)); fastDelete(const_cast<HashTable*>(booleanPrototypeTable)); fastDelete(const_cast<HashTable*>(dateTable)); fastDelete(const_cast<HashTable*>(dateConstructorTable)); fastDelete(const_cast<HashTable*>(errorPrototypeTable)); fastDelete(const_cast<HashTable*>(globalObjectTable)); fastDelete(const_cast<HashTable*>(jsonTable)); fastDelete(const_cast<HashTable*>(mathTable)); fastDelete(const_cast<HashTable*>(numberConstructorTable)); fastDelete(const_cast<HashTable*>(numberPrototypeTable)); fastDelete(const_cast<HashTable*>(objectConstructorTable)); fastDelete(const_cast<HashTable*>(objectPrototypeTable)); fastDelete(const_cast<HashTable*>(privateNamePrototypeTable)); fastDelete(const_cast<HashTable*>(regExpTable)); fastDelete(const_cast<HashTable*>(regExpConstructorTable)); fastDelete(const_cast<HashTable*>(regExpPrototypeTable)); fastDelete(const_cast<HashTable*>(stringTable)); fastDelete(const_cast<HashTable*>(stringConstructorTable)); opaqueJSClassData.clear(); delete emptyList; delete propertyNames; if (globalDataType != Default) deleteIdentifierTable(identifierTable); delete clientData; delete m_regExpCache; #if ENABLE(REGEXP_TRACING) delete m_rtTraceList; #endif #if ENABLE(DFG_JIT) for (unsigned i = 0; i < scratchBuffers.size(); ++i) fastFree(scratchBuffers[i]); #endif }
JSGlobalData::~JSGlobalData() { // By the time this is destroyed, heap.destroy() must already have been called. delete interpreter; #ifndef NDEBUG // Zeroing out to make the behavior more predictable when someone attempts to use a deleted instance. interpreter = 0; #endif arrayPrototypeTable->deleteTable(); arrayConstructorTable->deleteTable(); booleanPrototypeTable->deleteTable(); dateTable->deleteTable(); dateConstructorTable->deleteTable(); errorPrototypeTable->deleteTable(); globalObjectTable->deleteTable(); jsonTable->deleteTable(); mathTable->deleteTable(); numberConstructorTable->deleteTable(); numberPrototypeTable->deleteTable(); objectConstructorTable->deleteTable(); objectPrototypeTable->deleteTable(); regExpTable->deleteTable(); regExpConstructorTable->deleteTable(); regExpPrototypeTable->deleteTable(); stringTable->deleteTable(); stringConstructorTable->deleteTable(); fastDelete(const_cast<HashTable*>(arrayConstructorTable)); fastDelete(const_cast<HashTable*>(arrayPrototypeTable)); fastDelete(const_cast<HashTable*>(booleanPrototypeTable)); fastDelete(const_cast<HashTable*>(dateTable)); fastDelete(const_cast<HashTable*>(dateConstructorTable)); fastDelete(const_cast<HashTable*>(errorPrototypeTable)); fastDelete(const_cast<HashTable*>(globalObjectTable)); fastDelete(const_cast<HashTable*>(jsonTable)); fastDelete(const_cast<HashTable*>(mathTable)); fastDelete(const_cast<HashTable*>(numberConstructorTable)); fastDelete(const_cast<HashTable*>(numberPrototypeTable)); fastDelete(const_cast<HashTable*>(objectConstructorTable)); fastDelete(const_cast<HashTable*>(objectPrototypeTable)); fastDelete(const_cast<HashTable*>(regExpTable)); fastDelete(const_cast<HashTable*>(regExpConstructorTable)); fastDelete(const_cast<HashTable*>(regExpPrototypeTable)); fastDelete(const_cast<HashTable*>(stringTable)); fastDelete(const_cast<HashTable*>(stringConstructorTable)); opaqueJSClassData.clear(); delete emptyList; delete propertyNames; if (globalDataType != Default) deleteIdentifierTable(identifierTable); delete clientData; delete m_regExpCache; #if ENABLE(REGEXP_TRACING) delete m_rtTraceList; #endif #if ENABLE(DFG_JIT) for (unsigned i = 0; i < scratchBuffers.size(); ++i) fastFree(scratchBuffers[i]); #endif }
VM::~VM() { // Clear this first to ensure that nobody tries to remove themselves from it. m_perBytecodeProfiler.clear(); ASSERT(m_apiLock->currentThreadIsHoldingLock()); m_apiLock->willDestroyVM(this); heap.lastChanceToFinalize(); delete interpreter; #ifndef NDEBUG interpreter = reinterpret_cast<Interpreter*>(0xbbadbeef); #endif arrayPrototypeTable->deleteTable(); arrayConstructorTable->deleteTable(); booleanPrototypeTable->deleteTable(); dateTable->deleteTable(); dateConstructorTable->deleteTable(); errorPrototypeTable->deleteTable(); globalObjectTable->deleteTable(); jsonTable->deleteTable(); mathTable->deleteTable(); numberConstructorTable->deleteTable(); numberPrototypeTable->deleteTable(); objectConstructorTable->deleteTable(); privateNamePrototypeTable->deleteTable(); regExpTable->deleteTable(); regExpConstructorTable->deleteTable(); regExpPrototypeTable->deleteTable(); stringConstructorTable->deleteTable(); fastDelete(const_cast<HashTable*>(arrayConstructorTable)); fastDelete(const_cast<HashTable*>(arrayPrototypeTable)); fastDelete(const_cast<HashTable*>(booleanPrototypeTable)); fastDelete(const_cast<HashTable*>(dateTable)); fastDelete(const_cast<HashTable*>(dateConstructorTable)); fastDelete(const_cast<HashTable*>(errorPrototypeTable)); fastDelete(const_cast<HashTable*>(globalObjectTable)); fastDelete(const_cast<HashTable*>(jsonTable)); fastDelete(const_cast<HashTable*>(mathTable)); fastDelete(const_cast<HashTable*>(numberConstructorTable)); fastDelete(const_cast<HashTable*>(numberPrototypeTable)); fastDelete(const_cast<HashTable*>(objectConstructorTable)); fastDelete(const_cast<HashTable*>(privateNamePrototypeTable)); fastDelete(const_cast<HashTable*>(regExpTable)); fastDelete(const_cast<HashTable*>(regExpConstructorTable)); fastDelete(const_cast<HashTable*>(regExpPrototypeTable)); fastDelete(const_cast<HashTable*>(stringConstructorTable)); delete emptyList; delete propertyNames; if (vmType != Default) deleteIdentifierTable(identifierTable); delete clientData; delete m_regExpCache; #if ENABLE(REGEXP_TRACING) delete m_rtTraceList; #endif #if ENABLE(DFG_JIT) for (unsigned i = 0; i < scratchBuffers.size(); ++i) fastFree(scratchBuffers[i]); #endif }
VM::~VM() { // Never GC, ever again. heap.incrementDeferralDepth(); #if ENABLE(DFG_JIT) // Make sure concurrent compilations are done, but don't install them, since there is // no point to doing so. if (worklist) { worklist->waitUntilAllPlansForVMAreReady(*this); worklist->removeAllReadyPlansForVM(*this); } #endif // ENABLE(DFG_JIT) // Clear this first to ensure that nobody tries to remove themselves from it. m_perBytecodeProfiler.clear(); ASSERT(m_apiLock->currentThreadIsHoldingLock()); m_apiLock->willDestroyVM(this); heap.lastChanceToFinalize(); delete interpreter; #ifndef NDEBUG interpreter = reinterpret_cast<Interpreter*>(0xbbadbeef); #endif arrayPrototypeTable->deleteTable(); arrayConstructorTable->deleteTable(); booleanPrototypeTable->deleteTable(); dataViewTable->deleteTable(); dateTable->deleteTable(); dateConstructorTable->deleteTable(); errorPrototypeTable->deleteTable(); globalObjectTable->deleteTable(); jsonTable->deleteTable(); numberConstructorTable->deleteTable(); numberPrototypeTable->deleteTable(); objectConstructorTable->deleteTable(); privateNamePrototypeTable->deleteTable(); regExpTable->deleteTable(); regExpConstructorTable->deleteTable(); regExpPrototypeTable->deleteTable(); stringConstructorTable->deleteTable(); #if ENABLE(PROMISES) promisePrototypeTable->deleteTable(); promiseConstructorTable->deleteTable(); promiseResolverPrototypeTable->deleteTable(); #endif delete emptyList; delete propertyNames; if (vmType != Default) deleteIdentifierTable(identifierTable); delete clientData; delete m_regExpCache; #if ENABLE(REGEXP_TRACING) delete m_rtTraceList; #endif #if ENABLE(DFG_JIT) for (unsigned i = 0; i < scratchBuffers.size(); ++i) fastFree(scratchBuffers[i]); #endif }