1.1 --- a/generator.py Sat Jan 21 00:03:13 2017 +0100
1.2 +++ b/generator.py Sat Jan 21 17:03:55 2017 +0100
1.3 @@ -918,9 +918,26 @@
1.4 path = ref.get_origin()
1.5 value_type = self.string_type
1.6
1.7 + # Provide constant values. These must match the values
1.8 + # originally recorded during inspection.
1.9 +
1.10 if attrname == "__file__":
1.11 module = self.importer.get_module(path)
1.12 value = module.filename
1.13 +
1.14 + # Function and class names are leafnames.
1.15 +
1.16 + elif attrname in ("__fname__", "__name__"):
1.17 + value = path.rsplit(".", 1)[-1]
1.18 +
1.19 + # Module names of classes and functions are derived from
1.20 + # their object paths.
1.21 +
1.22 + elif attrname == "__mname__" and not ref.has_kind("<module>"):
1.23 + value = self.importer.get_module_provider(ref)
1.24 +
1.25 + # All other names just use the object path information.
1.26 +
1.27 else:
1.28 value = path
1.29
2.1 --- a/inspector.py Sat Jan 21 00:03:13 2017 +0100
2.2 +++ b/inspector.py Sat Jan 21 17:03:55 2017 +0100
2.3 @@ -524,7 +524,10 @@
2.4 self.set_name("__fn__") # special instantiator attribute
2.5 self.set_name("__args__") # special instantiator attribute
2.6
2.7 - self.set_name("__name__", self.get_constant("string", class_name).reference())
2.8 + # Provide leafname and module name attributes.
2.9 +
2.10 + self.set_name("__name__", self.get_constant("string", class_name.rsplit(".", 1)[-1]).reference())
2.11 + self.set_name("__mname__", self.get_constant("string", self.name).reference())
2.12
2.13 self.process_structure_node(n.code)
2.14 self.exit_namespace()
2.15 @@ -643,10 +646,11 @@
2.16
2.17 self.enter_namespace(name)
2.18
2.19 - # Define a name attribute value for the function instance.
2.20 + # Define leafname and module name attribute values for the function instance.
2.21
2.22 ref = self.get_builtin_class("string")
2.23 - self.reserve_constant(function_name, function_name, ref.get_origin())
2.24 + self.reserve_constant(function_name, name, ref.get_origin())
2.25 + self.reserve_constant(function_name, self.name, ref.get_origin())
2.26
2.27 # Track attribute usage within the namespace.
2.28
3.1 --- a/lib/__builtins__/core.py Sat Jan 21 00:03:13 2017 +0100
3.2 +++ b/lib/__builtins__/core.py Sat Jan 21 17:03:55 2017 +0100
3.3 @@ -41,7 +41,7 @@
3.4
3.5 "Return a string representation."
3.6
3.7 - return str(buffer(["<", self.__name__, " instance>"]))
3.8 + return str(buffer(["<", self.__mname__, ".", self.__name__, " instance>"]))
3.9
3.10 __repr__ = __str__
3.11
3.12 @@ -82,6 +82,7 @@
3.13 self.__fn__ = None
3.14 self.__args__ = None
3.15 self.__fname__ = None
3.16 + self.__mname__ = None
3.17
3.18 def __bool__(self):
3.19
3.20 @@ -93,7 +94,7 @@
3.21
3.22 "Return a string representation."
3.23
3.24 - return self.__fname__
3.25 + return str(buffer([self.__mname__, ".", self.__fname__]))
3.26
3.27 __repr__ = __str__
3.28
4.1 --- a/tests/getattr_visitor.py Sat Jan 21 00:03:13 2017 +0100
4.2 +++ b/tests/getattr_visitor.py Sat Jan 21 17:03:55 2017 +0100
4.3 @@ -2,8 +2,6 @@
4.4
4.5 "An expression."
4.6
4.7 - name = "Expr"
4.8 -
4.9 def __init__(self, ops):
4.10 self.ops = ops
4.11
4.12 @@ -14,8 +12,6 @@
4.13
4.14 "A binary operator."
4.15
4.16 - name = "Binary"
4.17 -
4.18 def __init__(self, left, op, right):
4.19 self.left = left
4.20 self.op = op
4.21 @@ -28,8 +24,6 @@
4.22
4.23 "A unary operator."
4.24
4.25 - name = "Unary"
4.26 -
4.27 def __init__(self, op, operand):
4.28 self.op = op
4.29 self.operand = operand
4.30 @@ -41,8 +35,6 @@
4.31
4.32 "A general value."
4.33
4.34 - name = "Value"
4.35 -
4.36 def __init__(self, value):
4.37 self.value = value
4.38
4.39 @@ -60,7 +52,7 @@
4.40
4.41 # Obtain the method for the node name.
4.42
4.43 - fn = getattr(self, node.name)
4.44 + fn = getattr(self, node.__name__)
4.45
4.46 # Call the method.
4.47
5.1 --- a/tests/name_attribute.py Sat Jan 21 00:03:13 2017 +0100
5.2 +++ b/tests/name_attribute.py Sat Jan 21 17:03:55 2017 +0100
5.3 @@ -4,13 +4,16 @@
5.4 pass
5.5
5.6 c = C()
5.7 -print c.__name__ # __main__.C
5.8 -print C.__name__ # __main__.C
5.9 +print c.__name__ # C
5.10 +print c.__mname__ # __main__
5.11 +print C.__name__ # C
5.12 +print C.__mname__ # __main__
5.13
5.14 -# If it were defined, operator.__name__ would be __builtins__.core.module.
5.15 +# If it were defined, operator.__name__ would be module.
5.16
5.17 -print operator.__mname__
5.18 +print operator.__mname__ # operator
5.19
5.20 -# If it were defined, operator.add.__name__ would be __builtins__.core.function.
5.21 +# If it were defined, operator.add.__name__ would be function.
5.22
5.23 -print operator.add.__fname__
5.24 +print operator.add.__fname__ # add
5.25 +print operator.add.__mname__ # operator.binary