Commit 5762a988fbcd95c9c44e58993c25f5cd1d53f897

  • avatar
  • khansen
  • Thu Feb 04 16:08:47 CET 2010
Use a shared QScriptEngine for debugger console command scripts

A single engine was used for each script (i.e. command), which was
just ridiculous. Use one engine with multiple global objects to
isolate each script's state.

Task-number: QTBUG-7227
  
4444#include "qscriptdebuggerconsolecommandmanager_p.h"
4545#include "qscriptdebuggerscriptedconsolecommand_p.h"
4646#include "qscriptmessagehandlerinterface_p.h"
47#include "qscriptbreakpointdata_p.h"
48#include "qscriptdebuggerresponse_p.h"
49#include "qscriptdebuggervalueproperty_p.h"
50#include "qscriptscriptdata_p.h"
4751
4852#include <QtCore/qdir.h>
4953#include <QtCore/qfileinfo.h>
5054#include <QtCore/qstring.h>
5155#include <QtCore/qstringlist.h>
5256#include <QtCore/qdebug.h>
57#include <QtScript/qscriptcontextinfo.h>
5358#include <QtScript/qscriptengine.h>
5459
60Q_DECLARE_METATYPE(QScriptDebuggerResponse)
61Q_DECLARE_METATYPE(QScriptBreakpointData)
62Q_DECLARE_METATYPE(QScriptBreakpointMap)
63Q_DECLARE_METATYPE(QScriptScriptData)
64Q_DECLARE_METATYPE(QScriptScriptMap)
65Q_DECLARE_METATYPE(QScriptContextInfo)
66Q_DECLARE_METATYPE(QScriptDebuggerValue)
67Q_DECLARE_METATYPE(QScriptDebuggerValueProperty)
68Q_DECLARE_METATYPE(QScriptDebuggerValuePropertyList)
69Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommand*)
70Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandList)
71Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupData)
72Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupMap)
73
5574QT_BEGIN_NAMESPACE
5675
76static QScriptValue debuggerResponseToScriptValue(QScriptEngine *eng, const QScriptDebuggerResponse &in)
77{
78 QScriptValue out = eng->newObject();
79 out.setProperty(QString::fromLatin1("result"), qScriptValueFromValue(eng, in.result()));
80 out.setProperty(QString::fromLatin1("error"), QScriptValue(eng, in.error()));
81 out.setProperty(QString::fromLatin1("async"), QScriptValue(eng, in.async()));
82 return out;
83}
84
85static void debuggerResponseFromScriptValue(const QScriptValue &, QScriptDebuggerResponse &)
86{
87 Q_ASSERT(0);
88}
89
90static QScriptValue breakpointDataToScriptValue(QScriptEngine *eng, const QScriptBreakpointData &in)
91{
92 QScriptValue out = eng->newObject();
93 out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
94 out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
95 out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
96 out.setProperty(QString::fromLatin1("enabled"), QScriptValue(eng, in.isEnabled()));
97 out.setProperty(QString::fromLatin1("singleShot"), QScriptValue(eng, in.isSingleShot()));
98 out.setProperty(QString::fromLatin1("ignoreCount"), QScriptValue(eng, in.ignoreCount()));
99 out.setProperty(QString::fromLatin1("condition"), QScriptValue(eng, in.condition()));
100 return out;
101}
102
103static void breakpointDataFromScriptValue(const QScriptValue &in, QScriptBreakpointData &out)
104{
105 QScriptValue scriptId = in.property(QString::fromLatin1("scriptId"));
106 if (scriptId.isValid())
107 out.setScriptId((qint64)scriptId.toNumber());
108 out.setFileName(in.property(QString::fromLatin1("fileName")).toString());
109 out.setLineNumber(in.property(QString::fromLatin1("lineNumber")).toInt32());
110 QScriptValue enabled = in.property(QString::fromLatin1("enabled"));
111 if (enabled.isValid())
112 out.setEnabled(enabled.toBoolean());
113 QScriptValue singleShot = in.property(QString::fromLatin1("singleShot"));
114 if (singleShot.isValid())
115 out.setSingleShot(singleShot.toBoolean());
116 out.setIgnoreCount(in.property(QString::fromLatin1("ignoreCount")).toInt32());
117 out.setCondition(in.property(QString::fromLatin1("condition")).toString());
118}
119
120static QScriptValue breakpointMapToScriptValue(QScriptEngine *eng, const QScriptBreakpointMap &in)
121{
122 QScriptValue out = eng->newObject();
123 QScriptBreakpointMap::const_iterator it;
124 for (it = in.constBegin(); it != in.constEnd(); ++it) {
125 out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
126 }
127 return out;
128}
129
130static void breakpointMapFromScriptValue(const QScriptValue &, QScriptBreakpointMap &)
131{
132 Q_ASSERT(0);
133}
134
135static QScriptValue scriptDataToScriptValue(QScriptEngine *eng, const QScriptScriptData &in)
136{
137 QScriptValue out = eng->newObject();
138 out.setProperty(QString::fromLatin1("contents"), QScriptValue(eng, in.contents()));
139 out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
140 out.setProperty(QString::fromLatin1("baseLineNumber"), QScriptValue(eng, in.baseLineNumber()));
141 return out;
142}
143
144static void scriptDataFromScriptValue(const QScriptValue &in, QScriptScriptData &out)
145{
146 QString contents = in.property(QString::fromLatin1("contents")).toString();
147 QString fileName = in.property(QString::fromLatin1("fileName")).toString();
148 int baseLineNumber = in.property(QString::fromLatin1("baseLineNumber")).toInt32();
149 QScriptScriptData tmp(contents, fileName, baseLineNumber);
150 out = tmp;
151}
152
153static QScriptValue scriptMapToScriptValue(QScriptEngine *eng, const QScriptScriptMap &in)
154{
155 QScriptValue out = eng->newObject();
156 QScriptScriptMap::const_iterator it;
157 for (it = in.constBegin(); it != in.constEnd(); ++it) {
158 out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
159 }
160 return out;
161}
162
163static void scriptMapFromScriptValue(const QScriptValue &, QScriptScriptMap &)
164{
165 Q_ASSERT(0);
166}
167
168static QScriptValue consoleCommandToScriptValue(
169 QScriptEngine *eng, QScriptDebuggerConsoleCommand* const &in)
170{
171 if (!in)
172 return eng->undefinedValue();
173 QScriptValue out = eng->newObject();
174 out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in->name()));
175 out.setProperty(QString::fromLatin1("group"), QScriptValue(eng, in->group()));
176 out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in->shortDescription()));
177 out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in->longDescription()));
178 out.setProperty(QString::fromLatin1("aliases"), qScriptValueFromValue(eng, in->aliases()));
179 out.setProperty(QString::fromLatin1("seeAlso"), qScriptValueFromValue(eng, in->seeAlso()));
180 return out;
181}
182
183static void consoleCommandFromScriptValue(
184 const QScriptValue &, QScriptDebuggerConsoleCommand* &)
185{
186 Q_ASSERT(0);
187}
188
189static QScriptValue consoleCommandGroupDataToScriptValue(
190 QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupData &in)
191{
192 QScriptValue out = eng->newObject();
193 out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in.longDescription()));
194 out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in.shortDescription()));
195 return out;
196}
197
198static void consoleCommandGroupDataFromScriptValue(
199 const QScriptValue &, QScriptDebuggerConsoleCommandGroupData &)
200{
201 Q_ASSERT(0);
202}
203
204static QScriptValue consoleCommandGroupMapToScriptValue(
205 QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupMap &in)
206{
207 QScriptValue out = eng->newObject();
208 QScriptDebuggerConsoleCommandGroupMap::const_iterator it;
209 for (it = in.constBegin(); it != in.constEnd(); ++it) {
210 out.setProperty(it.key(), qScriptValueFromValue(eng, it.value()));
211 }
212 return out;
213}
214
215static void consoleCommandGroupMapFromScriptValue(
216 const QScriptValue &, QScriptDebuggerConsoleCommandGroupMap &)
217{
218 Q_ASSERT(0);
219}
220
221static QScriptValue contextInfoToScriptValue(QScriptEngine *eng, const QScriptContextInfo &in)
222{
223 QScriptValue out = eng->newObject();
224 out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
225 out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
226 out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
227 out.setProperty(QString::fromLatin1("columnNumber"), QScriptValue(eng, in.columnNumber()));
228 out.setProperty(QString::fromLatin1("functionName"), QScriptValue(eng, in.functionName()));
229 return out;
230}
231
232static void contextInfoFromScriptValue(const QScriptValue &, QScriptContextInfo &)
233{
234 Q_ASSERT(0);
235}
236
237static QScriptValue debuggerScriptValuePropertyToScriptValue(QScriptEngine *eng, const QScriptDebuggerValueProperty &in)
238{
239 QScriptValue out = eng->newObject();
240 out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in.name()));
241 out.setProperty(QString::fromLatin1("value"), qScriptValueFromValue(eng, in.value()));
242 out.setProperty(QString::fromLatin1("valueAsString"), QScriptValue(eng, in.valueAsString()));
243 out.setProperty(QString::fromLatin1("flags"), QScriptValue(eng, static_cast<int>(in.flags())));
244 return out;
245}
246
247static void debuggerScriptValuePropertyFromScriptValue(const QScriptValue &in, QScriptDebuggerValueProperty &out)
248{
249 QString name = in.property(QString::fromLatin1("name")).toString();
250 QScriptDebuggerValue value = qscriptvalue_cast<QScriptDebuggerValue>(in.property(QString::fromLatin1("value")));
251 QString valueAsString = in.property(QString::fromLatin1("valueAsString")).toString();
252 int flags = in.property(QString::fromLatin1("flags")).toInt32();
253 QScriptDebuggerValueProperty tmp(name, value, valueAsString, QScriptValue::PropertyFlags(flags));
254 out = tmp;
255}
256
57257/*!
58258 \since 4.5
59259 \class QScriptDebuggerConsole
276276 QScriptMessageHandlerInterface *messageHandler,
277277 QScriptDebuggerCommandSchedulerInterface *commandScheduler);
278278
279 QScriptEngine *commandEngine;
279280 QScriptDebuggerConsoleCommandManager *commandManager;
280281 QString commandPrefix;
281282 QString input;
300300 evaluateAction = 0;
301301 commandPrefix = QLatin1String(".");
302302 commandManager = new QScriptDebuggerConsoleCommandManager();
303
304 commandEngine = new QScriptEngine;
305 qScriptRegisterMetaType<QScriptBreakpointData>(commandEngine, breakpointDataToScriptValue, breakpointDataFromScriptValue);
306 qScriptRegisterMetaType<QScriptBreakpointMap>(commandEngine, breakpointMapToScriptValue, breakpointMapFromScriptValue);
307 qScriptRegisterMetaType<QScriptScriptData>(commandEngine, scriptDataToScriptValue, scriptDataFromScriptValue);
308 qScriptRegisterMetaType<QScriptScriptMap>(commandEngine, scriptMapToScriptValue, scriptMapFromScriptValue);
309 qScriptRegisterMetaType<QScriptContextInfo>(commandEngine, contextInfoToScriptValue, contextInfoFromScriptValue);
310 qScriptRegisterMetaType<QScriptDebuggerValueProperty>(commandEngine, debuggerScriptValuePropertyToScriptValue, debuggerScriptValuePropertyFromScriptValue);
311 qScriptRegisterSequenceMetaType<QScriptDebuggerValuePropertyList>(commandEngine);
312 qScriptRegisterMetaType<QScriptDebuggerResponse>(commandEngine, debuggerResponseToScriptValue, debuggerResponseFromScriptValue);
313 qScriptRegisterMetaType<QScriptDebuggerConsoleCommand*>(commandEngine, consoleCommandToScriptValue, consoleCommandFromScriptValue);
314 qScriptRegisterSequenceMetaType<QScriptDebuggerConsoleCommandList>(commandEngine);
315 qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupData>(commandEngine, consoleCommandGroupDataToScriptValue, consoleCommandGroupDataFromScriptValue);
316 qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupMap>(commandEngine, consoleCommandGroupMapToScriptValue, consoleCommandGroupMapFromScriptValue);
317// ### can't do this, if it's an object ID the conversion will be incorrect since
318// ### the object ID refers to an object in a different engine!
319// qScriptRegisterMetaType(commandEngine, debuggerScriptValueToScriptValue, debuggerScriptValueFromScriptValue);
303320}
304321
305322QScriptDebuggerConsolePrivate::~QScriptDebuggerConsolePrivate()
306323{
307324 delete commandManager;
325 delete commandEngine;
308326}
309327
310328/*!
345345 QString program = stream.readAll();
346346 QScriptDebuggerScriptedConsoleCommand *command;
347347 command = QScriptDebuggerScriptedConsoleCommand::parse(
348 program, fileName, messageHandler);
348 program, fileName, commandEngine, messageHandler);
349349 if (!command)
350350 continue;
351351 commandManager->addCommand(command);
  
4646#include "qscriptmessagehandlerinterface_p.h"
4747#include "qscriptdebuggerconsoleglobalobject_p.h"
4848#include "qscriptdebuggerresponse_p.h"
49#include "qscriptdebuggervalue_p.h"
50#include "qscriptdebuggervalueproperty_p.h"
5149#include "qscriptdebuggercommandschedulerinterface_p.h"
5250
5351#include <QtCore/qstring.h>
5757#include <QtCore/qdebug.h>
5858
5959Q_DECLARE_METATYPE(QScriptDebuggerResponse)
60Q_DECLARE_METATYPE(QScriptBreakpointData)
61Q_DECLARE_METATYPE(QScriptBreakpointMap)
62Q_DECLARE_METATYPE(QScriptScriptData)
63Q_DECLARE_METATYPE(QScriptScriptMap)
64Q_DECLARE_METATYPE(QScriptContextInfo)
65Q_DECLARE_METATYPE(QScriptDebuggerValue)
66Q_DECLARE_METATYPE(QScriptDebuggerValueProperty)
67Q_DECLARE_METATYPE(QScriptDebuggerValuePropertyList)
68Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommand*)
69Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandList)
70Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupData)
71Q_DECLARE_METATYPE(QScriptDebuggerConsoleCommandGroupMap)
7260
7361QT_BEGIN_NAMESPACE
7462
75static QScriptValue debuggerResponseToScriptValue(QScriptEngine *eng, const QScriptDebuggerResponse &in)
76{
77 QScriptValue out = eng->newObject();
78 out.setProperty(QString::fromLatin1("result"), qScriptValueFromValue(eng, in.result()));
79 out.setProperty(QString::fromLatin1("error"), QScriptValue(eng, in.error()));
80 out.setProperty(QString::fromLatin1("async"), QScriptValue(eng, in.async()));
81 return out;
82}
83
84static void debuggerResponseFromScriptValue(const QScriptValue &, QScriptDebuggerResponse &)
85{
86 Q_ASSERT(0);
87}
88
89static QScriptValue breakpointDataToScriptValue(QScriptEngine *eng, const QScriptBreakpointData &in)
90{
91 QScriptValue out = eng->newObject();
92 out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
93 out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
94 out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
95 out.setProperty(QString::fromLatin1("enabled"), QScriptValue(eng, in.isEnabled()));
96 out.setProperty(QString::fromLatin1("singleShot"), QScriptValue(eng, in.isSingleShot()));
97 out.setProperty(QString::fromLatin1("ignoreCount"), QScriptValue(eng, in.ignoreCount()));
98 out.setProperty(QString::fromLatin1("condition"), QScriptValue(eng, in.condition()));
99 return out;
100}
101
102static void breakpointDataFromScriptValue(const QScriptValue &in, QScriptBreakpointData &out)
103{
104 QScriptValue scriptId = in.property(QString::fromLatin1("scriptId"));
105 if (scriptId.isValid())
106 out.setScriptId((qint64)scriptId.toNumber());
107 out.setFileName(in.property(QString::fromLatin1("fileName")).toString());
108 out.setLineNumber(in.property(QString::fromLatin1("lineNumber")).toInt32());
109 QScriptValue enabled = in.property(QString::fromLatin1("enabled"));
110 if (enabled.isValid())
111 out.setEnabled(enabled.toBoolean());
112 QScriptValue singleShot = in.property(QString::fromLatin1("singleShot"));
113 if (singleShot.isValid())
114 out.setSingleShot(singleShot.toBoolean());
115 out.setIgnoreCount(in.property(QString::fromLatin1("ignoreCount")).toInt32());
116 out.setCondition(in.property(QString::fromLatin1("condition")).toString());
117}
118
119static QScriptValue breakpointMapToScriptValue(QScriptEngine *eng, const QScriptBreakpointMap &in)
120{
121 QScriptValue out = eng->newObject();
122 QScriptBreakpointMap::const_iterator it;
123 for (it = in.constBegin(); it != in.constEnd(); ++it) {
124 out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
125 }
126 return out;
127}
128
129static void breakpointMapFromScriptValue(const QScriptValue &, QScriptBreakpointMap &)
130{
131 Q_ASSERT(0);
132}
133
134static QScriptValue scriptDataToScriptValue(QScriptEngine *eng, const QScriptScriptData &in)
135{
136 QScriptValue out = eng->newObject();
137 out.setProperty(QString::fromLatin1("contents"), QScriptValue(eng, in.contents()));
138 out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
139 out.setProperty(QString::fromLatin1("baseLineNumber"), QScriptValue(eng, in.baseLineNumber()));
140 return out;
141}
142
143static void scriptDataFromScriptValue(const QScriptValue &in, QScriptScriptData &out)
144{
145 QString contents = in.property(QString::fromLatin1("contents")).toString();
146 QString fileName = in.property(QString::fromLatin1("fileName")).toString();
147 int baseLineNumber = in.property(QString::fromLatin1("baseLineNumber")).toInt32();
148 QScriptScriptData tmp(contents, fileName, baseLineNumber);
149 out = tmp;
150}
151
152static QScriptValue scriptMapToScriptValue(QScriptEngine *eng, const QScriptScriptMap &in)
153{
154 QScriptValue out = eng->newObject();
155 QScriptScriptMap::const_iterator it;
156 for (it = in.constBegin(); it != in.constEnd(); ++it) {
157 out.setProperty(QString::number(it.key()), qScriptValueFromValue(eng, it.value()));
158 }
159 return out;
160}
161
162static void scriptMapFromScriptValue(const QScriptValue &, QScriptScriptMap &)
163{
164 Q_ASSERT(0);
165}
166
167static QScriptValue consoleCommandToScriptValue(
168 QScriptEngine *eng, QScriptDebuggerConsoleCommand* const &in)
169{
170 if (!in)
171 return eng->undefinedValue();
172 QScriptValue out = eng->newObject();
173 out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in->name()));
174 out.setProperty(QString::fromLatin1("group"), QScriptValue(eng, in->group()));
175 out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in->shortDescription()));
176 out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in->longDescription()));
177 out.setProperty(QString::fromLatin1("aliases"), qScriptValueFromValue(eng, in->aliases()));
178 out.setProperty(QString::fromLatin1("seeAlso"), qScriptValueFromValue(eng, in->seeAlso()));
179 return out;
180}
181
182static void consoleCommandFromScriptValue(
183 const QScriptValue &, QScriptDebuggerConsoleCommand* &)
184{
185 Q_ASSERT(0);
186}
187
188static QScriptValue consoleCommandGroupDataToScriptValue(
189 QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupData &in)
190{
191 QScriptValue out = eng->newObject();
192 out.setProperty(QString::fromLatin1("longDescription"), QScriptValue(eng, in.longDescription()));
193 out.setProperty(QString::fromLatin1("shortDescription"), QScriptValue(eng, in.shortDescription()));
194 return out;
195}
196
197static void consoleCommandGroupDataFromScriptValue(
198 const QScriptValue &, QScriptDebuggerConsoleCommandGroupData &)
199{
200 Q_ASSERT(0);
201}
202
203static QScriptValue consoleCommandGroupMapToScriptValue(
204 QScriptEngine *eng, const QScriptDebuggerConsoleCommandGroupMap &in)
205{
206 QScriptValue out = eng->newObject();
207 QScriptDebuggerConsoleCommandGroupMap::const_iterator it;
208 for (it = in.constBegin(); it != in.constEnd(); ++it) {
209 out.setProperty(it.key(), qScriptValueFromValue(eng, it.value()));
210 }
211 return out;
212}
213
214static void consoleCommandGroupMapFromScriptValue(
215 const QScriptValue &, QScriptDebuggerConsoleCommandGroupMap &)
216{
217 Q_ASSERT(0);
218}
219
220static QScriptValue contextInfoToScriptValue(QScriptEngine *eng, const QScriptContextInfo &in)
221{
222 QScriptValue out = eng->newObject();
223 out.setProperty(QString::fromLatin1("scriptId"), QScriptValue(eng, qsreal(in.scriptId())));
224 out.setProperty(QString::fromLatin1("fileName"), QScriptValue(eng, in.fileName()));
225 out.setProperty(QString::fromLatin1("lineNumber"), QScriptValue(eng, in.lineNumber()));
226 out.setProperty(QString::fromLatin1("columnNumber"), QScriptValue(eng, in.columnNumber()));
227 out.setProperty(QString::fromLatin1("functionName"), QScriptValue(eng, in.functionName()));
228 return out;
229}
230
231static void contextInfoFromScriptValue(const QScriptValue &, QScriptContextInfo &)
232{
233 Q_ASSERT(0);
234}
235
236static QScriptValue debuggerScriptValuePropertyToScriptValue(QScriptEngine *eng, const QScriptDebuggerValueProperty &in)
237{
238 QScriptValue out = eng->newObject();
239 out.setProperty(QString::fromLatin1("name"), QScriptValue(eng, in.name()));
240 out.setProperty(QString::fromLatin1("value"), qScriptValueFromValue(eng, in.value()));
241 out.setProperty(QString::fromLatin1("valueAsString"), QScriptValue(eng, in.valueAsString()));
242 out.setProperty(QString::fromLatin1("flags"), QScriptValue(eng, static_cast<int>(in.flags())));
243 return out;
244}
245
246static void debuggerScriptValuePropertyFromScriptValue(const QScriptValue &in, QScriptDebuggerValueProperty &out)
247{
248 QString name = in.property(QString::fromLatin1("name")).toString();
249 QScriptDebuggerValue value = qscriptvalue_cast<QScriptDebuggerValue>(in.property(QString::fromLatin1("value")));
250 QString valueAsString = in.property(QString::fromLatin1("valueAsString")).toString();
251 int flags = in.property(QString::fromLatin1("flags")).toInt32();
252 QScriptDebuggerValueProperty tmp(name, value, valueAsString, QScriptValue::PropertyFlags(flags));
253 out = tmp;
254}
255
25663/*!
25764 \since 4.5
25865 \class QScriptDebuggerScriptedConsoleCommand
8484 QStringList seeAlso;
8585 QStringList argumentTypes;
8686 QStringList subCommands;
87 QScriptEngine *engine;
87 QScriptValue globalObject;
8888 QScriptValue execFunction;
8989 QScriptValue responseFunction;
9090};
9191
9292QScriptDebuggerScriptedConsoleCommandPrivate::QScriptDebuggerScriptedConsoleCommandPrivate()
9393{
94 engine = 0;
9594}
9695
9796QScriptDebuggerScriptedConsoleCommandPrivate::~QScriptDebuggerScriptedConsoleCommandPrivate()
9897{
99 delete engine;
10098}
10199
102100QScriptDebuggerScriptedConsoleCommand::QScriptDebuggerScriptedConsoleCommand(
102102 const QString &shortDescription, const QString &longDescription,
103103 const QStringList &aliases, const QStringList &seeAlso,
104104 const QStringList &argumentTypes, const QStringList &subCommands,
105 const QScriptValue &globalObject,
105106 const QScriptValue &execFunction, const QScriptValue &responseFunction)
106107 : QScriptDebuggerConsoleCommand(*new QScriptDebuggerScriptedConsoleCommandPrivate)
107108{
115115 d->seeAlso = seeAlso;
116116 d->argumentTypes = argumentTypes;
117117 d->subCommands = subCommands;
118 d->globalObject = globalObject;
118119 d->execFunction = execFunction;
119120 d->responseFunction = responseFunction;
120 d->engine = execFunction.engine();
121
122 qScriptRegisterMetaType<QScriptBreakpointData>(d->engine, breakpointDataToScriptValue, breakpointDataFromScriptValue);
123 qScriptRegisterMetaType<QScriptBreakpointMap>(d->engine, breakpointMapToScriptValue, breakpointMapFromScriptValue);
124 qScriptRegisterMetaType<QScriptScriptData>(d->engine, scriptDataToScriptValue, scriptDataFromScriptValue);
125 qScriptRegisterMetaType<QScriptScriptMap>(d->engine, scriptMapToScriptValue, scriptMapFromScriptValue);
126 qScriptRegisterMetaType<QScriptContextInfo>(d->engine, contextInfoToScriptValue, contextInfoFromScriptValue);
127 qScriptRegisterMetaType<QScriptDebuggerValueProperty>(d->engine, debuggerScriptValuePropertyToScriptValue, debuggerScriptValuePropertyFromScriptValue);
128 qScriptRegisterSequenceMetaType<QScriptDebuggerValuePropertyList>(d->engine);
129 qScriptRegisterMetaType<QScriptDebuggerResponse>(d->engine, debuggerResponseToScriptValue, debuggerResponseFromScriptValue);
130 qScriptRegisterMetaType<QScriptDebuggerConsoleCommand*>(d->engine, consoleCommandToScriptValue, consoleCommandFromScriptValue);
131 qScriptRegisterSequenceMetaType<QScriptDebuggerConsoleCommandList>(d->engine);
132 qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupData>(d->engine, consoleCommandGroupDataToScriptValue, consoleCommandGroupDataFromScriptValue);
133 qScriptRegisterMetaType<QScriptDebuggerConsoleCommandGroupMap>(d->engine, consoleCommandGroupMapToScriptValue, consoleCommandGroupMapFromScriptValue);
134// ### can't do this, if it's an object ID the conversion will be incorrect since
135// ### the object ID refers to an object in a different engine!
136// qScriptRegisterMetaType(d->engine, debuggerScriptValueToScriptValue, debuggerScriptValueFromScriptValue);
137121}
138122
139123QScriptDebuggerScriptedConsoleCommand::~QScriptDebuggerScriptedConsoleCommand()
193193void QScriptDebuggerScriptedConsoleCommandJob::start()
194194{
195195 Q_D(QScriptDebuggerScriptedConsoleCommandJob);
196 QScriptEngine *engine = d->command->engine;
196 QScriptEngine *engine = d->command->globalObject.engine();
197 engine->setGlobalObject(d->command->globalObject);
197198 QScriptValueList args;
198199 for (int i = 0; i < d->arguments.size(); ++i)
199200 args.append(QScriptValue(engine, d->arguments.at(i)));
224224{
225225 Q_D(QScriptDebuggerScriptedConsoleCommandJob);
226226 // ### generalize
227 QScriptEngine *engine = d->command->engine;
227 QScriptEngine *engine = d->command->globalObject.engine();
228 engine->setGlobalObject(d->command->globalObject);
228229 QScriptValueList args;
229230 args.append(qScriptValueFromValue(engine, response));
230231 args.append(QScriptValue(engine, commandId));
231232 QScriptDebuggerConsoleGlobalObject *global;
232 global = qobject_cast<QScriptDebuggerConsoleGlobalObject*>(engine->globalObject().toQObject());
233 global = qobject_cast<QScriptDebuggerConsoleGlobalObject*>(d->command->globalObject.toQObject());
233234 Q_ASSERT(global != 0);
234235 global->setScheduler(this);
235236 global->setResponseHandler(this);
341341*/
342342QScriptDebuggerScriptedConsoleCommand *QScriptDebuggerScriptedConsoleCommand::parse(
343343 const QString &program, const QString &fileName,
344 QScriptMessageHandlerInterface *messageHandler)
344 QScriptEngine *engine, QScriptMessageHandlerInterface *messageHandler)
345345{
346 QScriptEngine *engine = new QScriptEngine();
347346 // create a custom global object
348347 QScriptDebuggerConsoleGlobalObject *cppGlobal = new QScriptDebuggerConsoleGlobalObject();
349348 QScriptValue global = engine->newQObject(cppGlobal,
363363 if (engine->hasUncaughtException()) {
364364 messageHandler->message(QtCriticalMsg, ret.toString(), fileName,
365365 engine->uncaughtExceptionLineNumber());
366 delete engine;
367366 return 0;
368367 }
369368
370369 QScriptValue name = global.property(QLatin1String("name"));
371370 if (!name.isString()) {
372371 messageHandler->message(QtCriticalMsg, QLatin1String("command definition lacks a name"), fileName);
373 delete engine;
374372 return 0;
375373 }
376374 QString nameStr = name.toString();
377377 if (!group.isString()) {
378378 messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks a group name")
379379 .arg(nameStr), fileName);
380 delete engine;
381380 return 0;
382381 }
383382 QString groupStr = group.toString();
385385 if (!shortDesc.isString()) {
386386 messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks shortDescription")
387387 .arg(nameStr), fileName);
388 delete engine;
389388 return 0;
390389 }
391390 QString shortDescStr = shortDesc.toString();
393393 if (!longDesc.isString()) {
394394 messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks longDescription")
395395 .arg(nameStr), fileName);
396 delete engine;
397396 return 0;
398397 }
399398 QString longDescStr = longDesc.toString();
413413 if (!execFunction.isFunction()) {
414414 messageHandler->message(QtCriticalMsg, QString::fromLatin1("definition of command \"%0\" lacks execute() function")
415415 .arg(nameStr), fileName);
416 delete engine;
417416 return 0;
418417 }
419418
423423 shortDescStr, longDescStr,
424424 aliases, seeAlso,
425425 argTypes, subCommands,
426 execFunction, responseFunction);
426 global, execFunction, responseFunction);
427427 return result;
428428}
429429
  
5757
5858QT_BEGIN_NAMESPACE
5959
60class QScriptEngine;
6061class QScriptValue;
6162
6263class QScriptDebuggerScriptedConsoleCommandPrivate;
7373 const QStringList &seeAlso,
7474 const QStringList &argumentTypes,
7575 const QStringList &subCommands,
76 const QScriptValue &globalObject,
7677 const QScriptValue &execFunction,
7778 const QScriptValue &responseFunction);
7879public:
8181
8282 static QScriptDebuggerScriptedConsoleCommand *parse(
8383 const QString &program, const QString &fileName,
84 QScriptMessageHandlerInterface *messageHandler);
84 QScriptEngine *engine, QScriptMessageHandlerInterface *messageHandler);
8585
8686 QString name() const;
8787 QString group() const;