diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-04-15 16:39:33 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:15:21 -0300 |
commit | 04d571f872a8cada531646f15b2d4440b20d0d53 (patch) | |
tree | fda05f186dd0b2c758699003b77f75cb560eea22 /generator/overloaddata.cpp | |
parent | 4936232cec98614069cf72b55497c50b450a71e8 (diff) |
Overload decisor was improved to consider PySequences on modified function signatures.
Unit tests were added as usual.
Reviewer: Hugo Parente <hugo.lima@openbossa.org>
Renato Araujo <renato.filho@openbossa.org>
Diffstat (limited to 'generator/overloaddata.cpp')
-rw-r--r-- | generator/overloaddata.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/generator/overloaddata.cpp b/generator/overloaddata.cpp index 7e3f608cd..1390eea08 100644 --- a/generator/overloaddata.cpp +++ b/generator/overloaddata.cpp @@ -156,6 +156,8 @@ void OverloadData::sortNextOverloads() OverloadSortData sortData; bool checkPyObject = false; int pyobjectIndex = 0; + bool checkPySequence = false; + int pySeqIndex = 0; bool checkQString = false; int qstringIndex = 0; bool checkQVariant = false; @@ -188,6 +190,9 @@ void OverloadData::sortNextOverloads() if (!checkPyObject && typeName.contains("PyObject")) { checkPyObject = true; pyobjectIndex = sortData.lastProcessedItemId(); + } else if (!checkPySequence && typeName == "PySequence") { + checkPySequence = true; + pySeqIndex = sortData.lastProcessedItemId(); } else if (!checkQVariant && typeName == "QVariant") { checkQVariant = true; qvariantIndex = sortData.lastProcessedItemId(); @@ -238,6 +243,9 @@ void OverloadData::sortNextOverloads() for (int i = 0; i < numPrimitives; ++i) hasPrimitive[i] = sortData.map.contains(primitiveTypes[i]); + if (checkPySequence && checkPyObject) + graph.addEdge(pySeqIndex, pyobjectIndex); + QStringList classesWithIntegerImplicitConversion; foreach(OverloadData* ov, m_nextOverloadData) { @@ -305,13 +313,23 @@ void OverloadData::sortNextOverloads() } } - /* Add dependency on PyObject, so its check is the last one (too generic) */ - if (checkPyObject && !targetTypeEntryName.contains("PyObject")) { - graph.addEdge(targetTypeId, pyobjectIndex); + + if ((checkPySequence || checkPyObject) + && !targetTypeEntryName.contains("PyObject") + && !targetTypeEntryName.contains("PySequence")) { + if (checkPySequence) { + // PySequence will be checked after all more specific types, but before PyObject. + graph.addEdge(targetTypeId, pySeqIndex); + } else { + // Add dependency on PyObject, so its check is the last one (too generic). + graph.addEdge(targetTypeId, pyobjectIndex); + } } else if (checkQVariant && targetTypeEntryName != "QVariant") { if (!graph.containsEdge(qvariantIndex, targetTypeId)) // Avoid cyclic dependency. graph.addEdge(targetTypeId, qvariantIndex); - } else if (checkQString && ov->argType()->indirections() > 0 && targetTypeEntryName != "QString" && targetTypeEntryName != "QByteArray") { + } else if (checkQString && ov->argType()->indirections() > 0 + && targetTypeEntryName != "QString" + && targetTypeEntryName != "QByteArray") { if (!graph.containsEdge(qstringIndex, targetTypeId)) // Avoid cyclic dependency. graph.addEdge(targetTypeId, qstringIndex); } |