summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLauro Neto <lauro.neto@openbossa.org>2010-03-22 16:23:58 -0300
committerLauro Neto <lauro.neto@openbossa.org>2010-03-22 16:23:58 -0300
commitc8ee3423948143cf1123586e6a95ebaa5578dc14 (patch)
tree29a12869471850cac46cc667313c606126bab61c
parenta50c2a87185d0caeada88a658547c58f87a9d0bb (diff)
parentfb5d06e1fed8942ffc934f2ae77c9464e0f8ad40 (diff)
downloadshiboken-c8ee3423948143cf1123586e6a95ebaa5578dc14.tar.gz
shiboken-c8ee3423948143cf1123586e6a95ebaa5578dc14.tar.xz
shiboken-c8ee3423948143cf1123586e6a95ebaa5578dc14.zip
Merge branch 'operator'
-rw-r--r--cppgenerator.cpp32
-rw-r--r--libshiboken/basewrapper.h2
-rw-r--r--tests/libother/CMakeLists.txt1
-rw-r--r--tests/libother/otherobjecttype.cpp42
-rw-r--r--tests/libother/otherobjecttype.h55
-rw-r--r--tests/libsample/collector.cpp7
-rw-r--r--tests/libsample/collector.h4
-rw-r--r--tests/libsample/objecttype.h2
-rw-r--r--tests/otherbinding/CMakeLists.txt1
-rw-r--r--tests/otherbinding/collector_external_operator_test.py47
-rw-r--r--tests/otherbinding/global.h1
-rw-r--r--tests/otherbinding/typesystem_other.xml1
-rwxr-xr-xtests/samplebinding/collector_test.py17
13 files changed, 209 insertions, 3 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp
index d9cd0bf4..23ce9ca3 100644
--- a/cppgenerator.cpp
+++ b/cppgenerator.cpp
@@ -863,6 +863,38 @@ void CppGenerator::writeMethodWrapper(QTextStream& s, const AbstractMetaFunction
writeArgumentsInitializer(s, overloadData);
}
+ /*
+ * Make sure reverse <</>> operators defined in other classes (specially from other modules)
+ * are called. A proper and generic solution would require an reengineering in the operator
+ * system like the extended converters.
+ *
+ * Solves #119 - QDataStream <</>> operators not working for QPixmap
+ * http://bugs.openbossa.org/show_bug.cgi?id=119
+ */
+ if (hasReturnValue && !rfunc->isInplaceOperator() && rfunc->isOperatorOverload()) {
+ QString opName = ShibokenGenerator::pythonOperatorFunctionName(rfunc);
+ if (opName == "__rshift__" || opName == "__lshift__") {
+ s << INDENT << "if (!isReverse && SbkBaseWrapper_Check(arg)) {" << endl;
+ {
+ Indentation indent(INDENT);
+ // This PyObject_CallMethod call will emit lots of warnings like
+ // "deprecated conversion from string constant to char *" during compilation
+ // due to the method name argument being declared as "char*" instead of "const char*"
+ // issue 6952 http://bugs.python.org/issue6952
+ s << INDENT << PYTHON_RETURN_VAR << " = PyObject_CallMethod(arg, const_cast<char*>(\"" << opName.insert(2, 'r') << "\"), \"O\", self);" << endl;
+ s << INDENT << "if (PyErr_Occurred() && (PyErr_ExceptionMatches(PyExc_NotImplementedError) ||";
+ s << "PyErr_ExceptionMatches(PyExc_AttributeError))) {" << endl;
+ s << INDENT << INDENT << "PyErr_Clear();" << endl;
+ s << INDENT << "} else {" << endl;
+ s << INDENT << INDENT << "return " << PYTHON_RETURN_VAR << "; // Propagate the error" << endl;
+ s << INDENT << "}" << endl;
+
+ }
+ s << INDENT << "}" << endl;
+ }
+ }
+
+
writeOverloadedMethodDecisor(s, &overloadData);
s << endl << INDENT << "if (PyErr_Occurred()";
diff --git a/libshiboken/basewrapper.h b/libshiboken/basewrapper.h
index 9d683394..ea234b74 100644
--- a/libshiboken/basewrapper.h
+++ b/libshiboken/basewrapper.h
@@ -172,7 +172,7 @@ inline bool isShibokenType(const PyObject* pyObj)
*/
#define Shiboken_TypeCheck(pyobj, type) (PyObject_TypeCheck(pyobj, SbkType<type>()))
-#define SbkBaseWrapper_Check(op) PyObject_TypeCheck(op, &Shiboken::SbkBaseWrapper_Type)
+#define SbkBaseWrapper_Check(op) PyObject_TypeCheck(op, (PyTypeObject*)&Shiboken::SbkBaseWrapper_Type)
#define SbkBaseWrapper_CheckExact(op) ((op)->ob_type == &Shiboken::SbkBaseWrapper_Type)
#define SbkBaseWrapper_cptr(pyobj) (((Shiboken::SbkBaseWrapper*)pyobj)->cptr)
diff --git a/tests/libother/CMakeLists.txt b/tests/libother/CMakeLists.txt
index de589ac3..96ab6cab 100644
--- a/tests/libother/CMakeLists.txt
+++ b/tests/libother/CMakeLists.txt
@@ -3,6 +3,7 @@ project(libother)
set(libother_SRC
number.cpp
otherderived.cpp
+otherobjecttype.cpp
)
add_definitions("-DLIBOTHER_BUILD")
diff --git a/tests/libother/otherobjecttype.cpp b/tests/libother/otherobjecttype.cpp
new file mode 100644
index 00000000..beffbe1a
--- /dev/null
+++ b/tests/libother/otherobjecttype.cpp
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the Shiboken Python Binding Generator project.
+ *
+ * Copyright (C) 2009,2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * Contact: PySide team <contact@pyside.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation. Please
+ * review the following information to ensure the GNU Lesser General
+ * Public License version 2.1 requirements will be met:
+ * http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * As a special exception to the GNU Lesser General Public License
+ * version 2.1, the object code form of a "work that uses the Library"
+ * may incorporate material from a header file that is part of the
+ * Library. You may distribute such object code under terms of your
+ * choice, provided that the incorporated material (i) does not exceed
+ * more than 5% of the total size of the Library; and (ii) is limited to
+ * numerical parameters, data structure layouts, accessors, macros,
+ * inline functions and templates.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include "otherobjecttype.h"
+
+Collector&
+operator<<(Collector& collector, OtherObjectType& obj)
+{
+ collector << static_cast<int>(obj.identifier()*2);
+ return collector;
+}
diff --git a/tests/libother/otherobjecttype.h b/tests/libother/otherobjecttype.h
new file mode 100644
index 00000000..592a8adf
--- /dev/null
+++ b/tests/libother/otherobjecttype.h
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the Shiboken Python Binding Generator project.
+ *
+ * Copyright (C) 2009,2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * Contact: PySide team <contact@pyside.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation. Please
+ * review the following information to ensure the GNU Lesser General
+ * Public License version 2.1 requirements will be met:
+ * http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * As a special exception to the GNU Lesser General Public License
+ * version 2.1, the object code form of a "work that uses the Library"
+ * may incorporate material from a header file that is part of the
+ * Library. You may distribute such object code under terms of your
+ * choice, provided that the incorporated material (i) does not exceed
+ * more than 5% of the total size of the Library; and (ii) is limited to
+ * numerical parameters, data structure layouts, accessors, macros,
+ * inline functions and templates.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef OTHEROBJECTTYPE_H
+#define OTHEROBJECTTYPE_H
+
+#include <list>
+#include "str.h"
+
+#include "libothermacros.h"
+#include "objecttype.h"
+#include "collector.h"
+
+class LIBOTHER_API OtherObjectType : public ObjectType
+{
+public:
+
+};
+
+
+LIBOTHER_API Collector& operator<<(Collector&, OtherObjectType&);
+
+#endif // OTHEROBJECTTYPE_H
+
diff --git a/tests/libsample/collector.cpp b/tests/libsample/collector.cpp
index 36e0145f..c33269de 100644
--- a/tests/libsample/collector.cpp
+++ b/tests/libsample/collector.cpp
@@ -54,6 +54,13 @@ Collector::operator<<(signed int item)
return *this;
}
+Collector&
+Collector::operator<<(const ObjectType *obj)
+{
+ m_items.push_back(obj->identifier());
+ return *this;
+}
+
std::list<int>
Collector::items()
{
diff --git a/tests/libsample/collector.h b/tests/libsample/collector.h
index 68d7f536..623f6469 100644
--- a/tests/libsample/collector.h
+++ b/tests/libsample/collector.h
@@ -38,6 +38,8 @@
#include <list>
#include "libsamplemacros.h"
+#include "objecttype.h"
+
class LIBSAMPLE_API Collector
{
public:
@@ -49,6 +51,8 @@ public:
Collector& operator<<(unsigned int item);
Collector& operator<<(signed int item);
+ Collector& operator<<(const ObjectType *);
+
std::list<int> items();
int size();
diff --git a/tests/libsample/objecttype.h b/tests/libsample/objecttype.h
index 3679b3b7..b606dd81 100644
--- a/tests/libsample/objecttype.h
+++ b/tests/libsample/objecttype.h
@@ -81,6 +81,8 @@ public:
Str objectName() const;
void setObjectName(const Str& name);
+ unsigned long identifier() const { return reinterpret_cast<unsigned long>(this); }
+
bool causeEvent(Event::EventType eventType);
// Returns true if the event is processed.
diff --git a/tests/otherbinding/CMakeLists.txt b/tests/otherbinding/CMakeLists.txt
index 06a5caa9..35bae41a 100644
--- a/tests/otherbinding/CMakeLists.txt
+++ b/tests/otherbinding/CMakeLists.txt
@@ -9,6 +9,7 @@ ${CMAKE_CURRENT_BINARY_DIR}/other/extendsnoimplicitconversion_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/number_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/otherderived_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/othermultiplederived_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/other/otherobjecttype_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/other_module_wrapper.cpp
)
diff --git a/tests/otherbinding/collector_external_operator_test.py b/tests/otherbinding/collector_external_operator_test.py
new file mode 100644
index 00000000..28b2d65d
--- /dev/null
+++ b/tests/otherbinding/collector_external_operator_test.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# This file is part of the Shiboken Python Bindings Generator project.
+#
+# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+#
+# Contact: PySide team <contact@pyside.org>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# version 2.1 as published by the Free Software Foundation. Please
+# review the following information to ensure the GNU Lesser General
+# Public License version 2.1 requirements will be met:
+# http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+# #
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA
+
+'''Test cases for Collector shift operators defined in other modules.'''
+
+import sys
+import unittest
+
+from sample import Collector
+from other import OtherObjectType
+
+class CollectorOtherObjectType(unittest.TestCase):
+ '''Test cases for Collector << OtherObjectType'''
+
+ def testOtherReversal(self):
+ '''Collector << OtherObjectType # libother << operator'''
+ collector = Collector()
+ obj = OtherObjectType()
+ collector << obj
+ self.assertEqual(collector.items()[0], obj.identifier()*2)
+
+if __name__ == '__main__':
+ unittest.main()
+
diff --git a/tests/otherbinding/global.h b/tests/otherbinding/global.h
index 8e5c0b0f..539c2aee 100644
--- a/tests/otherbinding/global.h
+++ b/tests/otherbinding/global.h
@@ -2,5 +2,6 @@
#include "extendsnoimplicitconversion.h"
#include "number.h"
#include "otherderived.h"
+#include "otherobjecttype.h"
#include "othermultiplederived.h"
diff --git a/tests/otherbinding/typesystem_other.xml b/tests/otherbinding/typesystem_other.xml
index 58ec134b..a1ef6b9a 100644
--- a/tests/otherbinding/typesystem_other.xml
+++ b/tests/otherbinding/typesystem_other.xml
@@ -2,6 +2,7 @@
<typesystem package="other">
<load-typesystem name="typesystem_sample.xml" generate="no" />
+ <object-type name="OtherObjectType" />
<object-type name="OtherDerived" />
<object-type name="OtherMultipleDerived" />
diff --git a/tests/samplebinding/collector_test.py b/tests/samplebinding/collector_test.py
index a4c9248c..69cf2a14 100755
--- a/tests/samplebinding/collector_test.py
+++ b/tests/samplebinding/collector_test.py
@@ -3,7 +3,7 @@
#
# This file is part of the Shiboken Python Bindings Generator project.
#
-# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (C) 2009,2010 Nokia Corporation and/or its subsidiary(-ies).
#
# Contact: PySide team <contact@pyside.org>
#
@@ -29,7 +29,8 @@
import sys
import unittest
-from sample import Collector, IntWrapper
+from sample import Collector, IntWrapper, ObjectType
+
class CollectorTest(unittest.TestCase):
'''Test cases for Collector class' shift operators.'''
@@ -58,6 +59,18 @@ class CollectorExternalOperator(unittest.TestCase):
self.assertEqual(collector.size(), 1)
self.assertEqual(collector.items(), [5])
+
+class CollectorObjectType(unittest.TestCase):
+ '''Test cases for Collector ObjectType'''
+
+ def testBasic(self):
+ '''Collector << ObjectType # greedy collector'''
+ collector = Collector()
+ obj = ObjectType()
+ collector << obj
+ self.assertEqual(collector.items()[0], obj.identifier())
+
+
if __name__ == '__main__':
unittest.main()