# HG changeset patch # User Paul Boddie # Date 1489506004 -3600 # Node ID 640bb383ee53c09a7a51cb0af654482b8b18a9ef # Parent 881299824661ae4960d38f5c99bc97d95b0d47ca Replaced resolved return value recording with initialised/aliased name details, using a special "$return" name together with return statement instance numbering to give distinct name versions. diff -r 881299824661 -r 640bb383ee53 deducer.py --- a/deducer.py Mon Mar 13 17:59:13 2017 +0100 +++ b/deducer.py Tue Mar 14 16:40:04 2017 +0100 @@ -1864,9 +1864,7 @@ if ref.has_kind(""): return ref elif ref.has_kind(""): - refs = self.importer.all_return_values.get(ref.get_origin()) - if refs and len(refs) == 1: - return first(refs) + return self.convert_function_invocation(ref) return Reference("") @@ -1887,9 +1885,19 @@ if ref.has_kind(""): return ref.instance_of() elif ref.has_kind(""): - refs = self.importer.all_return_values.get(ref.get_origin()) - if refs and len(refs) == 1: - return first(refs) + return self.convert_function_invocation(ref) + + return Reference("") + + def convert_function_invocation(self, ref): + + "Convert the function 'ref' to its return value reference." + + initialised_names = self.importer.all_initialised_names.get((ref.get_origin(), "$return")) + if initialised_names: + refs = set(initialised_names.values()) + if len(refs) == 1: + return first(refs) return Reference("") diff -r 881299824661 -r 640bb383ee53 importer.py --- a/importer.py Mon Mar 13 17:59:13 2017 +0100 +++ b/importer.py Tue Mar 14 16:40:04 2017 +0100 @@ -116,10 +116,6 @@ self.all_constants = {} self.all_constant_values = {} - # Return values. - - self.all_return_values = {} - self.make_cache() def give_warning(self, name): diff -r 881299824661 -r 640bb383ee53 inspector.py --- a/inspector.py Mon Mar 13 17:59:13 2017 +0100 +++ b/inspector.py Tue Mar 14 16:40:04 2017 +0100 @@ -1487,7 +1487,7 @@ "Record the given return 'expr'." path = self.get_namespace_path() - init_item(self.return_values, path, set) - self.return_values[path].add(expr) + init_item(self.return_values, path, list) + self.return_values[path].append(expr) # vim: tabstop=4 expandtab shiftwidth=4 diff -r 881299824661 -r 640bb383ee53 modules.py --- a/modules.py Mon Mar 13 17:59:13 2017 +0100 +++ b/modules.py Tue Mar 14 16:40:04 2017 +0100 @@ -115,7 +115,6 @@ self.propagate_name_references() self.propagate_attr_accesses() self.propagate_constants() - self.propagate_return_values() def unpropagate(self): @@ -152,7 +151,6 @@ remove_items(self.importer.all_attr_access_modifiers, self.attr_access_modifiers) remove_items(self.importer.all_constants, self.constants) remove_items(self.importer.all_constant_values, self.constant_values) - remove_items(self.importer.all_return_values, self.return_values) # Remove this module's objects from the importer. Objects are # automatically propagated when defined. @@ -222,12 +220,6 @@ self.importer.all_instance_attrs[name] = self.instance_attrs.get(name) or {} self.importer.all_instance_attr_constants[name] = self.instance_attr_constants.get(name) or {} - def propagate_return_values(self): - - "Propagate return values for the module." - - self.importer.all_return_values.update(self.return_values) - def set_object(self, name, value=None): "Set an object with the given 'name' and the given 'value'." @@ -410,7 +402,6 @@ self._get_constant_literals(f) self._get_constant_values(f) self._get_exception_namespaces(f) - self._get_return_values(f) finally: f.close() @@ -631,15 +622,6 @@ self.exception_namespaces = value and set(value.split(", ")) or set() f.readline() - def _get_return_values(self, f): - f.readline() # "return values:" - line = f.readline().rstrip() - while line: - path, values = self._get_fields(line) - values = values.split(", ") - self.return_values[path] = map(decode_reference, values) - line = f.readline().rstrip() - # Generic parsing methods. def from_lines(self, f, d): @@ -897,13 +879,6 @@ paths.sort() print >>f, ", ".join(paths) - print >>f - print >>f, "return values:" - paths = self.return_values.keys() - paths.sort() - for path in paths: - print >>f, path, ", ".join(map(str, self.return_values[path])) - finally: f.close() diff -r 881299824661 -r 640bb383ee53 resolving.py --- a/resolving.py Mon Mar 13 17:59:13 2017 +0100 +++ b/resolving.py Tue Mar 14 16:40:04 2017 +0100 @@ -259,26 +259,26 @@ "Resolve return values using name references." - return_values = {} - # Get the return values from each namespace. for path, values in self.return_values.items(): - l = set() + + # Resolve each return value provided by the scope. - for value in values: - if not value: - ref = None - else: - ref, aliased_name = self.resolve_reference(path, value) + initialised_names = {} + aliased_names = {} - l.add(ref or Reference("")) - - return_values[path] = l + for i, name_ref in enumerate(values): + initialised_ref, aliased_name = self.resolve_reference(path, name_ref) + if initialised_ref: + initialised_names[i] = initialised_ref + if aliased_name: + aliased_names[i] = aliased_name - # Replace the original values. - - self.return_values = return_values + if initialised_names: + self.initialised_names[(path, "$return")] = initialised_names + if aliased_names: + self.aliased_names[(path, "$return")] = aliased_names def resolve_reference(self, path, name_ref):