diff options
-rw-r--r-- | cppgenerator.cpp | 32 | ||||
-rw-r--r-- | libshiboken/basewrapper.h | 2 | ||||
-rw-r--r-- | tests/libother/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/libother/otherobjecttype.cpp | 42 | ||||
-rw-r--r-- | tests/libother/otherobjecttype.h | 55 | ||||
-rw-r--r-- | tests/libsample/collector.cpp | 7 | ||||
-rw-r--r-- | tests/libsample/collector.h | 4 | ||||
-rw-r--r-- | tests/libsample/objecttype.h | 2 | ||||
-rw-r--r-- | tests/otherbinding/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/otherbinding/collector_external_operator_test.py | 47 | ||||
-rw-r--r-- | tests/otherbinding/global.h | 1 | ||||
-rw-r--r-- | tests/otherbinding/typesystem_other.xml | 1 | ||||
-rwxr-xr-x | tests/samplebinding/collector_test.py | 17 |
13 files changed, 209 insertions, 3 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index d9cd0bf46..23ce9ca38 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 9d683394b..ea234b748 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 de589ac3a..96ab6cab5 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 000000000..beffbe1ad --- /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 000000000..592a8adf2 --- /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 36e0145f4..c33269de1 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 68d7f536c..623f64696 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 3679b3b77..b606dd818 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 06a5caa97..35bae41a5 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 000000000..28b2d65d7 --- /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 8e5c0b0f4..539c2aeef 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 58ec134b3..a1ef6b9a3 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 a4c9248c4..69cf2a147 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() |