Add support for custom names of template instantiation methods.

This commit is contained in:
Gustavo J. A. M. Carneiro committed 2007-12-27 20:13:28 +00:00
1 parent 19aa06c8ed
commit 8f8f2bf7f5
3 files changed
+30 -8

No files matched your search

+3 -4
View File
@@ -600,13 +600,12 @@ public:
else:
raise TypeError
mangled_name = utils.get_mangled_name(name, method.template_parameters)
try:
overload = self.methods[mangled_name]
overload = self.methods[method.mangled_name]
except KeyError:
overload = CppOverloadedMethod(mangled_name)
overload = CppOverloadedMethod(method.mangled_name)
overload.pystruct = self.pystruct
self.methods[mangled_name] = overload
self.methods[method.mangled_name] = overload
method.class_ = self
overload.add(method)
+6 -2
View File
@@ -18,7 +18,8 @@ class CppMethod(ForwardWrapperBase):
def __init__(self, return_value, method_name, parameters, is_static=False,
template_parameters=(), is_virtual=False, is_const=False,
unblock_threads=None, is_pure_virtual=False):
unblock_threads=None, is_pure_virtual=False,
custom_template_method_name=None):
"""
return_value -- the method return value
method_name -- name of the method
@@ -37,7 +38,10 @@ class CppMethod(ForwardWrapperBase):
self.is_pure_virtual = is_pure_virtual
self.is_const = is_const
self.template_parameters = template_parameters
self.mangled_name = utils.get_mangled_name(self.method_name, self.template_parameters)
if custom_template_method_name is None:
self.mangled_name = utils.get_mangled_name(self.method_name, self.template_parameters)
else:
self.mangled_name = custom_template_method_name
self._class = None
self.docstring = None
+21 -2
View File
@@ -545,12 +545,22 @@ class ModuleParser(object):
member.location.line)
if 'ignore' in global_annotations:
continue
for key, val in global_annotations.iteritems():
if key == 'ignore':
pass
elif key == 'template_instance_names' \
and templates.is_instantiation(member.demangled_name):
pass
else:
warnings.warn_explicit("Annotation '%s=%s' not used (used in %s)"
% (key, val, member),
Warning, member.location.file_name, member.location.line)
## ------------ method --------------------
if isinstance(member, calldef.member_function_t):
is_virtual = (member.virtuality != calldef.VIRTUALITY_TYPES.NOT_VIRTUAL)
pure_virtual = (member.virtuality == calldef.VIRTUALITY_TYPES.PURE_VIRTUAL)
try:
return_type = type_registry.lookup_return(member.return_type,
parameter_annotations.get('return', {}))
@@ -580,8 +590,16 @@ class ModuleParser(object):
if pure_virtual and not class_wrapper.allow_subclassing:
class_wrapper.set_cannot_be_constructed(True)
custom_template_method_name = None
if templates.is_instantiation(member.demangled_name):
template_parameters = templates.args(member.demangled_name)
template_instance_names = global_annotations.get('template_instance_names', '')
for mapping in template_instance_names.split('|'):
type_names, name = mapping.split('=>')
instance_types = type_names.split(',')
if instance_types == template_parameters:
custom_template_method_name = name
break
else:
template_parameters = ()
@@ -590,7 +608,8 @@ class ModuleParser(object):
is_static=member.has_static,
is_virtual=(is_virtual and class_wrapper.allow_subclassing),
is_pure_virtual=pure_virtual,
template_parameters=template_parameters)
template_parameters=template_parameters,
custom_template_method_name=custom_template_method_name)
method_wrapper.gccxml_definition = member
class_wrapper.add_method(method_wrapper)