| |   |
| 46 | 46 | #include "qscriptmessagehandlerinterface_p.h" |
| 47 | 47 | #include "qscriptdebuggerconsoleglobalobject_p.h" |
| 48 | 48 | #include "qscriptdebuggerresponse_p.h" |
| #include "qscriptdebuggervalue_p.h" |
| #include "qscriptdebuggervalueproperty_p.h" |
| 51 | 49 | #include "qscriptdebuggercommandschedulerinterface_p.h" |
| 52 | 50 | |
| 53 | 51 | #include <QtCore/qstring.h> |
| … | … | |
| 57 | 57 | #include <QtCore/qdebug.h> |
| 58 | 58 | |
| 59 | 59 | 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) |
| 72 | 60 | |
| 73 | 61 | QT_BEGIN_NAMESPACE |
| 74 | 62 | |
| 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; |
| } |
|
| 256 | 63 | /*! |
| 257 | 64 | \since 4.5 |
| 258 | 65 | \class QScriptDebuggerScriptedConsoleCommand |
| … | … | |
| 84 | 84 | QStringList seeAlso; |
| 85 | 85 | QStringList argumentTypes; |
| 86 | 86 | QStringList subCommands; |
| QScriptEngine *engine; |
| QScriptValue globalObject; |
| 88 | 88 | QScriptValue execFunction; |
| 89 | 89 | QScriptValue responseFunction; |
| 90 | 90 | }; |
| 91 | 91 | |
| 92 | 92 | QScriptDebuggerScriptedConsoleCommandPrivate::QScriptDebuggerScriptedConsoleCommandPrivate() |
| 93 | 93 | { |
| engine = 0; |
| 95 | 94 | } |
| 96 | 95 | |
| 97 | 96 | QScriptDebuggerScriptedConsoleCommandPrivate::~QScriptDebuggerScriptedConsoleCommandPrivate() |
| 98 | 97 | { |
| delete engine; |
| 100 | 98 | } |
| 101 | 99 | |
| 102 | 100 | QScriptDebuggerScriptedConsoleCommand::QScriptDebuggerScriptedConsoleCommand( |
| … | … | |
| 102 | 102 | const QString &shortDescription, const QString &longDescription, |
| 103 | 103 | const QStringList &aliases, const QStringList &seeAlso, |
| 104 | 104 | const QStringList &argumentTypes, const QStringList &subCommands, |
| const QScriptValue &globalObject, |
| 105 | 106 | const QScriptValue &execFunction, const QScriptValue &responseFunction) |
| 106 | 107 | : QScriptDebuggerConsoleCommand(*new QScriptDebuggerScriptedConsoleCommandPrivate) |
| 107 | 108 | { |
| … | … | |
| 115 | 115 | d->seeAlso = seeAlso; |
| 116 | 116 | d->argumentTypes = argumentTypes; |
| 117 | 117 | d->subCommands = subCommands; |
| d->globalObject = globalObject; |
| 118 | 119 | d->execFunction = execFunction; |
| 119 | 120 | 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); |
| 137 | 121 | } |
| 138 | 122 | |
| 139 | 123 | QScriptDebuggerScriptedConsoleCommand::~QScriptDebuggerScriptedConsoleCommand() |
| … | … | |
| 193 | 193 | void QScriptDebuggerScriptedConsoleCommandJob::start() |
| 194 | 194 | { |
| 195 | 195 | Q_D(QScriptDebuggerScriptedConsoleCommandJob); |
| QScriptEngine *engine = d->command->engine; |
| QScriptEngine *engine = d->command->globalObject.engine(); |
| engine->setGlobalObject(d->command->globalObject); |
| 197 | 198 | QScriptValueList args; |
| 198 | 199 | for (int i = 0; i < d->arguments.size(); ++i) |
| 199 | 200 | args.append(QScriptValue(engine, d->arguments.at(i))); |
| … | … | |
| 224 | 224 | { |
| 225 | 225 | Q_D(QScriptDebuggerScriptedConsoleCommandJob); |
| 226 | 226 | // ### generalize |
| QScriptEngine *engine = d->command->engine; |
| QScriptEngine *engine = d->command->globalObject.engine(); |
| engine->setGlobalObject(d->command->globalObject); |
| 228 | 229 | QScriptValueList args; |
| 229 | 230 | args.append(qScriptValueFromValue(engine, response)); |
| 230 | 231 | args.append(QScriptValue(engine, commandId)); |
| 231 | 232 | QScriptDebuggerConsoleGlobalObject *global; |
| global = qobject_cast<QScriptDebuggerConsoleGlobalObject*>(engine->globalObject().toQObject()); |
| global = qobject_cast<QScriptDebuggerConsoleGlobalObject*>(d->command->globalObject.toQObject()); |
| 233 | 234 | Q_ASSERT(global != 0); |
| 234 | 235 | global->setScheduler(this); |
| 235 | 236 | global->setResponseHandler(this); |
| … | … | |
| 341 | 341 | */ |
| 342 | 342 | QScriptDebuggerScriptedConsoleCommand *QScriptDebuggerScriptedConsoleCommand::parse( |
| 343 | 343 | const QString &program, const QString &fileName, |
| QScriptMessageHandlerInterface *messageHandler) |
| QScriptEngine *engine, QScriptMessageHandlerInterface *messageHandler) |
| 345 | 345 | { |
| QScriptEngine *engine = new QScriptEngine(); |
| 347 | 346 | // create a custom global object |
| 348 | 347 | QScriptDebuggerConsoleGlobalObject *cppGlobal = new QScriptDebuggerConsoleGlobalObject(); |
| 349 | 348 | QScriptValue global = engine->newQObject(cppGlobal, |
| … | … | |
| 363 | 363 | if (engine->hasUncaughtException()) { |
| 364 | 364 | messageHandler->message(QtCriticalMsg, ret.toString(), fileName, |
| 365 | 365 | engine->uncaughtExceptionLineNumber()); |
| delete engine; |
| 367 | 366 | return 0; |
| 368 | 367 | } |
| 369 | 368 | |
| 370 | 369 | QScriptValue name = global.property(QLatin1String("name")); |
| 371 | 370 | if (!name.isString()) { |
| 372 | 371 | messageHandler->message(QtCriticalMsg, QLatin1String("command definition lacks a name"), fileName); |
| delete engine; |
| 374 | 372 | return 0; |
| 375 | 373 | } |
| 376 | 374 | QString nameStr = name.toString(); |
| … | … | |
| 377 | 377 | if (!group.isString()) { |
| 378 | 378 | messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks a group name") |
| 379 | 379 | .arg(nameStr), fileName); |
| delete engine; |
| 381 | 380 | return 0; |
| 382 | 381 | } |
| 383 | 382 | QString groupStr = group.toString(); |
| … | … | |
| 385 | 385 | if (!shortDesc.isString()) { |
| 386 | 386 | messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks shortDescription") |
| 387 | 387 | .arg(nameStr), fileName); |
| delete engine; |
| 389 | 388 | return 0; |
| 390 | 389 | } |
| 391 | 390 | QString shortDescStr = shortDesc.toString(); |
| … | … | |
| 393 | 393 | if (!longDesc.isString()) { |
| 394 | 394 | messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks longDescription") |
| 395 | 395 | .arg(nameStr), fileName); |
| delete engine; |
| 397 | 396 | return 0; |
| 398 | 397 | } |
| 399 | 398 | QString longDescStr = longDesc.toString(); |
| … | … | |
| 413 | 413 | if (!execFunction.isFunction()) { |
| 414 | 414 | messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks execute() function") |
| 415 | 415 | .arg(nameStr), fileName); |
| delete engine; |
| 417 | 416 | return 0; |
| 418 | 417 | } |
| 419 | 418 | |
| … | … | |
| 423 | 423 | shortDescStr, longDescStr, |
| 424 | 424 | aliases, seeAlso, |
| 425 | 425 | argTypes, subCommands, |
| execFunction, responseFunction); |
| global, execFunction, responseFunction); |
| 427 | 427 | return result; |
| 428 | 428 | } |
| 429 | 429 | |