diff --git a/examples/foomodulegen.py b/examples/foomodulegen.py index 4631a0c..2cf9818 100755 --- a/examples/foomodulegen.py +++ b/examples/foomodulegen.py @@ -98,6 +98,8 @@ def my_module_gen(out_file): SomeObject = CppClass('SomeObject', allow_subclassing=True) + mod.add_class(SomeObject) + SomeObject.add_instance_attribute(ReturnValue.new('std::string'), 'm_prefix') SomeObject.add_static_attribute(ReturnValue.new('std::string'), 'staticData') @@ -171,9 +173,6 @@ def my_module_gen(out_file): name="get_int") - mod.add_class(SomeObject) - - mod.add_function(Function(ReturnValue.new('void'), 'store_some_object', [Parameter.new('SomeObject*', 'obj', transfer_ownership=True)])) mod.add_function(Function(ReturnValue.new('std::string'), 'invoke_some_object_get_prefix', diff --git a/pybindgen/cppattribute.py b/pybindgen/cppattribute.py index 0e89684..be06a8f 100644 --- a/pybindgen/cppattribute.py +++ b/pybindgen/cppattribute.py @@ -78,7 +78,7 @@ class CppStaticAttributeGetter(PyGetter): self.attribute_name = attribute_name self.c_function_name = "_wrap_%s__get_%s" % (self.class_.pystruct, self.attribute_name) - value_type.value = "%s::%s" % (self.class_.name, self.attribute_name) + value_type.value = "%s::%s" % (self.class_.full_name, self.attribute_name) def generate_call(self): "virtual method implementation; do not call" @@ -167,7 +167,7 @@ class CppStaticAttributeSetter(PySetter): self.attribute_name = attribute_name self.c_function_name = "_wrap_%s__set_%s" % (self.class_.pystruct, self.attribute_name) - value_type.value = "%s::%s" % (self.class_.name, self.attribute_name) + value_type.value = "%s::%s" % (self.class_.full_name, self.attribute_name) def generate(self, code_sink): """ diff --git a/pybindgen/cppclass.py b/pybindgen/cppclass.py index 68d6263..cd8136d 100644 --- a/pybindgen/cppclass.py +++ b/pybindgen/cppclass.py @@ -261,8 +261,8 @@ class CppClass(object): def set_module(self, module): """Set the Module object this class belongs to""" self._module = module - if module.cpp_namespace: - self.full_name = module.cpp_namespace + '::' + self.name + if module.cpp_namespace_prefix: + self.full_name = module.cpp_namespace_prefix + '::' + self.name else: self.full_name = self.name @@ -367,7 +367,7 @@ public: module.header.writeln("\npybindgen::TypeMap %s;\n" % self.typeid_map_name) for subclass in self.typeid_map: module.after_init.write_code("%s.register_wrapper(typeid(%s), &%s);" - % (self.typeid_map_name, subclass.name, + % (self.typeid_map_name, subclass.full_name, subclass.pytypestruct)) def add_method(self, method, name=None): @@ -732,6 +732,16 @@ class CppClassRefParameter(Parameter): DIRECTIONS = [Parameter.DIRECTION_IN, Parameter.DIRECTION_OUT, Parameter.DIRECTION_INOUT] + + def __init__(self, ctype, name, direction=Parameter.DIRECTION_IN): + """ + ctype -- C type, normally 'MyClass*' + name -- parameter name + """ + if ctype == self.cpp_class.name: + ctype = self.cpp_class.full_name + super(CppClassRefParameter, self).__init__( + ctype, name, direction) def convert_python_to_c(self, wrapper): "parses python args to get C++ value" @@ -778,6 +788,12 @@ class CppClassReturnValue(ReturnValue): CTYPES = [] cpp_class = CppClass('dummy') # CppClass instance + def __init__(self, ctype): + """override to fix the ctype parameter with namespace information""" + if ctype == self.cpp_class.name: + ctype = self.cpp_class.full_name + super(CppClassReturnValue, self).__init__(ctype) + def get_c_error_return(self): # only used in reverse wrappers """See ReturnValue.get_c_error_return""" return "return %s();" % (self.cpp_class.full_name,) @@ -824,6 +840,8 @@ class CppClassPtrParameter(Parameter): transfer_ownership -- this parameter transfer the ownership of the pointed-to object to the called function """ + if ctype == self.cpp_class.name: + ctype = self.cpp_class.full_name super(CppClassPtrParameter, self).__init__( ctype, name, direction=Parameter.DIRECTION_IN) self.transfer_ownership = transfer_ownership @@ -861,6 +879,8 @@ class CppClassPtrReturnValue(ReturnValue): caller_owns_return -- if true, ownership of the object pointer is transferred to the caller """ + if ctype == self.cpp_class.name: + ctype = self.cpp_class.full_name super(CppClassPtrReturnValue, self).__init__(ctype) self.caller_owns_return = caller_owns_return diff --git a/pybindgen/function.py b/pybindgen/function.py index 2f55f94..b1fc6d2 100644 --- a/pybindgen/function.py +++ b/pybindgen/function.py @@ -38,8 +38,8 @@ class Function(ForwardWrapperBase): def generate_call(self): "virtual method implementation; do not call" - if self._module.cpp_namespace: - namespace = self._module.cpp_namespace + '::' + if self._module.cpp_namespace_prefix: + namespace = self._module.cpp_namespace_prefix + '::' else: namespace = '' if self.return_value.ctype == 'void':