1.1 --- a/common.py Sat Nov 19 23:15:52 2016 +0100
1.2 +++ b/common.py Sat Nov 19 23:16:37 2016 +0100
1.3 @@ -311,16 +311,16 @@
1.4
1.5 return self.process_structure_node(assignment)
1.6
1.7 - def process_assignment_for_function(self, original_name, name):
1.8 + def process_assignment_for_function(self, original_name, source):
1.9
1.10 """
1.11 Return an assignment operation making 'original_name' refer to the given
1.12 - 'name'.
1.13 + 'source'.
1.14 """
1.15
1.16 assignment = compiler.ast.Assign(
1.17 [compiler.ast.AssName(original_name, "OP_ASSIGN")],
1.18 - compiler.ast.Name(name)
1.19 + source
1.20 )
1.21
1.22 return self.process_structure_node(assignment)
2.1 --- a/translator.py Sat Nov 19 23:15:52 2016 +0100
2.2 +++ b/translator.py Sat Nov 19 23:16:37 2016 +0100
2.3 @@ -102,7 +102,7 @@
2.4
2.5 # Eliminate assignments between constants.
2.6
2.7 - if self.static() and isinstance(self.expr, results.ResolvedNameRef) and self.expr.static():
2.8 + if ref and isinstance(self.expr, results.ResolvedNameRef) and self.expr.static():
2.9 return ""
2.10
2.11 # Qualified names must be converted into parent-relative assignments.
2.12 @@ -746,24 +746,32 @@
2.13 # Where a function is declared conditionally, use a separate name for
2.14 # the definition, and assign the definition to the stated name.
2.15
2.16 + original_name = n.name
2.17 +
2.18 if self.in_conditional or self.in_function:
2.19 - original_name = n.name
2.20 name = self.get_lambda_name()
2.21 else:
2.22 - original_name = None
2.23 name = n.name
2.24
2.25 + objpath = self.get_object_path(name)
2.26 +
2.27 # Obtain details of the defaults.
2.28
2.29 - defaults = self.process_function_defaults(n, name, "&%s" % self.get_object_path(name))
2.30 + defaults = self.process_function_defaults(n, name, "&%s" % objpath)
2.31 if defaults:
2.32 for default in defaults:
2.33 self.writeline("%s;" % default)
2.34
2.35 - # Where a function is set conditionally, assign the name.
2.36 + # Where a function is set conditionally or where the name may refer to
2.37 + # different values, assign the name.
2.38 +
2.39 + ref = self.importer.identify(objpath)
2.40
2.41 - if original_name:
2.42 - self.process_assignment_for_function(original_name, name)
2.43 + if self.in_conditional or self.in_function:
2.44 + self.process_assignment_for_function(original_name, compiler.ast.Name(name))
2.45 + elif not ref.static():
2.46 + self.process_assignment_for_function(original_name,
2.47 + make_expression("((__attr) {0, &%s})" % encode_path(objpath)))
2.48
2.49 def process_function_defaults(self, n, name, instance_name):
2.50