From fb0af528ed52a90d422b95f6976e21fd670f40b0 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Thu, 22 Oct 2009 19:04:22 +0200 Subject: Bind QScriptValue to engine when the value is created internally Makes creation+destruction of the QScriptValue a lot faster because it uses the engine's pool of QScriptValuePrivates instead of qMalloc()/qFree(). Reviewed-by: Olivier Goffart --- src/script/api/qscriptengine.cpp | 53 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index a628578..654eea1 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -2508,62 +2508,63 @@ QScriptValue QScriptEngine::create(int type, const void *ptr) QScriptValue QScriptEnginePrivate::create(int type, const void *ptr) { + Q_Q(QScriptEngine); Q_ASSERT(ptr != 0); QScriptValue result; QScriptTypeInfo *info = m_typeInfos.value(type); if (info && info->marshal) { - result = info->marshal(q_func(), ptr); + result = info->marshal(q, ptr); } else { // check if it's one of the types we know switch (QMetaType::Type(type)) { case QMetaType::Void: - result = QScriptValue(QScriptValue::UndefinedValue); + result = QScriptValue(q, QScriptValue::UndefinedValue); break; case QMetaType::Bool: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::Int: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::UInt: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::LongLong: - result = QScriptValue(qsreal(*reinterpret_cast(ptr))); + result = QScriptValue(q, qsreal(*reinterpret_cast(ptr))); break; case QMetaType::ULongLong: #if defined(Q_OS_WIN) && defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 12008804 #pragma message("** NOTE: You need the Visual Studio Processor Pack to compile support for 64bit unsigned integers.") - result = QScriptValue(qsreal((qlonglong)*reinterpret_cast(ptr))); + result = QScriptValue(q, qsreal((qlonglong)*reinterpret_cast(ptr))); #elif defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET) - result = QScriptValue(qsreal((qlonglong)*reinterpret_cast(ptr))); + result = QScriptValue(q, qsreal((qlonglong)*reinterpret_cast(ptr))); #else - result = QScriptValue(qsreal(*reinterpret_cast(ptr))); + result = QScriptValue(q, qsreal(*reinterpret_cast(ptr))); #endif break; case QMetaType::Double: - result = QScriptValue(qsreal(*reinterpret_cast(ptr))); + result = QScriptValue(q, qsreal(*reinterpret_cast(ptr))); break; case QMetaType::QString: - result = QScriptValue(q_func(), *reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::Float: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::Short: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::UShort: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::Char: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::UChar: - result = QScriptValue(*reinterpret_cast(ptr)); + result = QScriptValue(q, *reinterpret_cast(ptr)); break; case QMetaType::QChar: - result = QScriptValue((*reinterpret_cast(ptr)).unicode()); + result = QScriptValue(q, (*reinterpret_cast(ptr)).unicode()); break; case QMetaType::QStringList: result = arrayFromStringList(*reinterpret_cast(ptr)); @@ -2575,38 +2576,38 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr) result = objectFromVariantMap(*reinterpret_cast(ptr)); break; case QMetaType::QDateTime: - result = q_func()->newDate(*reinterpret_cast(ptr)); + result = q->newDate(*reinterpret_cast(ptr)); break; case QMetaType::QDate: - result = q_func()->newDate(QDateTime(*reinterpret_cast(ptr))); + result = q->newDate(QDateTime(*reinterpret_cast(ptr))); break; #ifndef QT_NO_REGEXP case QMetaType::QRegExp: - result = q_func()->newRegExp(*reinterpret_cast(ptr)); + result = q->newRegExp(*reinterpret_cast(ptr)); break; #endif #ifndef QT_NO_QOBJECT case QMetaType::QObjectStar: case QMetaType::QWidgetStar: - result = q_func()->newQObject(*reinterpret_cast(ptr)); + result = q->newQObject(*reinterpret_cast(ptr)); break; #endif default: if (type == qMetaTypeId()) { result = *reinterpret_cast(ptr); if (!result.isValid()) - result = QScriptValue(QScriptValue::UndefinedValue); + result = QScriptValue(q, QScriptValue::UndefinedValue); } #ifndef QT_NO_QOBJECT // lazy registration of some common list types else if (type == qMetaTypeId()) { - qScriptRegisterSequenceMetaType(q_func()); + qScriptRegisterSequenceMetaType(q); return create(type, ptr); } #endif else if (type == qMetaTypeId >()) { - qScriptRegisterSequenceMetaType >(q_func()); + qScriptRegisterSequenceMetaType >(q); return create(type, ptr); } @@ -2615,9 +2616,9 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr) if (typeName == "QVariant") result = scriptValueFromVariant(*reinterpret_cast(ptr)); if (typeName.endsWith('*') && !*reinterpret_cast(ptr)) - result = QScriptValue(QScriptValue::NullValue); + result = QScriptValue(q, QScriptValue::NullValue); else - result = q_func()->newVariant(QVariant(type, ptr)); + result = q->newVariant(QVariant(type, ptr)); } } } -- cgit v0.12