17 #ifndef hifi_ScriptValue_h
18 #define hifi_ScriptValue_h
22 #include <QtCore/QObject>
23 #include <QtCore/QFlags>
24 #include <QtCore/QList>
25 #include <QtCore/QString>
26 #include <QtCore/QVariant>
27 #include <QtCore/QDebug>
29 #include "ScriptEngineLogging.h"
35 using ScriptEnginePointer = std::shared_ptr<ScriptEngine>;
36 using ScriptValueList = QList<ScriptValue>;
37 using ScriptValueIteratorPointer = std::shared_ptr<ScriptValueIterator>;
47 using ResolveFlags = QFlags<ResolveFlag>;
51 ReadOnly = 0x00000001,
52 Undeletable = 0x00000002,
53 SkipInEnumeration = 0x00000004,
54 PropertyGetter = 0x00000008,
55 PropertySetter = 0x00000010,
56 QObjectMember = 0x00000020,
57 KeepExistingFlags = 0x00000800,
59 Q_DECLARE_FLAGS(PropertyFlags, PropertyFlag);
72 const ScriptValueList& args = ScriptValueList())
const;
74 inline ScriptValue construct(
const ScriptValueList& args = ScriptValueList())
const;
77 inline ScriptEnginePointer engine()
const;
79 inline bool isArray()
const;
80 inline bool isBool()
const;
81 inline bool isError()
const;
82 inline bool isFunction()
const;
83 inline bool isNumber()
const;
84 inline bool isNull()
const;
85 inline bool isObject()
const;
86 inline bool isString()
const;
87 inline bool isUndefined()
const;
88 inline bool isValid()
const;
89 inline bool isVariant()
const;
90 inline ScriptValueIteratorPointer newIterator()
const;
91 inline ScriptValue property(
const QString& name,
const ResolveFlags& mode = ResolvePrototype)
const;
92 inline ScriptValue property(quint32 arrayIndex,
const ResolveFlags& mode = ResolvePrototype)
const;
95 inline bool hasProperty(
const QString &name)
const;
96 inline void setProperty(
const QString& name,
98 const PropertyFlags& flags = KeepExistingFlags);
99 inline void setProperty(quint32 arrayIndex,
101 const PropertyFlags& flags = KeepExistingFlags);
102 template <
typename TYP,
class ScriptEnginePo
inter = ScriptEnginePo
inter>
103 inline void setProperty(
const QString& name,
const TYP& value,
104 const PropertyFlags& flags = KeepExistingFlags);
105 template <
typename TYP,
class ScriptEnginePo
inter = ScriptEnginePo
inter>
106 inline void setProperty(quint32 arrayIndex,
const TYP& value,
107 const PropertyFlags& flags = KeepExistingFlags);
108 inline void setPrototype(
const ScriptValue& prototype);
109 inline bool strictlyEquals(
const ScriptValue& other)
const;
110 inline QList<QString> getPropertyNames()
const;
112 inline bool toBool()
const;
113 inline qint32 toInt32()
const;
114 inline double toInteger()
const;
115 inline double toNumber()
const;
116 inline QString toString()
const;
117 inline quint16 toUInt16()
const;
118 inline quint32 toUInt32()
const;
119 inline QVariant toVariant()
const;
120 inline QObject* toQObject()
const;
124 inline QString repr()
const;
129 Q_DECLARE_OPERATORS_FOR_FLAGS(ScriptValue::PropertyFlags);
134 virtual void enqueueRelease() = 0;
135 virtual void release() = 0;
140 const ScriptValueList& args = ScriptValueList()) = 0;
142 virtual ScriptValue construct(
const ScriptValueList& args = ScriptValueList()) = 0;
145 virtual ScriptEnginePointer engine()
const = 0;
146 virtual bool equals(
const ScriptValue& other)
const = 0;
147 virtual bool isArray()
const = 0;
148 virtual bool isBool()
const = 0;
149 virtual bool isError()
const = 0;
150 virtual bool isFunction()
const = 0;
151 virtual bool isNumber()
const = 0;
152 virtual bool isNull()
const = 0;
153 virtual bool isObject()
const = 0;
154 virtual bool isString()
const = 0;
155 virtual bool isUndefined()
const = 0;
156 virtual bool isValid()
const = 0;
157 virtual bool isVariant()
const = 0;
158 virtual ScriptValueIteratorPointer newIterator()
const = 0;
160 const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype)
const = 0;
162 const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype)
const = 0;
165 virtual bool hasProperty(
const QString &name)
const = 0;
166 virtual void setProperty(
const QString& name,
168 const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags) = 0;
169 virtual void setProperty(quint32 arrayIndex,
171 const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags) = 0;
172 virtual void setPrototype(
const ScriptValue& prototype) = 0;
173 virtual bool strictlyEquals(
const ScriptValue& other)
const = 0;
174 virtual QList<QString> getPropertyNames()
const = 0;
176 virtual bool toBool()
const = 0;
177 virtual qint32 toInt32()
const = 0;
178 virtual double toInteger()
const = 0;
179 virtual double toNumber()
const = 0;
180 virtual QString toString()
const = 0;
181 virtual quint16 toUInt16()
const = 0;
182 virtual quint32 toUInt32()
const = 0;
183 virtual QVariant toVariant()
const = 0;
184 virtual QObject* toQObject()
const = 0;
186 virtual QString repr()
const = 0;
193 template <
typename TYP,
class ScriptEnginePo
inter>
194 void ScriptValue::setProperty(
const QString& name,
const TYP& value,
const PropertyFlags& flags) {
195 setProperty(name,
static_cast<const ScriptEnginePointer&
>(engine())->newValue(value), flags);
199 template <
typename TYP,
class ScriptEnginePo
inter>
200 void ScriptValue::setProperty(quint32 arrayIndex,
const TYP& value,
const PropertyFlags& flags) {
201 setProperty(arrayIndex,
static_cast<const ScriptEnginePointer&
>(engine())->newValue(value), flags);
204 ScriptValue::ScriptValue(
const ScriptValue& src) : _proxy(src.ptr()->copy()) {
205 Q_ASSERT(_proxy !=
nullptr);
208 ScriptValue::~ScriptValue() {
209 Q_ASSERT(_proxy !=
nullptr);
210 _proxy->enqueueRelease();
214 Q_ASSERT(_proxy !=
nullptr);
215 _proxy->enqueueRelease();
216 _proxy = other.ptr()->copy();
221 Q_ASSERT(_proxy !=
nullptr);
222 ScriptEnginePointer scriptEngine = _proxy->engine();
223 if (scriptEngine ==
nullptr) {
224 qCDebug(scriptengine) <<
"Call to deleted or non-existing script engine";
227 return _proxy->call(thisObject, args);
231 Q_ASSERT(_proxy !=
nullptr);
232 return _proxy->call(thisObject, arguments);
235 ScriptValue ScriptValue::construct(
const ScriptValueList& args)
const {
236 Q_ASSERT(_proxy !=
nullptr);
237 return _proxy->construct(args);
241 Q_ASSERT(_proxy !=
nullptr);
242 return _proxy->construct(arguments);
246 Q_ASSERT(_proxy !=
nullptr);
247 return _proxy->data();
250 ScriptEnginePointer ScriptValue::engine()
const {
251 Q_ASSERT(_proxy !=
nullptr);
252 return _proxy->engine();
255 bool ScriptValue::equals(
const ScriptValue& other)
const {
256 Q_ASSERT(_proxy !=
nullptr);
257 return _proxy->equals(other);
260 bool ScriptValue::isArray()
const {
261 Q_ASSERT(_proxy !=
nullptr);
262 return _proxy->isArray();
265 bool ScriptValue::isBool()
const {
266 Q_ASSERT(_proxy !=
nullptr);
267 return _proxy->isBool();
270 bool ScriptValue::isError()
const {
271 Q_ASSERT(_proxy !=
nullptr);
272 return _proxy->isError();
275 bool ScriptValue::isFunction()
const {
276 Q_ASSERT(_proxy !=
nullptr);
277 return _proxy->isFunction();
280 bool ScriptValue::isNumber()
const {
281 Q_ASSERT(_proxy !=
nullptr);
282 return _proxy->isNumber();
285 bool ScriptValue::isNull()
const {
286 Q_ASSERT(_proxy !=
nullptr);
287 return _proxy->isNull();
290 bool ScriptValue::isObject()
const {
291 Q_ASSERT(_proxy !=
nullptr);
292 return _proxy->isObject();
295 bool ScriptValue::isString()
const {
296 Q_ASSERT(_proxy !=
nullptr);
297 return _proxy->isString();
300 bool ScriptValue::isUndefined()
const {
301 Q_ASSERT(_proxy !=
nullptr);
302 return _proxy->isUndefined();
305 bool ScriptValue::isValid()
const {
306 Q_ASSERT(_proxy !=
nullptr);
307 return _proxy->isValid();
310 bool ScriptValue::isVariant()
const {
311 Q_ASSERT(_proxy !=
nullptr);
312 return _proxy->isVariant();
315 ScriptValueIteratorPointer ScriptValue::newIterator()
const {
316 Q_ASSERT(_proxy !=
nullptr);
317 return _proxy->newIterator();
320 ScriptValue ScriptValue::property(
const QString& name,
const ResolveFlags& mode)
const {
321 Q_ASSERT(_proxy !=
nullptr);
322 return _proxy->property(name, mode);
325 ScriptValue ScriptValue::property(quint32 arrayIndex,
const ResolveFlags& mode)
const {
326 Q_ASSERT(_proxy !=
nullptr);
327 return _proxy->property(arrayIndex, mode);
331 Q_ASSERT(_proxy !=
nullptr);
332 return _proxy->prototype();
335 void ScriptValue::setData(
const ScriptValue& val) {
336 Q_ASSERT(_proxy !=
nullptr);
337 return _proxy->setData(val);
341 bool ScriptValue::hasProperty(
const QString& name)
const {
342 Q_ASSERT(_proxy !=
nullptr);
343 return _proxy->hasProperty(name);
346 void ScriptValue::setProperty(
const QString& name,
const ScriptValue& value,
const PropertyFlags& flags) {
347 Q_ASSERT(_proxy !=
nullptr);
348 return _proxy->setProperty(name, value, flags);
351 void ScriptValue::setProperty(quint32 arrayIndex,
const ScriptValue& value,
const PropertyFlags& flags) {
352 Q_ASSERT(_proxy !=
nullptr);
353 return _proxy->setProperty(arrayIndex, value, flags);
356 void ScriptValue::setPrototype(
const ScriptValue& prototype) {
357 Q_ASSERT(_proxy !=
nullptr);
358 return _proxy->setPrototype(prototype);
361 bool ScriptValue::strictlyEquals(
const ScriptValue& other)
const {
362 Q_ASSERT(_proxy !=
nullptr);
363 return _proxy->strictlyEquals(other);
366 inline QList<QString> ScriptValue::getPropertyNames()
const {
367 Q_ASSERT(_proxy !=
nullptr);
368 return _proxy->getPropertyNames();
371 bool ScriptValue::toBool()
const {
372 Q_ASSERT(_proxy !=
nullptr);
373 return _proxy->toBool();
376 qint32 ScriptValue::toInt32()
const {
377 Q_ASSERT(_proxy !=
nullptr);
378 return _proxy->toInt32();
381 double ScriptValue::toInteger()
const {
382 Q_ASSERT(_proxy !=
nullptr);
383 return _proxy->toInteger();
386 double ScriptValue::toNumber()
const {
387 Q_ASSERT(_proxy !=
nullptr);
388 return _proxy->toNumber();
391 QString ScriptValue::toString()
const {
392 Q_ASSERT(_proxy !=
nullptr);
393 return _proxy->toString();
396 quint16 ScriptValue::toUInt16()
const {
397 Q_ASSERT(_proxy !=
nullptr);
398 return _proxy->toUInt16();
401 quint32 ScriptValue::toUInt32()
const {
402 Q_ASSERT(_proxy !=
nullptr);
403 return _proxy->toUInt32();
406 QVariant ScriptValue::toVariant()
const {
407 Q_ASSERT(_proxy !=
nullptr);
408 return _proxy->toVariant();
411 QObject* ScriptValue::toQObject()
const {
412 Q_ASSERT(_proxy !=
nullptr);
413 return _proxy->toQObject();
416 QString ScriptValue::repr()
const {
417 Q_ASSERT(_proxy !=
nullptr);
418 return _proxy->repr();
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40
[ScriptInterface] Provides an engine-independent interface for QScriptValueIterator
Definition: ScriptValueIterator.h:30
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:132