# HG changeset patch # User Paul Boddie # Date 1479593797 -3600 # Node ID c331b40e0896b9a18783c9bf815c0a75bb64bcb3 # Parent cbca47e004fe55b782101d880e15d0e092f2717b Assign functions to names in namespaces where such names are reused. diff -r cbca47e004fe -r c331b40e0896 common.py --- a/common.py Sat Nov 19 23:15:52 2016 +0100 +++ b/common.py Sat Nov 19 23:16:37 2016 +0100 @@ -311,16 +311,16 @@ return self.process_structure_node(assignment) - def process_assignment_for_function(self, original_name, name): + def process_assignment_for_function(self, original_name, source): """ Return an assignment operation making 'original_name' refer to the given - 'name'. + 'source'. """ assignment = compiler.ast.Assign( [compiler.ast.AssName(original_name, "OP_ASSIGN")], - compiler.ast.Name(name) + source ) return self.process_structure_node(assignment) diff -r cbca47e004fe -r c331b40e0896 translator.py --- a/translator.py Sat Nov 19 23:15:52 2016 +0100 +++ b/translator.py Sat Nov 19 23:16:37 2016 +0100 @@ -102,7 +102,7 @@ # Eliminate assignments between constants. - if self.static() and isinstance(self.expr, results.ResolvedNameRef) and self.expr.static(): + if ref and isinstance(self.expr, results.ResolvedNameRef) and self.expr.static(): return "" # Qualified names must be converted into parent-relative assignments. @@ -746,24 +746,32 @@ # Where a function is declared conditionally, use a separate name for # the definition, and assign the definition to the stated name. + original_name = n.name + if self.in_conditional or self.in_function: - original_name = n.name name = self.get_lambda_name() else: - original_name = None name = n.name + objpath = self.get_object_path(name) + # Obtain details of the defaults. - defaults = self.process_function_defaults(n, name, "&%s" % self.get_object_path(name)) + defaults = self.process_function_defaults(n, name, "&%s" % objpath) if defaults: for default in defaults: self.writeline("%s;" % default) - # Where a function is set conditionally, assign the name. + # Where a function is set conditionally or where the name may refer to + # different values, assign the name. + + ref = self.importer.identify(objpath) - if original_name: - self.process_assignment_for_function(original_name, name) + if self.in_conditional or self.in_function: + self.process_assignment_for_function(original_name, compiler.ast.Name(name)) + elif not ref.static(): + self.process_assignment_for_function(original_name, + make_expression("((__attr) {0, &%s})" % encode_path(objpath))) def process_function_defaults(self, n, name, instance_name):