aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsapi/qjsengine.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-01-14 16:22:33 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2015-01-21 18:22:52 +0100
commit8209f35b7961b7ea6867d7ebfb5288dcf40ecd71 (patch)
treef9e8b5083788574b75d7dba7f4ca1c60eded86fe /src/qml/jsapi/qjsengine.cpp
parentd8131513b07d3f0a6d749c9961b294fc955fed6d (diff)
Rework QJSValue internals
Use a flagged pointer to either store a pointer to a QV4::Value (from the persistent storage) or a pointer to a QVariant in QJSValue::d. Like this we don't need to malloc to create a QJSValue for most use cases. Significantly reduces the memory consumption of QJSValue and speeds it up a lot. Change-Id: I10902cc4b6cc3f43d3f816875dc6c4bbb6b4490f Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsapi/qjsengine.cpp')
-rw-r--r--src/qml/jsapi/qjsengine.cpp34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp
index e82849746f..413e0eedaf 100644
--- a/src/qml/jsapi/qjsengine.cpp
+++ b/src/qml/jsapi/qjsengine.cpp
@@ -250,12 +250,18 @@ void QJSEngine::collectGarbage()
*/
void QJSEngine::installTranslatorFunctions(const QJSValue &object)
{
- QV4::ExecutionEngine *v4 = d->m_v4Engine;
- QV4::Scope scope(v4);
- QJSValuePrivate *vp = QJSValuePrivate::get(object);
- QV4::ScopedObject obj(scope, vp->getValue(v4));
+ QV4::ExecutionEngine *otherEngine = QJSValuePrivate::engine(&object);
+ if (otherEngine && otherEngine != d->m_v4Engine) {
+ qWarning("QJSEngine: Trying to install a translator function from a different engine");
+ return;
+ }
+ QV4::Scope scope(d->m_v4Engine);
+ QV4::ScopedObject obj(scope);
+ QV4::Value *val = QJSValuePrivate::getValue(&object);
+ if (val)
+ obj = val;
if (!obj)
- obj = v4->globalObject();
+ obj = scope.engine->globalObject();
#ifndef QT_NO_TRANSLATION
obj->defineDefaultProperty(QStringLiteral("qsTranslate"), QV4::GlobalExtensions::method_qsTranslate);
obj->defineDefaultProperty(QStringLiteral("QT_TRANSLATE_NOOP"), QV4::GlobalExtensions::method_qsTranslateNoOp);
@@ -265,7 +271,7 @@ void QJSEngine::installTranslatorFunctions(const QJSValue &object)
obj->defineDefaultProperty(QStringLiteral("QT_TRID_NOOP"), QV4::GlobalExtensions::method_qsTrIdNoOp);
// string prototype extension
- v4->stringPrototype.asObject()->defineDefaultProperty(QStringLiteral("arg"),
+ scope.engine->stringPrototype.asObject()->defineDefaultProperty(QStringLiteral("arg"),
QV4::GlobalExtensions::method_string_arg);
#endif
}
@@ -420,21 +426,21 @@ QJSValue QJSEngine::create(int type, const void *ptr)
*/
bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr)
{
- QJSValuePrivate *vp = QJSValuePrivate::get(value);
- QV4::ExecutionEngine *v4 = vp->engine();
+ QV4::ExecutionEngine *v4 = QJSValuePrivate::engine(&value);
QV4::Value scratch;
- QV4::Value *val = vp->valueForData(&scratch);
+ QV4::Value *val = QJSValuePrivate::valueForData(&value, &scratch);
if (v4) {
QV4::Scope scope(v4);
QV4::ScopedValue v(scope, *val);
return scope.engine->metaTypeFromJS(v, type, ptr);
}
- Q_ASSERT(vp->persistent.isEmpty());
-
if (!val) {
- if (vp->unboundData.userType() == QMetaType::QString) {
- QString string = vp->unboundData.toString();
+ QVariant *variant = QJSValuePrivate::getVariant(&value);
+ Q_ASSERT(variant);
+
+ if (variant->userType() == QMetaType::QString) {
+ QString string = variant->toString();
// have a string based value without engine. Do conversion manually
if (type == QMetaType::Bool) {
*reinterpret_cast<bool*>(ptr) = string.length() != 0;
@@ -483,7 +489,7 @@ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr)
return false;
}
} else {
- return QMetaType::convert(&vp->unboundData.data_ptr(), vp->unboundData.userType(), ptr, type);
+ return QMetaType::convert(&variant->data_ptr(), variant->userType(), ptr, type);
}
}