summaryrefslogtreecommitdiffstats
path: root/src/script/api/qscriptengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/api/qscriptengine.cpp')
-rw-r--r--src/script/api/qscriptengine.cpp79
1 files changed, 10 insertions, 69 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index b27d1be..fb14940 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -382,65 +382,6 @@ private:
bool m_shouldAbortEvaluation;
};
-/*Helper class. Main purpose is to give debugger feedback about unloading and loading scripts.
- It keeps pointer to JSGlobalObject assuming that it is always the same - there is no way to update
- this data. Class is internal and used as an implementation detail in and only in QScriptEngine::evaluate.*/
-class UStringSourceProviderWithFeedback: public JSC::UStringSourceProvider
-{
-public:
-
- static PassRefPtr<UStringSourceProviderWithFeedback> create(const JSC::UString& source, const JSC::UString& url, int lineNumber, QScriptEnginePrivate* engine)
- {
- return adoptRef(new UStringSourceProviderWithFeedback(source, url, lineNumber, engine));
- }
-
- /* Destruction means that there is no more copies of script so create scriptUnload event
- and unregister script in QScriptEnginePrivate::loadedScripts */
- virtual ~UStringSourceProviderWithFeedback()
- {
- if (m_ptr) {
- if (JSC::Debugger* debugger = this->debugger())
- debugger->scriptUnload(asID());
- m_ptr->loadedScripts.remove(this);
- }
- }
-
- /* set internal QScriptEnginePrivate pointer to null and create unloadScript event, should be called
- only if QScriptEnginePrivate is about to be destroyed.*/
- void disconnectFromEngine()
- {
- if (JSC::Debugger* debugger = this->debugger())
- debugger->scriptUnload(asID());
- m_ptr = 0;
- }
-
-protected:
- UStringSourceProviderWithFeedback(const JSC::UString& source, const JSC::UString& url, int lineNumber, QScriptEnginePrivate* engine)
- : UStringSourceProvider(source, url),
- m_ptr(engine)
- {
- if (JSC::Debugger* debugger = this->debugger())
- debugger->scriptLoad(asID(), source, url, lineNumber);
- if (m_ptr)
- m_ptr->loadedScripts.insert(this);
- }
-
- JSC::Debugger* debugger()
- {
- //if m_ptr is null it mean that QScriptEnginePrivate was destroyed and scriptUnload was called
- //else m_ptr is stable and we can use it as normal pointer without hesitation
- if(!m_ptr)
- return 0; //we are in ~QScriptEnginePrivate
- else
- return m_ptr->originalGlobalObject()->debugger(); //QScriptEnginePrivate is still alive
- }
-
- //trace global object and debugger instance
- QScriptEnginePrivate* m_ptr;
-};
-
-
-
static int toDigit(char c)
{
if ((c >= '0') && (c <= '9'))
@@ -900,11 +841,9 @@ QScriptEnginePrivate::QScriptEnginePrivate()
QScriptEnginePrivate::~QScriptEnginePrivate()
{
//disconnect all loadedScripts and generate all jsc::debugger::scriptUnload events
- QSet<QScript::UStringSourceProviderWithFeedback*>::const_iterator i = loadedScripts.constBegin();
- while(i!=loadedScripts.constEnd()) {
- (*i)->disconnectFromEngine();
- i++;
- }
+ QHash<intptr_t,QScript::UStringSourceProviderWithFeedback*>::const_iterator it;
+ for (it = loadedScripts.constBegin(); it != loadedScripts.constEnd(); ++it)
+ it.value()->disconnectFromEngine();
while (!ownedAgents.isEmpty())
delete ownedAgents.takeFirst();
@@ -1606,6 +1545,9 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun,
}
#ifndef QT_NO_REGEXP
+
+extern QString qt_regexp_toCanonical(const QString &, QRegExp::PatternSyntax);
+
/*!
Creates a QtScript object of class RegExp with the given
\a regexp.
@@ -1620,7 +1562,6 @@ QScriptValue QScriptEngine::newRegExp(const QRegExp &regexp)
JSC::ArgList args(buf, sizeof(buf));
//convert the pattern to a ECMAScript pattern
- extern QString qt_regexp_toCanonical(const QString &, QRegExp::PatternSyntax);
QString pattern = qt_regexp_toCanonical(regexp.pattern(), regexp.patternSyntax());
if (regexp.isMinimal()) {
QString ecmaPattern;
@@ -2244,6 +2185,8 @@ QScriptValue QScriptEngine::evaluate(const QString &program, const QString &file
JSC::JSObject* thisObject = (!thisValue || thisValue.isUndefinedOrNull()) ? exec->dynamicGlobalObject() : thisValue.toObject(exec);
JSC::JSValue exceptionValue;
d->timeoutChecker()->setShouldAbort(false);
+ if (d->processEventsInterval > 0)
+ d->timeoutChecker()->reset();
JSC::JSValue result = exec->interpreter()->execute(&executable, exec, thisObject, exec->scopeChain(), &exceptionValue);
if (d->timeoutChecker()->shouldAbort()) {
@@ -2360,11 +2303,9 @@ JSC::CallFrame *QScriptEnginePrivate::pushContext(JSC::CallFrame *exec, JSC::JSV
JSC::Register *oldEnd = interp->registerFile().end();
int argc = args.size() + 1; //add "this"
JSC::Register *newEnd = oldEnd + argc + JSC::RegisterFile::CallFrameHeaderSize;
- //Without + argc + JSC::RegisterFile::CallFrameHeaderSize, it crashes.
- //It seems that JSC is not consistant with the way the callframe is crated
- if (!interp->registerFile().grow(newEnd + argc + JSC::RegisterFile::CallFrameHeaderSize))
+ if (!interp->registerFile().grow(newEnd))
return 0; //### Stack overflow
- newCallFrame = JSC::CallFrame::create(newEnd);
+ newCallFrame = JSC::CallFrame::create(oldEnd);
newCallFrame[0] = thisObject;
int dst = 0;
JSC::ArgList::const_iterator it;