History

rework ScriptValue to act like a stack variable rather than a pointer

Heather Anderson committed 5 years ago

Commit 85810221 parent f209c51170 files · +2837 −2594Browse files

Showing the changes to libraries/script-engine/src/ScriptValue.cpp (1 of 170 files). Show all

Unified · Split

libraries/script-engine/src/ScriptValue.cpp+236−0
@@ -0,0 +1,236 @@
1//
2// ScriptValue.cpp
3// libraries/script-engine/src
4//
5// Created by Heather Anderson on 9/2/21.
6// Copyright 2021 Vircadia contributors.
7//
8// Distributed under the Apache License, Version 2.0.
9// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10//
11
12#include "ScriptValue.h"
13
14#include "ScriptEngineLogging.h"
15
16
17class ScriptValueProxyNull : public ScriptValueProxy {
18public:
19 virtual void release();
20 virtual ScriptValueProxy* copy() const;
21
22public:
23 virtual ScriptValue call(const ScriptValue& thisObject = ScriptValue(), const ScriptValueList& args = ScriptValueList());
24 virtual ScriptValue call(const ScriptValue& thisObject, const ScriptValue& arguments);
25 virtual ScriptValue construct(const ScriptValueList& args = ScriptValueList());
26 virtual ScriptValue construct(const ScriptValue& arguments);
27 virtual ScriptValue data() const;
28 virtual ScriptEnginePointer engine() const;
29 virtual bool equals(const ScriptValue& other) const;
30 virtual bool isArray() const;
31 virtual bool isBool() const;
32 virtual bool isError() const;
33 virtual bool isFunction() const;
34 virtual bool isNumber() const;
35 virtual bool isNull() const;
36 virtual bool isObject() const;
37 virtual bool isString() const;
38 virtual bool isUndefined() const;
39 virtual bool isValid() const;
40 virtual bool isVariant() const;
41 virtual ScriptValueIteratorPointer newIterator() const;
42 virtual ScriptValue property(const QString& name,
43 const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype) const;
44 virtual ScriptValue property(quint32 arrayIndex,
45 const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype) const;
46 virtual void setData(const ScriptValue& val);
47 virtual void setProperty(const QString& name,
48 const ScriptValue& value,
49 const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags);
50 virtual void setProperty(quint32 arrayIndex,
51 const ScriptValue& value,
52 const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags);
53 virtual void setPrototype(const ScriptValue& prototype);
54 virtual bool strictlyEquals(const ScriptValue& other) const;
55
56 virtual bool toBool() const;
57 virtual qint32 toInt32() const;
58 virtual double toInteger() const;
59 virtual double toNumber() const;
60 virtual QString toString() const;
61 virtual quint16 toUInt16() const;
62 virtual quint32 toUInt32() const;
63 virtual QVariant toVariant() const;
64 virtual QObject* toQObject() const;
65};
66
67static ScriptValueProxyNull SCRIPT_VALUE_NULL;
68
69ScriptValue::ScriptValue() : _proxy(&SCRIPT_VALUE_NULL) {}
70
71void ScriptValueProxyNull::release() {
72 // do nothing, we're a singlet
73}
74
75ScriptValueProxy* ScriptValueProxyNull::copy() const {
76 // return ourselves, we're a singlet
77 return const_cast <ScriptValueProxyNull*>(this);
78}
79
80ScriptValue ScriptValueProxyNull::call(const ScriptValue& thisObject, const ScriptValueList& args) {
81 Q_ASSERT(false);
82 qCWarning(scriptengine_script, "ScriptValue::call made to empty value");
83 return ScriptValue();
84}
85
86ScriptValue ScriptValueProxyNull::call(const ScriptValue& thisObject, const ScriptValue& arguments) {
87 Q_ASSERT(false);
88 qCWarning(scriptengine_script, "ScriptValue::call made to empty value");
89 return ScriptValue();
90}
91
92ScriptValue ScriptValueProxyNull::construct(const ScriptValueList& args) {
93 Q_ASSERT(false);
94 qCWarning(scriptengine_script, "ScriptValue::construct called on empty value");
95 return ScriptValue();
96}
97
98ScriptValue ScriptValueProxyNull::construct(const ScriptValue& arguments) {
99 Q_ASSERT(false);
100 qCWarning(scriptengine_script, "ScriptValue::construct called on empty value");
101 return ScriptValue();
102}
103
104ScriptValue ScriptValueProxyNull::data() const {
105 return ScriptValue();
106}
107
108ScriptEnginePointer ScriptValueProxyNull::engine() const {
109 Q_ASSERT(false);
110 qCWarning(scriptengine_script, "ScriptValue::engine called on empty value");
111 return ScriptEnginePointer();
112}
113
114bool ScriptValueProxyNull::equals(const ScriptValue& other) const {
115 return other.isUndefined();
116}
117
118bool ScriptValueProxyNull::isArray() const {
119 return false;
120}
121
122bool ScriptValueProxyNull::isBool() const {
123 return false;
124}
125
126bool ScriptValueProxyNull::isError() const {
127 return false;
128}
129
130bool ScriptValueProxyNull::isFunction() const {
131 return false;
132}
133
134bool ScriptValueProxyNull::isNumber() const {
135 return false;
136}
137
138bool ScriptValueProxyNull::isNull() const {
139 return false;
140}
141
142bool ScriptValueProxyNull::isObject() const {
143 return false;
144}
145
146bool ScriptValueProxyNull::isString() const {
147 return false;
148}
149
150bool ScriptValueProxyNull::isUndefined() const {
151 return true;
152}
153
154bool ScriptValueProxyNull::isValid() const {
155 return false;
156}
157
158bool ScriptValueProxyNull::isVariant() const {
159 return false;
160}
161
162ScriptValueIteratorPointer ScriptValueProxyNull::newIterator() const {
163 Q_ASSERT(false);
164 qCWarning(scriptengine_script, "ScriptValue::newIterator called on empty value");
165 return ScriptValueIteratorPointer();
166}
167
168ScriptValue ScriptValueProxyNull::property(const QString& name, const ScriptValue::ResolveFlags& mode) const {
169 return ScriptValue();
170}
171
172ScriptValue ScriptValueProxyNull::property(quint32 arrayIndex, const ScriptValue::ResolveFlags& mode) const {
173 return ScriptValue();
174}
175
176void ScriptValueProxyNull::setData(const ScriptValue& val) {
177 Q_ASSERT(false);
178 qCWarning(scriptengine_script, "ScriptValue::setData called on empty value");
179}
180
181void ScriptValueProxyNull::setProperty(const QString& name,
182 const ScriptValue& value, const ScriptValue::PropertyFlags& flags) {
183 Q_ASSERT(false);
184 qCWarning(scriptengine_script, "ScriptValue::setProperty called on empty value");
185}
186
187void ScriptValueProxyNull::setProperty(quint32 arrayIndex,
188 const ScriptValue& value, const ScriptValue::PropertyFlags& flags) {
189 Q_ASSERT(false);
190 qCWarning(scriptengine_script, "ScriptValue::setProperty called on empty value");
191}
192
193void ScriptValueProxyNull::setPrototype(const ScriptValue& prototype) {
194 Q_ASSERT(false);
195 qCWarning(scriptengine_script, "ScriptValue::setPrototype called on empty value");
196}
197
198bool ScriptValueProxyNull::strictlyEquals(const ScriptValue& other) const {
199 return !other.isValid();
200}
201
202bool ScriptValueProxyNull::toBool() const {
203 return false;
204}
205
206qint32 ScriptValueProxyNull::toInt32() const {
207 return 0;
208}
209
210double ScriptValueProxyNull::toInteger() const {
211 return 0;
212}
213
214double ScriptValueProxyNull::toNumber() const {
215 return 0;
216}
217
218QString ScriptValueProxyNull::toString() const {
219 return QString();
220}
221
222quint16 ScriptValueProxyNull::toUInt16() const {
223 return 0;
224}
225
226quint32 ScriptValueProxyNull::toUInt32() const {
227 return 0;
228}
229
230QVariant ScriptValueProxyNull::toVariant() const {
231 return QVariant();
232}
233
234QObject* ScriptValueProxyNull::toQObject() const {
235 return nullptr;
236}