1.1 --- a/transresults.py Sun Nov 14 00:32:11 2021 +0100
1.2 +++ b/transresults.py Sun Nov 14 00:37:32 2021 +0100
1.3 @@ -67,6 +67,20 @@
1.4 ResolvedNameRef.__init__(self, name, ref, expr, is_global)
1.5 self.location = location
1.6
1.7 + # For sources, any identified static origin will be constant and thus
1.8 + # usable directly. For targets, no constant should be assigned and thus
1.9 + # the alias (or any plain name) will be used.
1.10 +
1.11 + self.static_ref = self.static()
1.12 + origin = self.static_ref and self.get_origin()
1.13 + self.static_name = origin and encode_path(origin)
1.14 +
1.15 + # Determine whether a qualified name is involved.
1.16 +
1.17 + t = (not self.is_constant_alias() and self.get_name() or self.name).rsplit(".", 1)
1.18 + self.parent = len(t) > 1 and t[0] or None
1.19 + self.attrname = t[-1] and encode_path(t[-1])
1.20 +
1.21 def access_location(self):
1.22 return self.location
1.23
1.24 @@ -82,55 +96,41 @@
1.25 else:
1.26 return encode_path(self.name)
1.27
1.28 - # For sources, any identified static origin will be constant and thus
1.29 - # usable directly. For targets, no constant should be assigned and thus
1.30 - # the alias (or any plain name) will be used.
1.31 -
1.32 - ref = self.static()
1.33 - origin = ref and self.get_origin()
1.34 - static_name = origin and encode_path(origin)
1.35 -
1.36 - # Determine whether a qualified name is involved.
1.37 -
1.38 - t = (not self.is_constant_alias() and self.get_name() or self.name).rsplit(".", 1)
1.39 - parent = len(t) > 1 and t[0] or None
1.40 - attrname = t[-1] and encode_path(t[-1])
1.41 -
1.42 # Assignments.
1.43
1.44 if self.expr:
1.45
1.46 # Eliminate assignments between constants.
1.47
1.48 - if ref and self.expr.static():
1.49 + if self.static_ref and self.expr.static():
1.50 return ""
1.51
1.52 # Qualified names must be converted into parent-relative assignments.
1.53
1.54 - elif parent:
1.55 + elif self.parent:
1.56 return "__store_via_object(&%s, %s, %s)" % (
1.57 - encode_path(parent), attrname, self.expr)
1.58 + encode_path(self.parent), self.attrname, self.expr)
1.59
1.60 # All other assignments involve the names as they were given.
1.61
1.62 else:
1.63 - return "%s = %s" % (attrname, self.expr)
1.64 + return "%s = %s" % (self.attrname, self.expr)
1.65
1.66 # Expressions.
1.67
1.68 - elif static_name:
1.69 - return "__ATTRVALUE(&%s)" % static_name
1.70 + elif self.static_name:
1.71 + return "__ATTRVALUE(&%s)" % self.static_name
1.72
1.73 # Qualified names must be converted into parent-relative accesses.
1.74
1.75 - elif parent:
1.76 + elif self.parent:
1.77 return "__load_via_object(&%s, %s)" % (
1.78 - encode_path(parent), attrname)
1.79 + encode_path(self.parent), self.attrname)
1.80
1.81 # All other accesses involve the names as they were given.
1.82
1.83 else:
1.84 - return "(%s)" % attrname
1.85 + return "(%s)" % self.attrname
1.86
1.87 class TrConstantValueRef(ConstantValueRef):
1.88