From f7a0d4664009fd5fe82bc4c5a5d1d2b53cfe01e4 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sun, 30 Dec 2007 13:56:06 +0000 Subject: [PATCH] Fix problems with nested classes/enums and name clashes --- pybindgen/cppclass.py | 33 +++++++++++++++++++++++++++------ pybindgen/enum.py | 26 ++++++++++++++++++++++---- pybindgen/gccxmlparser.py | 5 +++++ 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/pybindgen/cppclass.py b/pybindgen/cppclass.py index e05d3b8..b7feab6 100644 --- a/pybindgen/cppclass.py +++ b/pybindgen/cppclass.py @@ -345,35 +345,56 @@ class CppClass(object): class ThisClassParameter(CppClassParameter): """Register this C++ class as pass-by-value parameter""" - CTYPES = [name] + CTYPES = [] cpp_class = self self.ThisClassParameter = ThisClassParameter + try: + param_type_matcher.register(name, self.ThisClassParameter) + except ValueError: + pass + class ThisClassRefParameter(CppClassRefParameter): """Register this C++ class as pass-by-reference parameter""" - CTYPES = [name+'&'] + CTYPES = [] cpp_class = self self.ThisClassRefParameter = ThisClassRefParameter + try: + param_type_matcher.register(name+'&', self.ThisClassRefParameter) + except ValueError: + pass class ThisClassReturn(CppClassReturnValue): """Register this C++ class as value return""" - CTYPES = [name] + CTYPES = [] cpp_class = self - self.ThisClassReturn = ThisClassReturn self.ThisClassRefReturn = ThisClassReturn + try: + return_type_matcher.register(name, self.ThisClassReturn) + return_type_matcher.register(name, self.ThisClassRefReturn) + except ValueError: + pass class ThisClassPtrParameter(CppClassPtrParameter): """Register this C++ class as pass-by-pointer parameter""" - CTYPES = [name+'*'] + CTYPES = [] cpp_class = self self.ThisClassPtrParameter = ThisClassPtrParameter + try: + param_type_matcher.register(name+'*', self.ThisClassPtrParameter) + except ValueError: + pass class ThisClassPtrReturn(CppClassPtrReturnValue): """Register this C++ class as pointer return""" - CTYPES = [name+'*'] + CTYPES = [] cpp_class = self self.ThisClassPtrReturn = ThisClassPtrReturn + try: + return_type_matcher.register(name+'*', self.ThisClassPtrReturn) + except ValueError: + pass self._inherit_default_constructors() diff --git a/pybindgen/enum.py b/pybindgen/enum.py index 86c1146..fefdf3d 100644 --- a/pybindgen/enum.py +++ b/pybindgen/enum.py @@ -3,6 +3,7 @@ Wraps enumerations """ from typehandlers import inttype +from typehandlers.base import return_type_matcher, param_type_matcher from cppclass import CppClass class Enum(object): @@ -31,12 +32,16 @@ class Enum(object): if not isinstance(val, str): raise TypeError + if not name: + raise ValueError self.name = name self.full_name = None self.values = list(values) self.values_prefix = values_prefix self.cpp_namespace = cpp_namespace self._module = None + self.ThisEnumParameter = None + self.ThisEnumReturn = None def get_module(self): """Get the Module object this class belongs to""" @@ -60,19 +65,32 @@ class Enum(object): self.full_name = self.outer_class.full_name + '::' + self.name ## Register type handlers for the enum type + assert self.name + assert self.full_name class ThisEnumParameter(inttype.IntParam): - CTYPES = [self.name, self.full_name] + CTYPES = [] full_type_name = self.full_name def __init__(self, ctype, name): super(ThisEnumParameter, self).__init__(self.full_type_name, name) - self.ThisEnumParameter = ThisEnumParameter - class ThisEnumReturn(inttype.IntReturn): - CTYPES = [self.name, self.full_name] + CTYPES = [] full_type_name = self.full_name def __init__(self, ctype): super(ThisEnumReturn, self).__init__(self.full_type_name) + self.ThisEnumParameter = ThisEnumParameter self.ThisEnumReturn = ThisEnumReturn + param_type_matcher.register(self.full_name, self.ThisEnumParameter) + return_type_matcher.register(self.full_name, self.ThisEnumReturn) + + if self.name != self.full_name: + try: + param_type_matcher.register(self.name, self.ThisEnumParameter) + except ValueError: + pass + try: + return_type_matcher.register(self.name, self.ThisEnumReturn) + except ValueError: + pass module = property(get_module, set_module) diff --git a/pybindgen/gccxmlparser.py b/pybindgen/gccxmlparser.py index d8f0942..48b500f 100644 --- a/pybindgen/gccxmlparser.py +++ b/pybindgen/gccxmlparser.py @@ -376,6 +376,11 @@ class ModuleParser(object): for enum in enums: if enum.name.startswith('__'): continue + if not enum.name: + warnings.warn_explicit("Enum %s ignored because it has no name" + % (enum, ), + Warning, enum.location.file_name, enum.location.line) + continue module.add_enum(Enum(enum.name, [name for name, dummy_val in enum.values], outer_class=outer_class))