diff --git a/pybindgen/cppclass.py b/pybindgen/cppclass.py index c90e682..97c1b82 100644 --- a/pybindgen/cppclass.py +++ b/pybindgen/cppclass.py @@ -1490,7 +1490,7 @@ class CppClassRefParameter(CppClassParameterBase): Parameter.DIRECTION_OUT, Parameter.DIRECTION_INOUT] - 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 @@ -1498,7 +1498,7 @@ class CppClassRefParameter(CppClassParameterBase): if ctype == self.cpp_class.name: ctype = self.cpp_class.full_name super(CppClassRefParameter, self).__init__( - ctype, name, direction, is_const) + ctype, name, direction, is_const, default_value) def convert_python_to_c(self, wrapper): "parses python args to get C++ value" @@ -1514,13 +1514,25 @@ class CppClassRefParameter(CppClassParameterBase): else: implicit_conversion_sources = self.cpp_class.get_all_implicit_conversions() if not (implicit_conversion_sources and self.is_const): - 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: + if self.default_value: + warnings.warn("with implicit conversions, default value " + "in C++ class reference parameters is ignored.") self.py_name = wrapper.declarations.declare_variable( 'PyObject*', self.name) tmp_value_variable = wrapper.declarations.declare_variable( diff --git a/pybindgen/gccxmlparser.py b/pybindgen/gccxmlparser.py index bf2316d..c8e19c3 100644 --- a/pybindgen/gccxmlparser.py +++ b/pybindgen/gccxmlparser.py @@ -241,7 +241,11 @@ class GccXmlTypeRegistry(object): ## here is a Bad Idea™ return cpp_class.ThisClassPtrParameter(type_info.decl_string, param_name, **kwargs) if not is_pointer and is_reference: - return cpp_class.ThisClassRefParameter(type_info.decl_string, param_name, **kwargs) + try: + return cpp_class.ThisClassRefParameter(type_info.decl_string, param_name, **kwargs) + except TypeError: + print >> sys.stderr, "** Error in %s class ref parameter" % cpp_class.full_name + raise assert 0, "this line should not be reached" type_registry = GccXmlTypeRegistry()