typedef bug fixes

This commit is contained in:
Gustavo J. A. M. Carneiro committed 2009-08-04 15:55:09 +01:00
1 parent 3ece82b3d7
commit cef0930983
3 files changed
+44 -10

No files matched your search

+7 -1
View File
@@ -634,7 +634,7 @@ class CppClass(object):
"""Register this C++ class as reference return"""
CTYPES = []
cpp_class = self
self.ThisClassPtrReturn = ThisClassPtrReturn
self.ThisClassRefReturn = ThisClassRefReturn
try:
return_type_matcher.register(name+'&', self.ThisClassRefReturn)
except ValueError:
@@ -1021,6 +1021,12 @@ class CppClass(object):
try:
return_type_matcher.register(alias+'*', self.ThisClassPtrReturn)
except ValueError: pass
self.ThisClassRefReturn.CTYPES.append(alias)
try:
return_type_matcher.register(alias+'&', self.ThisClassRefReturn)
except ValueError: pass
def get_module(self):
"""Get the Module object this class belongs to"""
+5 -4
View File
@@ -1177,10 +1177,11 @@ pybindgen.settings.error_handler = ErrorHandler()
type_from_name = normalize_name(str(alias.type))
type_to_name = normalize_name(utils.ascii('::'.join([module.cpp_namespace_prefix, alias.name])))
typehandlers.base.add_type_alias(type_from_name, type_to_name)
pygen_sink = self._get_pygen_sink_for_definition(alias)
if pygen_sink:
pygen_sink.writeln("typehandlers.add_type_alias(%r, %r)" % (type_from_name, type_to_name))
for sym in '', '*', '&':
typehandlers.base.add_type_alias(type_from_name+sym, type_to_name+sym)
pygen_sink = self._get_pygen_sink_for_definition(alias)
if pygen_sink:
pygen_sink.writeln("typehandlers.add_type_alias(%r, %r)" % (type_from_name+sym, type_to_name+sym))
## Look for forward declarations of class/structs like
## "typedef struct _Foo Foo"; these are represented in
+32 -5
View File
@@ -1302,6 +1302,7 @@ class TypeMatcher(object):
self._types = {}
self._transformations = []
self._type_aliases = {}
self._type_aliases_rev = {}
def register_transformation(self, transformation):
@@ -1320,11 +1321,31 @@ class TypeMatcher(object):
self._types[name] = type_handler
def _raw_lookup_with_alias_support(self, name):
already_tried = []
return self._raw_lookup_with_alias_support_recursive(name, already_tried)
def _raw_lookup_with_alias_support_recursive(self, name, already_tried):
try:
return self._types[name]
except KeyError:
alias = self._type_aliases[name]
return self._raw_lookup_with_alias_support(alias)
aliases_to_try = []
try:
aliases_to_try.append(self._type_aliases[name])
except KeyError:
pass
try:
aliases_to_try.append(self._type_aliases_rev[name])
except KeyError:
pass
for alias in aliases_to_try:
if alias in already_tried:
continue
already_tried.append(name)
#if 'Time' in name or 'Time' in alias:
# import sys
# print >> sys.stderr, "**** trying name %r in place of %r" % (alias, name)
return self._raw_lookup_with_alias_support_recursive(alias, already_tried)
raise KeyError
def lookup(self, name):
"""
@@ -1360,8 +1381,11 @@ class TypeMatcher(object):
logger.debug("try to lookup type handler for %r => success (%r)", untransformed_name, rv)
return rv
else:
#existing = self._types.keys()
#existing.sort()
#if 'Time' in name:
# existing = [k for k in self._types.iterkeys() if 'Time' in k]
# existing.sort()
# raise TypeLookupError((tried_names, existing, self._type_aliases))
#else:
raise TypeLookupError(tried_names)
else:
logger.debug("try to lookup type handler for %r => success (%r)", name, rv)
@@ -1372,7 +1396,10 @@ class TypeMatcher(object):
return self._types.iteritems()
def add_type_alias(self, from_type_name, to_type_name):
self._type_aliases[to_type_name] = from_type_name
from_type_name_normalized = str(ctypeparser.TypeTraits(from_type_name).ctype)
to_type_name_normalized = str(ctypeparser.TypeTraits(to_type_name).ctype)
self._type_aliases[to_type_name_normalized] = from_type_name_normalized
self._type_aliases_rev[from_type_name_normalized] = to_type_name_normalized
return_type_matcher = TypeMatcher()
param_type_matcher = TypeMatcher()