JSGlobalObject::~JSGlobalObject() { ASSERT(JSLock::currentThreadIsHoldingLock()); if (d()->debugger) d()->debugger->detach(this); Profiler** profiler = Profiler::enabledProfilerReference(); if (UNLIKELY(*profiler != 0)) { (*profiler)->stopProfiling(globalExec(), UString()); } d()->next->d()->prev = d()->prev; d()->prev->d()->next = d()->next; JSGlobalObject*& headObject = head(); if (headObject == this) headObject = d()->next; if (headObject == this) headObject = 0; HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end(); for (HashSet<ProgramCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it) (*it)->clearGlobalObject(); RegisterFile& registerFile = globalData()->interpreter->registerFile(); if (registerFile.globalObject() == this) { registerFile.setGlobalObject(0); registerFile.setNumGlobals(0); } delete d(); }
void JSGlobalObject::mark() { JSVariableObject::mark(); HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end(); for (HashSet<ProgramCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it) (*it)->mark(); RegisterFile& registerFile = globalData()->interpreter->registerFile(); if (registerFile.globalObject() == this) registerFile.markGlobals(&globalData()->heap); markIfNeeded(d()->regExpConstructor); markIfNeeded(d()->errorConstructor); markIfNeeded(d()->evalErrorConstructor); markIfNeeded(d()->rangeErrorConstructor); markIfNeeded(d()->referenceErrorConstructor); markIfNeeded(d()->syntaxErrorConstructor); markIfNeeded(d()->typeErrorConstructor); markIfNeeded(d()->URIErrorConstructor); markIfNeeded(d()->evalFunction); markIfNeeded(d()->callFunction); markIfNeeded(d()->applyFunction); markIfNeeded(d()->objectPrototype); markIfNeeded(d()->functionPrototype); markIfNeeded(d()->arrayPrototype); markIfNeeded(d()->booleanPrototype); markIfNeeded(d()->stringPrototype); markIfNeeded(d()->numberPrototype); markIfNeeded(d()->datePrototype); markIfNeeded(d()->regExpPrototype); markIfNeeded(d()->errorStructure); // No need to mark the other structures, because their prototypes are all // guaranteed to be referenced elsewhere. Register* registerArray = d()->registerArray.get(); if (!registerArray) return; size_t size = d()->registerArraySize; for (size_t i = 0; i < size; ++i) { Register& r = registerArray[i]; if (!r.marked()) r.mark(); } }
void JSGlobalObject::markChildren(MarkStack& markStack) { JSVariableObject::markChildren(markStack); HashSet<GlobalCodeBlock*>::const_iterator end = codeBlocks().end(); for (HashSet<GlobalCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it) (*it)->markAggregate(markStack); RegisterFile& registerFile = globalData()->interpreter->registerFile(); if (registerFile.globalObject() == this) registerFile.markGlobals(markStack, &globalData()->heap); markIfNeeded(markStack, d()->regExpConstructor); markIfNeeded(markStack, d()->errorConstructor); markIfNeeded(markStack, d()->evalErrorConstructor); markIfNeeded(markStack, d()->rangeErrorConstructor); markIfNeeded(markStack, d()->referenceErrorConstructor); markIfNeeded(markStack, d()->syntaxErrorConstructor); markIfNeeded(markStack, d()->typeErrorConstructor); markIfNeeded(markStack, d()->URIErrorConstructor); markIfNeeded(markStack, d()->evalFunction); markIfNeeded(markStack, d()->callFunction); markIfNeeded(markStack, d()->applyFunction); markIfNeeded(markStack, d()->objectPrototype); markIfNeeded(markStack, d()->functionPrototype); markIfNeeded(markStack, d()->arrayPrototype); markIfNeeded(markStack, d()->booleanPrototype); markIfNeeded(markStack, d()->stringPrototype); markIfNeeded(markStack, d()->numberPrototype); markIfNeeded(markStack, d()->datePrototype); markIfNeeded(markStack, d()->regExpPrototype); markIfNeeded(markStack, d()->methodCallDummy); markIfNeeded(markStack, d()->errorStructure); markIfNeeded(markStack, d()->argumentsStructure); markIfNeeded(markStack, d()->arrayStructure); markIfNeeded(markStack, d()->booleanObjectStructure); markIfNeeded(markStack, d()->callbackConstructorStructure); markIfNeeded(markStack, d()->callbackFunctionStructure); markIfNeeded(markStack, d()->callbackObjectStructure); markIfNeeded(markStack, d()->dateStructure); markIfNeeded(markStack, d()->emptyObjectStructure); markIfNeeded(markStack, d()->errorStructure); markIfNeeded(markStack, d()->functionStructure); markIfNeeded(markStack, d()->numberObjectStructure); markIfNeeded(markStack, d()->prototypeFunctionStructure); markIfNeeded(markStack, d()->regExpMatchesArrayStructure); markIfNeeded(markStack, d()->regExpStructure); markIfNeeded(markStack, d()->stringObjectStructure); // No need to mark the other structures, because their prototypes are all // guaranteed to be referenced elsewhere. Register* registerArray = d()->registerArray.get(); if (!registerArray) return; size_t size = d()->registerArraySize; markStack.appendValues(reinterpret_cast<JSValue*>(registerArray), size); }