[pypy-svn] r30135 - in pypy/dist/pypy/translator/cli: . test

antocuni at codespeak.net antocuni at codespeak.net
Mon Jul 17 17:41:05 CEST 2006


Author: antocuni
Date: Mon Jul 17 17:40:59 2006
New Revision: 30135

Modified:
   pypy/dist/pypy/translator/cli/class_.py
   pypy/dist/pypy/translator/cli/database.py
   pypy/dist/pypy/translator/cli/test/test_class.py
Log:
Make sure to use unique names for classes in the same namespace.



Modified: pypy/dist/pypy/translator/cli/class_.py
==============================================================================
--- pypy/dist/pypy/translator/cli/class_.py	(original)
+++ pypy/dist/pypy/translator/cli/class_.py	Mon Jul 17 17:40:59 2006
@@ -7,7 +7,8 @@
         self.db = db
         self.cts = db.type_system_class(db)
         self.classdef = classdef
-        self.namespace, self.name = self.cts.split_class_name(classdef._name)
+        self.namespace, name = self.cts.split_class_name(classdef._name)
+        self.name = self.db.get_unique_class_name(self.namespace, name)
 
     def dependencies(self):
         if not self.is_root(self.classdef):

Modified: pypy/dist/pypy/translator/cli/database.py
==============================================================================
--- pypy/dist/pypy/translator/cli/database.py	(original)
+++ pypy/dist/pypy/translator/cli/database.py	Mon Jul 17 17:40:59 2006
@@ -36,6 +36,7 @@
         self.type_system_class = type_system_class
         self.cts = type_system_class(self)
         self.classes = {} # classdef --> class_name
+        self.classnames = set() # (namespace, name)
         self.functions = {} # graph --> function_name
         self.methods = {} # graph --> method_name
         self.consts = {}  # value --> AbstractConst
@@ -82,6 +83,12 @@
         # XXX: graph name are not guaranteed to be unique
         return self.functions.get(graph, None)
 
+    def get_unique_class_name(self, namespace, name):
+        while (namespace, name) in self.classnames:
+            name += '_'
+        self.classnames.add((namespace, name))            
+        return name
+
     def class_name(self, classdef):
         return self.classes.get(classdef, None)
 

Modified: pypy/dist/pypy/translator/cli/test/test_class.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/test_class.py	(original)
+++ pypy/dist/pypy/translator/cli/test/test_class.py	Mon Jul 17 17:40:59 2006
@@ -21,6 +21,18 @@
             return call(a, x) + call(b, x)
         assert self.interpret(fn, [0]) == 3
 
+    def test_same_name(self):
+        class A:
+            pass
+        B=A
+        class A:
+            pass
+        assert A is not B
+        assert A.__name__ == B.__name__
+        def fn():
+            obj1 = A()
+            obj2 = B()
+        self.interpret(fn, [])
 
 class TestCliSpecialCase(CliTest, BaseTestRspecialcase):
     pass



More information about the Pypy-commit mailing list