diff options
-rw-r--r-- | src/qml/jsapi/qjsengine.cpp | 12 | ||||
-rw-r--r-- | src/qml/jsapi/qjsvalue.cpp | 22 | ||||
-rw-r--r-- | src/qml/jsapi/qjsvalue.h | 13 | ||||
-rw-r--r-- | src/qml/jsapi/qjsvalueiterator.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlproperty.cpp | 2 |
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 "); |