Skip to content

Commit

Permalink
ENH: checks to prevent infinite recursion
Browse files Browse the repository at this point in the history
  • Loading branch information
fbordignon committed Jun 24, 2022
1 parent fb16d6e commit e23c03b
Showing 1 changed file with 26 additions and 8 deletions.
34 changes: 26 additions & 8 deletions src/PythonQtClassInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,9 @@ PythonQtSlotInfo* PythonQtClassInfo::recursiveFindDecoratorSlotsFromDecoratorPro
{
inputInfo = findDecoratorSlotsFromDecoratorProvider(memberName, inputInfo, found, memberCache, upcastingOffset);
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
inputInfo = info._parent->recursiveFindDecoratorSlotsFromDecoratorProvider(memberName, inputInfo, found, memberCache, upcastingOffset+info._upcastingOffset);
if (this != info._parent) {
inputInfo = info._parent->recursiveFindDecoratorSlotsFromDecoratorProvider(memberName, inputInfo, found, memberCache, upcastingOffset+info._upcastingOffset);
}
}
return inputInfo;
}
Expand Down Expand Up @@ -382,14 +384,18 @@ void PythonQtClassInfo::recursiveCollectDecoratorObjects(QList<QObject*>& decora
decoratorObjects.append(deco);
}
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
info._parent->recursiveCollectDecoratorObjects(decoratorObjects);
if (this != info._parent) {
info._parent->recursiveCollectDecoratorObjects(decoratorObjects);
}
}
}

void PythonQtClassInfo::recursiveCollectClassInfos(QList<PythonQtClassInfo*>& classInfoObjects) {
classInfoObjects.append(this);
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
info._parent->recursiveCollectClassInfos(classInfoObjects);
if (this != info._parent) {
info._parent->recursiveCollectClassInfos(classInfoObjects);
}
}
}

Expand Down Expand Up @@ -584,7 +590,7 @@ bool PythonQtClassInfo::inherits(const char* name)
return true;
}
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
if (info._parent->inherits(name)) {
if (info._parent != this && info._parent->inherits(name)) {
return true;
}
}
Expand All @@ -597,7 +603,7 @@ bool PythonQtClassInfo::inherits(PythonQtClassInfo* classInfo)
return true;
}
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
if (info._parent->inherits(classInfo)) {
if (info._parent != this && info._parent->inherits(classInfo)) {
return true;
}
}
Expand Down Expand Up @@ -761,8 +767,11 @@ void* PythonQtClassInfo::recursiveCastDownIfPossible(void* ptr, const char** res
}
}
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
void* resultPtr = NULL;
if (!info._parent->isQObject()) {
void* resultPtr = info._parent->recursiveCastDownIfPossible((char*)ptr + info._upcastingOffset, resultClassName);
if (this != info._parent) {
resultPtr = info._parent->recursiveCastDownIfPossible((char*)ptr + info._upcastingOffset, resultClassName);
}
if (resultPtr) {
return resultPtr;
}
Expand Down Expand Up @@ -870,7 +879,9 @@ void PythonQtClassInfo::createEnumWrappers(const QObject* decoratorProvider)
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
// trigger decorator() instead of createEnumWrappers(),
// which will then call createEnumWrappers().
info._parent->decorator();
if (info._parent != this) {
info._parent->decorator();
}
}
}
}
Expand All @@ -889,7 +900,10 @@ PyObject* PythonQtClassInfo::findEnumWrapper(const char* name) {
}
}
Q_FOREACH(const ParentClassInfo& info, _parentClasses) {
PyObject* p = info._parent->findEnumWrapper(name);
PyObject* p = NULL;
if (info._parent != this) {
p = info._parent->findEnumWrapper(name);
}
if (p) return p;
}
return NULL;
Expand Down Expand Up @@ -1004,6 +1018,10 @@ void PythonQtClassInfo::updateRefCountingCBs()
if (!_parentClasses.isEmpty()) {
// we only search in single inheritance, using the first parent class
PythonQtClassInfo* parent = _parentClasses.at(0)._parent;
if (parent == this) {
_searchRefCountCB = false;
return;
}
parent->updateRefCountingCBs();
// propagate to ourself
_refCallback = parent->_refCallback;
Expand Down

0 comments on commit e23c03b

Please sign in to comment.