diff --git a/pybindgen/cppclass.py b/pybindgen/cppclass.py index c6440b3..c90e682 100644 --- a/pybindgen/cppclass.py +++ b/pybindgen/cppclass.py @@ -1368,7 +1368,7 @@ class CppClassParameterBase(Parameter): cpp_class = CppClass('dummy') # CppClass instance DIRECTIONS = [Parameter.DIRECTION_IN] - def __init__(self, ctype, name, direction=Parameter.DIRECTION_IN, is_const=False): + def __init__(self, ctype, name, direction=Parameter.DIRECTION_IN, is_const=False, default_value=None): """ ctype -- C type, normally 'MyClass*' name -- parameter name @@ -1376,7 +1376,7 @@ class CppClassParameterBase(Parameter): if ctype == self.cpp_class.name: ctype = self.cpp_class.full_name super(CppClassParameterBase, self).__init__( - ctype, name, direction, is_const) + ctype, name, direction, is_const, default_value) ## name of the PyFoo * variable used in parameter parsing self.py_name = None @@ -1416,12 +1416,20 @@ class CppClassParameter(CppClassParameterBase): else: implicit_conversion_sources = self.cpp_class.get_all_implicit_conversions() if not implicit_conversion_sources: - self.py_name = wrapper.declarations.declare_variable( - self.cpp_class.pystruct+'*', self.name) - wrapper.parse_params.add_parameter( - 'O!', ['&'+self.cpp_class.pytypestruct, '&'+self.py_name], self.name) - wrapper.call_params.append( - '*((%s *) %s)->obj' % (self.cpp_class.pystruct, self.py_name)) + if self.default_value: + self.py_name = wrapper.declarations.declare_variable( + self.cpp_class.pystruct+'*', self.name, 'NULL') + wrapper.parse_params.add_parameter( + 'O!', ['&'+self.cpp_class.pytypestruct, '&'+self.py_name], self.name, optional=True) + wrapper.call_params.append( + '(%s ? (*((%s *) %s)->obj) : %s)' % (self.py_name, self.cpp_class.pystruct, self.py_name, self.default_value)) + else: + self.py_name = wrapper.declarations.declare_variable( + self.cpp_class.pystruct+'*', self.name) + wrapper.parse_params.add_parameter( + 'O!', ['&'+self.cpp_class.pytypestruct, '&'+self.py_name], self.name) + 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)