/****************************************************************************+ −
**+ −
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).+ −
** All rights reserved.+ −
** Contact: Nokia Corporation (qt-info@nokia.com)+ −
**+ −
** This file is part of the QtSCriptTools module of the Qt Toolkit.+ −
**+ −
** $QT_BEGIN_LICENSE:LGPL$+ −
** No Commercial Usage+ −
** This file contains pre-release code and may not be distributed.+ −
** You may use this file in accordance with the terms and conditions+ −
** contained in the Technology Preview License Agreement accompanying+ −
** this package.+ −
**+ −
** GNU Lesser General Public License Usage+ −
** Alternatively, this file may be used under the terms of the GNU Lesser+ −
** General Public License version 2.1 as published by the Free Software+ −
** Foundation and appearing in the file LICENSE.LGPL included in the+ −
** packaging of this file. Please review the following information to+ −
** ensure the GNU Lesser General Public License version 2.1 requirements+ −
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.+ −
**+ −
** In addition, as a special exception, Nokia gives you certain additional+ −
** rights. These rights are described in the Nokia Qt LGPL Exception+ −
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.+ −
**+ −
** If you have questions regarding the use of this file, please contact+ −
** Nokia at qt-info@nokia.com.+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
** $QT_END_LICENSE$+ −
**+ −
****************************************************************************/+ −
+ −
#include "qscriptdebuggervalue_p.h"+ −
+ −
#include <QtScript/qscriptvalue.h>+ −
#include <QtScript/qscriptengine.h>+ −
#include <QtCore/qdatastream.h>+ −
#include <QtCore/qdebug.h>+ −
+ −
QT_BEGIN_NAMESPACE+ −
+ −
/*!+ −
\since 4.5+ −
\class QScriptDebuggerValue+ −
\internal+ −
+ −
\brief The QScriptDebuggerValue class represents a script value.+ −
*/+ −
+ −
class QScriptDebuggerValuePrivate+ −
{+ −
public:+ −
QScriptDebuggerValuePrivate();+ −
~QScriptDebuggerValuePrivate();+ −
+ −
QScriptDebuggerValue::ValueType type;+ −
union {+ −
bool booleanValue;+ −
QString *stringValue;+ −
double numberValue;+ −
qint64 objectId;+ −
};+ −
+ −
QBasicAtomicInt ref;+ −
};+ −
+ −
QScriptDebuggerValuePrivate::QScriptDebuggerValuePrivate()+ −
: type(QScriptDebuggerValue::NoValue)+ −
{+ −
ref = 0;+ −
}+ −
+ −
QScriptDebuggerValuePrivate::~QScriptDebuggerValuePrivate()+ −
{+ −
if (type == QScriptDebuggerValue::StringValue)+ −
delete stringValue;+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue()+ −
: d_ptr(0)+ −
{+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue(const QScriptValue &value)+ −
: d_ptr(0)+ −
{+ −
if (value.isValid()) {+ −
d_ptr.reset(new QScriptDebuggerValuePrivate);+ −
if (value.isUndefined())+ −
d_ptr->type = UndefinedValue;+ −
else if (value.isNull())+ −
d_ptr->type = NullValue;+ −
else if (value.isNumber()) {+ −
d_ptr->type = NumberValue;+ −
d_ptr->numberValue = value.toNumber();+ −
} else if (value.isBoolean()) {+ −
d_ptr->type = BooleanValue;+ −
d_ptr->booleanValue = value.toBoolean();+ −
} else if (value.isString()) {+ −
d_ptr->type = StringValue;+ −
d_ptr->stringValue = new QString(value.toString());+ −
} else {+ −
Q_ASSERT(value.isObject());+ −
d_ptr->type = ObjectValue;+ −
d_ptr->objectId = value.objectId();+ −
}+ −
d_ptr->ref.ref();+ −
}+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue(double value)+ −
: d_ptr(new QScriptDebuggerValuePrivate)+ −
{+ −
d_ptr->type = NumberValue;+ −
d_ptr->numberValue = value;+ −
d_ptr->ref.ref();+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue(bool value)+ −
: d_ptr(new QScriptDebuggerValuePrivate)+ −
{+ −
d_ptr->type = BooleanValue;+ −
d_ptr->booleanValue = value;+ −
d_ptr->ref.ref();+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue(const QString &value)+ −
: d_ptr(new QScriptDebuggerValuePrivate)+ −
{+ −
d_ptr->type = StringValue;+ −
d_ptr->stringValue = new QString(value);+ −
d_ptr->ref.ref();+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue(qint64 objectId)+ −
: d_ptr(new QScriptDebuggerValuePrivate)+ −
{+ −
d_ptr->type = ObjectValue;+ −
d_ptr->objectId = objectId;+ −
d_ptr->ref.ref();+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue(ValueType type)+ −
: d_ptr(new QScriptDebuggerValuePrivate)+ −
{+ −
d_ptr->type = type;+ −
d_ptr->ref.ref();+ −
}+ −
+ −
QScriptDebuggerValue::QScriptDebuggerValue(const QScriptDebuggerValue &other)+ −
: d_ptr(other.d_ptr.data())+ −
{+ −
if (d_ptr)+ −
d_ptr->ref.ref();+ −
}+ −
+ −
QScriptDebuggerValue::~QScriptDebuggerValue()+ −
{+ −
}+ −
+ −
QScriptDebuggerValue &QScriptDebuggerValue::operator=(const QScriptDebuggerValue &other)+ −
{+ −
d_ptr.assign(other.d_ptr.data());+ −
return *this;+ −
}+ −
+ −
/*!+ −
Returns the type of this value.+ −
*/+ −
QScriptDebuggerValue::ValueType QScriptDebuggerValue::type() const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
if (!d)+ −
return NoValue;+ −
return d->type;+ −
}+ −
+ −
/*!+ −
Returns this value as a number.+ −
*/+ −
double QScriptDebuggerValue::numberValue() const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
if (!d)+ −
return 0;+ −
Q_ASSERT(d->type == NumberValue);+ −
return d->numberValue;+ −
}+ −
+ −
/*!+ −
Returns this value as a boolean.+ −
*/+ −
bool QScriptDebuggerValue::booleanValue() const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
if (!d)+ −
return false;+ −
Q_ASSERT(d->type == BooleanValue);+ −
return d->booleanValue;+ −
}+ −
+ −
/*!+ −
Returns this value as a string.+ −
*/+ −
QString QScriptDebuggerValue::stringValue() const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
if (!d)+ −
return QString();+ −
Q_ASSERT(d->type == StringValue);+ −
return *d->stringValue;+ −
}+ −
+ −
/*!+ −
Returns this value as an object ID.+ −
*/+ −
qint64 QScriptDebuggerValue::objectId() const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
if (!d)+ −
return -1;+ −
Q_ASSERT(d->type == ObjectValue);+ −
return d->objectId;+ −
}+ −
+ −
/*!+ −
Converts this QScriptDebuggerValue to a QScriptValue in the+ −
given \a engine and returns the resulting value.+ −
*/+ −
QScriptValue QScriptDebuggerValue::toScriptValue(QScriptEngine *engine) const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
if (!d)+ −
return QScriptValue();+ −
switch (d->type) {+ −
case NoValue:+ −
return QScriptValue();+ −
case UndefinedValue:+ −
return engine->undefinedValue();+ −
case NullValue:+ −
return engine->nullValue();+ −
case BooleanValue:+ −
return QScriptValue(engine, d->booleanValue);+ −
case StringValue:+ −
return QScriptValue(engine, *d->stringValue);+ −
case NumberValue:+ −
return QScriptValue(engine, d->numberValue);+ −
case ObjectValue:+ −
return engine->objectById(d->objectId);+ −
}+ −
return QScriptValue();+ −
}+ −
+ −
/*!+ −
Returns a string representation of this value.+ −
*/+ −
QString QScriptDebuggerValue::toString() const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
if (!d)+ −
return QString();+ −
switch (d->type) {+ −
case NoValue:+ −
return QString();+ −
case UndefinedValue:+ −
return QString::fromLatin1("undefined");+ −
case NullValue:+ −
return QString::fromLatin1("null");+ −
case BooleanValue:+ −
if (d->booleanValue)+ −
return QString::fromLatin1("true");+ −
else+ −
return QString::fromLatin1("false");+ −
case StringValue:+ −
return *d->stringValue;+ −
case NumberValue:+ −
return QString::number(d->numberValue); // ### qScriptNumberToString()+ −
case ObjectValue:+ −
return QString::fromLatin1("[object Object]");+ −
}+ −
return QString();+ −
}+ −
+ −
/*!+ −
Returns true if this QScriptDebuggerValue is equal to the \a other+ −
value, otherwise returns false.+ −
*/+ −
bool QScriptDebuggerValue::operator==(const QScriptDebuggerValue &other) const+ −
{+ −
Q_D(const QScriptDebuggerValue);+ −
const QScriptDebuggerValuePrivate *od = other.d_func();+ −
if (d == od)+ −
return true;+ −
if (!d || !od)+ −
return false;+ −
if (d->type != od->type)+ −
return false;+ −
switch (d->type) {+ −
case NoValue:+ −
case UndefinedValue:+ −
case NullValue:+ −
return true;+ −
case BooleanValue:+ −
return d->booleanValue == od->booleanValue;+ −
case StringValue:+ −
return *d->stringValue == *od->stringValue;+ −
case NumberValue:+ −
return d->numberValue == od->numberValue;+ −
case ObjectValue:+ −
return d->objectId == od->objectId;+ −
}+ −
return false;+ −
}+ −
+ −
/*!+ −
Returns true if this QScriptDebuggerValue is not equal to the \a+ −
other value, otherwise returns false.+ −
*/+ −
bool QScriptDebuggerValue::operator!=(const QScriptDebuggerValue &other) const+ −
{+ −
return !(*this == other);+ −
}+ −
+ −
/*!+ −
\fn QDataStream &operator<<(QDataStream &stream, const QScriptDebuggerValue &value)+ −
\relates QScriptDebuggerValue+ −
+ −
Writes the given \a value to the specified \a stream.+ −
*/+ −
QDataStream &operator<<(QDataStream &out, const QScriptDebuggerValue &value)+ −
{+ −
out << (quint32)value.type();+ −
switch (value.type()) {+ −
case QScriptDebuggerValue::NoValue:+ −
case QScriptDebuggerValue::UndefinedValue:+ −
case QScriptDebuggerValue::NullValue:+ −
break;+ −
case QScriptDebuggerValue::BooleanValue:+ −
out << value.booleanValue();+ −
break;+ −
case QScriptDebuggerValue::StringValue:+ −
out << value.stringValue();+ −
break;+ −
case QScriptDebuggerValue::NumberValue:+ −
out << value.numberValue();+ −
break;+ −
case QScriptDebuggerValue::ObjectValue:+ −
out << value.objectId();+ −
break;+ −
}+ −
return out;+ −
}+ −
+ −
/*!+ −
\fn QDataStream &operator>>(QDataStream &stream, QScriptDebuggerValue &value)+ −
\relates QScriptDebuggerValue+ −
+ −
Reads a QScriptDebuggerValue from the specified \a stream into the+ −
given \a value.+ −
*/+ −
QDataStream &operator>>(QDataStream &in, QScriptDebuggerValue &value)+ −
{+ −
quint32 type;+ −
in >> type;+ −
switch (QScriptDebuggerValue::ValueType(type)) {+ −
case QScriptDebuggerValue::UndefinedValue:+ −
case QScriptDebuggerValue::NullValue:+ −
value = QScriptDebuggerValue(QScriptDebuggerValue::ValueType(type));+ −
break;+ −
case QScriptDebuggerValue::BooleanValue: {+ −
bool b;+ −
in >> b;+ −
value = QScriptDebuggerValue(b);+ −
} break;+ −
case QScriptDebuggerValue::StringValue: {+ −
QString s;+ −
in >> s;+ −
value = QScriptDebuggerValue(s);+ −
} break;+ −
case QScriptDebuggerValue::NumberValue: {+ −
double d;+ −
in >> d;+ −
value = QScriptDebuggerValue(d);+ −
} break;+ −
case QScriptDebuggerValue::ObjectValue: {+ −
qint64 id;+ −
in >> id;+ −
value = QScriptDebuggerValue(id);+ −
} break;+ −
case QScriptDebuggerValue::NoValue:+ −
default:+ −
value = QScriptDebuggerValue();+ −
break;+ −
}+ −
return in;+ −
}+ −
+ −
QT_END_NAMESPACE+ −