summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2011-05-31 16:28:07 +0200
committerJedrzej Nowacki <jedrzej.nowacki@nokia.com>2011-05-31 16:28:07 +0200
commit51b5a84ce2b47291ea4bdf9b186fce37a0cabf09 (patch)
treef58545411b3b42d0806eb5500bc41d63d1606fb5
parent47be6022c9fc66eacb1496d7b8d97e0ff98dc1ef (diff)
Fix QScriptEnginePrivate constructor.
If the constructor is called with a QScriptEngine::AdoptCurrentContext parameter then use the current isolate instead of creating a new one. Merge-request: 2 Reviewed-by: Jedrzej Nowacki <jedrzej.nowacki@nokia.com>
-rw-r--r--src/script/api/qscriptengine.cpp14
-rw-r--r--src/script/api/qscriptengine_p.h3
2 files changed, 10 insertions, 7 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 8752cbd..2a5349c 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -661,9 +661,8 @@ v8::Handle<v8::Object> QScriptEnginePrivate::newVariant(const QVariant &value)
return persistent;
}
-v8::Isolate *QScriptEnginePrivate::Isolates::createEnterIsolate(QScriptEnginePrivate *engine)
+v8::Isolate *QScriptEnginePrivate::Isolates::enterIsolate(QScriptEnginePrivate *engine, v8::Isolate *isolate)
{
- v8::Isolate *isolate = v8::Isolate::New();
isolate->Enter();
{
Isolates *i = isolates();
@@ -683,9 +682,11 @@ QScriptEnginePrivate *QScriptEnginePrivate::Isolates::engine(v8::Isolate *isolat
}
QScriptEnginePrivate::QScriptEnginePrivate(QScriptEngine::ContextOwnership ownership)
- : m_isolate(Isolates::createEnterIsolate(this))
- , m_v8Context(ownership == QScriptEngine::AdoptCurrentContext ?
- v8::Persistent<v8::Context>::New(v8::Context::GetCurrent()) : v8::Context::New())
+ : m_hasOwnV8Context(ownership == QScriptEngine::CreateNewContext)
+ , m_isolate(m_hasOwnV8Context ?
+ Isolates::enterIsolate(this, v8::Isolate::New()) : Isolates::enterIsolate(this, v8::Isolate::GetCurrent()))
+ , m_v8Context(m_hasOwnV8Context ?
+ v8::Context::New() : v8::Persistent<v8::Context>::New(v8::Context::GetCurrent()))
, m_originalGlobalObject(this, m_v8Context)
, m_reportedAddtionalMemoryCost(-1)
, m_currentQsContext(0)
@@ -856,7 +857,8 @@ QScriptEnginePrivate::~QScriptEnginePrivate()
m_v8Context.Dispose();
m_isolate->Exit();
- m_isolate->Dispose();
+ if (m_hasOwnV8Context)
+ m_isolate->Dispose();
m_state = Destroyed;
deallocateAdditionalResources();
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
index 86c825f..78fe4f3 100644
--- a/src/script/api/qscriptengine_p.h
+++ b/src/script/api/qscriptengine_p.h
@@ -87,7 +87,7 @@ class QScriptEnginePrivate
// will be resolved and we can store QScriptEnginePrivate* in v8::Isolate
class Isolates {
public:
- static v8::Isolate *createEnterIsolate(QScriptEnginePrivate *engine);
+ static v8::Isolate *enterIsolate(QScriptEnginePrivate *engine, v8::Isolate *isolate);
static QScriptEnginePrivate *engine(v8::Isolate *isolate);
private:
Q_GLOBAL_STATIC(Isolates, isolates);
@@ -299,6 +299,7 @@ private:
v8::Handle<v8::FunctionTemplate> metaObjectTemplate();
v8::Handle<v8::FunctionTemplate> variantTemplate();
+ const bool m_hasOwnV8Context;
v8::Isolate *m_isolate;
v8::Persistent<v8::Context> m_v8Context;
Exception m_exception;