1.1 --- a/generator.py Sun Jan 22 01:16:01 2017 +0100
1.2 +++ b/generator.py Sun Jan 22 21:46:37 2017 +0100
1.3 @@ -914,7 +914,7 @@
1.4
1.5 # Special cases.
1.6
1.7 - elif attrname in ("__file__", "__fname__", "__mname__", "__name__", "__oname__"):
1.8 + elif attrname in ("__file__", "__name__"):
1.9 path = ref.get_origin()
1.10 value_type = self.string_type
1.11
1.12 @@ -927,15 +927,9 @@
1.13
1.14 # Function and class names are leafnames.
1.15
1.16 - elif attrname in ("__fname__", "__name__"):
1.17 + elif attrname == "__name__" and not ref.has_kind("<module>"):
1.18 value = path.rsplit(".", 1)[-1]
1.19
1.20 - # Object names of classes and functions are derived from
1.21 - # their object paths.
1.22 -
1.23 - elif attrname == "__oname__":
1.24 - value = path.rsplit(".", 1)[0]
1.25 -
1.26 # All other names just use the object path information.
1.27
1.28 else:
1.29 @@ -951,6 +945,16 @@
1.30 structure.append("%s /* %s */" % (constant_value, attrname))
1.31 continue
1.32
1.33 + elif attrname == "__parent__":
1.34 + path = ref.get_origin()
1.35 +
1.36 + # Parents of classes and functions are derived from their
1.37 + # object paths.
1.38 +
1.39 + value = path.rsplit(".", 1)[0]
1.40 + structure.append("{.context=0, .value=&%s}" % encode_path(value))
1.41 + continue
1.42 +
1.43 # Special class relationship attributes.
1.44
1.45 elif is_type_attribute(attrname):
2.1 --- a/importer.py Sun Jan 22 01:16:01 2017 +0100
2.2 +++ b/importer.py Sun Jan 22 21:46:37 2017 +0100
2.3 @@ -607,7 +607,7 @@
2.4
2.5 # NOTE: Consolidate this information in a common location.
2.6
2.7 - special_attributes = ("__args__", "__file__", "__fn__", "__fname__", "__mname__", "__name__", "__oname__")
2.8 + special_attributes = ("__args__", "__file__", "__fn__", "__name__", "__parent__")
2.9
2.10 def is_dynamic(self, ref):
2.11 return not ref or not ref.static() and not ref.is_constant_alias() and not ref.is_predefined_value()
3.1 --- a/inspector.py Sun Jan 22 01:16:01 2017 +0100
3.2 +++ b/inspector.py Sun Jan 22 21:46:37 2017 +0100
3.3 @@ -77,7 +77,7 @@
3.4
3.5 ref = self.get_builtin("module")
3.6 self.set_name("__class__", ref)
3.7 - self.set_name("__mname__", self.get_constant("string", self.name).reference())
3.8 + self.set_name("__name__", self.get_constant("string", self.name).reference())
3.9 self.set_name("__file__", self.get_constant("string", filename).reference())
3.10
3.11 # Reserve a constant for the encoding.
3.12 @@ -524,10 +524,11 @@
3.13 self.set_name("__fn__") # special instantiator attribute
3.14 self.set_name("__args__") # special instantiator attribute
3.15
3.16 - # Provide leafname and object name attributes.
3.17 + # Provide leafname and parent attributes.
3.18
3.19 - self.set_name("__name__", self.get_constant("string", class_name.rsplit(".", 1)[-1]).reference())
3.20 - self.set_name("__oname__", self.get_constant("string", class_name.rsplit(".", 1)[0]).reference())
3.21 + parent, leafname = class_name.rsplit(".", 1)
3.22 + self.set_name("__name__", self.get_constant("string", leafname).reference())
3.23 + self.set_name("__parent__")
3.24
3.25 self.process_structure_node(n.code)
3.26 self.exit_namespace()
3.27 @@ -646,11 +647,10 @@
3.28
3.29 self.enter_namespace(name)
3.30
3.31 - # Define leafname and object name attribute values for the function instance.
3.32 + # Define a leafname attribute value for the function instance.
3.33
3.34 ref = self.get_builtin_class("string")
3.35 self.reserve_constant(function_name, name, ref.get_origin())
3.36 - self.reserve_constant(function_name, function_name.rsplit(".", 1)[0], ref.get_origin())
3.37
3.38 # Track attribute usage within the namespace.
3.39
4.1 --- a/lib/__builtins__/core.py Sun Jan 22 01:16:01 2017 +0100
4.2 +++ b/lib/__builtins__/core.py Sun Jan 22 21:46:37 2017 +0100
4.3 @@ -41,7 +41,10 @@
4.4
4.5 "Return a string representation."
4.6
4.7 - return str(buffer(["<", self.__oname__, ".", self.__name__, " instance>"]))
4.8 + # The string representation of the class should be provided by the
4.9 + # type.__str__ method using the class as self.
4.10 +
4.11 + return str(buffer(["<", self.__class__, " instance>"]))
4.12
4.13 __repr__ = __str__
4.14
4.15 @@ -56,13 +59,13 @@
4.16 """
4.17
4.18 self.__file__ = None
4.19 - self.__mname__ = None
4.20 + self.__name__ = None
4.21
4.22 def __str__(self):
4.23
4.24 "Return a string representation."
4.25
4.26 - return self.__mname__
4.27 + return self.__name__
4.28
4.29 __repr__ = __str__
4.30
4.31 @@ -81,8 +84,8 @@
4.32
4.33 self.__fn__ = None
4.34 self.__args__ = None
4.35 - self.__fname__ = None
4.36 - self.__oname__ = None
4.37 + self.__name__ = None
4.38 + self.__parent__ = None
4.39
4.40 def __bool__(self):
4.41
4.42 @@ -94,7 +97,9 @@
4.43
4.44 "Return a string representation."
4.45
4.46 - return str(buffer([self.__oname__, ".", self.__fname__]))
4.47 + # Combine the function's parent representation with the function's name.
4.48 +
4.49 + return str(buffer([self.__parent__, ".", self.__name__]))
4.50
4.51 __repr__ = __str__
4.52
4.53 @@ -110,7 +115,10 @@
4.54
4.55 "Return a string representation."
4.56
4.57 - return str(buffer([self.__oname__, ".", self.__name__]))
4.58 + # With the class as self, combine the class's parent representation with
4.59 + # the class's name.
4.60 +
4.61 + return str(buffer([self.__parent__, ".", self.__name__]))
4.62
4.63 __repr__ = __str__
4.64
5.1 --- a/lib/__builtins__/span.py Sun Jan 22 01:16:01 2017 +0100
5.2 +++ b/lib/__builtins__/span.py Sun Jan 22 21:46:37 2017 +0100
5.3 @@ -45,7 +45,7 @@
5.4
5.5 "Return a string representation."
5.6
5.7 - b = buffer([self.__oname__, ".", self.__name__, "(", self.start, ", ", self.end, ", ", self.step, ")"])
5.8 + b = buffer([self.__parent__.__name__, ".", self.__name__, "(", self.start, ", ", self.end, ", ", self.step, ")"])
5.9 return str(b)
5.10
5.11 __repr__ = __str__
6.1 --- a/tests/name_attribute.py Sun Jan 22 01:16:01 2017 +0100
6.2 +++ b/tests/name_attribute.py Sun Jan 22 21:46:37 2017 +0100
6.3 @@ -3,21 +3,54 @@
6.4 class C:
6.5 def f(self): pass
6.6
6.7 +def name(x):
6.8 + print x.__name__
6.9 + print x.__parent__.__name__
6.10 + print str(x)
6.11 +
6.12 +def attrname(x):
6.13 + print x.f.__name__
6.14 + print x.f.__parent__.__name__
6.15 + print str(x.f)
6.16 +
6.17 c = C()
6.18 print c.__name__ # C
6.19 -print c.__oname__ # __main__
6.20 +print c.__parent__.__name__ # __main__
6.21 +print str(c) # <__main__.C instance>
6.22 print C.__name__ # C
6.23 -print C.__oname__ # __main__
6.24 -print c.f.__fname__ # f
6.25 -print c.f.__oname__ # __main__.C
6.26 -print C.f.__fname__ # f
6.27 -print C.f.__oname__ # __main__.C
6.28 +print C.__parent__.__name__ # __main__
6.29 +print str(C) # __main__.C
6.30 +print c.f.__name__ # f
6.31 +print c.f.__parent__.__name__ # C
6.32 +print str(c.f) # __main__.C.f
6.33 +print C.f.__name__ # f
6.34 +print C.f.__parent__.__name__ # C
6.35 +print str(C.f) # __main__.C.f
6.36 +
6.37 +name(c) # C
6.38 + # __main__
6.39 + # <__main__.C instance>
6.40 +name(C) # C
6.41 + # __main__
6.42 + # __main__.C
6.43 +attrname(c) # f
6.44 + # C
6.45 + # __main__.C.f
6.46 +attrname(C) # f
6.47 + # C
6.48 + # __main__.C.f
6.49 +name(c.f) # f
6.50 + # C
6.51 + # __main__.C.f
6.52 +name(C.f) # f
6.53 + # C
6.54 + # __main__.C.f
6.55
6.56 # If it were defined, operator.__name__ would be module.
6.57
6.58 -print operator.__mname__ # operator
6.59 +print operator.__name__ # operator
6.60
6.61 # If it were defined, operator.add.__name__ would be function.
6.62
6.63 -print operator.add.__fname__ # add
6.64 -print operator.add.__oname__ # operator.binary
6.65 +print operator.add.__name__ # add
6.66 +print operator.add.__parent__.__name__ # operator.binary