diff --git a/pybindgen/cppclass.py b/pybindgen/cppclass.py index 848a280..38cf533 100644 --- a/pybindgen/cppclass.py +++ b/pybindgen/cppclass.py @@ -6,7 +6,7 @@ import warnings from typehandlers.base import ForwardWrapperBase, ReverseWrapperBase, Parameter, ReturnValue, \ join_ctype_and_name, CodeGenerationError, TypeConfigurationError, \ - param_type_matcher, return_type_matcher + param_type_matcher, return_type_matcher, CodegenErrorBase from typehandlers.codesink import NullCodeSink, MemoryCodeSink @@ -1099,10 +1099,17 @@ typedef struct { self.constructors_overload = overload overload.pystruct = self.pystruct for constructor in self.constructors: - overload.add(constructor) - overload.generate(code_sink) - constructor = overload.wrapper_function_name - code_sink.writeln() + try: + overload.add(constructor) + except CodegenErrorBase: + continue + if overload.wrappers: + overload.generate(code_sink) + constructor = overload.wrapper_function_name + code_sink.writeln() + else: + constructor = None + have_constructor = False else: ## In C++, and unlike Python, constructors with ## parameters are not automatically inheritted by diff --git a/pybindgen/overloading.py b/pybindgen/overloading.py index b34c621..10a1b2e 100644 --- a/pybindgen/overloading.py +++ b/pybindgen/overloading.py @@ -68,17 +68,18 @@ class OverloadedWrapper(object): assert flags == existing_flags if flags is not None and (flags != set(wrapper.get_py_method_def_flags())): - if (set(['METH_KEYWORDS', 'METH_VARARGS']).issubset(set(wrapper.get_py_method_def_flags())) - and not set(['METH_KEYWORDS', 'METH_VARARGS']).issubset(existing_flags)): - ## Try to coerce existing wrappers into - ## METH_KEYWORDS|METH_VARARGS mode, then try again - modified = False - for existing_wrapper in self.wrappers: - if existing_wrapper.force_parse != ForwardWrapperBase.PARSE_TUPLE_AND_KEYWORDS: - existing_wrapper.force_parse = ForwardWrapperBase.PARSE_TUPLE_AND_KEYWORDS - modified = True - if modified: - return self.add(wrapper) + ## Try to coerce all wrappers into + ## METH_KEYWORDS|METH_VARARGS mode, then try again + modified = False + if wrapper.force_parse != ForwardWrapperBase.PARSE_TUPLE_AND_KEYWORDS: + wrapper.force_parse = ForwardWrapperBase.PARSE_TUPLE_AND_KEYWORDS + modified = True + for existing_wrapper in self.wrappers: + if existing_wrapper.force_parse != ForwardWrapperBase.PARSE_TUPLE_AND_KEYWORDS: + existing_wrapper.force_parse = ForwardWrapperBase.PARSE_TUPLE_AND_KEYWORDS + modified = True + if modified: + return self.add(wrapper) raise NotSupportedError("attempting to overload methods of different kinds" " (adding %r vs existing %r)" % (set(wrapper.get_py_method_def_flags()), flags)) diff --git a/pybindgen/typehandlers/base.py b/pybindgen/typehandlers/base.py index 4625502..cb11e82 100644 --- a/pybindgen/typehandlers/base.py +++ b/pybindgen/typehandlers/base.py @@ -847,12 +847,14 @@ class ForwardWrapperBase(object): tmp_sink = codesink.NullCodeSink() try: - try: - self.generate_body(tmp_sink) - except CodegenErrorBase: - return [] - else: - return list(set(self.meth_flags)) +# try: +# self.generate_body(tmp_sink) +# except CodegenErrorBase: +# return [] +# else: +# return list(set(self.meth_flags)) + self.generate_body(tmp_sink) + return list(set(self.meth_flags)) finally: self.reset_code_generation_state()