aboutsummaryrefslogtreecommitdiffstats
path: root/generator
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-04-15 16:39:33 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:15:21 -0300
commit04d571f872a8cada531646f15b2d4440b20d0d53 (patch)
treefda05f186dd0b2c758699003b77f75cb560eea22 /generator
parent4936232cec98614069cf72b55497c50b450a71e8 (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')
-rw-r--r--generator/overloaddata.cpp26
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);
}