diff --git a/pyste/NEWS b/pyste/NEWS index 5d12e14a..ede77dd7 100644 --- a/pyste/NEWS +++ b/pyste/NEWS @@ -1,3 +1,7 @@ +17 May 2004 +Applied a patch by Roman Yakovenko that makes the export of unnamed enums +better. Thanks Roman! + 23 October 2003 Fixed bug where a class would appear more than one in the generated code. diff --git a/pyste/src/Pyste/EnumExporter.py b/pyste/src/Pyste/EnumExporter.py index 5dbe0b0b..ca91aba6 100644 --- a/pyste/src/Pyste/EnumExporter.py +++ b/pyste/src/Pyste/EnumExporter.py @@ -25,48 +25,34 @@ class EnumExporter(Exporter): self.enum = None def Export(self, codeunit, exported_names): - if not self.info.exclude: - indent = self.INDENT - in_indent = self.INDENT*2 - rename = self.info.rename or self.enum.name - full_name = self.enum.FullName() - unnamed_enum = False - if rename.startswith('$_') or rename.startswith('._'): - unique_number = hash(self.info.include) - unnamed_enum = True - self.ExportUniqueInt(codeunit) - full_name = namespaces.pyste + 'UniqueInt<%d>' % unique_number - rename = "unnamed" - code = indent + namespaces.python + if self.info.exclude: + return + indent = self.INDENT + in_indent = self.INDENT*2 + rename = self.info.rename or self.enum.name + full_name = self.enum.FullName() + unnamed_enum = False + if rename.startswith('$_') or rename.startswith('._'): + unnamed_enum = True + code = '' + if not unnamed_enum: + code += indent + namespaces.python code += 'enum_< %s >("%s")\n' % (full_name, rename) - for name in self.enum.values: - rename = self.info[name].rename or name - value_fullname = self.enum.ValueFullName(name) + for name in self.enum.values: + rename = self.info[name].rename or name + value_fullname = self.enum.ValueFullName(name) + if not unnamed_enum: code += in_indent + '.value("%s", %s)\n' % (rename, value_fullname) - if self.info.export_values or unnamed_enum: - code += in_indent + '.export_values()\n' - code += indent + ';\n\n' - codeunit.Write('module', code) - exported_names[self.enum.FullName()] = 1 - - - def ExportUniqueInt(self, codeunit): - write = lambda s: codeunit.Write('declaration', s) - write('// Unique type for unnamed enums\n') - write('#ifndef PYSTE_UNIQUE_INT_DEFINED\n') - write('#define PYSTE_UNIQUE_INT_DEFINED\n') - write('template\n') - write('struct UniqueInt {\n') - write(' int v;\n') - write(' enum { value=num };\n') - write(' UniqueInt(int v_):\n') - write(' v(v_)\n') - write(' {}\n') - write(' operator int() const\n') - write(' { return v; }\n') - write('};\n') - write('#endif // PYSTE_UNIQUE_INT_DEFINED \n') - + else: + code += indent + namespaces.python + code += 'scope().attr("%s") = (int)%s;\n' % (rename, value_fullname ) + if self.info.export_values and not unnamed_enum: + code += in_indent + '.export_values()\n' + if not unnamed_enum: + code += indent + ';\n' + code += '\n' + codeunit.Write('module', code) + exported_names[self.enum.FullName()] = 1 def Name(self): return self.info.name