summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/webkit/JavaScriptCore
diff options
context:
space:
mode:
authorJedrzej Nowacki <jedrzej.nowacki@nokia.com>2009-08-10 14:12:21 (GMT)
committerJedrzej Nowacki <jedrzej.nowacki@nokia.com>2009-08-10 14:12:21 (GMT)
commitf5af011ede569bb88ec9b27ff7a65fe99f7d17fd (patch)
tree31d7c7aa8b762d109e9dfcceb778ab0067c1fd24 /src/3rdparty/webkit/JavaScriptCore
parentca417d507af506b2571453863f97093bf3d14667 (diff)
downloadQt-f5af011ede569bb88ec9b27ff7a65fe99f7d17fd.zip
Qt-f5af011ede569bb88ec9b27ff7a65fe99f7d17fd.tar.gz
Qt-f5af011ede569bb88ec9b27ff7a65fe99f7d17fd.tar.bz2
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.
Diffstat (limited to 'src/3rdparty/webkit/JavaScriptCore')
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.cpp89
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.h72
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.cpp7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.h7
7 files changed, 193 insertions, 1 deletions
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 <wtf/MathExtras.h>
#include <wtf/OwnPtr.h>
+#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<CodeBlock> 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<intptr_t> currentScript;
+ QHash<unsigned, ScriptActivCount> scriptRef;
+ QHash<int, QString> 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> 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 <wtf/HashMap.h>
#include <wtf/RefCounted.h>
+#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