void VM::releaseExecutableMemory() { prepareToDiscardCode(); if (entryScope) { StackPreservingRecompiler recompiler; HeapIterationScope iterationScope(heap); HashSet<JSCell*> roots; heap.getConservativeRegisterRoots(roots); HashSet<JSCell*>::iterator end = roots.end(); for (HashSet<JSCell*>::iterator ptr = roots.begin(); ptr != end; ++ptr) { ScriptExecutable* executable = 0; JSCell* cell = *ptr; if (cell->inherits(ScriptExecutable::info())) executable = static_cast<ScriptExecutable*>(*ptr); else if (cell->inherits(JSFunction::info())) { JSFunction* function = jsCast<JSFunction*>(*ptr); if (function->isHostFunction()) continue; executable = function->jsExecutable(); } else continue; ASSERT(executable->inherits(ScriptExecutable::info())); executable->unlinkCalls(); if (executable->inherits(FunctionExecutable::info())) recompiler.currentlyExecutingFunctions.add(static_cast<FunctionExecutable*>(executable)); } heap.objectSpace().forEachLiveCell<StackPreservingRecompiler>(iterationScope, recompiler); } m_regExpCache->invalidateCode(); heap.collectAllGarbage(); }
void VM::discardAllCode() { prepareToDiscardCode(); m_codeCache->clear(); heap.deleteAllCompiledCode(); heap.reportAbandonedObjectGraph(); }
void VM::setEnabledProfiler(LegacyProfiler* profiler) { m_enabledProfiler = profiler; if (m_enabledProfiler) { prepareToDiscardCode(); SetEnabledProfilerFunctor functor; heap.forEachCodeBlock(functor); } }
void VM::discardAllCode() { prepareToDiscardCode(); m_codeCache->clear(); m_regExpCache->invalidateCode(); heap.deleteAllCompiledCode(); heap.deleteAllUnlinkedFunctionCode(); heap.reportAbandonedObjectGraph(); }