From 3eb875cf972ddd1f5945b03175011801848b29d3 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 1 Sep 2009 16:19:13 +0200
Subject: [PATCH] No need to create a QScriptEngine at startup.

---
 .../scriptmanager/scriptmanager.cpp           | 73 ++++++++-----------
 .../coreplugin/scriptmanager/scriptmanager.h  |  3 -
 .../scriptmanager/scriptmanager_p.h           |  6 +-
 .../duieditor/duieditoractionhandler.cpp      |  1 -
 .../scriptwrapper/interface_wrap_helpers.h    |  8 +-
 src/shared/scriptwrapper/wrap_helpers.h       |  4 +-
 6 files changed, 40 insertions(+), 55 deletions(-)

diff --git a/src/plugins/coreplugin/scriptmanager/scriptmanager.cpp b/src/plugins/coreplugin/scriptmanager/scriptmanager.cpp
index 3edcc75658c..1d13fa5ad38 100644
--- a/src/plugins/coreplugin/scriptmanager/scriptmanager.cpp
+++ b/src/plugins/coreplugin/scriptmanager/scriptmanager.cpp
@@ -46,10 +46,6 @@
 #include <QtGui/QToolBar>
 #include <QtGui/QStatusBar>
 
-namespace {
-    enum { debugQWorkbenchWrappers = 0 };
-}
-
 // Script function template to pop up a message box
 // with a certain icon and buttons.
 template <int MsgBoxIcon, int MsgBoxButtons>
@@ -178,14 +174,9 @@ namespace Core {
 namespace Internal {
 
 ScriptManagerPrivate::ScriptManagerPrivate(QObject *parent)
-   : ScriptManager(parent), m_initialized(false)
-{
-}
-
-QScriptEngine &ScriptManagerPrivate::scriptEngine()
+   : ScriptManager(parent),
+   m_engine(0)
 {
-    ensureEngineInitialized();
-    return m_engine;
 }
 
 // Split a backtrace of the form:
@@ -225,25 +216,26 @@ bool ScriptManagerPrivate::runScript(const QString &script, QString *errorMessag
     ensureEngineInitialized();
     stack->clear();
 
-    m_engine.pushContext();
-    m_engine.evaluate(script);
+    m_engine->pushContext();
+    m_engine->evaluate(script);
 
-    const bool failed = m_engine.hasUncaughtException ();
+    const bool failed = m_engine->hasUncaughtException ();
     if (failed) {
-        const int errorLineNumber = m_engine.uncaughtExceptionLineNumber();
-        const QStringList backTrace = m_engine.uncaughtExceptionBacktrace();
+        const int errorLineNumber = m_engine->uncaughtExceptionLineNumber();
+        const QStringList backTrace = m_engine->uncaughtExceptionBacktrace();
         parseBackTrace(backTrace, *stack);
         const QString backtrace = backTrace.join(QString(QLatin1Char('\n')));
         *errorMessage = ScriptManager::tr("Exception at line %1: %2\n%3").arg(errorLineNumber).arg(engineError(m_engine)).arg(backtrace);
     }
-    m_engine.popContext();
+    m_engine->popContext();
     return !failed;
 }
 
 void ScriptManagerPrivate::ensureEngineInitialized()
 {
-    if (m_initialized)
+    if (m_engine)
         return;
+    m_engine = new QScriptEngine(this);
     // register QObjects that occur as properties
     SharedTools::registerQObject<QMainWindow>(m_engine);
     SharedTools::registerQObject<QStatusBar>(m_engine);
@@ -252,52 +244,51 @@ void ScriptManagerPrivate::ensureEngineInitialized()
 //    SharedTools::registerQObjectInterface<Core::MessageManager, MessageManagerPrototype>(m_engine);
 
 //    SharedTools::registerQObjectInterface<Core::IFile, FilePrototype>(m_engine);
-//    qScriptRegisterSequenceMetaType<QList<Core::IFile *> >(&m_engine);
+//    qScriptRegisterSequenceMetaType<QList<Core::IFile *> >(m_engine);
 //    SharedTools::registerQObjectInterface<Core::FileManager, FileManagerPrototype>(m_engine);
 
 //    SharedTools::registerQObjectInterface<Core::IEditor, EditorPrototype>(m_engine);
-    qScriptRegisterSequenceMetaType<QList<Core::IEditor *> >(&m_engine);
+    qScriptRegisterSequenceMetaType<QList<Core::IEditor *> >(m_engine);
 
 //    SharedTools::registerQObjectInterface<Core::EditorGroup, EditorGroupPrototype>(m_engine);
-    qScriptRegisterSequenceMetaType<QList<Core::EditorGroup *> >(&m_engine);
+    qScriptRegisterSequenceMetaType<QList<Core::EditorGroup *> >(m_engine);
 
     SharedTools::registerQObjectInterface<Core::EditorManager, EditorManagerPrototype>(m_engine);
 
 //    SharedTools::registerQObjectInterface<Core::ICore, CorePrototype>(m_engine);
 
     // Make "core" available
-    m_engine.globalObject().setProperty(QLatin1String("core"), qScriptValueFromValue(&m_engine, Core::ICore::instance()));
+    m_engine->globalObject().setProperty(QLatin1String("core"), qScriptValueFromValue(m_engine, Core::ICore::instance()));
 
     // CLASSIC:  registerInterfaceWithDefaultPrototype<Core::MessageManager, MessageManagerPrototype>(m_engine);
 
     // Message box conveniences
-    m_engine.globalObject().setProperty(QLatin1String("critical"),
-                                        m_engine.newFunction(messageBox<QMessageBox::Critical, QMessageBox::Ok>, 3));
-    m_engine.globalObject().setProperty(QLatin1String("warning"),
-                                        m_engine.newFunction(messageBox<QMessageBox::Warning, QMessageBox::Ok>, 3));
-    m_engine.globalObject().setProperty(QLatin1String("information"),
-                                        m_engine.newFunction(messageBox<QMessageBox::Information, QMessageBox::Ok>, 3));
+    m_engine->globalObject().setProperty(QLatin1String("critical"),
+                                        m_engine->newFunction(messageBox<QMessageBox::Critical, QMessageBox::Ok>, 3));
+    m_engine->globalObject().setProperty(QLatin1String("warning"),
+                                        m_engine->newFunction(messageBox<QMessageBox::Warning, QMessageBox::Ok>, 3));
+    m_engine->globalObject().setProperty(QLatin1String("information"),
+                                        m_engine->newFunction(messageBox<QMessageBox::Information, QMessageBox::Ok>, 3));
     // StandardButtons has overloaded operator '|' - grrr.
     enum { MsgBoxYesNo = 0x00014000 };
-    m_engine.globalObject().setProperty(QLatin1String("yesNoQuestion"),
-                                        m_engine.newFunction(messageBox<QMessageBox::Question, MsgBoxYesNo>, 3));
+    m_engine->globalObject().setProperty(QLatin1String("yesNoQuestion"),
+                                        m_engine->newFunction(messageBox<QMessageBox::Question, MsgBoxYesNo>, 3));
 
-    m_engine.globalObject().setProperty(QLatin1String("getText"), m_engine.newFunction(inputDialogGetText, 3));
-    m_engine.globalObject().setProperty(QLatin1String("getInteger"), m_engine.newFunction(inputDialogGetInteger, 3));
-    m_engine.globalObject().setProperty(QLatin1String("getDouble"), m_engine.newFunction(inputDialogGetDouble, 3));
-    m_engine.globalObject().setProperty(QLatin1String("getItem"), m_engine.newFunction(inputDialogGetItem, 3));
+    m_engine->globalObject().setProperty(QLatin1String("getText"), m_engine->newFunction(inputDialogGetText, 3));
+    m_engine->globalObject().setProperty(QLatin1String("getInteger"), m_engine->newFunction(inputDialogGetInteger, 3));
+    m_engine->globalObject().setProperty(QLatin1String("getDouble"), m_engine->newFunction(inputDialogGetDouble, 3));
+    m_engine->globalObject().setProperty(QLatin1String("getItem"), m_engine->newFunction(inputDialogGetItem, 3));
 
     // file box
-    m_engine.globalObject().setProperty(QLatin1String("getOpenFileNames"), m_engine.newFunction(fileBox<QFileDialog::AcceptOpen, QFileDialog::ExistingFiles> , 2));
-    m_engine.globalObject().setProperty(QLatin1String("getOpenFileName"), m_engine.newFunction(fileBox<QFileDialog::AcceptOpen, QFileDialog::ExistingFile> , 2));
-    m_engine.globalObject().setProperty(QLatin1String("getSaveFileName"), m_engine.newFunction(fileBox<QFileDialog::AcceptSave, QFileDialog::AnyFile> , 2));
-    m_engine.globalObject().setProperty(QLatin1String("getExistingDirectory"), m_engine.newFunction(fileBox<QFileDialog::AcceptSave, QFileDialog::DirectoryOnly> , 2));
-    m_initialized = true;
+    m_engine->globalObject().setProperty(QLatin1String("getOpenFileNames"), m_engine->newFunction(fileBox<QFileDialog::AcceptOpen, QFileDialog::ExistingFiles> , 2));
+    m_engine->globalObject().setProperty(QLatin1String("getOpenFileName"), m_engine->newFunction(fileBox<QFileDialog::AcceptOpen, QFileDialog::ExistingFile> , 2));
+    m_engine->globalObject().setProperty(QLatin1String("getSaveFileName"), m_engine->newFunction(fileBox<QFileDialog::AcceptSave, QFileDialog::AnyFile> , 2));
+    m_engine->globalObject().setProperty(QLatin1String("getExistingDirectory"), m_engine->newFunction(fileBox<QFileDialog::AcceptSave, QFileDialog::DirectoryOnly> , 2));
 }
 
-QString ScriptManagerPrivate::engineError(QScriptEngine &scriptEngine)
+QString ScriptManagerPrivate::engineError(QScriptEngine *scriptEngine)
 {
-    QScriptValue error = scriptEngine.evaluate(QLatin1String("Error"));
+    QScriptValue error = scriptEngine->evaluate(QLatin1String("Error"));
     if (error.isValid())
         return error.toString();
     return ScriptManager::tr("Unknown error");
diff --git a/src/plugins/coreplugin/scriptmanager/scriptmanager.h b/src/plugins/coreplugin/scriptmanager/scriptmanager.h
index 5d40f5b190b..8b3fcb2b09d 100644
--- a/src/plugins/coreplugin/scriptmanager/scriptmanager.h
+++ b/src/plugins/coreplugin/scriptmanager/scriptmanager.h
@@ -59,9 +59,6 @@ public:
     ScriptManager(QObject *parent = 0) : QObject(parent) {}
     virtual ~ScriptManager() { }
 
-    // Access the engine (for plugins to wrap additional interfaces).
-    virtual QScriptEngine &scriptEngine() = 0;
-
     // Run a script
     virtual bool runScript(const QString &script, QString *errorMessage, Stack *errorStack) = 0;
     virtual bool runScript(const QString &script, QString *errorMessage) = 0;
diff --git a/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h b/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h
index 2a94e094ab8..4a34fd61d1a 100644
--- a/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h
+++ b/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h
@@ -45,17 +45,15 @@ class ScriptManagerPrivate : public Core::ScriptManager
 public:
     explicit ScriptManagerPrivate(QObject *parent);
 
-    QScriptEngine &scriptEngine();
     bool runScript(const QString &script, QString *errorMessage, Stack *stack);
     bool runScript(const QString &script, QString *errorMessage);
 
-    static QString engineError(QScriptEngine &scriptEngine);
+    static QString engineError(QScriptEngine *scriptEngine);
 
 private:
     void ensureEngineInitialized();
 
-    QScriptEngine m_engine;
-    bool m_initialized;
+    QScriptEngine *m_engine;
 };
 
 } // namespace Internal
diff --git a/src/plugins/duieditor/duieditoractionhandler.cpp b/src/plugins/duieditor/duieditoractionhandler.cpp
index 28c50a23619..de776d5a814 100644
--- a/src/plugins/duieditor/duieditoractionhandler.cpp
+++ b/src/plugins/duieditor/duieditoractionhandler.cpp
@@ -33,7 +33,6 @@
 
 #include <coreplugin/icore.h>
 #include <coreplugin/actionmanager/actionmanager.h>
-#include <coreplugin/scriptmanager/scriptmanager.h>
 
 #include <QtCore/QDebug>
 #include <QtGui/QAction>
diff --git a/src/shared/scriptwrapper/interface_wrap_helpers.h b/src/shared/scriptwrapper/interface_wrap_helpers.h
index 968c417f29f..b28e84dbe06 100644
--- a/src/shared/scriptwrapper/interface_wrap_helpers.h
+++ b/src/shared/scriptwrapper/interface_wrap_helpers.h
@@ -70,13 +70,13 @@ static void scriptValueToQObjectInterface(const QScriptValue &sv, QObjectInterfa
 // QObject that implements the interface, so it can be casted to it.
 
 template <class QObjectInterface, class Prototype>
-static void registerQObjectInterface(QScriptEngine &engine)
+static void registerQObjectInterface(QScriptEngine *engine)
 {
-    Prototype *protoType = new Prototype(&engine);
-    const QScriptValue scriptProtoType = engine.newQObject(protoType);
+    Prototype *protoType = new Prototype(engine);
+    const QScriptValue scriptProtoType = engine->newQObject(protoType);
 
     const int metaTypeId = qScriptRegisterMetaType<QObjectInterface*>(
-        &engine,
+        engine,
         qObjectInterfaceToScriptValue<QObjectInterface>,
         scriptValueToQObjectInterface<QObjectInterface>,
         scriptProtoType);
diff --git a/src/shared/scriptwrapper/wrap_helpers.h b/src/shared/scriptwrapper/wrap_helpers.h
index 533450d8da8..eed26e06852 100644
--- a/src/shared/scriptwrapper/wrap_helpers.h
+++ b/src/shared/scriptwrapper/wrap_helpers.h
@@ -319,9 +319,9 @@ static void scriptValueToQObject(const QScriptValue &sv, SomeQObject * &p)
 // Q_PROPERTY(QMainWindow*).
 
 template <class SomeQObject>
-static void registerQObject(QScriptEngine &engine)
+static void registerQObject(QScriptEngine *engine)
 {
-    qScriptRegisterMetaType<SomeQObject*>(&engine,
+    qScriptRegisterMetaType<SomeQObject*>(engine,
                                           qObjectToScriptValue<SomeQObject>,
                                           scriptValueToQObject<SomeQObject>);
 }
-- 
GitLab