diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2022-09-16 12:08:06 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2022-09-20 10:03:56 +0200 |
commit | 17bd07cbc5b6cf54716e991765ab3088a710d7b3 (patch) | |
tree | 64f0840f9a4da790c37f9a78992a39cfba19c1ae /src/qml/compiler/qv4compiler.cpp | |
parent | a2db40e6c070017960b9f815c66cab354e3466dc (diff) |
QML: Optimize QObject method calls
So far, for each method call we had to allocate a new QObjectMethod as
we didn't have any lookup to cache the methods. Introduce a new lookup
for that and use it for all QObject methods.
Since QObjectMethod contains a pointer to the concrete QObject the
method was retrieved from, some more care has to be taken: If we are
going to call the method right away, we don't need the object since we
always have a thisObject and any further retrieval of the same method
will result in a call again. This enables us to cache the method for any
instance of the same class. When storing the method elsewhere, though,
we need to hold on to the object since you can defer the call or connect
a handler to a signal or similar. For such operations we do need the
object. We can still optimize a bit by re-using the method cache we
build the first time around.
Fixes: QTBUG-95628
Change-Id: I5991180c5e0234cdc179c2b78a43dafc9083e525
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4compiler.cpp')
-rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index c0026aba1f..2dad207087 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -111,14 +111,22 @@ QV4::Compiler::JSUnitGenerator::JSUnitGenerator(QV4::Compiler::Module *module) registerString(QString()); } -int QV4::Compiler::JSUnitGenerator::registerGetterLookup(const QString &name) +int QV4::Compiler::JSUnitGenerator::registerGetterLookup(const QString &name, LookupMode mode) { - return registerGetterLookup(registerString(name)); + return registerGetterLookup(registerString(name), mode); } -int QV4::Compiler::JSUnitGenerator::registerGetterLookup(int nameIndex) +static QV4::CompiledData::Lookup::Mode lookupMode(QV4::Compiler::JSUnitGenerator::LookupMode mode) { - lookups << CompiledData::Lookup(CompiledData::Lookup::Type_Getter, nameIndex); + return mode == QV4::Compiler::JSUnitGenerator::LookupForCall + ? QV4::CompiledData::Lookup::Mode_ForCall + : QV4::CompiledData::Lookup::Mode_ForStorage; +} + +int QV4::Compiler::JSUnitGenerator::registerGetterLookup(int nameIndex, LookupMode mode) +{ + lookups << CompiledData::Lookup( + CompiledData::Lookup::Type_Getter, lookupMode(mode), nameIndex); return lookups.size() - 1; } @@ -129,19 +137,25 @@ int QV4::Compiler::JSUnitGenerator::registerSetterLookup(const QString &name) int QV4::Compiler::JSUnitGenerator::registerSetterLookup(int nameIndex) { - lookups << CompiledData::Lookup(CompiledData::Lookup::Type_Setter, nameIndex); + lookups << CompiledData::Lookup( + CompiledData::Lookup::Type_Setter, + CompiledData::Lookup::Mode_ForStorage, nameIndex); return lookups.size() - 1; } -int QV4::Compiler::JSUnitGenerator::registerGlobalGetterLookup(int nameIndex) +int QV4::Compiler::JSUnitGenerator::registerGlobalGetterLookup(int nameIndex, LookupMode mode) { - lookups << CompiledData::Lookup(CompiledData::Lookup::Type_GlobalGetter, nameIndex); + lookups << CompiledData::Lookup( + CompiledData::Lookup::Type_GlobalGetter, lookupMode(mode), nameIndex); return lookups.size() - 1; } -int QV4::Compiler::JSUnitGenerator::registerQmlContextPropertyGetterLookup(int nameIndex) +int QV4::Compiler::JSUnitGenerator::registerQmlContextPropertyGetterLookup( + int nameIndex, LookupMode mode) { - lookups << CompiledData::Lookup(CompiledData::Lookup::Type_QmlContextPropertyGetter, nameIndex); + lookups << CompiledData::Lookup( + CompiledData::Lookup::Type_QmlContextPropertyGetter, lookupMode(mode), + nameIndex); return lookups.size() - 1; } |