From 2fc2651226baac27029e38c9d6ef883fa32084db Mon Sep 17 00:00:00 2001 From: Steve Block Date: Wed, 18 May 2011 13:36:51 +0100 Subject: Merge WebKit at r78450: Initial merge by git. Change-Id: I6d3e5f1f868ec266a0aafdef66182ddc3f265dc1 --- Source/JavaScriptCore/debugger/Debugger.cpp | 90 +++++++++++++--------- .../JavaScriptCore/debugger/DebuggerActivation.cpp | 6 +- .../JavaScriptCore/debugger/DebuggerActivation.h | 4 +- .../JavaScriptCore/debugger/DebuggerCallFrame.cpp | 2 +- 4 files changed, 60 insertions(+), 42 deletions(-) (limited to 'Source/JavaScriptCore/debugger') diff --git a/Source/JavaScriptCore/debugger/Debugger.cpp b/Source/JavaScriptCore/debugger/Debugger.cpp index 23b9361..20a8485 100644 --- a/Source/JavaScriptCore/debugger/Debugger.cpp +++ b/Source/JavaScriptCore/debugger/Debugger.cpp @@ -22,7 +22,6 @@ #include "config.h" #include "Debugger.h" -#include "CollectorHeapIterator.h" #include "Error.h" #include "Interpreter.h" #include "JSFunction.h" @@ -32,6 +31,57 @@ namespace JSC { +class Recompiler { +public: + Recompiler(Debugger*); + ~Recompiler(); + void operator()(JSCell*); + +private: + typedef HashSet FunctionExecutableSet; + typedef HashMap SourceProviderMap; + + Debugger* m_debugger; + FunctionExecutableSet m_functionExecutables; + SourceProviderMap m_sourceProviders; +}; + +inline Recompiler::Recompiler(Debugger* debugger) + : m_debugger(debugger) +{ +} + +inline Recompiler::~Recompiler() +{ + // Call sourceParsed() after reparsing all functions because it will execute + // JavaScript in the inspector. + SourceProviderMap::const_iterator end = m_sourceProviders.end(); + for (SourceProviderMap::const_iterator iter = m_sourceProviders.begin(); iter != end; ++iter) + m_debugger->sourceParsed(iter->second, iter->first, -1, UString()); +} + +inline void Recompiler::operator()(JSCell* cell) +{ + if (!cell->inherits(&JSFunction::info)) + return; + + JSFunction* function = asFunction(cell); + if (function->executable()->isHostFunction()) + return; + + FunctionExecutable* executable = function->jsExecutable(); + + // Check if the function is already in the set - if so, + // we've already retranslated it, nothing to do here. + if (!m_functionExecutables.add(executable).second) + return; + + ExecState* exec = function->scope().globalObject()->JSGlobalObject::globalExec(); + executable->discardCode(); + if (m_debugger == function->scope().globalObject()->debugger()) + m_sourceProviders.add(executable->source().provider(), exec); +} + Debugger::~Debugger() { HashSet::iterator end = m_globalObjects.end(); @@ -61,40 +111,8 @@ void Debugger::recompileAllJSFunctions(JSGlobalData* globalData) if (globalData->dynamicGlobalObject) return; - typedef HashSet FunctionExecutableSet; - typedef HashMap SourceProviderMap; - - FunctionExecutableSet functionExecutables; - SourceProviderMap sourceProviders; - - LiveObjectIterator it = globalData->heap.primaryHeapBegin(); - LiveObjectIterator heapEnd = globalData->heap.primaryHeapEnd(); - for ( ; it != heapEnd; ++it) { - if (!(*it)->inherits(&JSFunction::info)) - continue; - - JSFunction* function = asFunction(*it); - if (function->executable()->isHostFunction()) - continue; - - FunctionExecutable* executable = function->jsExecutable(); - - // Check if the function is already in the set - if so, - // we've already retranslated it, nothing to do here. - if (!functionExecutables.add(executable).second) - continue; - - ExecState* exec = function->scope().globalObject()->JSGlobalObject::globalExec(); - executable->discardCode(); - if (function->scope().globalObject()->debugger() == this) - sourceProviders.add(executable->source().provider(), exec); - } - - // Call sourceParsed() after reparsing all functions because it will execute - // JavaScript in the inspector. - SourceProviderMap::const_iterator end = sourceProviders.end(); - for (SourceProviderMap::const_iterator iter = sourceProviders.begin(); iter != end; ++iter) - sourceParsed(iter->second, iter->first, -1, UString()); + Recompiler recompiler(this); + globalData->heap.forEach(recompiler); } JSValue evaluateInGlobalCallFrame(const UString& script, JSValue& exception, JSGlobalObject* globalObject) @@ -109,7 +127,7 @@ JSValue evaluateInGlobalCallFrame(const UString& script, JSValue& exception, JSG JSGlobalData& globalData = globalObject->globalData(); JSValue result = globalData.interpreter->execute(eval.get(), globalCallFrame, globalObject, globalCallFrame->scopeChain()); if (globalData.exception) { - exception = globalData.exception; + exception = globalData.exception.get(); globalData.exception = JSValue(); } ASSERT(result); diff --git a/Source/JavaScriptCore/debugger/DebuggerActivation.cpp b/Source/JavaScriptCore/debugger/DebuggerActivation.cpp index 0444d23..fcd257c 100644 --- a/Source/JavaScriptCore/debugger/DebuggerActivation.cpp +++ b/Source/JavaScriptCore/debugger/DebuggerActivation.cpp @@ -30,12 +30,12 @@ namespace JSC { -DebuggerActivation::DebuggerActivation(JSObject* activation) +DebuggerActivation::DebuggerActivation(JSGlobalData& globalData, JSObject* activation) : JSObject(DebuggerActivation::createStructure(jsNull())) { ASSERT(activation); ASSERT(activation->isActivationObject()); - m_activation = static_cast(activation); + m_activation.set(globalData, this, static_cast(activation)); } void DebuggerActivation::markChildren(MarkStack& markStack) @@ -43,7 +43,7 @@ void DebuggerActivation::markChildren(MarkStack& markStack) JSObject::markChildren(markStack); if (m_activation) - markStack.append(m_activation); + markStack.append(&m_activation); } UString DebuggerActivation::className() const diff --git a/Source/JavaScriptCore/debugger/DebuggerActivation.h b/Source/JavaScriptCore/debugger/DebuggerActivation.h index 3927017..b64060d 100644 --- a/Source/JavaScriptCore/debugger/DebuggerActivation.h +++ b/Source/JavaScriptCore/debugger/DebuggerActivation.h @@ -34,7 +34,7 @@ namespace JSC { class DebuggerActivation : public JSObject { public: - DebuggerActivation(JSObject*); + DebuggerActivation(JSGlobalData&, JSObject*); virtual void markChildren(MarkStack&); virtual UString className() const; @@ -58,7 +58,7 @@ namespace JSC { static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | JSObject::StructureFlags; private: - JSActivation* m_activation; + WriteBarrier m_activation; }; } // namespace JSC diff --git a/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp b/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp index ed673cb..cb4592c 100644 --- a/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp +++ b/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp @@ -96,7 +96,7 @@ JSValue DebuggerCallFrame::evaluate(const UString& script, JSValue& exception) c JSGlobalData& globalData = m_callFrame->globalData(); JSValue result = globalData.interpreter->execute(eval.get(), m_callFrame, thisObject(), m_callFrame->scopeChain()); if (globalData.exception) { - exception = globalData.exception; + exception = globalData.exception.get(); globalData.exception = JSValue(); } ASSERT(result); -- cgit v1.1