1.1 --- a/translator.py Sat Nov 19 23:15:52 2016 +0100
1.2 +++ b/translator.py Sat Nov 19 23:16:37 2016 +0100
1.3 @@ -102,7 +102,7 @@
1.4
1.5 # Eliminate assignments between constants.
1.6
1.7 - if self.static() and isinstance(self.expr, results.ResolvedNameRef) and self.expr.static():
1.8 + if ref and isinstance(self.expr, results.ResolvedNameRef) and self.expr.static():
1.9 return ""
1.10
1.11 # Qualified names must be converted into parent-relative assignments.
1.12 @@ -746,24 +746,32 @@
1.13 # Where a function is declared conditionally, use a separate name for
1.14 # the definition, and assign the definition to the stated name.
1.15
1.16 + original_name = n.name
1.17 +
1.18 if self.in_conditional or self.in_function:
1.19 - original_name = n.name
1.20 name = self.get_lambda_name()
1.21 else:
1.22 - original_name = None
1.23 name = n.name
1.24
1.25 + objpath = self.get_object_path(name)
1.26 +
1.27 # Obtain details of the defaults.
1.28
1.29 - defaults = self.process_function_defaults(n, name, "&%s" % self.get_object_path(name))
1.30 + defaults = self.process_function_defaults(n, name, "&%s" % objpath)
1.31 if defaults:
1.32 for default in defaults:
1.33 self.writeline("%s;" % default)
1.34
1.35 - # Where a function is set conditionally, assign the name.
1.36 + # Where a function is set conditionally or where the name may refer to
1.37 + # different values, assign the name.
1.38 +
1.39 + ref = self.importer.identify(objpath)
1.40
1.41 - if original_name:
1.42 - self.process_assignment_for_function(original_name, name)
1.43 + if self.in_conditional or self.in_function:
1.44 + self.process_assignment_for_function(original_name, compiler.ast.Name(name))
1.45 + elif not ref.static():
1.46 + self.process_assignment_for_function(original_name,
1.47 + make_expression("((__attr) {0, &%s})" % encode_path(objpath)))
1.48
1.49 def process_function_defaults(self, n, name, instance_name):
1.50