From f2e0002c8ebc7a68fca731bfbde1d32415f5a240 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Wed, 3 Aug 2011 14:35:35 -0300 Subject: Fixed type system variable replacement for arguments removed with conversion rule. Also added an array argument modification test, and moved AutoArrayPointer from libpyside to libshiboken. Reviewed by Hugo Parente Reviewed by Luciano Wolf --- tests/libsample/modifications.cpp | 8 ++++ tests/libsample/modifications.h | 2 + tests/samplebinding/modifications_test.py | 15 +++++--- tests/samplebinding/typesystem_sample.xml | 61 +++++++++++++++---------------- 4 files changed, 49 insertions(+), 37 deletions(-) (limited to 'tests') diff --git a/tests/libsample/modifications.cpp b/tests/libsample/modifications.cpp index 8d3539814..00a0cdf0c 100644 --- a/tests/libsample/modifications.cpp +++ b/tests/libsample/modifications.cpp @@ -88,3 +88,11 @@ Modifications::className() return "Modifications"; } +Point +Modifications::sumPointArray(int arraySize, const Point pointArray[]) +{ + Point point; + for (int i = 0; i < arraySize; ++i) + point = point + pointArray[i]; + return point; +} diff --git a/tests/libsample/modifications.h b/tests/libsample/modifications.h index 639d09218..5f7b58995 100644 --- a/tests/libsample/modifications.h +++ b/tests/libsample/modifications.h @@ -93,6 +93,8 @@ public: // change the name of this virtual method virtual const char* className(); + + Point sumPointArray(int arraySize, const Point pointArray[]); }; class LIBSAMPLE_API AbstractModifications : public Modifications diff --git a/tests/samplebinding/modifications_test.py b/tests/samplebinding/modifications_test.py index 9a33c25e1..b23165ff6 100644 --- a/tests/samplebinding/modifications_test.py +++ b/tests/samplebinding/modifications_test.py @@ -24,9 +24,8 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA -'''Test cases for method modifications performed as described on typesystem. ''' +'''Test cases for method modifications performed as described on type system. ''' -import sys import unittest from sample import Modifications, Point @@ -40,7 +39,7 @@ class ExtModifications(Modifications): class ModificationsTest(unittest.TestCase): - '''Test cases for method modifications performed as described on typesystem. ''' + '''Test cases for method modifications performed as described on type system. ''' def setUp(self): self.mods = Modifications() @@ -105,7 +104,7 @@ class ModificationsTest(unittest.TestCase): self.assertEqual(self.mods.timesTen(), 100) def testArgumentRemovalAndReturnTypeModificationWithTypesystemTemplates1(self): - '''Test modifications to method signature and return value using typesystem templates (case 1).''' + '''Test modifications to method signature and return value using type system templates (case 1).''' result, ok = self.mods.pointToPair(Point(2, 5)) self.assertEqual(type(ok), bool) self.assertEqual(type(result), tuple) @@ -116,7 +115,7 @@ class ModificationsTest(unittest.TestCase): self.assertEqual(result[1], 5.0) def testArgumentRemovalAndReturnTypeModificationWithTypesystemTemplates2(self): - '''Test modifications to method signature and return value using typesystem templates (case 2).''' + '''Test modifications to method signature and return value using type system templates (case 2).''' result, ok = self.mods.multiplyPointCoordsPlusValue(Point(2, 5), 4.1) self.assertEqual(type(ok), bool) self.assertEqual(type(result), float) @@ -134,6 +133,10 @@ class ModificationsTest(unittest.TestCase): self.assertRaises(TypeError, self.mods.overloaded, 1, True, Point(2, 3), Point(4, 5)) self.assertEqual(self.mods.over(1, True, Point(2, 3), Point(4, 5)), Modifications.Overloaded_ibPP) + def testPointArrayModification(self): + points = (Point(1, 1), Point(2, 2)) + summedPoint = Point(1, 1) + Point(2, 2) + self.assertEqual(self.mods.sumPointArray(points), summedPoint) + if __name__ == '__main__': unittest.main() - diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml index 5184526e4..9624ba27a 100644 --- a/tests/samplebinding/typesystem_sample.xml +++ b/tests/samplebinding/typesystem_sample.xml @@ -664,6 +664,23 @@ + + + + + + int %out = PySequence_Size(%PYARG_1); + + + + + + Shiboken::AutoArrayPointer<Point> %out(%1); + for (int i = 0; i < %1; ++i) + %out[i] = %CONVERTTOCPP[Point](PySequence_Fast_GET_ITEM(%PYARG_1, i)); + + + @@ -936,22 +953,8 @@ %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval); } - - - // simple class to avoid mem leak inside conversion rule used in arrayMethod - template<typename T> - struct ArrayDeleter { - ArrayDeleter(T* ptr) : m_ptr(ptr) {} - ~ArrayDeleter() { delete[] m_ptr; } - operator T*() { return m_ptr; } - private: - T* m_ptr; - ArrayDeleter(const ArrayDeleter&); - ArrayDeleter& operator=(ArrayDeleter&); - }; - @@ -959,24 +962,20 @@ int %out = PySequence_Size(%PYARG_1); - - - - + + int numItems = PySequence_Size(%PYARG_1); - ArrayDeleter<int> %out(new int[numItems]); - for (int i=0; i < numItems; i++) - %out[i] = %CONVERTTOCPP[int](PySequence_GetItem(%PYARG_1, i)); - - - - PyObject *%out = PyList_New(count); - for (int i=0; i < count; i++) + Shiboken::AutoArrayPointer<int> %out(numItems); + for (int i = 0; i < numItems; ++i) + %out[i] = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(%PYARG_1, i)); + + + PyObject* %out = PyList_New(count); + for (int i = 0; i < count; ++i) PyList_SET_ITEM(%out, i, %CONVERTTOPYTHON[int](%in[i])); - - - + + @@ -1356,10 +1355,10 @@ - + PyThreadState* _save = PyEval_SaveThread(); - %RETURN_TYPE cppResult = %CPPSELF.%FUNCTION_NAME(%1_out, %2); + %RETURN_TYPE cppResult = %CPPSELF.%FUNCTION_NAME(argOut, %2); PyEval_RestoreThread(_save); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](cppResult); -- cgit v1.2.3