source: trunk/src/script/api/qscriptengine.h

Last change on this file was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

  • Property svn:eol-style set to native
File size: 13.8 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtScript module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL-ONLY$
10** GNU Lesser General Public License Usage
11** This file may be used under the terms of the GNU Lesser
12** General Public License version 2.1 as published by the Free Software
13** Foundation and appearing in the file LICENSE.LGPL included in the
14** packaging of this file. Please review the following information to
15** ensure the GNU Lesser General Public License version 2.1 requirements
16** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17**
18** If you have questions regarding the use of this file, please contact
19** Nokia at [email protected].
20** $QT_END_LICENSE$
21**
22****************************************************************************/
23
24#ifndef QSCRIPTENGINE_H
25#define QSCRIPTENGINE_H
26
27#include <QtCore/qmetatype.h>
28
29#include <QtCore/qvariant.h>
30#include <QtCore/qsharedpointer.h>
31
32#ifndef QT_NO_QOBJECT
33#include <QtCore/qobject.h>
34#else
35#include <QtCore/qobjectdefs.h>
36#endif
37
38#include <QtScript/qscriptvalue.h>
39#include <QtScript/qscriptcontext.h>
40#include <QtScript/qscriptstring.h>
41#include <QtScript/qscriptprogram.h>
42
43QT_BEGIN_HEADER
44
45QT_BEGIN_NAMESPACE
46
47QT_MODULE(Script)
48
49class QDateTime;
50class QScriptClass;
51class QScriptEngineAgent;
52class QScriptEnginePrivate;
53
54#ifndef QT_NO_QOBJECT
55
56template <class T>
57inline QScriptValue qscriptQMetaObjectConstructor(QScriptContext *, QScriptEngine *, T *)
58{
59 return QScriptValue();
60}
61
62#endif // QT_NO_QOBJECT
63
64#ifndef QT_NO_REGEXP
65class QRegExp;
66#endif
67
68#ifndef QT_NO_MEMBER_TEMPLATES
69template <typename T>
70inline QScriptValue qScriptValueFromValue(QScriptEngine *, const T &);
71
72template <typename T>
73inline T qScriptValueToValue(const QScriptValue &);
74#endif
75
76class QScriptSyntaxCheckResultPrivate;
77class Q_SCRIPT_EXPORT QScriptSyntaxCheckResult
78{
79public:
80 enum State {
81 Error,
82 Intermediate,
83 Valid
84 };
85
86 QScriptSyntaxCheckResult(const QScriptSyntaxCheckResult &other);
87 ~QScriptSyntaxCheckResult();
88
89 State state() const;
90 int errorLineNumber() const;
91 int errorColumnNumber() const;
92 QString errorMessage() const;
93
94 QScriptSyntaxCheckResult &operator=(const QScriptSyntaxCheckResult &other);
95
96private:
97 QScriptSyntaxCheckResult();
98 QScriptSyntaxCheckResult(QScriptSyntaxCheckResultPrivate *d);
99 QExplicitlySharedDataPointer<QScriptSyntaxCheckResultPrivate> d_ptr;
100
101 Q_DECLARE_PRIVATE(QScriptSyntaxCheckResult)
102 friend class QScriptEngine;
103 friend class QScriptEnginePrivate;
104};
105
106class Q_SCRIPT_EXPORT QScriptEngine
107#ifndef QT_NO_QOBJECT
108 : public QObject
109#endif
110{
111#ifndef QT_NO_QOBJECT
112 Q_OBJECT
113#endif
114public:
115 enum ValueOwnership {
116 QtOwnership,
117 ScriptOwnership,
118 AutoOwnership
119 };
120
121 enum QObjectWrapOption {
122 ExcludeChildObjects = 0x0001,
123 ExcludeSuperClassMethods = 0x0002,
124 ExcludeSuperClassProperties = 0x0004,
125 ExcludeSuperClassContents = 0x0006,
126 SkipMethodsInEnumeration = 0x0008,
127 ExcludeDeleteLater = 0x0010,
128 ExcludeSlots = 0x0020,
129
130 AutoCreateDynamicProperties = 0x0100,
131 PreferExistingWrapperObject = 0x0200
132 };
133 Q_DECLARE_FLAGS(QObjectWrapOptions, QObjectWrapOption)
134
135 QScriptEngine();
136#ifndef QT_NO_QOBJECT
137 explicit QScriptEngine(QObject *parent);
138#endif
139 virtual ~QScriptEngine();
140
141 QScriptValue globalObject() const;
142 void setGlobalObject(const QScriptValue &object);
143
144 QScriptContext *currentContext() const;
145 QScriptContext *pushContext();
146 void popContext();
147
148 bool canEvaluate(const QString &program) const;
149 static QScriptSyntaxCheckResult checkSyntax(const QString &program);
150
151 QScriptValue evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1);
152
153 QScriptValue evaluate(const QScriptProgram &program);
154
155 bool isEvaluating() const;
156 void abortEvaluation(const QScriptValue &result = QScriptValue());
157
158 bool hasUncaughtException() const;
159 QScriptValue uncaughtException() const;
160 int uncaughtExceptionLineNumber() const;
161 QStringList uncaughtExceptionBacktrace() const;
162 void clearExceptions();
163
164 QScriptValue nullValue();
165 QScriptValue undefinedValue();
166
167 typedef QScriptValue (*FunctionSignature)(QScriptContext *, QScriptEngine *);
168 typedef QScriptValue (*FunctionWithArgSignature)(QScriptContext *, QScriptEngine *, void *);
169
170 QScriptValue newFunction(FunctionSignature signature, int length = 0);
171 QScriptValue newFunction(FunctionSignature signature, const QScriptValue &prototype, int length = 0);
172
173 QScriptValue newFunction(FunctionWithArgSignature signature, void *arg);
174
175 QScriptValue newVariant(const QVariant &value);
176 QScriptValue newVariant(const QScriptValue &object, const QVariant &value);
177
178#ifndef QT_NO_REGEXP
179 QScriptValue newRegExp(const QRegExp &regexp);
180#endif
181
182 QScriptValue newObject();
183 QScriptValue newObject(QScriptClass *scriptClass, const QScriptValue &data = QScriptValue());
184 QScriptValue newArray(uint length = 0);
185 QScriptValue newRegExp(const QString &pattern, const QString &flags);
186 QScriptValue newDate(qsreal value);
187 QScriptValue newDate(const QDateTime &value);
188 QScriptValue newActivationObject();
189
190#ifndef QT_NO_QOBJECT
191 QScriptValue newQObject(QObject *object, ValueOwnership ownership = QtOwnership,
192 const QObjectWrapOptions &options = 0);
193 QScriptValue newQObject(const QScriptValue &scriptObject, QObject *qtObject,
194 ValueOwnership ownership = QtOwnership,
195 const QObjectWrapOptions &options = 0);
196
197 QScriptValue newQMetaObject(const QMetaObject *metaObject, const QScriptValue &ctor = QScriptValue());
198
199# ifndef QT_NO_MEMBER_TEMPLATES
200 template <class T> QScriptValue scriptValueFromQMetaObject();
201# endif // QT_NO_MEMBER_TEMPLATES
202
203#endif // QT_NO_QOBJECT
204
205
206
207 QScriptValue defaultPrototype(int metaTypeId) const;
208 void setDefaultPrototype(int metaTypeId, const QScriptValue &prototype);
209
210
211 typedef QScriptValue (*MarshalFunction)(QScriptEngine *, const void *);
212 typedef void (*DemarshalFunction)(const QScriptValue &, void *);
213
214
215
216#ifndef QT_NO_MEMBER_TEMPLATES
217 template <typename T>
218 inline QScriptValue toScriptValue(const T &value)
219 {
220 return qScriptValueFromValue(this, value);
221 }
222 template <typename T>
223 inline T fromScriptValue(const QScriptValue &value)
224 {
225 return qScriptValueToValue<T>(value);
226 }
227#endif // QT_NO_MEMBER_TEMPLATES
228
229 void installTranslatorFunctions(const QScriptValue &object = QScriptValue());
230
231 QScriptValue importExtension(const QString &extension);
232 QStringList availableExtensions() const;
233 QStringList importedExtensions() const;
234
235 void collectGarbage();
236 void reportAdditionalMemoryCost(int size);
237
238 void setProcessEventsInterval(int interval);
239 int processEventsInterval() const;
240
241 void setAgent(QScriptEngineAgent *agent);
242 QScriptEngineAgent *agent() const;
243
244 QScriptString toStringHandle(const QString &str);
245 QScriptValue toObject(const QScriptValue &value);
246
247 QScriptValue objectById(qint64 id) const;
248
249#ifndef QT_NO_QOBJECT
250Q_SIGNALS:
251 void signalHandlerException(const QScriptValue &exception);
252#endif
253
254private:
255 QScriptValue create(int type, const void *ptr);
256
257 bool convert(const QScriptValue &value, int type, void *ptr);
258 static bool convertV2(const QScriptValue &value, int type, void *ptr);
259
260 void registerCustomType(int type, MarshalFunction mf, DemarshalFunction df,
261 const QScriptValue &prototype);
262
263 friend inline void qScriptRegisterMetaType_helper(QScriptEngine *,
264 int, MarshalFunction, DemarshalFunction, const QScriptValue &);
265
266 friend inline QScriptValue qScriptValueFromValue_helper(QScriptEngine *, int, const void *);
267
268 friend inline bool qscriptvalue_cast_helper(const QScriptValue &, int, void *);
269
270protected:
271#ifdef QT_NO_QOBJECT
272 QScopedPointer<QScriptEnginePrivate> d_ptr;
273
274 QScriptEngine(QScriptEnginePrivate &dd);
275#else
276 QScriptEngine(QScriptEnginePrivate &dd, QObject *parent = 0);
277#endif
278
279private:
280 Q_DECLARE_PRIVATE(QScriptEngine)
281 Q_DISABLE_COPY(QScriptEngine)
282#ifndef QT_NO_QOBJECT
283 Q_PRIVATE_SLOT(d_func(), void _q_objectDestroyed(QObject *))
284#endif
285};
286
287#ifndef QT_NO_QOBJECT
288template <class T>
289inline QScriptValue qScriptValueFromQMetaObject(
290 QScriptEngine *engine
291#ifndef qdoc
292 , T * /* dummy */ = 0
293#endif
294 )
295{
296 typedef QScriptValue(*ConstructPtr)(QScriptContext *, QScriptEngine *, T *);
297 ConstructPtr cptr = qscriptQMetaObjectConstructor<T>;
298 return engine->newQMetaObject(&T::staticMetaObject,
299 engine->newFunction(reinterpret_cast<QScriptEngine::FunctionWithArgSignature>(cptr), 0));
300}
301
302#define Q_SCRIPT_DECLARE_QMETAOBJECT(T, _Arg1) \
303template<> inline QScriptValue qscriptQMetaObjectConstructor<T>(QScriptContext *ctx, QScriptEngine *eng, T *) \
304{ \
305 _Arg1 arg1 = qscriptvalue_cast<_Arg1> (ctx->argument(0)); \
306 T* t = new T(arg1); \
307 if (ctx->isCalledAsConstructor()) \
308 return eng->newQObject(ctx->thisObject(), t, QScriptEngine::AutoOwnership); \
309 QScriptValue o = eng->newQObject(t, QScriptEngine::AutoOwnership); \
310 o.setPrototype(ctx->callee().property(QString::fromLatin1("prototype"))); \
311 return o; \
312}
313
314# ifndef QT_NO_MEMBER_TEMPLATES
315 template <class T> QScriptValue QScriptEngine::scriptValueFromQMetaObject()
316 {
317 return qScriptValueFromQMetaObject<T>(this);
318 }
319# endif // QT_NO_MEMBER_TEMPLATES
320
321#endif // QT_NO_QOBJECT
322
323inline QScriptValue qScriptValueFromValue_helper(QScriptEngine *engine, int type, const void *ptr)
324{
325 if (!engine)
326 return QScriptValue();
327
328 return engine->create(type, ptr);
329}
330
331template <typename T>
332inline QScriptValue qScriptValueFromValue(QScriptEngine *engine, const T &t)
333{
334 return qScriptValueFromValue_helper(engine, qMetaTypeId<T>(), &t);
335}
336
337template <>
338inline QScriptValue qScriptValueFromValue<QVariant>(QScriptEngine *engine, const QVariant &v)
339{
340 QScriptValue result = qScriptValueFromValue_helper(engine, v.userType(), v.data());
341 if (!result.isValid())
342 result = engine->newVariant(v);
343 return result;
344}
345
346inline bool qscriptvalue_cast_helper(const QScriptValue &value, int type, void *ptr)
347{
348 return QScriptEngine::convertV2(value, type, ptr);
349}
350
351template<typename T>
352T qscriptvalue_cast(const QScriptValue &value
353#if !defined qdoc && defined Q_CC_MSVC && _MSC_VER < 1300
354, T * = 0
355#endif
356 )
357{
358 T t;
359 const int id = qMetaTypeId<T>();
360
361 if (qscriptvalue_cast_helper(value, id, &t))
362 return t;
363 else if (value.isVariant())
364 return qvariant_cast<T>(value.toVariant());
365
366 return T();
367}
368
369#if !defined Q_CC_MSVC || _MSC_VER >= 1300
370template <>
371inline QVariant qscriptvalue_cast<QVariant>(const QScriptValue &value)
372{
373 return value.toVariant();
374}
375#endif
376
377template <typename T>
378inline T qScriptValueToValue(const QScriptValue &value)
379{
380 return qscriptvalue_cast<T>(value);
381}
382
383inline void qScriptRegisterMetaType_helper(QScriptEngine *eng, int type,
384 QScriptEngine::MarshalFunction mf,
385 QScriptEngine::DemarshalFunction df,
386 const QScriptValue &prototype)
387{
388 eng->registerCustomType(type, mf, df, prototype);
389}
390
391template<typename T>
392int qScriptRegisterMetaType(
393 QScriptEngine *eng,
394 QScriptValue (*toScriptValue)(QScriptEngine *, const T &t),
395 void (*fromScriptValue)(const QScriptValue &, T &t),
396 const QScriptValue &prototype = QScriptValue()
397#ifndef qdoc
398 , T * /* dummy */ = 0
399#endif
400)
401{
402 const int id = qRegisterMetaType<T>(); // make sure it's registered
403
404 qScriptRegisterMetaType_helper(
405 eng, id, reinterpret_cast<QScriptEngine::MarshalFunction>(toScriptValue),
406 reinterpret_cast<QScriptEngine::DemarshalFunction>(fromScriptValue),
407 prototype);
408
409 return id;
410}
411
412template <class Container>
413QScriptValue qScriptValueFromSequence(QScriptEngine *eng, const Container &cont)
414{
415 QScriptValue a = eng->newArray();
416 typename Container::const_iterator begin = cont.begin();
417 typename Container::const_iterator end = cont.end();
418 typename Container::const_iterator it;
419 quint32 i;
420 for (it = begin, i = 0; it != end; ++it, ++i)
421 a.setProperty(i, qScriptValueFromValue(eng, *it));
422 return a;
423}
424
425template <class Container>
426void qScriptValueToSequence(const QScriptValue &value, Container &cont)
427{
428 quint32 len = value.property(QLatin1String("length")).toUInt32();
429 for (quint32 i = 0; i < len; ++i) {
430 QScriptValue item = value.property(i);
431#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
432 cont.push_back(qscriptvalue_cast<Container::value_type>(item));
433#else
434 cont.push_back(qscriptvalue_cast<typename Container::value_type>(item));
435#endif
436 }
437}
438
439template<typename T>
440int qScriptRegisterSequenceMetaType(
441 QScriptEngine *engine,
442 const QScriptValue &prototype = QScriptValue()
443#ifndef qdoc
444 , T * /* dummy */ = 0
445#endif
446)
447{
448 return qScriptRegisterMetaType<T>(engine, qScriptValueFromSequence,
449 qScriptValueToSequence, prototype);
450}
451
452#ifndef QT_NO_QOBJECT
453Q_SCRIPT_EXPORT bool qScriptConnect(QObject *sender, const char *signal,
454 const QScriptValue &receiver,
455 const QScriptValue &function);
456Q_SCRIPT_EXPORT bool qScriptDisconnect(QObject *sender, const char *signal,
457 const QScriptValue &receiver,
458 const QScriptValue &function);
459#endif // QT_NO_QOBJECT
460
461Q_DECLARE_OPERATORS_FOR_FLAGS(QScriptEngine::QObjectWrapOptions)
462
463QT_END_NAMESPACE
464
465QT_END_HEADER
466
467#endif // QSCRIPTENGINE_H
Note: See TracBrowser for help on using the repository browser.