1.1 --- a/common.py Sat Nov 26 23:05:45 2016 +0100
1.2 +++ b/common.py Sat Nov 26 23:07:09 2016 +0100
1.3 @@ -231,9 +231,26 @@
1.4
1.5 # Record the value and type for the constant.
1.6
1.7 - self.constant_values[objpath] = name_ref.value, name_ref.get_origin()
1.8 + self._reserve_constant(objpath, name_ref.value, name_ref.get_origin())
1.9 return name_ref
1.10
1.11 + def reserve_constant(self, objpath, value, origin):
1.12 +
1.13 + """
1.14 + Reserve a constant within 'objpath' with the given 'value' and having a
1.15 + type with the given 'origin'.
1.16 + """
1.17 +
1.18 + constant_name = self.get_constant_name(value)
1.19 + objpath = self.get_object_path(constant_name)
1.20 + self._reserve_constant(objpath, value, origin)
1.21 +
1.22 + def _reserve_constant(self, objpath, value, origin):
1.23 +
1.24 + "Store a constant for 'objpath' with the given 'value' and 'origin'."
1.25 +
1.26 + self.constant_values[objpath] = value, origin
1.27 +
1.28 def get_literal_reference(self, name, ref, items, cls):
1.29
1.30 """
2.1 --- a/generator.py Sat Nov 26 23:05:45 2016 +0100
2.2 +++ b/generator.py Sat Nov 26 23:07:09 2016 +0100
2.3 @@ -783,6 +783,18 @@
2.4 encode_literal_constant_value(attr)))
2.5 continue
2.6
2.7 + # Special cases.
2.8 +
2.9 + elif attrname in ("__fname__", "__name__"):
2.10 + path = ref.get_origin()
2.11 + local_number = self.importer.all_constants[path][path]
2.12 + constant_name = "$c%d" % local_number
2.13 + attr_path = "%s.%s" % (path, constant_name)
2.14 + constant_number = self.optimiser.constant_numbers[attr_path]
2.15 + constant_value = "__const%d" % constant_number
2.16 + structure.append("%s /* %s */" % (constant_value, attrname))
2.17 + continue
2.18 +
2.19 structure.append(self.encode_member(origin, attrname, attr, kind))
2.20
2.21 def encode_member(self, path, name, ref, structure_type):
2.22 @@ -813,16 +825,6 @@
2.23 attr_path = encode_predefined_reference("%s.%s" % (path, name))
2.24 return "{&%s, &%s} /* %s */" % (attr_path, attr_path, name)
2.25
2.26 - # Special cases.
2.27 -
2.28 - if name == "__name__":
2.29 - local_number = self.importer.all_constants[path][path]
2.30 - constant_name = "$c%d" % local_number
2.31 - attr_path = "%s.%s" % (path, constant_name)
2.32 - constant_number = self.optimiser.constant_numbers[attr_path]
2.33 - constant_value = "__const%d" % constant_number
2.34 - return "%s /* %s */" % (constant_value, name)
2.35 -
2.36 # General undetermined members.
2.37
2.38 if kind in ("<var>", "<instance>"):
3.1 --- a/inspector.py Sat Nov 26 23:05:45 2016 +0100
3.2 +++ b/inspector.py Sat Nov 26 23:07:09 2016 +0100
3.3 @@ -640,6 +640,11 @@
3.4
3.5 self.enter_namespace(name)
3.6
3.7 + # Define a name attribute value for the function instance.
3.8 +
3.9 + ref = self.get_builtin_class("string")
3.10 + self.reserve_constant(function_name, function_name, ref.get_origin())
3.11 +
3.12 # Track attribute usage within the namespace.
3.13
3.14 path = self.get_namespace_path()
3.15 @@ -1256,12 +1261,16 @@
3.16 using the optional 'ref'.
3.17 """
3.18
3.19 - init_item(self.instance_attrs, self.in_class, set)
3.20 - self.instance_attrs[self.in_class].add(name)
3.21 + self._set_instance_attr(self.in_class, name, ref)
3.22 +
3.23 + def _set_instance_attr(self, path, name, ref=None):
3.24 +
3.25 + init_item(self.instance_attrs, path, set)
3.26 + self.instance_attrs[path].add(name)
3.27
3.28 if ref:
3.29 - init_item(self.instance_attr_constants, self.in_class, dict)
3.30 - self.instance_attr_constants[self.in_class][name] = ref
3.31 + init_item(self.instance_attr_constants, path, dict)
3.32 + self.instance_attr_constants[path][name] = ref
3.33
3.34 def get_initialising_value(self, value):
3.35
4.1 --- a/lib/__builtins__/core.py Sat Nov 26 23:05:45 2016 +0100
4.2 +++ b/lib/__builtins__/core.py Sat Nov 26 23:07:09 2016 +0100
4.3 @@ -60,6 +60,7 @@
4.4
4.5 self.__fn__ = None
4.6 self.__args__ = None
4.7 + self.__fname__ = None
4.8
4.9 def __bool__(self):
4.10
4.11 @@ -71,7 +72,7 @@
4.12
4.13 "Return a string representation."
4.14
4.15 - return "<function>" # NOTE: Could be made specific.
4.16 + return self.__fname__
4.17
4.18 __repr__ = __str__
4.19
5.1 --- a/tests/aliases.py Sat Nov 26 23:05:45 2016 +0100
5.2 +++ b/tests/aliases.py Sat Nov 26 23:07:09 2016 +0100
5.3 @@ -24,8 +24,8 @@
5.4
5.5 print c # "<type>"
5.6 print d # "<type>"
5.7 - print cm # "<function>"
5.8 - print dm # "<function>"
5.9 + print cm # "__main__.C.m"
5.10 + print dm # "__main__.C.m"
5.11
5.12 c = E
5.13 d = F # E
5.14 @@ -34,8 +34,8 @@
5.15
5.16 print c # "<type>"
5.17 print d # "<type>"
5.18 - print cm # "<function>"
5.19 - print dm # "<function>"
5.20 + print cm # "__main__.E.m"
5.21 + print dm # "__main__.E.m"
5.22
5.23 f()
5.24
5.25 @@ -44,17 +44,17 @@
5.26 Em = E.m
5.27 Fm = F.m
5.28
5.29 -print Cm # "<function>"
5.30 -print Dm # "<function>"
5.31 -print Em # "<function>"
5.32 -print Fm # "<function>"
5.33 +print Cm # "__main__.C.m"
5.34 +print Dm # "__main__.C.m"
5.35 +print Em # "__main__.E.m"
5.36 +print Fm # "__main__.E.m"
5.37
5.38 def g():
5.39 Cm = E.m
5.40 Dm = F.m # E.m
5.41
5.42 - print Cm # "<function>"
5.43 - print Dm # "<function>"
5.44 + print Cm # "__main__.E.m"
5.45 + print Dm # "__main__.E.m"
5.46
5.47 g()
5.48
5.49 @@ -63,11 +63,14 @@
5.50 Em = C.m
5.51 Fm = D.m # C.m
5.52
5.53 - print Cm # "<function>"
5.54 - print Dm # "<function>"
5.55 + print Em # "__main__.C.m"
5.56 + print Fm # "__main__.C.m"
5.57
5.58 h()
5.59
5.60 +print Em # "__main__.C.m"
5.61 +print Fm # "__main__.C.m"
5.62 +
5.63 Ci = C()
5.64 Ei = E()
5.65
5.66 @@ -89,6 +92,8 @@
5.67
5.68 j()
5.69
5.70 +print Ei # "__main__.C"
5.71 +
5.72 L = []
5.73 M = [1]
5.74