1.1 --- a/TO_DO.txt Mon Jan 14 23:26:31 2013 +0100
1.2 +++ b/TO_DO.txt Tue Jan 15 00:32:39 2013 +0100
1.3 @@ -31,6 +31,9 @@
1.4 define another form with that name. Currently, such multiple definitions are treated like
1.5 "unions" in the object table.
1.6
1.7 + Consider functions as well as classes which are supported using "shadow" names for the
1.8 + second and subsequent definitions of classes in the same namespace.
1.9 +
1.10 Class and Module Attribute Assignment
1.11 =====================================
1.12
2.1 --- a/micropython/data.py Mon Jan 14 23:26:31 2013 +0100
2.2 +++ b/micropython/data.py Tue Jan 15 00:32:39 2013 +0100
2.3 @@ -1476,9 +1476,20 @@
2.4 if premade.has_key(name) and module.full_name() == "__builtins__":
2.5 cls = premade[name]
2.6 cls.set_context(parent, module, node)
2.7 - return cls
2.8 else:
2.9 - return Class(name, parent, module, node)
2.10 + # Where names are reused in a namespace, differentiate between classes
2.11 + # using a name index.
2.12 +
2.13 + if parent.has_key(name):
2.14 + name = "%s#%d" % (name, parent[name].assignments + 1)
2.15 +
2.16 + cls = Class(name, parent, module, node)
2.17 +
2.18 + # Add a reference for the class's "shadow" name.
2.19 +
2.20 + parent.use_specific_attribute(parent.full_name(), name)
2.21 +
2.22 + return cls
2.23
2.24 # Lambda sequence numbering.
2.25
3.1 --- a/micropython/inspect.py Mon Jan 14 23:26:31 2013 +0100
3.2 +++ b/micropython/inspect.py Tue Jan 15 00:32:39 2013 +0100
3.3 @@ -1014,6 +1014,7 @@
3.4
3.5 self.namespaces.pop()
3.6 self.store(node.name, cls)
3.7 + self.define_attribute_user(node)
3.8 self.add_object(cls)
3.9
3.10 # Process the class body in its own namespace.
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/tests/class_multiple_same_name_explicit_redefinition.py Tue Jan 15 00:32:39 2013 +0100
4.3 @@ -0,0 +1,19 @@
4.4 +#!/usr/bin/env python
4.5 +
4.6 +class A:
4.7 + x = 1
4.8 +
4.9 +class B(A):
4.10 + y = 2
4.11 +
4.12 +result_2 = B.y
4.13 +
4.14 +class B2(A):
4.15 + z = 3
4.16 +
4.17 +B = B2
4.18 +
4.19 +result_1 = A.x
4.20 +result_3 = B.z
4.21 +
4.22 +# vim: tabstop=4 expandtab shiftwidth=4