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;
125 Q_DECLARE_OPERATORS_FOR_FLAGS(ScriptValue::PropertyFlags);
130 virtual void release() = 0;
135 const ScriptValueList& args = ScriptValueList()) = 0;
137 virtual ScriptValue construct(
const ScriptValueList& args = ScriptValueList()) = 0;
140 virtual ScriptEnginePointer engine()
const = 0;
141 virtual bool equals(
const ScriptValue& other)
const = 0;
142 virtual bool isArray()
const = 0;
143 virtual bool isBool()
const = 0;
144 virtual bool isError()
const = 0;
145 virtual bool isFunction()
const = 0;
146 virtual bool isNumber()
const = 0;
147 virtual bool isNull()
const = 0;
148 virtual bool isObject()
const = 0;
149 virtual bool isString()
const = 0;
150 virtual bool isUndefined()
const = 0;
151 virtual bool isValid()
const = 0;
152 virtual bool isVariant()
const = 0;
153 virtual ScriptValueIteratorPointer newIterator()
const = 0;
155 const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype)
const = 0;
157 const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype)
const = 0;
160 virtual bool hasProperty(
const QString &name)
const = 0;
161 virtual void setProperty(
const QString& name,
163 const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags) = 0;
164 virtual void setProperty(quint32 arrayIndex,
166 const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags) = 0;
167 virtual void setPrototype(
const ScriptValue& prototype) = 0;
168 virtual bool strictlyEquals(
const ScriptValue& other)
const = 0;
169 virtual QList<QString> getPropertyNames()
const = 0;
171 virtual bool toBool()
const = 0;
172 virtual qint32 toInt32()
const = 0;
173 virtual double toInteger()
const = 0;
174 virtual double toNumber()
const = 0;
175 virtual QString toString()
const = 0;
176 virtual quint16 toUInt16()
const = 0;
177 virtual quint32 toUInt32()
const = 0;
178 virtual QVariant toVariant()
const = 0;
179 virtual QObject* toQObject()
const = 0;
186 template <
typename TYP,
class ScriptEnginePo
inter>
187 void ScriptValue::setProperty(
const QString& name,
const TYP& value,
const PropertyFlags& flags) {
188 setProperty(name,
static_cast<const ScriptEnginePointer&
>(engine())->newValue(value), flags);
192 template <
typename TYP,
class ScriptEnginePo
inter>
193 void ScriptValue::setProperty(quint32 arrayIndex,
const TYP& value,
const PropertyFlags& flags) {
194 setProperty(arrayIndex,
static_cast<const ScriptEnginePointer&
>(engine())->newValue(value), flags);
197 ScriptValue::ScriptValue(
const ScriptValue& src) : _proxy(src.ptr()->copy()) {
198 Q_ASSERT(_proxy !=
nullptr);
201 ScriptValue::~ScriptValue() {
202 Q_ASSERT(_proxy !=
nullptr);
207 Q_ASSERT(_proxy !=
nullptr);
209 _proxy = other.ptr()->copy();
214 Q_ASSERT(_proxy !=
nullptr);
215 ScriptEnginePointer scriptEngine = _proxy->engine();
216 if (scriptEngine ==
nullptr) {
217 qCDebug(scriptengine) <<
"Call to deleted or non-existing script engine";
220 return _proxy->call(thisObject, args);
224 Q_ASSERT(_proxy !=
nullptr);
225 return _proxy->call(thisObject, arguments);
228 ScriptValue ScriptValue::construct(
const ScriptValueList& args)
const {
229 Q_ASSERT(_proxy !=
nullptr);
230 return _proxy->construct(args);
234 Q_ASSERT(_proxy !=
nullptr);
235 return _proxy->construct(arguments);
239 Q_ASSERT(_proxy !=
nullptr);
240 return _proxy->data();
243 ScriptEnginePointer ScriptValue::engine()
const {
244 Q_ASSERT(_proxy !=
nullptr);
245 return _proxy->engine();
248 bool ScriptValue::equals(
const ScriptValue& other)
const {
249 Q_ASSERT(_proxy !=
nullptr);
250 return _proxy->equals(other);
253 bool ScriptValue::isArray()
const {
254 Q_ASSERT(_proxy !=
nullptr);
255 return _proxy->isArray();
258 bool ScriptValue::isBool()
const {
259 Q_ASSERT(_proxy !=
nullptr);
260 return _proxy->isBool();
263 bool ScriptValue::isError()
const {
264 Q_ASSERT(_proxy !=
nullptr);
265 return _proxy->isError();
268 bool ScriptValue::isFunction()
const {
269 Q_ASSERT(_proxy !=
nullptr);
270 return _proxy->isFunction();
273 bool ScriptValue::isNumber()
const {
274 Q_ASSERT(_proxy !=
nullptr);
275 return _proxy->isNumber();
278 bool ScriptValue::isNull()
const {
279 Q_ASSERT(_proxy !=
nullptr);
280 return _proxy->isNull();
283 bool ScriptValue::isObject()
const {
284 Q_ASSERT(_proxy !=
nullptr);
285 return _proxy->isObject();
288 bool ScriptValue::isString()
const {
289 Q_ASSERT(_proxy !=
nullptr);
290 return _proxy->isString();
293 bool ScriptValue::isUndefined()
const {
294 Q_ASSERT(_proxy !=
nullptr);
295 return _proxy->isUndefined();
298 bool ScriptValue::isValid()
const {
299 Q_ASSERT(_proxy !=
nullptr);
300 return _proxy->isValid();
303 bool ScriptValue::isVariant()
const {
304 Q_ASSERT(_proxy !=
nullptr);
305 return _proxy->isVariant();
308 ScriptValueIteratorPointer ScriptValue::newIterator()
const {
309 Q_ASSERT(_proxy !=
nullptr);
310 return _proxy->newIterator();
313 ScriptValue ScriptValue::property(
const QString& name,
const ResolveFlags& mode)
const {
314 Q_ASSERT(_proxy !=
nullptr);
315 return _proxy->property(name, mode);
318 ScriptValue ScriptValue::property(quint32 arrayIndex,
const ResolveFlags& mode)
const {
319 Q_ASSERT(_proxy !=
nullptr);
320 return _proxy->property(arrayIndex, mode);
324 Q_ASSERT(_proxy !=
nullptr);
325 return _proxy->prototype();
328 void ScriptValue::setData(
const ScriptValue& val) {
329 Q_ASSERT(_proxy !=
nullptr);
330 return _proxy->setData(val);
334 bool ScriptValue::hasProperty(
const QString& name)
const {
335 Q_ASSERT(_proxy !=
nullptr);
336 return _proxy->hasProperty(name);
339 void ScriptValue::setProperty(
const QString& name,
const ScriptValue& value,
const PropertyFlags& flags) {
340 Q_ASSERT(_proxy !=
nullptr);
341 return _proxy->setProperty(name, value, flags);
344 void ScriptValue::setProperty(quint32 arrayIndex,
const ScriptValue& value,
const PropertyFlags& flags) {
345 Q_ASSERT(_proxy !=
nullptr);
346 return _proxy->setProperty(arrayIndex, value, flags);
349 void ScriptValue::setPrototype(
const ScriptValue& prototype) {
350 Q_ASSERT(_proxy !=
nullptr);
351 return _proxy->setPrototype(prototype);
354 bool ScriptValue::strictlyEquals(
const ScriptValue& other)
const {
355 Q_ASSERT(_proxy !=
nullptr);
356 return _proxy->strictlyEquals(other);
359 inline QList<QString> ScriptValue::getPropertyNames()
const {
360 Q_ASSERT(_proxy !=
nullptr);
361 return _proxy->getPropertyNames();
364 bool ScriptValue::toBool()
const {
365 Q_ASSERT(_proxy !=
nullptr);
366 return _proxy->toBool();
369 qint32 ScriptValue::toInt32()
const {
370 Q_ASSERT(_proxy !=
nullptr);
371 return _proxy->toInt32();
374 double ScriptValue::toInteger()
const {
375 Q_ASSERT(_proxy !=
nullptr);
376 return _proxy->toInteger();
379 double ScriptValue::toNumber()
const {
380 Q_ASSERT(_proxy !=
nullptr);
381 return _proxy->toNumber();
384 QString ScriptValue::toString()
const {
385 Q_ASSERT(_proxy !=
nullptr);
386 return _proxy->toString();
389 quint16 ScriptValue::toUInt16()
const {
390 Q_ASSERT(_proxy !=
nullptr);
391 return _proxy->toUInt16();
394 quint32 ScriptValue::toUInt32()
const {
395 Q_ASSERT(_proxy !=
nullptr);
396 return _proxy->toUInt32();
399 QVariant ScriptValue::toVariant()
const {
400 Q_ASSERT(_proxy !=
nullptr);
401 return _proxy->toVariant();
404 QObject* ScriptValue::toQObject()
const {
405 Q_ASSERT(_proxy !=
nullptr);
406 return _proxy->toQObject();
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:128