From e71fba71859985a5fe9b81c016451ac090cfc145 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Tue, 31 May 2011 12:26:19 -0300 Subject: Fixed injected code processing to avoid infinite recursion in virtual method calls. Unit tests were also added. --- tests/libsample/virtualmethods.h | 3 +++ tests/samplebinding/typesystem_sample.xml | 13 +++++++++++-- tests/samplebinding/virtualmethods_test.py | 11 ++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/libsample/virtualmethods.h b/tests/libsample/virtualmethods.h index 38a421d30..7d7fe1d5a 100644 --- a/tests/libsample/virtualmethods.h +++ b/tests/libsample/virtualmethods.h @@ -97,6 +97,9 @@ public: getMargins(left, top, right, bottom); } + virtual int recursionOnModifiedVirtual(Str arg) const { return 0; } + int callRecursionOnModifiedVirtual(Str arg) const { return recursionOnModifiedVirtual(arg); } + private: Str m_name; int m_left; diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml index 6cbd77af4..2537b6047 100644 --- a/tests/samplebinding/typesystem_sample.xml +++ b/tests/samplebinding/typesystem_sample.xml @@ -847,6 +847,15 @@ + + + %BEGIN_ALLOW_THREADS + // It's important for test purposes to use a constructor with parenthesis as argument. + %RETURN_TYPE retval_ = %RETURN_TYPE(%CPPSELF.%FUNCTION_NAME(Str(%1))); + %END_ALLOW_THREADS + %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval_); + + @@ -867,10 +876,10 @@ - %PYARG_0 = (PyObject*)%CPPSELF.%FUNCTION_NAME(); + %PYARG_0 = reinterpret_cast<PyObject*>(%CPPSELF.%FUNCTION_NAME()); if (!%PYARG_0) %PYARG_0 = Py_None; - Py_XINCREF(%PYARG_0); + Py_INCREF(%PYARG_0); diff --git a/tests/samplebinding/virtualmethods_test.py b/tests/samplebinding/virtualmethods_test.py index 73490eb84..f2895af64 100644 --- a/tests/samplebinding/virtualmethods_test.py +++ b/tests/samplebinding/virtualmethods_test.py @@ -44,9 +44,13 @@ class ExtendedVirtualMethods(VirtualMethods): return VirtualMethods.virtualMethod0(self, pt, val, cpx, b) * -1.0 def strListToStdList(self, arg): - # returnning wrong type for test purporses. + # returning wrong type for test purposes. return True + def recursionOnModifiedVirtual(self, arg): + # check if recursion is caused by injected code that calls C++. + return VirtualMethods.recursionOnModifiedVirtual(self, arg) + 10 + class ExtendedVirtualDaughter(VirtualDaughter): def __init__(self, name): VirtualDaughter.__init__(self, name) @@ -86,6 +90,11 @@ class VirtualMethodsTest(unittest.TestCase): result1 = evm.callVirtualMethod0(pt, val, cpx, b) self.assertEqual(result0 * -1.0, result1) + def testRecursionOnModifiedVirtual(self): + evm = ExtendedVirtualMethods() + self.assertEqual(evm.recursionOnModifiedVirtual(''), 10) + self.assertEqual(evm.callRecursionOnModifiedVirtual(''), 10) + def testReimplementedVirtualMethodInheritedFromGrandParent(self): '''Test Python override of a virtual method inherited from a grand parent.''' original_name = 'Foo' -- cgit v1.2.3