From f5af011ede569bb88ec9b27ff7a65fe99f7d17fd Mon Sep 17 00:00:00 2001 From: Jedrzej Nowacki Date: Mon, 10 Aug 2009 16:12:21 +0200 Subject: New class and new JSC::JSGlobalData attribute. SourcePool's objects should be responsible for calling debugger each time scriptLoad or scriptUnload event occurs. This code is specific to Qt only. --- .../webkit/JavaScriptCore/JavaScriptCore.pri | 3 +- .../webkit/JavaScriptCore/parser/Nodes.cpp | 9 +++ src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h | 7 ++ .../webkit/JavaScriptCore/parser/SourcePoolQt.cpp | 89 ++++++++++++++++++++++ .../webkit/JavaScriptCore/parser/SourcePoolQt.h | 72 +++++++++++++++++ .../webkit/JavaScriptCore/runtime/JSGlobalData.cpp | 7 ++ .../webkit/JavaScriptCore/runtime/JSGlobalData.h | 7 ++ 7 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.cpp create mode 100644 src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.h diff --git a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri index b43602e..5019109 100644 --- a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri +++ b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri @@ -216,7 +216,8 @@ SOURCES += \ wtf/DateMath.cpp \ wtf/FastMalloc.cpp \ wtf/Threading.cpp \ - wtf/qt/MainThreadQt.cpp + wtf/qt/MainThreadQt.cpp \ + parser/SourcePoolQt.cpp !contains(DEFINES, ENABLE_SINGLE_THREADED=1) { SOURCES += wtf/qt/ThreadingQt.cpp diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp index 8cb98e0..a9ea1fd 100644 --- a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp +++ b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp @@ -1997,6 +1997,9 @@ inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData) , m_parameters(0) , m_parameterCount(0) { +#ifdef QT_BUILD_SCRIPT_LIB + sourceToken = globalData->scriptpool->objectRegister(); +#endif } inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& sourceCode, CodeFeatures features, int numConstants) @@ -2004,10 +2007,16 @@ inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElemen , m_parameters(0) , m_parameterCount(0) { +#ifdef QT_BUILD_SCRIPT_LIB + sourceToken = globalData->scriptpool->objectRegister(); +#endif } FunctionBodyNode::~FunctionBodyNode() { +#ifdef QT_BUILD_SCRIPT_LIB + if (sourceToken) delete sourceToken; +#endif for (size_t i = 0; i < m_parameterCount; ++i) m_parameters[i].~Identifier(); fastFree(m_parameters); diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h index 5c35755..185cede 100644 --- a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h +++ b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h @@ -36,6 +36,10 @@ #include #include +#ifdef QT_BUILD_SCRIPT_LIB +#include "SourcePoolQt.h" +#endif + namespace JSC { class ArgumentListNode; @@ -1607,6 +1611,9 @@ namespace JSC { Identifier* m_parameters; size_t m_parameterCount; OwnPtr m_code; +#ifdef QT_BUILD_SCRIPT_LIB + SourcePool::SourcePoolToken* sourceToken; +#endif }; class FuncExprNode : public ExpressionNode, public ParserArenaRefCounted { diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.cpp b/src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.cpp new file mode 100644 index 0000000..44d80d8 --- /dev/null +++ b/src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.cpp @@ -0,0 +1,89 @@ +#include "SourcePoolQt.h" + + +#ifdef QT_BUILD_SCRIPT_LIB + +#include "SourceCode.h" +#include "Debugger.h" + + +namespace JSC { + + void SourcePool::startEvaluating(const SourceCode& source) + { + int id = source.provider()->asID(); + + codes.insert(id,source.toString().toQString()); + + currentScript.push(id); + scriptRef.insert(id,ScriptActivCount()); + + if (debug) + debug->scriptLoad(id,source.toString(),source.provider()->url(),source.firstLine()); + } + + + void SourcePool::stopEvaluating(const SourceCode& source) + { + int id = source.provider()->asID(); + int cid = currentScript.pop(); + + if (scriptRef.contains(id)) { + ScriptActivCount info = scriptRef.take(id); + if (info.getCount()) { + //we can't remove info from scriptRef + info.isActive = false; + scriptRef.insert(id,info); + } else { + //we are unloading source code + if (debug) + debug->scriptUnload(id); + } + } + } + + SourcePool::SourcePoolToken* SourcePool::objectRegister() + { + if (currentScript.isEmpty()) { + return 0; + } + + int id = currentScript.top(); + + SourcePoolToken* token = new SourcePoolToken(id,this); + + ScriptActivCount info = scriptRef.take(id); + + info.incCount(); + scriptRef.insert(id,info); + return token; + } + + void SourcePool::objectUnregister(const SourcePool::SourcePoolToken *token) + { + int id = token->id; + + ScriptActivCount info = scriptRef.take(id); + info.decCount(); + if (info.isActive) { + scriptRef.insert(id,info); + } else { + if (info.getCount() == 0) { + //remove from scriptRef (script is not active and there is no objects connected) + if(debug) + debug->scriptUnload(id); + } else { + scriptRef.insert(id,info); + } + } + + } + + + void SourcePool::setDebugger(JSC::Debugger *debugger) { this->debug = debugger; } + Debugger* SourcePool::debugger() { return debug; } + +} //namespace JSC + + +#endif //QT_BUILD_SCRIPT_LIB diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.h b/src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.h new file mode 100644 index 0000000..0f00071 --- /dev/null +++ b/src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.h @@ -0,0 +1,72 @@ +#ifndef SOURCEPOOL_H +#define SOURCEPOOL_H + +#ifdef QT_BUILD_SCRIPT_LIB + +#include "qhash.h" +#include "qstack.h" +#include "qdebug.h" + +namespace JSC { + + class SourceCode; + class Debugger; + + class SourcePool + { + class ScriptActivCount + { + int count; + public: + void incCount() + { + count++; + }; + void decCount() + { + count--; + }; + int getCount() const + { + return count; + }; + bool isActive; + ScriptActivCount() : count(0), isActive(true) {} + }; + QStack currentScript; + QHash scriptRef; + QHash codes; //debug + Debugger *debug; + + friend class SourcePoolToken; + public: + class SourcePoolToken + { + unsigned id; + SourcePool *ptr; + SourcePoolToken(unsigned scriptId, SourcePool *scriptPool) : id(scriptId),ptr(scriptPool) {} + SourcePoolToken(const SourcePoolToken&) : id(0), ptr(0) {} //private - do not use - will crash + public: + ~SourcePoolToken() { ptr->objectUnregister(this); } + friend class SourcePool; + }; + + SourcePool() : debug(0) {} + + void startEvaluating(const SourceCode& source); + void stopEvaluating(const SourceCode& source); + SourcePoolToken* objectRegister(); + + void setDebugger(Debugger *debugger); + Debugger* debugger(); + + private: + void objectUnregister(const SourcePoolToken *token); + }; + +} //namespace JSC + + +#endif //QT_BUILD_SCRIPT_LIB + +#endif // SOURCEPOOL_H diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.cpp index 95b4d0c..85d881e 100644 --- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.cpp +++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.cpp @@ -142,6 +142,9 @@ JSGlobalData::JSGlobalData(bool isShared, const VPtrSet& vptrSet) , scopeNodeBeingReparsed(0) , firstStringifierToMark(0) { +#ifdef QT_BUILD_SCRIPT_LIB + scriptpool = new SourcePool(); +#endif #if PLATFORM(MAC) startProfilerServerIfNeeded(); #endif @@ -187,6 +190,10 @@ JSGlobalData::~JSGlobalData() deleteIdentifierTable(identifierTable); delete clientData; +#ifdef QT_BUILD_SCRIPT_LIB + if (scriptpool) + delete scriptpool; +#endif } PassRefPtr JSGlobalData::create(bool isShared) diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.h index dca3e94..fb557af 100644 --- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.h +++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.h @@ -39,6 +39,10 @@ #include #include +#ifdef QT_BUILD_SCRIPT_LIB +#include "SourcePoolQt.h" +#endif + struct OpaqueJSClass; struct OpaqueJSClassContextData; @@ -121,6 +125,9 @@ namespace JSC { Lexer* lexer; Parser* parser; Interpreter* interpreter; +#ifdef QT_BUILD_SCRIPT_LIB + SourcePool* scriptpool; +#endif #if ENABLE(JIT) JITThunks jitStubs; #endif -- cgit v0.12