From f7f089d2d42621caa5ae6ff84b14b1208e4d2a47 Mon Sep 17 00:00:00 2001 From: Bruno da Silva de Oliveira Date: Mon, 7 Apr 2003 18:15:50 +0000 Subject: [PATCH] - Fixed bug where the order of instantiations in the --multiple mode could end up wrong [SVN r18198] --- pyste/NEWS | 4 ++++ pyste/src/ClassExporter.py | 6 +++--- pyste/src/EnumExporter.py | 7 ++++++- pyste/src/Exporter.py | 15 ++++++++------- pyste/src/FunctionExporter.py | 11 ++++++----- pyste/src/HeaderExporter.py | 6 +++++- pyste/src/IncludeExporter.py | 2 +- pyste/src/MultipleCodeUnit.py | 5 +++-- pyste/src/exporterutils.py | 4 +++- pyste/src/pyste.py | 6 +++--- pyste/src/utils.py | 14 +++++++++++--- 11 files changed, 53 insertions(+), 27 deletions(-) diff --git a/pyste/NEWS b/pyste/NEWS index 2dd2cbda..edb99984 100644 --- a/pyste/NEWS +++ b/pyste/NEWS @@ -1,3 +1,7 @@ +07 Apr 2003 +Removed the warnings about forward declarations: it was not accurate enough. +Another strategy must be thought of. + 06 Apr 2003 Support for the improved static data members support of Boost.Python. diff --git a/pyste/src/ClassExporter.py b/pyste/src/ClassExporter.py index 097c6be3..2c615e27 100644 --- a/pyste/src/ClassExporter.py +++ b/pyste/src/ClassExporter.py @@ -47,8 +47,8 @@ class ClassExporter(Exporter): return makeid(self.class_.FullName()) + '_scope' - def Name(self): - return self.class_.FullName() + def Unit(self): + return makeid(self.class_.name) def SetDeclarations(self, declarations): @@ -76,7 +76,7 @@ class ClassExporter(Exporter): return bases - def ID(self): + def Order(self): '''Return the TOTAL number of bases that this class has, including the bases' bases. Do this because base classes must be instantialized before the derived classes in the module definition. diff --git a/pyste/src/EnumExporter.py b/pyste/src/EnumExporter.py index 994c0cd6..033a00f8 100644 --- a/pyste/src/EnumExporter.py +++ b/pyste/src/EnumExporter.py @@ -1,5 +1,6 @@ from Exporter import Exporter from settings import * +import utils #============================================================================== # EnumExporter @@ -30,5 +31,9 @@ class EnumExporter(Exporter): codeunit.Write('module', code) - def ID(self): + def Unit(self): + return utils.makeid(self.info.include) + + + def Order(self): return self.info.name diff --git a/pyste/src/Exporter.py b/pyste/src/Exporter.py index 962ce773..c0f2a69f 100644 --- a/pyste/src/Exporter.py +++ b/pyste/src/Exporter.py @@ -12,6 +12,10 @@ class Exporter: self.info = info self.parser_tail = parser_tail + + def Name(self): + return self.info.name + def Parse(self, parser): self.parser = parser @@ -40,11 +44,8 @@ class Exporter: pass - def Name(self): - '''Returns the name of this Exporter. The name will be added to the - list of names exported, which may have a use for other exporters. - ''' - return None + def Unit(self): + raise NotImplementedError def GetDeclarations(self, fullname): @@ -60,9 +61,9 @@ class Exporter: return decls[0] - def ID(self): + def Order(self): '''Returns a string that uniquely identifies this instance. All - exporters will be sorted by ID before being exported. + exporters will be sorted by Order before being exported. ''' raise NotImplementedError diff --git a/pyste/src/FunctionExporter.py b/pyste/src/FunctionExporter.py index 1ab960f5..1207dd87 100644 --- a/pyste/src/FunctionExporter.py +++ b/pyste/src/FunctionExporter.py @@ -2,6 +2,7 @@ from Exporter import Exporter from policies import * from declarations import * from settings import * +import utils import exporterutils @@ -24,10 +25,6 @@ class FunctionExporter(Exporter): self.GenerateOverloads(decls, codeunit) - def Name(self): - return self.info.name - - def ExportDeclaration(self, decl, unique, codeunit): name = self.info.rename or decl.name defs = namespaces.python + 'def("%s", ' % name @@ -78,5 +75,9 @@ class FunctionExporter(Exporter): return '' - def ID(self): + def Order(self): return self.info.name + + + def Unit(self): + return utils.makeid(self.info.include) diff --git a/pyste/src/HeaderExporter.py b/pyste/src/HeaderExporter.py index 62b1cc9c..2ff7876b 100644 --- a/pyste/src/HeaderExporter.py +++ b/pyste/src/HeaderExporter.py @@ -64,7 +64,11 @@ class HeaderExporter(Exporter): exporters.exporters.append(exporter) - def ID(self): + def Unit(self): + return self.info.include + + + def Order(self): return self.info.include diff --git a/pyste/src/IncludeExporter.py b/pyste/src/IncludeExporter.py index 59076469..7784d577 100644 --- a/pyste/src/IncludeExporter.py +++ b/pyste/src/IncludeExporter.py @@ -17,7 +17,7 @@ class IncludeExporter(Exporter): def Parse(self, parser): pass - def ID(self): + def Order(self): return self.info.include def Unit(self): diff --git a/pyste/src/MultipleCodeUnit.py b/pyste/src/MultipleCodeUnit.py index ae8414c7..b98071e6 100644 --- a/pyste/src/MultipleCodeUnit.py +++ b/pyste/src/MultipleCodeUnit.py @@ -10,7 +10,7 @@ from SmartFile import SmartFile class MultipleCodeUnit(object): ''' Represents a bunch of cpp files, where each cpp file represents a header - to be exported by pyste. Another header, named _main.cpp is created too. + to be exported by pyste. Another cpp, named .cpp is created too. ''' def __init__(self, modulename, outdir): @@ -23,6 +23,7 @@ class MultipleCodeUnit(object): def _FunctionName(self, code_unit_name): return '_Export_%s' % utils.makeid(code_unit_name) + def _FileName(self, code_unit_name): filename = os.path.basename(code_unit_name) @@ -84,7 +85,7 @@ class MultipleCodeUnit(object): codeunit.Merge(__all__) codeunit.Save() # generate the main cpp - filename = os.path.join(self.outdir, '_main.cpp') + filename = os.path.join(self.outdir, self.modulename + '.cpp') fout = SmartFile(filename, 'w') fout.write(utils.left_equals('Include')) fout.write('#include \n\n') diff --git a/pyste/src/exporterutils.py b/pyste/src/exporterutils.py index 394dee4e..2efa1892 100644 --- a/pyste/src/exporterutils.py +++ b/pyste/src/exporterutils.py @@ -82,7 +82,9 @@ def WarnForwardDeclarations(function): if type.incomplete: msg = '---> Error: %s is forward declared. Please include the ' \ 'appropriate header with its definition' % type.name - if msg not in _printed_warnings: + # disable this for now... it was reporting too many false + # forward declarations to be useful + if 0 and msg not in _printed_warnings: print msg print _printed_warnings[msg] = 1 diff --git a/pyste/src/pyste.py b/pyste/src/pyste.py index 28eb3744..26d59a9a 100644 --- a/pyste/src/pyste.py +++ b/pyste/src/pyste.py @@ -34,7 +34,7 @@ from policies import * from CppParser import CppParser, CppParserError import time -__VERSION__ = '0.7.0' +__VERSION__ = '0.7.1' def RecursiveIncludes(include): 'Return a list containg the include dir and all its subdirectories' @@ -161,8 +161,8 @@ def Main(): print '***', e, ': exitting' return 2 print - # sort the exporters by its ids - exports = [(x.ID(), x) for x in exporters.exporters] + # sort the exporters by its order + exports = [(x.Order(), x) for x in exporters.exporters] exports.sort() exports = [x for _, x in exports] # now generate the wrapper code diff --git a/pyste/src/utils.py b/pyste/src/utils.py index 26546570..67c2933d 100644 --- a/pyste/src/utils.py +++ b/pyste/src/utils.py @@ -1,4 +1,5 @@ from __future__ import generators +import string #============================================================================== # enumerate @@ -13,12 +14,19 @@ def enumerate(seq): #============================================================================== # makeid #============================================================================== +_valid_chars = string.ascii_letters + string.digits + '_' +_valid_chars = dict(zip(_valid_chars, _valid_chars)) + def makeid(name): 'Returns the name as a valid identifier' - for invalidchar in ('::', '<', '>', ' ', ',', '.', '#'): - name = name.replace(invalidchar, '_') + newname = [] + for char in name: + if char not in _valid_chars: + char = '_' + newname.append(char) + newname = ''.join(newname) # avoid duplications of '_' chars - names = [x for x in name.split('_') if x] + names = [x for x in newname.split('_') if x] return '_'.join(names)