aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-05-31 12:26:19 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:15:26 -0300
commite71fba71859985a5fe9b81c016451ac090cfc145 (patch)
tree0429d70d9e8a4bca21fa64f09c478fc11f659770 /tests
parent7b731d702c64d172e192aa1876e4a6fade6c38d7 (diff)
Fixed injected code processing to avoid infinite recursion in virtual method calls.
Unit tests were also added.
Diffstat (limited to 'tests')
-rw-r--r--tests/libsample/virtualmethods.h3
-rw-r--r--tests/samplebinding/typesystem_sample.xml13
-rw-r--r--tests/samplebinding/virtualmethods_test.py11
3 files changed, 24 insertions, 3 deletions
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 @@
<insert-template name="fix_int*,int*,int*,int*"/>
</inject-code>
</modify-function>
+ <modify-function signature="recursionOnModifiedVirtual(Str)const">
+ <inject-code class="target" position="beginning">
+ %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_);
+ </inject-code>
+ </modify-function>
</value-type>
<value-type name="VirtualDaughter" />
@@ -867,10 +876,10 @@
</add-function>
<modify-function signature="pointer() const">
<inject-code class="target" position="beginning">
- %PYARG_0 = (PyObject*)%CPPSELF.%FUNCTION_NAME();
+ %PYARG_0 = reinterpret_cast&lt;PyObject*>(%CPPSELF.%FUNCTION_NAME());
if (!%PYARG_0)
%PYARG_0 = Py_None;
- Py_XINCREF(%PYARG_0);
+ Py_INCREF(%PYARG_0);
</inject-code>
</modify-function>
</value-type>
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'