From b4aa14e713bca625d3c43d3051983e605916351b Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 3 Jun 2013 21:28:07 +0200 Subject: [PATCH] Fold the qv4jsonwrapper into the json object Removes the need for an extra file, and cleans up the QV8Engine a bit more. Change-Id: I25e4c9252357a098041ecb188960777094c6b959 Reviewed-by: Simon Hausmann --- src/qml/qml/v4/qv4jsonobject.cpp | 118 ++++++++++++++++++++++ src/qml/qml/v4/qv4jsonobject_p.h | 21 ++++ src/qml/qml/v4/qv4managed_p.h | 3 - src/qml/qml/v8/qv4jsonwrapper.cpp | 185 ----------------------------------- src/qml/qml/v8/qv4jsonwrapper_p.h | 105 -------------------- src/qml/qml/v8/qv8engine.cpp | 59 +++-------- src/qml/qml/v8/qv8engine_p.h | 9 -- src/qml/qml/v8/qv8qobjectwrapper.cpp | 13 +-- src/qml/qml/v8/v8.pri | 2 - 9 files changed, 159 insertions(+), 356 deletions(-) delete mode 100644 src/qml/qml/v8/qv4jsonwrapper.cpp delete mode 100644 src/qml/qml/v8/qv4jsonwrapper_p.h diff --git a/src/qml/qml/v4/qv4jsonobject.cpp b/src/qml/qml/v4/qv4jsonobject.cpp index b575609..cdc5ae7 100644 --- a/src/qml/qml/v4/qv4jsonobject.cpp +++ b/src/qml/qml/v4/qv4jsonobject.cpp @@ -928,3 +928,121 @@ Value JsonObject::method_stringify(SimpleCallContext *ctx) return Value::undefinedValue(); return Value::fromString(ctx, result); } + + + +QV4::Value JsonObject::fromJsonValue(ExecutionEngine *engine, const QJsonValue &value) +{ + if (value.isString()) + return Value::fromString(engine->current, value.toString()); + else if (value.isDouble()) + return Value::fromDouble(value.toDouble()); + else if (value.isBool()) + return Value::fromBoolean(value.toBool()); + else if (value.isArray()) + return fromJsonArray(engine, value.toArray()); + else if (value.isObject()) + return fromJsonObject(engine, value.toObject()); + else if (value.isNull()) + return Value::nullValue(); + else + return Value::undefinedValue(); +} + +QJsonValue JsonObject::toJsonValue(const QV4::Value &value, + V4ObjectSet &visitedObjects) +{ + if (String *s = value.asString()) + return QJsonValue(s->toQString()); + else if (value.isNumber()) + return QJsonValue(value.toNumber()); + else if (value.isBoolean()) + return QJsonValue((bool)value.booleanValue()); + else if (ArrayObject *a = value.asArrayObject()) + return toJsonArray(a, visitedObjects); + else if (Object *o = value.asObject()) + return toJsonObject(o, visitedObjects); + else if (value.isNull()) + return QJsonValue(QJsonValue::Null); + else + return QJsonValue(QJsonValue::Undefined); +} + +QV4::Value JsonObject::fromJsonObject(ExecutionEngine *engine, const QJsonObject &object) +{ + Object *o = engine->newObject(); + for (QJsonObject::const_iterator it = object.begin(); it != object.end(); ++it) + o->put(engine->current, engine->newString(it.key()), fromJsonValue(engine, it.value())); + return Value::fromObject(o); +} + +QJsonObject JsonObject::toJsonObject(QV4::Object *o, V4ObjectSet &visitedObjects) +{ + QJsonObject result; + if (!o || o->asFunctionObject()) + return result; + + if (visitedObjects.contains(o)) { + // Avoid recursion. + // For compatibility with QVariant{List,Map} conversion, we return an + // empty object (and no error is thrown). + return result; + } + + visitedObjects.insert(o); + + ObjectIterator it(o, ObjectIterator::EnumerableOnly); + while (1) { + PropertyAttributes attributes; + String *name; + uint idx; + Property *p = it.next(&name, &idx, &attributes); + if (!p) + break; + + Value v = o->getValue(o->engine()->current, p, attributes); + QString key = name ? name->toQString() : QString::number(idx); + result.insert(key, toJsonValue(v, visitedObjects)); + } + + visitedObjects.remove(o); + + return result; +} + +QV4::Value JsonObject::fromJsonArray(ExecutionEngine *engine, const QJsonArray &array) +{ + int size = array.size(); + ArrayObject *a = engine->newArrayObject(); + a->arrayReserve(size); + for (int i = 0; i < size; i++) + a->arrayData[i].value = fromJsonValue(engine, array.at(i)); + a->setArrayLengthUnchecked(size); + return Value::fromObject(a); +} + +QJsonArray JsonObject::toJsonArray(ArrayObject *a, V4ObjectSet &visitedObjects) +{ + QJsonArray result; + if (!a) + return result; + + if (visitedObjects.contains(a)) { + // Avoid recursion. + // For compatibility with QVariant{List,Map} conversion, we return an + // empty array (and no error is thrown). + return result; + } + + visitedObjects.insert(a); + + quint32 length = a->arrayLength(); + for (quint32 i = 0; i < length; ++i) { + Value v = a->getIndexed(i); + result.append(toJsonValue(v, visitedObjects)); + } + + visitedObjects.remove(a); + + return result; +} diff --git a/src/qml/qml/v4/qv4jsonobject_p.h b/src/qml/qml/v4/qv4jsonobject_p.h index 2a923fb..4225f4c 100644 --- a/src/qml/qml/v4/qv4jsonobject_p.h +++ b/src/qml/qml/v4/qv4jsonobject_p.h @@ -42,17 +42,38 @@ #define QV4SJONOBJECTS_H #include "qv4object_p.h" +#include +#include +#include QT_BEGIN_NAMESPACE namespace QV4 { struct JsonObject : Object { +private: + typedef QSet V4ObjectSet; +public: JsonObject(ExecutionContext *context); static Value method_parse(SimpleCallContext *ctx); static Value method_stringify(SimpleCallContext *ctx); + static QV4::Value fromJsonValue(ExecutionEngine *engine, const QJsonValue &value); + static QV4::Value fromJsonObject(ExecutionEngine *engine, const QJsonObject &object); + static QV4::Value fromJsonArray(ExecutionEngine *engine, const QJsonArray &array); + + static inline QJsonValue toJsonValue(const QV4::Value &value) + { V4ObjectSet visitedObjects; return toJsonValue(value, visitedObjects); } + static inline QJsonObject toJsonObject(QV4::Object *o) + { V4ObjectSet visitedObjects; return toJsonObject(o, visitedObjects); } + static inline QJsonArray toJsonArray(QV4::ArrayObject *a) + { V4ObjectSet visitedObjects; return toJsonArray(a, visitedObjects); } + +private: + static QJsonValue toJsonValue(const QV4::Value &value, V4ObjectSet &visitedObjects); + static QJsonObject toJsonObject(QV4::Object *o, V4ObjectSet &visitedObjects); + static QJsonArray toJsonArray(QV4::ArrayObject *a, V4ObjectSet &visitedObjects); }; } diff --git a/src/qml/qml/v4/qv4managed_p.h b/src/qml/qml/v4/qv4managed_p.h index 966410b..81b2260 100644 --- a/src/qml/qml/v4/qv4managed_p.h +++ b/src/qml/qml/v4/qv4managed_p.h @@ -66,7 +66,6 @@ struct DateObject; struct FunctionObject; struct ErrorObject; struct ArgumentsObject; -struct JSONObject; struct Managed; struct Value; struct Lookup; @@ -204,8 +203,6 @@ public: DateObject *asDateObject() { return type == Type_DateObject ? reinterpret_cast(this) : 0; } ErrorObject *asErrorObject() { return type == Type_ErrorObject ? reinterpret_cast(this) : 0; } ArgumentsObject *asArgumentsObject() { return type == Type_ArgumentsObject ? reinterpret_cast(this) : 0; } - JSONObject *asJSONObject() { return type == Type_JSONObject ? reinterpret_cast(this) : 0; } - bool isListType() const { return type == Type_QmlSequence; } diff --git a/src/qml/qml/v8/qv4jsonwrapper.cpp b/src/qml/qml/v8/qv4jsonwrapper.cpp deleted file mode 100644 index 5f0f285..0000000 --- a/src/qml/qml/v8/qv4jsonwrapper.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qv4jsonwrapper_p.h" -#include "private/qv4engine_p.h" -#include "private/qv4object_p.h" -#include "private/qv4objectiterator_p.h" - -QT_BEGIN_NAMESPACE - -using namespace QV4; - -QV4JsonWrapper::QV4JsonWrapper() -: m_engine(0) -{ -} - -QV4JsonWrapper::~QV4JsonWrapper() -{ -} - -void QV4JsonWrapper::init(QV4::ExecutionEngine *engine) -{ - m_engine = engine; -} - -void QV4JsonWrapper::destroy() -{ -} - -QV4::Value QV4JsonWrapper::fromJsonValue(const QJsonValue &value) -{ - if (value.isString()) - return Value::fromString(m_engine->current, value.toString()); - else if (value.isDouble()) - return Value::fromDouble(value.toDouble()); - else if (value.isBool()) - return Value::fromBoolean(value.toBool()); - else if (value.isArray()) - return fromJsonArray(value.toArray()); - else if (value.isObject()) - return fromJsonObject(value.toObject()); - else if (value.isNull()) - return Value::nullValue(); - else - return Value::undefinedValue(); -} - -QJsonValue QV4JsonWrapper::toJsonValue(const QV4::Value &value, - V4ObjectSet &visitedObjects) -{ - if (String *s = value.asString()) - return QJsonValue(s->toQString()); - else if (value.isNumber()) - return QJsonValue(value.toNumber()); - else if (value.isBoolean()) - return QJsonValue((bool)value.booleanValue()); - else if (ArrayObject *a = value.asArrayObject()) - return toJsonArray(a, visitedObjects); - else if (Object *o = value.asObject()) - return toJsonObject(o, visitedObjects); - else if (value.isNull()) - return QJsonValue(QJsonValue::Null); - else - return QJsonValue(QJsonValue::Undefined); -} - -QV4::Value QV4JsonWrapper::fromJsonObject(const QJsonObject &object) -{ - Object *o = m_engine->newObject(); - for (QJsonObject::const_iterator it = object.begin(); it != object.end(); ++it) - o->put(m_engine->current, m_engine->newString(it.key()), fromJsonValue(it.value())); - return Value::fromObject(o); -} - -QJsonObject QV4JsonWrapper::toJsonObject(QV4::Object *o, V4ObjectSet &visitedObjects) -{ - QJsonObject result; - if (!o || o->asFunctionObject()) - return result; - - if (visitedObjects.contains(o)) { - // Avoid recursion. - // For compatibility with QVariant{List,Map} conversion, we return an - // empty object (and no error is thrown). - return result; - } - - visitedObjects.insert(o); - - ObjectIterator it(o, ObjectIterator::EnumerableOnly); - while (1) { - PropertyAttributes attributes; - String *name; - uint idx; - Property *p = it.next(&name, &idx, &attributes); - if (!p) - break; - - Value v = o->getValue(m_engine->current, p, attributes); - QString key = name ? name->toQString() : QString::number(idx); - result.insert(key, toJsonValue(v, visitedObjects)); - } - - visitedObjects.remove(o); - - return result; -} - -QV4::Value QV4JsonWrapper::fromJsonArray(const QJsonArray &array) -{ - int size = array.size(); - ArrayObject *a = m_engine->newArrayObject(); - a->arrayReserve(size); - for (int i = 0; i < size; i++) - a->arrayData[i].value = fromJsonValue(array.at(i)); - a->setArrayLengthUnchecked(size); - return Value::fromObject(a); -} - -QJsonArray QV4JsonWrapper::toJsonArray(ArrayObject *a, V4ObjectSet &visitedObjects) -{ - QJsonArray result; - if (!a) - return result; - - if (visitedObjects.contains(a)) { - // Avoid recursion. - // For compatibility with QVariant{List,Map} conversion, we return an - // empty array (and no error is thrown). - return result; - } - - visitedObjects.insert(a); - - quint32 length = a->arrayLength(); - for (quint32 i = 0; i < length; ++i) { - Value v = a->getIndexed(m_engine->current, i); - result.append(toJsonValue(v, visitedObjects)); - } - - visitedObjects.remove(a); - - return result; -} - -QT_END_NAMESPACE diff --git a/src/qml/qml/v8/qv4jsonwrapper_p.h b/src/qml/qml/v8/qv4jsonwrapper_p.h deleted file mode 100644 index 7fe24c0..0000000 --- a/src/qml/qml/v8/qv4jsonwrapper_p.h +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QV8JSONWRAPPER_P_H -#define QV8JSONWRAPPER_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -namespace QV4 { -struct Value; -struct Object; -struct ArrayObject; -struct ExecutionEngine; -} - -class QV4JsonWrapper -{ - typedef QSet V4ObjectSet; -public: - QV4JsonWrapper(); - ~QV4JsonWrapper(); - - void init(QV4::ExecutionEngine *); - void destroy(); - - QV4::Value fromJsonValue(const QJsonValue &value); - inline QJsonValue toJsonValue(const QV4::Value &value) - { V4ObjectSet visitedObjects; return toJsonValue(value, visitedObjects); } - - QV4::Value fromJsonObject(const QJsonObject &object); - inline QJsonObject toJsonObject(QV4::Object *o) - { V4ObjectSet visitedObjects; return toJsonObject(o, visitedObjects); } - - QV4::Value fromJsonArray(const QJsonArray &array); - inline QJsonArray toJsonArray(QV4::ArrayObject *a) - { V4ObjectSet visitedObjects; return toJsonArray(a, visitedObjects); } - -private: - QJsonValue toJsonValue(const QV4::Value &value, V4ObjectSet &visitedObjects); - QJsonObject toJsonObject(QV4::Object *o, V4ObjectSet &visitedObjects); - QJsonArray toJsonArray(QV4::ArrayObject *a, V4ObjectSet &visitedObjects); - - QV4::ExecutionEngine *m_engine; -}; - -QT_END_NAMESPACE - -#endif // QV8JSONWRAPPER_P_H - diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index b5d42f6..4af730f 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -76,6 +76,7 @@ #include #include #include +#include Q_DECLARE_METATYPE(QList) @@ -100,8 +101,6 @@ QV8Engine::QV8Engine(QJSEngine* qq) m_v4Engine->publicEngine = q; m_qobjectWrapper.init(this); - m_jsonWrapper.init(m_v4Engine); - } QV8Engine::~QV8Engine() @@ -115,9 +114,6 @@ QV8Engine::~QV8Engine() delete m_listModelData; m_listModelData = 0; - m_jsonWrapper.destroy(); - m_qobjectWrapper.destroy(); - v8::Isolate::SetEngine(0); delete m_v4Engine; } @@ -134,7 +130,7 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) return QVariant(value.toBoolean()); if (typeHint == QMetaType::QJsonValue) - return QVariant::fromValue(jsonValueFromJS(value)); + return QVariant::fromValue(QV4::JsonObject::toJsonValue(value)); if (typeHint == qMetaTypeId()) return QVariant::fromValue(QJSValue(new QJSValuePrivate(m_v4Engine, value))); @@ -155,7 +151,7 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) } } else if (typeHint == QMetaType::QJsonObject && !value.asArrayObject() && !value.asFunctionObject()) { - return QVariant::fromValue(jsonObjectFromJS(value)); + return QVariant::fromValue(QV4::JsonObject::toJsonObject(object)); } else if (QV4::QObjectWrapper *wrapper = object->as()) { return qVariantFromValue(wrapper->object()); } else if (QV4::QmlContextWrapper *wrapper = object->as()) { @@ -185,7 +181,7 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) return qVariantFromValue >(list); } else if (typeHint == QMetaType::QJsonArray) { - return QVariant::fromValue(jsonArrayFromJS(value)); + return QVariant::fromValue(QV4::JsonObject::toJsonArray(a)); } bool succeeded = false; @@ -293,11 +289,11 @@ QV4::Value QV8Engine::fromVariant(const QVariant &variant) case QMetaType::QVariantMap: return objectFromVariantMap(this, *reinterpret_cast(ptr)); case QMetaType::QJsonValue: - return jsonValueToJS(*reinterpret_cast(ptr)); + return QV4::JsonObject::fromJsonValue(m_v4Engine, *reinterpret_cast(ptr)); case QMetaType::QJsonObject: - return jsonObjectToJS(*reinterpret_cast(ptr)); + return QV4::JsonObject::fromJsonObject(m_v4Engine, *reinterpret_cast(ptr)); case QMetaType::QJsonArray: - return jsonArrayToJS(*reinterpret_cast(ptr)); + return QV4::JsonObject::fromJsonArray(m_v4Engine, *reinterpret_cast(ptr)); default: break; @@ -716,13 +712,13 @@ QV4::Value QV8Engine::metaTypeToJS(int type, const void *data) result = variantToJS(*reinterpret_cast(data)); break; case QMetaType::QJsonValue: - result = m_jsonWrapper.fromJsonValue(*reinterpret_cast(data)); + result = QV4::JsonObject::fromJsonValue(m_v4Engine, *reinterpret_cast(data)); break; case QMetaType::QJsonObject: - result = m_jsonWrapper.fromJsonObject(*reinterpret_cast(data)); + result = QV4::JsonObject::fromJsonObject(m_v4Engine, *reinterpret_cast(data)); break; case QMetaType::QJsonArray: - result = m_jsonWrapper.fromJsonArray(*reinterpret_cast(data)); + result = QV4::JsonObject::fromJsonArray(m_v4Engine, *reinterpret_cast(data)); break; default: if (type == qMetaTypeId()) { @@ -834,13 +830,13 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) { *reinterpret_cast(data) = variantFromJS(value); return true; case QMetaType::QJsonValue: - *reinterpret_cast(data) = jsonValueFromJS(value); + *reinterpret_cast(data) = QV4::JsonObject::toJsonValue(value); return true; case QMetaType::QJsonObject: - *reinterpret_cast(data) = jsonObjectFromJS(value); + *reinterpret_cast(data) = QV4::JsonObject::toJsonObject(value.asObject()); return true; case QMetaType::QJsonArray: - *reinterpret_cast(data) = jsonArrayFromJS(value); + *reinterpret_cast(data) = QV4::JsonObject::toJsonArray(value.asArrayObject()); return true; default: ; @@ -961,35 +957,6 @@ QVariant QV8Engine::variantFromJS(const QV4::Value &value, return variantMapFromJS(value.asObject(), visitedObjects); } -QV4::Value QV8Engine::jsonValueToJS(const QJsonValue &value) -{ - return m_jsonWrapper.fromJsonValue(value); -} - -QJsonValue QV8Engine::jsonValueFromJS(const QV4::Value &value) -{ - return m_jsonWrapper.toJsonValue(value); -} - -QV4::Value QV8Engine::jsonObjectToJS(const QJsonObject &object) -{ - return m_jsonWrapper.fromJsonObject(object); -} - -QJsonObject QV8Engine::jsonObjectFromJS(const QV4::Value &value) -{ - return m_jsonWrapper.toJsonObject(value.asObject()); -} - -QV4::Value QV8Engine::jsonArrayToJS(const QJsonArray &array) -{ - return m_jsonWrapper.fromJsonArray(array); -} - -QJsonArray QV8Engine::jsonArrayFromJS(const QV4::Value &value) -{ - return m_jsonWrapper.toJsonArray(value.asArrayObject()); -} bool QV8Engine::convertToNativeQObject(const QV4::Value &value, const QByteArray &targetType, void **result) { diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index 9b317b5..b7c07ee 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -72,7 +72,6 @@ #include "qv8objectresource_p.h" #include "qv8qobjectwrapper_p.h" -#include "qv4jsonwrapper_p.h" #include #include @@ -292,13 +291,6 @@ public: inline QVariant variantFromJS(const QV4::Value &value) { V8ObjectSet visitedObjects; return variantFromJS(value, visitedObjects); } - QV4::Value jsonValueToJS(const QJsonValue &value); - QJsonValue jsonValueFromJS(const QV4::Value &value); - QV4::Value jsonObjectToJS(const QJsonObject &object); - QJsonObject jsonObjectFromJS(const QV4::Value &value); - QV4::Value jsonArrayToJS(const QJsonArray &array); - QJsonArray jsonArrayFromJS(const QV4::Value &value); - QV4::Value metaTypeToJS(int type, const void *data); bool metaTypeFromJS(const QV4::Value &value, int type, void *data); @@ -322,7 +314,6 @@ protected: QV4::ExecutionEngine *m_v4Engine; QV8QObjectWrapper m_qobjectWrapper; - QV4JsonWrapper m_jsonWrapper; QV4::PersistentValue m_freezeObject; diff --git a/src/qml/qml/v8/qv8qobjectwrapper.cpp b/src/qml/qml/v8/qv8qobjectwrapper.cpp index 47a504a..15ae806 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper.cpp +++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp @@ -61,6 +61,7 @@ #include #include #include +#include #include #include @@ -1729,13 +1730,13 @@ void CallArgument::fromValue(int callType, QV8Engine *engine, const QV4::Value & handlePtr = new (&allocData) QQmlV4Handle(QQmlV4Handle(value)); type = callType; } else if (callType == QMetaType::QJsonArray) { - jsonArrayPtr = new (&allocData) QJsonArray(engine->jsonArrayFromJS(value)); + jsonArrayPtr = new (&allocData) QJsonArray(QV4::JsonObject::toJsonArray(value.asArrayObject())); type = callType; } else if (callType == QMetaType::QJsonObject) { - jsonObjectPtr = new (&allocData) QJsonObject(engine->jsonObjectFromJS(value)); + jsonObjectPtr = new (&allocData) QJsonObject(QV4::JsonObject::toJsonObject(value.asObject())); type = callType; } else if (callType == QMetaType::QJsonValue) { - jsonValuePtr = new (&allocData) QJsonValue(engine->jsonValueFromJS(value)); + jsonValuePtr = new (&allocData) QJsonValue(QV4::JsonObject::toJsonValue(value)); type = callType; } else if (callType == QMetaType::Void) { *qvariantPtr = QVariant(); @@ -1806,11 +1807,11 @@ QV4::Value CallArgument::toValue(QV8Engine *engine) } else if (type == qMetaTypeId()) { return handlePtr->toValue(); } else if (type == QMetaType::QJsonArray) { - return engine->jsonArrayToJS(*jsonArrayPtr); + return QV4::JsonObject::fromJsonArray(QV8Engine::getV4(engine), *jsonArrayPtr); } else if (type == QMetaType::QJsonObject) { - return engine->jsonObjectToJS(*jsonObjectPtr); + return QV4::JsonObject::fromJsonObject(QV8Engine::getV4(engine), *jsonObjectPtr); } else if (type == QMetaType::QJsonValue) { - return engine->jsonValueToJS(*jsonValuePtr); + return QV4::JsonObject::fromJsonValue(QV8Engine::getV4(engine), *jsonValuePtr); } else if (type == -1 || type == qMetaTypeId()) { QVariant value = *qvariantPtr; QV4::Value rv = engine->fromVariant(value); diff --git a/src/qml/qml/v8/v8.pri b/src/qml/qml/v8/v8.pri index 01ecd2e..073e2cf 100644 --- a/src/qml/qml/v8/v8.pri +++ b/src/qml/qml/v8/v8.pri @@ -6,7 +6,6 @@ HEADERS += \ $$PWD/qv8profiler_p.h \ $$PWD/qv8engine_p.h \ $$PWD/qv8qobjectwrapper_p.h \ - $$PWD/qv4jsonwrapper_p.h \ $$PWD/qv4domerrors_p.h \ $$PWD/qv4sqlerrors_p.h \ $$PWD/qqmlbuiltinfunctions_p.h \ @@ -15,7 +14,6 @@ HEADERS += \ SOURCES += \ $$PWD/qv8engine.cpp \ $$PWD/qv8qobjectwrapper.cpp \ - $$PWD/qv4jsonwrapper.cpp \ $$PWD/qv4domerrors.cpp \ $$PWD/qv4sqlerrors.cpp \ $$PWD/qqmlbuiltinfunctions.cpp -- 2.7.4