source: branches/4.5.1/src/scripttools/debugging/qscriptdebuggervalue.cpp@ 559

Last change on this file since 559 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 11.0 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the QtSCriptTools module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qscriptdebuggervalue_p.h"
43
44#include <QtScript/qscriptvalue.h>
45#include <QtScript/qscriptengine.h>
46#include <QtCore/qdatastream.h>
47#include <QtCore/qdebug.h>
48
49QT_BEGIN_NAMESPACE
50
51/*!
52 \since 4.5
53 \class QScriptDebuggerValue
54 \internal
55
56 \brief The QScriptDebuggerValue class represents a script value.
57*/
58
59class QScriptDebuggerValuePrivate
60{
61public:
62 QScriptDebuggerValuePrivate();
63 ~QScriptDebuggerValuePrivate();
64
65 QScriptDebuggerValue::ValueType type;
66 union {
67 bool booleanValue;
68 QString *stringValue;
69 double numberValue;
70 qint64 objectId;
71 };
72
73 QBasicAtomicInt ref;
74};
75
76QScriptDebuggerValuePrivate::QScriptDebuggerValuePrivate()
77 : type(QScriptDebuggerValue::NoValue)
78{
79 ref = 0;
80}
81
82QScriptDebuggerValuePrivate::~QScriptDebuggerValuePrivate()
83{
84 if (type == QScriptDebuggerValue::StringValue)
85 delete stringValue;
86}
87
88QScriptDebuggerValue::QScriptDebuggerValue()
89 : d_ptr(0)
90{
91}
92
93QScriptDebuggerValue::QScriptDebuggerValue(const QScriptValue &value)
94 : d_ptr(0)
95{
96 if (value.isValid()) {
97 d_ptr = new QScriptDebuggerValuePrivate;
98 if (value.isUndefined())
99 d_ptr->type = UndefinedValue;
100 else if (value.isNull())
101 d_ptr->type = NullValue;
102 else if (value.isNumber()) {
103 d_ptr->type = NumberValue;
104 d_ptr->numberValue = value.toNumber();
105 } else if (value.isBoolean()) {
106 d_ptr->type = BooleanValue;
107 d_ptr->booleanValue = value.toBoolean();
108 } else if (value.isString()) {
109 d_ptr->type = StringValue;
110 d_ptr->stringValue = new QString(value.toString());
111 } else {
112 Q_ASSERT(value.isObject());
113 d_ptr->type = ObjectValue;
114 d_ptr->objectId = value.objectId();
115 }
116 d_ptr->ref.ref();
117 }
118}
119
120QScriptDebuggerValue::QScriptDebuggerValue(double value)
121 : d_ptr(new QScriptDebuggerValuePrivate)
122{
123 d_ptr->type = NumberValue;
124 d_ptr->numberValue = value;
125 d_ptr->ref.ref();
126}
127
128QScriptDebuggerValue::QScriptDebuggerValue(bool value)
129 : d_ptr(new QScriptDebuggerValuePrivate)
130{
131 d_ptr->type = BooleanValue;
132 d_ptr->booleanValue = value;
133 d_ptr->ref.ref();
134}
135
136QScriptDebuggerValue::QScriptDebuggerValue(const QString &value)
137 : d_ptr(new QScriptDebuggerValuePrivate)
138{
139 d_ptr->type = StringValue;
140 d_ptr->stringValue = new QString(value);
141 d_ptr->ref.ref();
142}
143
144QScriptDebuggerValue::QScriptDebuggerValue(qint64 objectId)
145 : d_ptr(new QScriptDebuggerValuePrivate)
146{
147 d_ptr->type = ObjectValue;
148 d_ptr->objectId = objectId;
149 d_ptr->ref.ref();
150}
151
152QScriptDebuggerValue::QScriptDebuggerValue(ValueType type)
153 : d_ptr(new QScriptDebuggerValuePrivate)
154{
155 d_ptr->type = type;
156 d_ptr->ref.ref();
157}
158
159QScriptDebuggerValue::QScriptDebuggerValue(const QScriptDebuggerValue &other)
160 : d_ptr(other.d_ptr)
161{
162 if (d_ptr)
163 d_ptr->ref.ref();
164}
165
166QScriptDebuggerValue::~QScriptDebuggerValue()
167{
168 if (d_ptr && !d_ptr->ref.deref()) {
169 delete d_ptr;
170 d_ptr = 0;
171 }
172}
173
174QScriptDebuggerValue &QScriptDebuggerValue::operator=(const QScriptDebuggerValue &other)
175{
176 if (d_ptr == other.d_ptr)
177 return *this;
178 if (d_ptr && !d_ptr->ref.deref())
179 delete d_ptr;
180 d_ptr = other.d_ptr;
181 if (d_ptr)
182 d_ptr->ref.ref();
183 return *this;
184}
185
186/*!
187 Returns the type of this value.
188*/
189QScriptDebuggerValue::ValueType QScriptDebuggerValue::type() const
190{
191 Q_D(const QScriptDebuggerValue);
192 if (!d)
193 return NoValue;
194 return d->type;
195}
196
197/*!
198 Returns this value as a number.
199*/
200double QScriptDebuggerValue::numberValue() const
201{
202 Q_D(const QScriptDebuggerValue);
203 if (!d)
204 return 0;
205 Q_ASSERT(d->type == NumberValue);
206 return d->numberValue;
207}
208
209/*!
210 Returns this value as a boolean.
211*/
212bool QScriptDebuggerValue::booleanValue() const
213{
214 Q_D(const QScriptDebuggerValue);
215 if (!d)
216 return false;
217 Q_ASSERT(d->type == BooleanValue);
218 return d->booleanValue;
219}
220
221/*!
222 Returns this value as a string.
223*/
224QString QScriptDebuggerValue::stringValue() const
225{
226 Q_D(const QScriptDebuggerValue);
227 if (!d)
228 return QString();
229 Q_ASSERT(d->type == StringValue);
230 return *d->stringValue;
231}
232
233/*!
234 Returns this value as an object ID.
235*/
236qint64 QScriptDebuggerValue::objectId() const
237{
238 Q_D(const QScriptDebuggerValue);
239 if (!d)
240 return -1;
241 Q_ASSERT(d->type == ObjectValue);
242 return d->objectId;
243}
244
245/*!
246 Converts this QScriptDebuggerValue to a QScriptValue in the
247 given \a engine and returns the resulting value.
248*/
249QScriptValue QScriptDebuggerValue::toScriptValue(QScriptEngine *engine) const
250{
251 Q_D(const QScriptDebuggerValue);
252 if (!d)
253 return QScriptValue();
254 switch (d->type) {
255 case NoValue:
256 return QScriptValue();
257 case UndefinedValue:
258 return engine->undefinedValue();
259 case NullValue:
260 return engine->nullValue();
261 case BooleanValue:
262 return QScriptValue(engine, d->booleanValue);
263 case StringValue:
264 return QScriptValue(engine, *d->stringValue);
265 case NumberValue:
266 return QScriptValue(engine, d->numberValue);
267 case ObjectValue:
268 return engine->objectById(d->objectId);
269 }
270 return QScriptValue();
271}
272
273/*!
274 Returns a string representation of this value.
275*/
276QString QScriptDebuggerValue::toString() const
277{
278 Q_D(const QScriptDebuggerValue);
279 if (!d)
280 return QString();
281 switch (d->type) {
282 case NoValue:
283 return QString();
284 case UndefinedValue:
285 return QString::fromLatin1("undefined");
286 case NullValue:
287 return QString::fromLatin1("null");
288 case BooleanValue:
289 if (d->booleanValue)
290 return QString::fromLatin1("true");
291 else
292 return QString::fromLatin1("false");
293 case StringValue:
294 return *d->stringValue;
295 case NumberValue:
296 return QString::number(d->numberValue); // ### qScriptNumberToString()
297 case ObjectValue:
298 return QString::fromLatin1("[object Object]");
299 }
300 return QString();
301}
302
303/*!
304 Returns true if this QScriptDebuggerValue is equal to the \a other
305 value, otherwise returns false.
306*/
307bool QScriptDebuggerValue::operator==(const QScriptDebuggerValue &other) const
308{
309 Q_D(const QScriptDebuggerValue);
310 const QScriptDebuggerValuePrivate *od = other.d_func();
311 if (d == od)
312 return true;
313 if (!d || !od)
314 return false;
315 if (d->type != od->type)
316 return false;
317 switch (d->type) {
318 case NoValue:
319 case UndefinedValue:
320 case NullValue:
321 return true;
322 case BooleanValue:
323 return d->booleanValue == od->booleanValue;
324 case StringValue:
325 return *d->stringValue == *od->stringValue;
326 case NumberValue:
327 return d->numberValue == od->numberValue;
328 case ObjectValue:
329 return d->objectId == od->objectId;
330 }
331 return false;
332}
333
334/*!
335 Returns true if this QScriptDebuggerValue is not equal to the \a
336 other value, otherwise returns false.
337*/
338bool QScriptDebuggerValue::operator!=(const QScriptDebuggerValue &other) const
339{
340 return !(*this == other);
341}
342
343/*!
344 \fn QDataStream &operator<<(QDataStream &stream, const QScriptDebuggerValue &value)
345 \relates QScriptDebuggerValue
346
347 Writes the given \a value to the specified \a stream.
348*/
349QDataStream &operator<<(QDataStream &out, const QScriptDebuggerValue &value)
350{
351 out << (quint32)value.type();
352 switch (value.type()) {
353 case QScriptDebuggerValue::NoValue:
354 case QScriptDebuggerValue::UndefinedValue:
355 case QScriptDebuggerValue::NullValue:
356 break;
357 case QScriptDebuggerValue::BooleanValue:
358 out << value.booleanValue();
359 break;
360 case QScriptDebuggerValue::StringValue:
361 out << value.stringValue();
362 break;
363 case QScriptDebuggerValue::NumberValue:
364 out << value.numberValue();
365 break;
366 case QScriptDebuggerValue::ObjectValue:
367 out << value.objectId();
368 break;
369 }
370 return out;
371}
372
373/*!
374 \fn QDataStream &operator>>(QDataStream &stream, QScriptDebuggerValue &value)
375 \relates QScriptDebuggerValue
376
377 Reads a QScriptDebuggerValue from the specified \a stream into the
378 given \a value.
379*/
380QDataStream &operator>>(QDataStream &in, QScriptDebuggerValue &value)
381{
382 quint32 type;
383 in >> type;
384 switch (QScriptDebuggerValue::ValueType(type)) {
385 case QScriptDebuggerValue::UndefinedValue:
386 case QScriptDebuggerValue::NullValue:
387 value = QScriptDebuggerValue(QScriptDebuggerValue::ValueType(type));
388 break;
389 case QScriptDebuggerValue::BooleanValue: {
390 bool b;
391 in >> b;
392 value = QScriptDebuggerValue(b);
393 } break;
394 case QScriptDebuggerValue::StringValue: {
395 QString s;
396 in >> s;
397 value = QScriptDebuggerValue(s);
398 } break;
399 case QScriptDebuggerValue::NumberValue: {
400 double d;
401 in >> d;
402 value = QScriptDebuggerValue(d);
403 } break;
404 case QScriptDebuggerValue::ObjectValue: {
405 qint64 id;
406 in >> id;
407 value = QScriptDebuggerValue(id);
408 } break;
409 case QScriptDebuggerValue::NoValue:
410 default:
411 value = QScriptDebuggerValue();
412 break;
413 }
414 return in;
415}
416
417QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.