From 5d8f76b2c61eb4a122515d6b6cface8eb33026d9 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Thu, 24 Apr 2008 00:32:03 +0100 Subject: [PATCH] Add missing support for the combination of CppClass parameter wich has implicit conversions (to it) and also a default value. --- pybindgen/cppclass.py | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/pybindgen/cppclass.py b/pybindgen/cppclass.py index 7358cd3..2429625 100644 --- a/pybindgen/cppclass.py +++ b/pybindgen/cppclass.py @@ -1431,17 +1431,36 @@ class CppClassParameter(CppClassParameterBase): wrapper.call_params.append( '*((%s *) %s)->obj' % (self.cpp_class.pystruct, self.py_name)) else: - self.py_name = wrapper.declarations.declare_variable( - 'PyObject*', self.name) - tmp_value_variable = wrapper.declarations.declare_variable( - self.cpp_class.full_name, self.name) - wrapper.parse_params.add_parameter('O', ['&'+self.py_name], self.name) + if self.default_value is None: + self.py_name = wrapper.declarations.declare_variable( + 'PyObject*', self.name) + tmp_value_variable = wrapper.declarations.declare_variable( + self.cpp_class.full_name, self.name) + wrapper.parse_params.add_parameter('O', ['&'+self.py_name], self.name) + else: + self.py_name = wrapper.declarations.declare_variable( + 'PyObject*', self.name, 'NULL') + tmp_value_variable = wrapper.declarations.declare_variable( + self.cpp_class.full_name, self.name) + wrapper.parse_params.add_parameter('O', ['&'+self.py_name], self.name, optional=True) - wrapper.before_call.write_code("if (PyObject_IsInstance(%s, (PyObject*) &%s)) {\n" - " %s = *((%s *) %s)->obj;" % - (self.py_name, self.cpp_class.pytypestruct, - tmp_value_variable, - self.cpp_class.pystruct, self.py_name)) + if self.default_value is None: + wrapper.before_call.write_code("if (PyObject_IsInstance(%s, (PyObject*) &%s)) {\n" + " %s = *((%s *) %s)->obj;" % + (self.py_name, self.cpp_class.pytypestruct, + tmp_value_variable, + self.cpp_class.pystruct, self.py_name)) + else: + wrapper.before_call.write_code( + "if (%s == NULL) {\n" + " %s = %s;" % + (self.py_name, tmp_value_variable, self.default_value)) + wrapper.before_call.write_code( + "} else if (PyObject_IsInstance(%s, (PyObject*) &%s)) {\n" + " %s = *((%s *) %s)->obj;" % + (self.py_name, self.cpp_class.pytypestruct, + tmp_value_variable, + self.cpp_class.pystruct, self.py_name)) for conversion_source in implicit_conversion_sources: wrapper.before_call.write_code("} else if (PyObject_IsInstance(%s, (PyObject*) &%s)) {\n" " %s = *((%s *) %s)->obj;" %