diff options
author | Ulf Hermann <[email protected]> | 2019-09-30 14:40:57 +0200 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2019-09-30 17:19:09 +0200 |
commit | fcae2d13e43eab1ea60092194667939f85269bde (patch) | |
tree | 9e5786018a9e9478e6cbb3e25190481d69622ab8 /src/qml/jsruntime/qv4executablecompilationunit.cpp | |
parent | e0334d05c00cfe6140ac55f8b6aa8ee83795b940 (diff) |
Fix property cache leaks
Leaks happened when using unqualified context property lookups and when
looking up properties of singletons. We need to release the caches when
unlinking.
Fixes: QTBUG-78859
Change-Id: I8b86bcf72f71a463fb259eb6ae6c46be62729d72
Reviewed-by: Simon Hausmann <[email protected]>
Reviewed-by: Ulf Hermann <[email protected]>
Diffstat (limited to 'src/qml/jsruntime/qv4executablecompilationunit.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp index 58cd581eae..79e2ec2a5d 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit.cpp +++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp @@ -52,6 +52,7 @@ #include <private/qv4module_p.h> #include <private/qv4compilationunitmapper_p.h> #include <private/qml_compile_hash_p.h> +#include <private/qqmltypewrapper_p.h> #include <QtQml/qqmlfile.h> #include <QtQml/qqmlpropertymap.h> @@ -291,15 +292,18 @@ void ExecutableCompilationUnit::unlink() if (runtimeLookups) { for (uint i = 0; i < data->lookupTableSize; ++i) { QV4::Lookup &l = runtimeLookups[i]; - if (l.getter == QV4::QObjectWrapper::lookupGetter) { + if (l.getter == QV4::QObjectWrapper::lookupGetter + || l.getter == QQmlTypeWrapper::lookupSingletonProperty) { if (QQmlPropertyCache *pc = l.qobjectLookup.propertyCache) pc->release(); - } else if (l.getter == QQmlValueTypeWrapper::lookupGetter) { + } else if (l.getter == QQmlValueTypeWrapper::lookupGetter + || l.getter == QQmlTypeWrapper::lookupSingletonProperty) { if (QQmlPropertyCache *pc = l.qgadgetLookup.propertyCache) pc->release(); } - if (l.qmlContextPropertyGetter == QQmlContextWrapper::lookupScopeObjectProperty) { + if (l.qmlContextPropertyGetter == QQmlContextWrapper::lookupScopeObjectProperty + || l.qmlContextPropertyGetter == QQmlContextWrapper::lookupContextObjectProperty) { if (QQmlPropertyCache *pc = l.qobjectLookup.propertyCache) pc->release(); } |