No need to create a QScriptEngine at startup.

(cherry picked from commit 3eb875cf97)
This commit is contained in:
con
2009-09-01 16:19:13 +02:00
parent a5b09336ac
commit 5063af5318
6 changed files with 40 additions and 55 deletions

View File

@@ -46,10 +46,6 @@
#include <QtGui/QToolBar> #include <QtGui/QToolBar>
#include <QtGui/QStatusBar> #include <QtGui/QStatusBar>
namespace {
enum { debugQWorkbenchWrappers = 0 };
}
// Script function template to pop up a message box // Script function template to pop up a message box
// with a certain icon and buttons. // with a certain icon and buttons.
template <int MsgBoxIcon, int MsgBoxButtons> template <int MsgBoxIcon, int MsgBoxButtons>
@@ -178,16 +174,11 @@ namespace Core {
namespace Internal { namespace Internal {
ScriptManagerPrivate::ScriptManagerPrivate(QObject *parent) ScriptManagerPrivate::ScriptManagerPrivate(QObject *parent)
: ScriptManager(parent), m_initialized(false) : ScriptManager(parent),
m_engine(0)
{ {
} }
QScriptEngine &ScriptManagerPrivate::scriptEngine()
{
ensureEngineInitialized();
return m_engine;
}
// Split a backtrace of the form: // Split a backtrace of the form:
// "<anonymous>(BuildManagerCommand(ls))@:0 // "<anonymous>(BuildManagerCommand(ls))@:0
// demoProjectExplorer()@:237 // demoProjectExplorer()@:237
@@ -225,25 +216,26 @@ bool ScriptManagerPrivate::runScript(const QString &script, QString *errorMessag
ensureEngineInitialized(); ensureEngineInitialized();
stack->clear(); stack->clear();
m_engine.pushContext(); m_engine->pushContext();
m_engine.evaluate(script); m_engine->evaluate(script);
const bool failed = m_engine.hasUncaughtException (); const bool failed = m_engine->hasUncaughtException ();
if (failed) { if (failed) {
const int errorLineNumber = m_engine.uncaughtExceptionLineNumber(); const int errorLineNumber = m_engine->uncaughtExceptionLineNumber();
const QStringList backTrace = m_engine.uncaughtExceptionBacktrace(); const QStringList backTrace = m_engine->uncaughtExceptionBacktrace();
parseBackTrace(backTrace, *stack); parseBackTrace(backTrace, *stack);
const QString backtrace = backTrace.join(QString(QLatin1Char('\n'))); 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); *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; return !failed;
} }
void ScriptManagerPrivate::ensureEngineInitialized() void ScriptManagerPrivate::ensureEngineInitialized()
{ {
if (m_initialized) if (m_engine)
return; return;
m_engine = new QScriptEngine(this);
// register QObjects that occur as properties // register QObjects that occur as properties
SharedTools::registerQObject<QMainWindow>(m_engine); SharedTools::registerQObject<QMainWindow>(m_engine);
SharedTools::registerQObject<QStatusBar>(m_engine); SharedTools::registerQObject<QStatusBar>(m_engine);
@@ -252,52 +244,51 @@ void ScriptManagerPrivate::ensureEngineInitialized()
// SharedTools::registerQObjectInterface<Core::MessageManager, MessageManagerPrototype>(m_engine); // SharedTools::registerQObjectInterface<Core::MessageManager, MessageManagerPrototype>(m_engine);
// SharedTools::registerQObjectInterface<Core::IFile, FilePrototype>(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::FileManager, FileManagerPrototype>(m_engine);
// SharedTools::registerQObjectInterface<Core::IEditor, EditorPrototype>(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); // 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::EditorManager, EditorManagerPrototype>(m_engine);
// SharedTools::registerQObjectInterface<Core::ICore, CorePrototype>(m_engine); // SharedTools::registerQObjectInterface<Core::ICore, CorePrototype>(m_engine);
// Make "core" available // 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); // CLASSIC: registerInterfaceWithDefaultPrototype<Core::MessageManager, MessageManagerPrototype>(m_engine);
// Message box conveniences // Message box conveniences
m_engine.globalObject().setProperty(QLatin1String("critical"), m_engine->globalObject().setProperty(QLatin1String("critical"),
m_engine.newFunction(messageBox<QMessageBox::Critical, QMessageBox::Ok>, 3)); m_engine->newFunction(messageBox<QMessageBox::Critical, QMessageBox::Ok>, 3));
m_engine.globalObject().setProperty(QLatin1String("warning"), m_engine->globalObject().setProperty(QLatin1String("warning"),
m_engine.newFunction(messageBox<QMessageBox::Warning, QMessageBox::Ok>, 3)); m_engine->newFunction(messageBox<QMessageBox::Warning, QMessageBox::Ok>, 3));
m_engine.globalObject().setProperty(QLatin1String("information"), m_engine->globalObject().setProperty(QLatin1String("information"),
m_engine.newFunction(messageBox<QMessageBox::Information, QMessageBox::Ok>, 3)); m_engine->newFunction(messageBox<QMessageBox::Information, QMessageBox::Ok>, 3));
// StandardButtons has overloaded operator '|' - grrr. // StandardButtons has overloaded operator '|' - grrr.
enum { MsgBoxYesNo = 0x00014000 }; enum { MsgBoxYesNo = 0x00014000 };
m_engine.globalObject().setProperty(QLatin1String("yesNoQuestion"), m_engine->globalObject().setProperty(QLatin1String("yesNoQuestion"),
m_engine.newFunction(messageBox<QMessageBox::Question, MsgBoxYesNo>, 3)); m_engine->newFunction(messageBox<QMessageBox::Question, MsgBoxYesNo>, 3));
m_engine.globalObject().setProperty(QLatin1String("getText"), m_engine.newFunction(inputDialogGetText, 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("getInteger"), m_engine->newFunction(inputDialogGetInteger, 3));
m_engine.globalObject().setProperty(QLatin1String("getDouble"), m_engine.newFunction(inputDialogGetDouble, 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("getItem"), m_engine->newFunction(inputDialogGetItem, 3));
// file box // file box
m_engine.globalObject().setProperty(QLatin1String("getOpenFileNames"), m_engine.newFunction(fileBox<QFileDialog::AcceptOpen, QFileDialog::ExistingFiles> , 2)); 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("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("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_engine->globalObject().setProperty(QLatin1String("getExistingDirectory"), m_engine->newFunction(fileBox<QFileDialog::AcceptSave, QFileDialog::DirectoryOnly> , 2));
m_initialized = true;
} }
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()) if (error.isValid())
return error.toString(); return error.toString();
return ScriptManager::tr("Unknown error"); return ScriptManager::tr("Unknown error");

View File

@@ -59,9 +59,6 @@ public:
ScriptManager(QObject *parent = 0) : QObject(parent) {} ScriptManager(QObject *parent = 0) : QObject(parent) {}
virtual ~ScriptManager() { } virtual ~ScriptManager() { }
// Access the engine (for plugins to wrap additional interfaces).
virtual QScriptEngine &scriptEngine() = 0;
// Run a script // Run a script
virtual bool runScript(const QString &script, QString *errorMessage, Stack *errorStack) = 0; virtual bool runScript(const QString &script, QString *errorMessage, Stack *errorStack) = 0;
virtual bool runScript(const QString &script, QString *errorMessage) = 0; virtual bool runScript(const QString &script, QString *errorMessage) = 0;

View File

@@ -45,17 +45,15 @@ class ScriptManagerPrivate : public Core::ScriptManager
public: public:
explicit ScriptManagerPrivate(QObject *parent); explicit ScriptManagerPrivate(QObject *parent);
QScriptEngine &scriptEngine();
bool runScript(const QString &script, QString *errorMessage, Stack *stack); bool runScript(const QString &script, QString *errorMessage, Stack *stack);
bool runScript(const QString &script, QString *errorMessage); bool runScript(const QString &script, QString *errorMessage);
static QString engineError(QScriptEngine &scriptEngine); static QString engineError(QScriptEngine *scriptEngine);
private: private:
void ensureEngineInitialized(); void ensureEngineInitialized();
QScriptEngine m_engine; QScriptEngine *m_engine;
bool m_initialized;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -33,7 +33,6 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/scriptmanager/scriptmanager.h>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtGui/QAction> #include <QtGui/QAction>

View File

@@ -70,13 +70,13 @@ static void scriptValueToQObjectInterface(const QScriptValue &sv, QObjectInterfa
// QObject that implements the interface, so it can be casted to it. // QObject that implements the interface, so it can be casted to it.
template <class QObjectInterface, class Prototype> template <class QObjectInterface, class Prototype>
static void registerQObjectInterface(QScriptEngine &engine) static void registerQObjectInterface(QScriptEngine *engine)
{ {
Prototype *protoType = new Prototype(&engine); Prototype *protoType = new Prototype(engine);
const QScriptValue scriptProtoType = engine.newQObject(protoType); const QScriptValue scriptProtoType = engine->newQObject(protoType);
const int metaTypeId = qScriptRegisterMetaType<QObjectInterface*>( const int metaTypeId = qScriptRegisterMetaType<QObjectInterface*>(
&engine, engine,
qObjectInterfaceToScriptValue<QObjectInterface>, qObjectInterfaceToScriptValue<QObjectInterface>,
scriptValueToQObjectInterface<QObjectInterface>, scriptValueToQObjectInterface<QObjectInterface>,
scriptProtoType); scriptProtoType);

View File

@@ -319,9 +319,9 @@ static void scriptValueToQObject(const QScriptValue &sv, SomeQObject * &p)
// Q_PROPERTY(QMainWindow*). // Q_PROPERTY(QMainWindow*).
template <class SomeQObject> template <class SomeQObject>
static void registerQObject(QScriptEngine &engine) static void registerQObject(QScriptEngine *engine)
{ {
qScriptRegisterMetaType<SomeQObject*>(&engine, qScriptRegisterMetaType<SomeQObject*>(engine,
qObjectToScriptValue<SomeQObject>, qObjectToScriptValue<SomeQObject>,
scriptValueToQObject<SomeQObject>); scriptValueToQObject<SomeQObject>);
} }