src/scripttools/debugging/qscriptdebuggerscriptedconsolecommand.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
--- a/src/scripttools/debugging/qscriptdebuggerscriptedconsolecommand.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/scripttools/debugging/qscriptdebuggerscriptedconsolecommand.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -46,8 +46,6 @@
 #include "qscriptmessagehandlerinterface_p.h"
 #include "qscriptdebuggerconsoleglobalobject_p.h"
 #include "qscriptdebuggerresponse_p.h"
-#include "qscriptdebuggervalue_p.h"
-#include "qscriptdebuggervalueproperty_p.h"
 #include "qscriptdebuggercommandschedulerinterface_p.h"
 
 #include <QtCore/qstring.h>
@@ -59,202 +57,9 @@
 #include <QtCore/qdebug.h>
 
 Q_DECLARE_METATYPE(QScriptDebuggerResponse)
-Q_DECLARE_METATYPE(QScriptBreakpointData)
-Q_DECLARE_METATYPE(QScriptBreakpointMap)
-Q_DECLARE_METATYPE(QScriptScriptData)
-Q_DECLARE_METATYPE(QScriptScriptMap)
-Q_DECLARE_METATYPE(QScriptContextInfo)
-Q_DECLARE_METATYPE(QScriptDebuggerValue)
-Q_DECLARE_METATYPE(QScriptDebuggerValueProperty)
-Q_DECLARE_METATYPE(QScriptDebuggerValuePropertyList)
-Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommand*)
-Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandList)
-Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupData)
-Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupMap)
 
 QT_BEGIN_NAMESPACE
 
-static QScriptValue debuggerResponseToScriptValue(QScriptEngine *eng, const QScriptDebuggerResponse &in)
-{
-    QScriptValue out = eng->newObject();
-    out.setProperty(QString::fromLatin1("result"), qScriptValueFromValue(eng, in.result()));
-    out.setProperty(QString::fromLatin1("error"), QScriptValue(eng, in.error()));
-    out.setProperty(QString::fromLatin1("async"), QScriptValue(eng, in.async()));
-    return out;
-}
-
-static void debuggerResponseFromScriptValue(const QScriptValue &, QScriptDebuggerResponse &)
-{
-    Q_ASSERT(0);
-}
-
-static QScriptValue breakpointDataToScriptValue(QScriptEngine *eng, const QScriptBreakpointData &in)
-{
-    QScriptValue out = eng->newObject();
-    out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
-    out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
-    out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
-    out.setProperty(QString::fromLatin1("enabled"), QScriptValue(eng, in.isEnabled()));
-    out.setProperty(QString::fromLatin1("singleShot"), QScriptValue(eng, in.isSingleShot()));
-    out.setProperty(QString::fromLatin1("ignoreCount"), QScriptValue(eng, in.ignoreCount()));
-    out.setProperty(QString::fromLatin1("condition"), QScriptValue(eng, in.condition()));
-    return out;
-}
-
-static void breakpointDataFromScriptValue(const QScriptValue &in, QScriptBreakpointData &out)
-{
-    QScriptValue scriptId = in.property(QString::fromLatin1("scriptId"));
-    if (scriptId.isValid())
-        out.setScriptId((qint64)scriptId.toNumber());
-    out.setFileName(in.property(QString::fromLatin1("fileName")).toString());
-    out.setLineNumber(in.property(QString::fromLatin1("lineNumber")).toInt32());
-    QScriptValue enabled = in.property(QString::fromLatin1("enabled"));
-    if (enabled.isValid())
-        out.setEnabled(enabled.toBoolean());
-    QScriptValue singleShot = in.property(QString::fromLatin1("singleShot"));
-    if (singleShot.isValid())
-        out.setSingleShot(singleShot.toBoolean());
-    out.setIgnoreCount(in.property(QString::fromLatin1("ignoreCount")).toInt32());
-    out.setCondition(in.property(QString::fromLatin1("condition")).toString());
-}
-
-static QScriptValue breakpointMapToScriptValue(QScriptEngine *eng, const QScriptBreakpointMap &in)
-{
-    QScriptValue out = eng->newObject();
-    QScriptBreakpointMap::const_iterator it;
-    for (it = in.constBegin(); it != in.constEnd(); ++it) {
-        out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
-    }
-    return out;
-}
-
-static void breakpointMapFromScriptValue(const QScriptValue &, QScriptBreakpointMap &)
-{
-    Q_ASSERT(0);
-}
-
-static QScriptValue scriptDataToScriptValue(QScriptEngine *eng, const QScriptScriptData &in)
-{
-    QScriptValue out = eng->newObject();
-    out.setProperty(QString::fromLatin1("contents"), QScriptValue(eng, in.contents()));
-    out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
-    out.setProperty(QString::fromLatin1("baseLineNumber"), QScriptValue(eng, in.baseLineNumber()));
-    return out;
-}
-
-static void scriptDataFromScriptValue(const QScriptValue &in, QScriptScriptData &out)
-{
-    QString contents = in.property(QString::fromLatin1("contents")).toString();
-    QString fileName = in.property(QString::fromLatin1("fileName")).toString();
-    int baseLineNumber = in.property(QString::fromLatin1("baseLineNumber")).toInt32();
-    QScriptScriptData tmp(contents, fileName, baseLineNumber);
-    out = tmp;
-}
-
-static QScriptValue scriptMapToScriptValue(QScriptEngine *eng, const QScriptScriptMap &in)
-{
-    QScriptValue out = eng->newObject();
-    QScriptScriptMap::const_iterator it;
-    for (it = in.constBegin(); it != in.constEnd(); ++it) {
-        out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
-    }
-    return out;
-}
-
-static void scriptMapFromScriptValue(const QScriptValue &, QScriptScriptMap &)
-{
-    Q_ASSERT(0);
-}
-
-static QScriptValue consoleCommandToScriptValue(
-    QScriptEngine *eng, QScriptDebuggerConsoleCommand* const &in)
-{
-    if (!in)
-        return eng->undefinedValue();
-    QScriptValue out = eng->newObject();
-    out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in->name()));
-    out.setProperty(QString::fromLatin1("group"), QScriptValue(eng, in->group()));
-    out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in->shortDescription()));
-    out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in->longDescription()));
-    out.setProperty(QString::fromLatin1("aliases"), qScriptValueFromValue(eng, in->aliases()));
-    out.setProperty(QString::fromLatin1("seeAlso"), qScriptValueFromValue(eng, in->seeAlso()));
-    return out;
-}
-
-static void consoleCommandFromScriptValue(
-    const QScriptValue &, QScriptDebuggerConsoleCommand* &)
-{
-    Q_ASSERT(0);
-}
-
-static QScriptValue consoleCommandGroupDataToScriptValue(
-    QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupData &in)
-{
-    QScriptValue out = eng->newObject();
-    out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in.longDescription()));
-    out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in.shortDescription()));
-    return out;
-}
-
-static void consoleCommandGroupDataFromScriptValue(
-    const QScriptValue &, QScriptDebuggerConsoleCommandGroupData &)
-{
-    Q_ASSERT(0);
-}
-
-static QScriptValue consoleCommandGroupMapToScriptValue(
-    QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupMap &in)
-{
-    QScriptValue out = eng->newObject();
-    QScriptDebuggerConsoleCommandGroupMap::const_iterator it;
-    for (it = in.constBegin(); it != in.constEnd(); ++it) {
-        out.setProperty(it.key(), qScriptValueFromValue(eng, it.value()));
-    }
-    return out;
-}
-
-static void consoleCommandGroupMapFromScriptValue(
-    const QScriptValue &, QScriptDebuggerConsoleCommandGroupMap &)
-{
-    Q_ASSERT(0);
-}
-
-static QScriptValue contextInfoToScriptValue(QScriptEngine *eng, const QScriptContextInfo &in)
-{
-    QScriptValue out = eng->newObject();
-    out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
-    out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
-    out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
-    out.setProperty(QString::fromLatin1("columnNumber"), QScriptValue(eng, in.columnNumber()));
-    out.setProperty(QString::fromLatin1("functionName"), QScriptValue(eng, in.functionName()));
-    return out;
-}
-
-static void contextInfoFromScriptValue(const QScriptValue &, QScriptContextInfo &)
-{
-    Q_ASSERT(0);
-}
-
-static QScriptValue debuggerScriptValuePropertyToScriptValue(QScriptEngine *eng, const QScriptDebuggerValueProperty &in)
-{
-    QScriptValue out = eng->newObject();
-    out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in.name()));
-    out.setProperty(QString::fromLatin1("value"), qScriptValueFromValue(eng, in.value()));
-    out.setProperty(QString::fromLatin1("valueAsString"), QScriptValue(eng, in.valueAsString()));
-    out.setProperty(QString::fromLatin1("flags"), QScriptValue(eng, static_cast<int>(in.flags())));
-    return out;
-}
-
-static void debuggerScriptValuePropertyFromScriptValue(const QScriptValue &in, QScriptDebuggerValueProperty &out)
-{
-    QString name = in.property(QString::fromLatin1("name")).toString();
-    QScriptDebuggerValue value = qscriptvalue_cast<QScriptDebuggerValue>(in.property(QString::fromLatin1("value")));
-    QString valueAsString = in.property(QString::fromLatin1("valueAsString")).toString();
-    int flags = in.property(QString::fromLatin1("flags")).toInt32();
-    QScriptDebuggerValueProperty tmp(name, value, valueAsString, QScriptValue::PropertyFlags(flags));
-    out = tmp;
-}
-
 /*!
   \since 4.5
   \class QScriptDebuggerScriptedConsoleCommand
@@ -279,19 +84,17 @@
     QStringList seeAlso;
     QStringList argumentTypes;
     QStringList subCommands;
-    QScriptEngine *engine;
+    QScriptValue globalObject;
     QScriptValue execFunction;
     QScriptValue responseFunction;
 };
 
 QScriptDebuggerScriptedConsoleCommandPrivate::QScriptDebuggerScriptedConsoleCommandPrivate()
 {
-    engine = 0;
 }
 
 QScriptDebuggerScriptedConsoleCommandPrivate::~QScriptDebuggerScriptedConsoleCommandPrivate()
 {
-    delete engine;
 }
 
 QScriptDebuggerScriptedConsoleCommand::QScriptDebuggerScriptedConsoleCommand(
@@ -299,6 +102,7 @@
     const QString &shortDescription, const QString &longDescription,
     const QStringList &aliases, const QStringList &seeAlso,
     const QStringList &argumentTypes, const QStringList &subCommands,
+    const QScriptValue &globalObject,
     const QScriptValue &execFunction, const QScriptValue &responseFunction)
     : QScriptDebuggerConsoleCommand(*new QScriptDebuggerScriptedConsoleCommandPrivate)
 {
@@ -311,25 +115,9 @@
     d->seeAlso = seeAlso;
     d->argumentTypes = argumentTypes;
     d->subCommands = subCommands;
+    d->globalObject = globalObject;
     d->execFunction = execFunction;
     d->responseFunction = responseFunction;
-    d->engine = execFunction.engine();
-
-    qScriptRegisterMetaType<QScriptBreakpointData>(d->engine, breakpointDataToScriptValue, breakpointDataFromScriptValue);
-    qScriptRegisterMetaType<QScriptBreakpointMap>(d->engine, breakpointMapToScriptValue, breakpointMapFromScriptValue);
-    qScriptRegisterMetaType<QScriptScriptData>(d->engine, scriptDataToScriptValue, scriptDataFromScriptValue);
-    qScriptRegisterMetaType<QScriptScriptMap>(d->engine, scriptMapToScriptValue, scriptMapFromScriptValue);
-    qScriptRegisterMetaType<QScriptContextInfo>(d->engine, contextInfoToScriptValue, contextInfoFromScriptValue);
-    qScriptRegisterMetaType<QScriptDebuggerValueProperty>(d->engine, debuggerScriptValuePropertyToScriptValue, debuggerScriptValuePropertyFromScriptValue);
-    qScriptRegisterSequenceMetaType<QScriptDebuggerValuePropertyList>(d->engine);
-    qScriptRegisterMetaType<QScriptDebuggerResponse>(d->engine, debuggerResponseToScriptValue, debuggerResponseFromScriptValue);
-    qScriptRegisterMetaType<QScriptDebuggerConsoleCommand*>(d->engine, consoleCommandToScriptValue, consoleCommandFromScriptValue);
-    qScriptRegisterSequenceMetaType<QScriptDebuggerConsoleCommandList>(d->engine);
-    qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupData>(d->engine, consoleCommandGroupDataToScriptValue, consoleCommandGroupDataFromScriptValue);
-    qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupMap>(d->engine, consoleCommandGroupMapToScriptValue, consoleCommandGroupMapFromScriptValue);
-// ### can't do this, if it's an object ID the conversion will be incorrect since
-// ### the object ID refers to an object in a different engine!
-//    qScriptRegisterMetaType(d->engine, debuggerScriptValueToScriptValue, debuggerScriptValueFromScriptValue);
 }
 
 QScriptDebuggerScriptedConsoleCommand::~QScriptDebuggerScriptedConsoleCommand()
@@ -405,7 +193,8 @@
 void QScriptDebuggerScriptedConsoleCommandJob::start()
 {
     Q_D(QScriptDebuggerScriptedConsoleCommandJob);
-    QScriptEngine *engine = d->command->engine;
+    QScriptEngine *engine = d->command->globalObject.engine();
+    engine->setGlobalObject(d->command->globalObject);
     QScriptValueList args;
     for (int i = 0; i < d->arguments.size(); ++i)
         args.append(QScriptValue(engine, d->arguments.at(i)));
@@ -435,12 +224,13 @@
 {
     Q_D(QScriptDebuggerScriptedConsoleCommandJob);
     // ### generalize
-    QScriptEngine *engine = d->command->engine;
+    QScriptEngine *engine = d->command->globalObject.engine();
+    engine->setGlobalObject(d->command->globalObject);
     QScriptValueList args;
     args.append(qScriptValueFromValue(engine, response));
     args.append(QScriptValue(engine, commandId));
     QScriptDebuggerConsoleGlobalObject *global;
-    global = qobject_cast<QScriptDebuggerConsoleGlobalObject*>(engine->globalObject().toQObject());
+    global = qobject_cast<QScriptDebuggerConsoleGlobalObject*>(d->command->globalObject.toQObject());
     Q_ASSERT(global != 0);
     global->setScheduler(this);
     global->setResponseHandler(this);
@@ -551,9 +341,8 @@
 */
 QScriptDebuggerScriptedConsoleCommand *QScriptDebuggerScriptedConsoleCommand::parse(
     const QString &program, const QString &fileName,
-    QScriptMessageHandlerInterface *messageHandler)
+    QScriptEngine *engine, QScriptMessageHandlerInterface *messageHandler)
 {
-    QScriptEngine *engine = new QScriptEngine();
     // create a custom global object
     QScriptDebuggerConsoleGlobalObject *cppGlobal = new QScriptDebuggerConsoleGlobalObject();
     QScriptValue global = engine->newQObject(cppGlobal,
@@ -574,14 +363,12 @@
     if (engine->hasUncaughtException()) {
         messageHandler->message(QtCriticalMsg, ret.toString(), fileName,
                                 engine->uncaughtExceptionLineNumber());
-        delete engine;
         return 0;
     }
 
     QScriptValue name = global.property(QLatin1String("name"));
     if (!name.isString()) {
         messageHandler->message(QtCriticalMsg, QLatin1String("command definition lacks a name"), fileName);
-        delete engine;
         return 0;
     }
     QString nameStr = name.toString();
@@ -590,7 +377,6 @@
     if (!group.isString()) {
         messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks a group name")
                                 .arg(nameStr), fileName);
-        delete engine;
         return 0;
     }
     QString groupStr = group.toString();
@@ -599,7 +385,6 @@
     if (!shortDesc.isString()) {
         messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks shortDescription")
                                 .arg(nameStr), fileName);
-        delete engine;
         return 0;
     }
     QString shortDescStr = shortDesc.toString();
@@ -608,7 +393,6 @@
     if (!longDesc.isString()) {
         messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks longDescription")
                                 .arg(nameStr), fileName);
-        delete engine;
         return 0;
     }
     QString longDescStr = longDesc.toString();
@@ -629,7 +413,6 @@
     if (!execFunction.isFunction()) {
         messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks execute() function")
                                 .arg(nameStr), fileName);
-        delete engine;
         return 0;
     }
 
@@ -640,7 +423,7 @@
         shortDescStr, longDescStr,
         aliases, seeAlso,
         argTypes, subCommands,
-        execFunction, responseFunction);
+        global, execFunction, responseFunction);
     return result;
 }