// of the JS Array, and elements being the JS Array's elements
// converted to QVariants, recursively.
QVariantList QV8Engine::variantListFromJS(v8::Handle<v8::Array> jsArray,
- QSet<int> &visitedObjects)
+ V8ObjectSet &visitedObjects)
{
QVariantList result;
- int hash = jsArray->GetIdentityHash();
- if (visitedObjects.contains(hash))
+ if (visitedObjects.contains(jsArray))
return result; // Avoid recursion.
v8::HandleScope handleScope;
- visitedObjects.insert(hash);
+ visitedObjects.insert(jsArray);
uint32_t length = jsArray->Length();
for (uint32_t i = 0; i < length; ++i)
result.append(variantFromJS(jsArray->Get(i), visitedObjects));
- visitedObjects.remove(hash);
+ visitedObjects.remove(jsArray);
return result;
}
// of the object, and values being the values of the JS object's
// properties converted to QVariants, recursively.
QVariantMap QV8Engine::variantMapFromJS(v8::Handle<v8::Object> jsObject,
- QSet<int> &visitedObjects)
+ V8ObjectSet &visitedObjects)
{
QVariantMap result;
if (length == 0)
return result;
- int hash = jsObject->GetIdentityHash();
- if (visitedObjects.contains(hash))
+ if (visitedObjects.contains(jsObject))
return result; // Avoid recursion.
- visitedObjects.insert(hash);
+ visitedObjects.insert(jsObject);
// TODO: Only object's own property names. Include non-enumerable properties.
for (uint32_t i = 0; i < length; ++i) {
v8::Handle<v8::Value> name = propertyNames->Get(i);
result.insert(QJSConverter::toString(name->ToString()),
variantFromJS(jsObject->Get(name), visitedObjects));
}
- visitedObjects.remove(hash);
+ visitedObjects.remove(jsObject);
return result;
}
// RegExp -> QVariant(QRegExp)
// [Any other object] -> QVariantMap(...)
QVariant QV8Engine::variantFromJS(v8::Handle<v8::Value> value,
- QSet<int> &visitedObjects)
+ V8ObjectSet &visitedObjects)
{
Q_ASSERT(!value.IsEmpty());
if (value->IsUndefined())
class Q_QML_PRIVATE_EXPORT QV8Engine
{
+ typedef QSet<v8::Handle<v8::Object> > V8ObjectSet;
public:
static QV8Engine* get(QJSEngine* q) { Q_ASSERT(q); return q->handle(); }
static QJSEngine* get(QV8Engine* d) { Q_ASSERT(d); return d->q; }
v8::Local<v8::Array> variantListToJS(const QVariantList &lst);
inline QVariantList variantListFromJS(v8::Handle<v8::Array> jsArray)
- { QSet<int> visitedObjects; return variantListFromJS(jsArray, visitedObjects); }
+ { V8ObjectSet visitedObjects; return variantListFromJS(jsArray, visitedObjects); }
v8::Local<v8::Object> variantMapToJS(const QVariantMap &vmap);
inline QVariantMap variantMapFromJS(v8::Handle<v8::Object> jsObject)
- { QSet<int> visitedObjects; return variantMapFromJS(jsObject, visitedObjects); }
+ { V8ObjectSet visitedObjects; return variantMapFromJS(jsObject, visitedObjects); }
v8::Handle<v8::Value> variantToJS(const QVariant &value);
inline QVariant variantFromJS(v8::Handle<v8::Value> value)
- { QSet<int> visitedObjects; return variantFromJS(value, visitedObjects); }
+ { V8ObjectSet visitedObjects; return variantFromJS(value, visitedObjects); }
v8::Handle<v8::Value> jsonValueToJS(const QJsonValue &value);
QJsonValue jsonValueFromJS(v8::Handle<v8::Value> value);
double qtDateTimeToJsDate(const QDateTime &dt);
private:
- QVariantList variantListFromJS(v8::Handle<v8::Array> jsArray, QSet<int> &visitedObjects);
- QVariantMap variantMapFromJS(v8::Handle<v8::Object> jsObject, QSet<int> &visitedObjects);
- QVariant variantFromJS(v8::Handle<v8::Value> value, QSet<int> &visitedObjects);
+ QVariantList variantListFromJS(v8::Handle<v8::Array> jsArray, V8ObjectSet &visitedObjects);
+ QVariantMap variantMapFromJS(v8::Handle<v8::Object> jsObject, V8ObjectSet &visitedObjects);
+ QVariant variantFromJS(v8::Handle<v8::Value> value, V8ObjectSet &visitedObjects);
static v8::Persistent<v8::Object> *findOwnerAndStrength(QObject *object, bool *shouldBeStrong);
return 0;
}
+// Needed for V8ObjectSet
+template<>
+inline uint qHash<v8::Handle<v8::Object> >(const v8::Handle<v8::Object> &object, uint /*seed*/)
+{
+ return object->GetIdentityHash();
+}
+
QT_END_NAMESPACE
#endif // QQMLV8ENGINE_P_H
}
QJsonValue QV8JsonWrapper::toJsonValue(v8::Handle<v8::Value> value,
- QSet<int> &visitedObjects)
+ V8ObjectSet &visitedObjects)
{
if (value->IsString())
return QJsonValue(QJSConverter::toString(value.As<v8::String>()));
}
QJsonObject QV8JsonWrapper::toJsonObject(v8::Handle<v8::Value> value,
- QSet<int> &visitedObjects)
+ V8ObjectSet &visitedObjects)
{
QJsonObject result;
if (!value->IsObject() || value->IsArray() || value->IsFunction())
return result;
v8::Handle<v8::Object> v8object(value.As<v8::Object>());
- int hash = v8object->GetIdentityHash();
- if (visitedObjects.contains(hash)) {
+ if (visitedObjects.contains(v8object)) {
// Avoid recursion.
// For compatibility with QVariant{List,Map} conversion, we return an
// empty object (and no error is thrown).
return result;
}
- visitedObjects.insert(hash);
+ visitedObjects.insert(v8object);
v8::Local<v8::Array> propertyNames = m_engine->getOwnPropertyNames(v8object);
uint32_t length = propertyNames->Length();
toJsonValue(propertyValue, visitedObjects));
}
- visitedObjects.remove(hash);
+ visitedObjects.remove(v8object);
return result;
}
}
QJsonArray QV8JsonWrapper::toJsonArray(v8::Handle<v8::Value> value,
- QSet<int> &visitedObjects)
+ V8ObjectSet &visitedObjects)
{
QJsonArray result;
if (!value->IsArray())
return result;
v8::Handle<v8::Array> v8array(value.As<v8::Array>());
- int hash = v8array->GetIdentityHash();
- if (visitedObjects.contains(hash)) {
+ if (visitedObjects.contains(v8array)) {
// Avoid recursion.
// For compatibility with QVariant{List,Map} conversion, we return an
// empty array (and no error is thrown).
return result;
}
- visitedObjects.insert(hash);
+ visitedObjects.insert(v8array);
uint32_t length = v8array->Length();
for (uint32_t i = 0; i < length; ++i) {
result.append(toJsonValue(element, visitedObjects));
}
- visitedObjects.remove(hash);
+ visitedObjects.remove(v8array);
return result;
}
class QV8Engine;
class QV8JsonWrapper
{
+ typedef QSet<v8::Handle<v8::Object> > V8ObjectSet;
public:
QV8JsonWrapper();
~QV8JsonWrapper();
v8::Handle<v8::Value> fromJsonValue(const QJsonValue &value);
inline QJsonValue toJsonValue(v8::Handle<v8::Value> value)
- { QSet<int> visitedObjects; return toJsonValue(value, visitedObjects); }
+ { V8ObjectSet visitedObjects; return toJsonValue(value, visitedObjects); }
v8::Local<v8::Object> fromJsonObject(const QJsonObject &object);
inline QJsonObject toJsonObject(v8::Handle<v8::Value> value)
- { QSet<int> visitedObjects; return toJsonObject(value, visitedObjects); }
+ { V8ObjectSet visitedObjects; return toJsonObject(value, visitedObjects); }
v8::Local<v8::Array> fromJsonArray(const QJsonArray &array);
inline QJsonArray toJsonArray(v8::Handle<v8::Value> value)
- { QSet<int> visitedObjects; return toJsonArray(value, visitedObjects); }
+ { V8ObjectSet visitedObjects; return toJsonArray(value, visitedObjects); }
private:
- QJsonValue toJsonValue(v8::Handle<v8::Value> value, QSet<int> &visitedObjects);
- QJsonObject toJsonObject(v8::Handle<v8::Value> value, QSet<int> &visitedObjects);
- QJsonArray toJsonArray(v8::Handle<v8::Value> value, QSet<int> &visitedObjects);
+ QJsonValue toJsonValue(v8::Handle<v8::Value> value, V8ObjectSet &visitedObjects);
+ QJsonObject toJsonObject(v8::Handle<v8::Value> value, V8ObjectSet &visitedObjects);
+ QJsonArray toJsonArray(v8::Handle<v8::Value> value, V8ObjectSet &visitedObjects);
QV8Engine *m_engine;
};