diff --git a/pybindgen/enum.py b/pybindgen/enum.py index bebbe82..fdf5e5e 100644 --- a/pybindgen/enum.py +++ b/pybindgen/enum.py @@ -88,13 +88,21 @@ class Enum(object): def __init__(self, ctype, name, *args, **kwargs): super(ThisEnumRefParameter, self).__init__(self.full_type_name, name, *args, **kwargs) + class ThisEnumPtrParameter(inttype.IntPtrParam): + CTYPES = [] + full_type_name = self.full_name + " *" + def __init__(self, ctype, name, *args, **kwargs): + super(ThisEnumPtrParameter, self).__init__(self.full_type_name, name, *args, **kwargs) + self.ThisEnumParameter = ThisEnumParameter self.ThisEnumReturn = ThisEnumReturn self.ThisEnumRefParameter = ThisEnumRefParameter + self.ThisEnumPtrParameter = ThisEnumPtrParameter param_type_matcher.register(self.full_name, self.ThisEnumParameter) return_type_matcher.register(self.full_name, self.ThisEnumReturn) param_type_matcher.register(self.full_name + ' &', self.ThisEnumRefParameter) + param_type_matcher.register(self.full_name + ' *', self.ThisEnumPtrParameter) if self.name != self.full_name: try: @@ -109,6 +117,10 @@ class Enum(object): param_type_matcher.register(self.name+' &', self.ThisEnumRefParameter) except ValueError: pass + try: + param_type_matcher.register(self.name+' *', self.ThisEnumPtrParameter) + except ValueError: + pass module = property(get_module, set_module) diff --git a/pybindgen/typehandlers/inttype.py b/pybindgen/typehandlers/inttype.py index b6dd914..bad4289 100644 --- a/pybindgen/typehandlers/inttype.py +++ b/pybindgen/typehandlers/inttype.py @@ -163,7 +163,7 @@ class IntPtrParam(PointerParameter): wrapper.parse_params.add_parameter("i", [self.value], self.name) def convert_python_to_c(self, wrapper): - name = wrapper.declarations.declare_variable('int', self.name) + name = wrapper.declarations.declare_variable(self.ctype_no_const[:-1], self.name) wrapper.call_params.append('&'+name) if self.direction & self.DIRECTION_IN: wrapper.parse_params.add_parameter('i', ['&'+name], self.name) diff --git a/tests/foo.cc b/tests/foo.cc index 19da25c..42087ac 100644 --- a/tests/foo.cc +++ b/tests/foo.cc @@ -237,6 +237,13 @@ namespace xpto type = oldfooType; } + void set_foo_type_ptr (FooType *type) + { + FooType oldfooType = g_fooType; + g_fooType = *type; + *type = oldfooType; + } + } diff --git a/tests/foo.h b/tests/foo.h index d7cc057..02b07aa 100644 --- a/tests/foo.h +++ b/tests/foo.h @@ -499,6 +499,9 @@ namespace xpto FooType get_foo_type (); void set_foo_type (FooType type); + // -#- @type(direction=inout) -#- + void set_foo_type_ptr (FooType *type); + // -#- @type(direction=inout) -#- void set_foo_type_inout (FooType &type); diff --git a/tests/foomodulegen.py b/tests/foomodulegen.py index 036bb60..25b7ebb 100755 --- a/tests/foomodulegen.py +++ b/tests/foomodulegen.py @@ -280,6 +280,8 @@ int %s::custom_method_added_by_a_hook(int x) xpto.add_function('set_foo_type', ReturnValue.new('void'), [Parameter.new("FooType", 'type')]) xpto.add_function('set_foo_type_inout', ReturnValue.new('void'), [Parameter.new("FooType&", 'type', direction=Parameter.DIRECTION_INOUT)]) + xpto.add_function('set_foo_type_ptr', ReturnValue.new('void'), + [Parameter.new("FooType*", 'type', direction=Parameter.DIRECTION_INOUT)]) xpto_SomeClass = xpto.add_class('SomeClass', docstring="This is the docstring for SomeClass") diff --git a/tests/footest.py b/tests/footest.py index fa90905..9e2e6a7 100644 --- a/tests/footest.py +++ b/tests/footest.py @@ -597,9 +597,13 @@ class TestFoo(unittest.TestCase): def test_enum(self): foo.xpto.set_foo_type(foo.xpto.FOO_TYPE_BBB) self.assertEqual(foo.xpto.get_foo_type(), foo.xpto.FOO_TYPE_BBB) + old = foo.xpto.set_foo_type_inout(foo.xpto.FOO_TYPE_CCC) self.assertEqual(old, foo.xpto.FOO_TYPE_BBB) + old = foo.xpto.set_foo_type_ptr(foo.xpto.FOO_TYPE_AAA) + self.assertEqual(old, foo.xpto.FOO_TYPE_CCC) + def test_virtual_overload(self): ## first test the plain object obj = foo.SomeObject("")