aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsapi/qjsengine.cpp12
-rw-r--r--src/qml/jsapi/qjsvalue.cpp22
-rw-r--r--src/qml/jsapi/qjsvalue.h13
-rw-r--r--src/qml/jsapi/qjsvalueiterator.cpp2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp6
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp4
-rw-r--r--src/qml/qml/qqmlproperty.cpp2
7 files changed, 37 insertions, 24 deletions
diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp
index d54af28f26..e82849746f 100644
--- a/src/qml/jsapi/qjsengine.cpp
+++ b/src/qml/jsapi/qjsengine.cpp
@@ -317,7 +317,7 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in
result = v4->catchException();
if (ctx->d() != v4->rootContext())
v4->popContext();
- return new QJSValuePrivate(v4, result);
+ return QJSValue(v4, result.asReturnedValue());
}
/*!
@@ -332,7 +332,7 @@ QJSValue QJSEngine::newObject()
{
QV4::Scope scope(d->m_v4Engine);
QV4::ScopedValue v(scope, d->m_v4Engine->newObject());
- return new QJSValuePrivate(d->m_v4Engine, v);
+ return QJSValue(d->m_v4Engine, v.asReturnedValue());
}
/*!
@@ -347,7 +347,7 @@ QJSValue QJSEngine::newArray(uint length)
if (length < 0x1000)
array->arrayReserve(length);
array->setArrayLengthUnchecked(length);
- return new QJSValuePrivate(d->m_v4Engine, array);
+ return QJSValue(d->m_v4Engine, array.asReturnedValue());
}
/*!
@@ -381,7 +381,7 @@ QJSValue QJSEngine::newQObject(QObject *object)
QQmlEngine::setObjectOwnership(object, QQmlEngine::JavaScriptOwnership);
}
QV4::ScopedValue v(scope, QV4::QObjectWrapper::wrap(v4, object));
- return new QJSValuePrivate(v4, v);
+ return QJSValue(v4, v.asReturnedValue());
}
/*!
@@ -399,7 +399,7 @@ QJSValue QJSEngine::globalObject() const
Q_D(const QJSEngine);
QV4::Scope scope(d->m_v4Engine);
QV4::ScopedValue v(scope, d->m_v4Engine->globalObject());
- return new QJSValuePrivate(d->m_v4Engine, v);
+ return QJSValue(d->m_v4Engine, v.asReturnedValue());
}
/*!
@@ -411,7 +411,7 @@ QJSValue QJSEngine::create(int type, const void *ptr)
Q_D(QJSEngine);
QV4::Scope scope(d->m_v4Engine);
QV4::ScopedValue v(scope, scope.engine->metaTypeToJS(type, ptr));
- return new QJSValuePrivate(d->m_v4Engine, v);
+ return QJSValue(d->m_v4Engine, v.asReturnedValue());
}
/*!
diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp
index 0a29e7802c..479a2d0901 100644
--- a/src/qml/jsapi/qjsvalue.cpp
+++ b/src/qml/jsapi/qjsvalue.cpp
@@ -172,8 +172,11 @@ QJSValue::QJSValue(bool value)
{
}
-QJSValue::QJSValue(QJSValuePrivate *dd)
- : d(dd)
+/*!
+ \internal
+*/
+QJSValue::QJSValue(ExecutionEngine *e, quint64 val)
+ : d(new QJSValuePrivate(e, val))
{
}
@@ -255,7 +258,8 @@ QJSValue::QJSValue(const QJSValue& other)
*/
QJSValue::~QJSValue()
{
- d->deref();
+ if (d)
+ d->deref();
}
/*!
@@ -642,7 +646,7 @@ QJSValue QJSValue::call(const QJSValueList &args)
if (engine->hasException)
result = engine->catchException();
- return new QJSValuePrivate(engine, result);
+ return QJSValue(engine, result.asReturnedValue());
}
/*!
@@ -697,7 +701,7 @@ QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList
if (engine->hasException)
result = engine->catchException();
- return new QJSValuePrivate(engine, result);
+ return QJSValue(engine, result.asReturnedValue());
}
/*!
@@ -744,7 +748,7 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args)
if (engine->hasException)
result = engine->catchException();
- return new QJSValuePrivate(engine, result);
+ return QJSValue(engine, result.asReturnedValue());
}
#ifdef QT_DEPRECATED
@@ -785,7 +789,7 @@ QJSValue QJSValue::prototype() const
ScopedObject p(scope, o->prototype());
if (!p)
return QJSValue(NullValue);
- return new QJSValuePrivate(o->internalClass()->engine, p);
+ return QJSValue(o->internalClass()->engine, p.asReturnedValue());
}
/*!
@@ -979,7 +983,7 @@ QJSValue QJSValue::property(const QString& name) const
if (engine->hasException)
result = engine->catchException();
- return new QJSValuePrivate(engine, result);
+ return QJSValue(engine, result.asReturnedValue());
}
/*!
@@ -1008,7 +1012,7 @@ QJSValue QJSValue::property(quint32 arrayIndex) const
QV4::ScopedValue result(scope, arrayIndex == UINT_MAX ? o->get(engine->id_uintMax) : o->getIndexed(arrayIndex));
if (engine->hasException)
engine->catchException();
- return new QJSValuePrivate(engine, result);
+ return QJSValue(engine, result.asReturnedValue());
}
/*!
diff --git a/src/qml/jsapi/qjsvalue.h b/src/qml/jsapi/qjsvalue.h
index d184cf6537..4ff86b1edc 100644
--- a/src/qml/jsapi/qjsvalue.h
+++ b/src/qml/jsapi/qjsvalue.h
@@ -41,7 +41,6 @@
QT_BEGIN_NAMESPACE
-
class QJSValue;
class QJSEngine;
class QVariant;
@@ -51,6 +50,10 @@ class QDateTime;
typedef QList<QJSValue> QJSValueList;
class QJSValuePrivate;
+namespace QV4 {
+ struct ExecutionEngine;
+ struct Value;
+}
class Q_QML_EXPORT QJSValue
{
@@ -65,6 +68,12 @@ public:
~QJSValue();
QJSValue(const QJSValue &other);
+#ifdef Q_COMPILER_RVALUE_REFS
+ inline QJSValue(QJSValue && other) : d(other.d) { other.d = 0; }
+ inline QJSValue &operator=(QJSValue &&other)
+ { qSwap(d, other.d); return *this; }
+#endif
+
QJSValue(bool value);
QJSValue(int value);
QJSValue(uint value);
@@ -125,7 +134,7 @@ public:
QT_DEPRECATED QJSEngine *engine() const;
#endif
- QJSValue(QJSValuePrivate *dd);
+ QJSValue(QV4::ExecutionEngine *e, quint64 val);
private:
friend class QJSValuePrivate;
// force compile error, prevent QJSValue(bool) to be called
diff --git a/src/qml/jsapi/qjsvalueiterator.cpp b/src/qml/jsapi/qjsvalueiterator.cpp
index e23bd5d763..2b27f655c8 100644
--- a/src/qml/jsapi/qjsvalueiterator.cpp
+++ b/src/qml/jsapi/qjsvalueiterator.cpp
@@ -201,7 +201,7 @@ QJSValue QJSValueIterator::value() const
engine->catchException();
return QJSValue();
}
- return new QJSValuePrivate(engine, v);
+ return QJSValue(engine, v.asReturnedValue());
}
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index b42d4bec1c..359b24d5ab 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -1183,7 +1183,7 @@ static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::ValueRef value, in
return QVariant::fromValue(QV4::JsonObject::toJsonValue(value));
if (typeHint == qMetaTypeId<QJSValue>())
- return QVariant::fromValue(QJSValue(new QJSValuePrivate(e, value)));
+ return QVariant::fromValue(QJSValue(e, value.asReturnedValue()));
if (value->asObject()) {
QV4::ScopedObject object(scope, value);
@@ -1255,7 +1255,7 @@ static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::ValueRef value, in
return re->toQRegExp();
if (createJSValueForObjects)
- return QVariant::fromValue(QJSValue(new QJSValuePrivate(scope.engine, o->asReturnedValue())));
+ return QVariant::fromValue(QJSValue(scope.engine, o->asReturnedValue()));
return objectToVariant(e, o, visitedObjects);
}
@@ -1799,7 +1799,7 @@ bool ExecutionEngine::metaTypeFromJS(const QV4::ValueRef value, int type, void *
*reinterpret_cast<void* *>(data) = 0;
return true;
} else if (type == qMetaTypeId<QJSValue>()) {
- *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(this, value));
+ *reinterpret_cast<QJSValue*>(data) = QJSValue(this, value.asReturnedValue());
return true;
}
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index e4c141c15d..3bacba117e 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -510,7 +510,7 @@ void QObjectWrapper::setProperty(QObject *object, ExecutionContext *ctx, QQmlPro
} else if (value->isUndefined() && property->propType == QMetaType::QJsonValue) {
PROPERTY_STORE(QJsonValue, QJsonValue(QJsonValue::Undefined));
} else if (!newBinding && property->propType == qMetaTypeId<QJSValue>()) {
- PROPERTY_STORE(QJSValue, new QJSValuePrivate(ctx->d()->engine, value));
+ PROPERTY_STORE(QJSValue, QJSValue(ctx->d()->engine, value.asReturnedValue()));
} else if (value->isUndefined() && property->propType != qMetaTypeId<QQmlScriptString>()) {
QString error = QLatin1String("Cannot assign [undefined] to ");
if (!QMetaType::typeName(property->propType))
@@ -1573,7 +1573,7 @@ void CallArgument::fromValue(int callType, QV4::ExecutionEngine *engine, const Q
bool queryEngine = false;
if (callType == qMetaTypeId<QJSValue>()) {
- qjsValuePtr = new (&allocData) QJSValue(new QJSValuePrivate(scope.engine, value));
+ qjsValuePtr = new (&allocData) QJSValue(scope.engine, value.asReturnedValue());
type = qMetaTypeId<QJSValue>();
} else if (callType == QMetaType::Int) {
intValue = quint32(value->toInt32());
diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp
index a4c46a1705..abdb938e52 100644
--- a/src/qml/qml/qqmlproperty.cpp
+++ b/src/qml/qml/qqmlproperty.cpp
@@ -1550,7 +1550,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object,
return false;
}
writeValueProperty(object, core, QVariant::fromValue(
- QJSValue(new QJSValuePrivate(QV8Engine::getV4(v8engine), result))),
+ QJSValue(QV8Engine::getV4(v8engine), result.asReturnedValue())),
context, flags);
} else if (isUndefined) {
QString errorStr = QLatin1String("Unable to assign [undefined] to ");