# HG changeset patch # User Paul Boddie # Date 1480893628 -3600 # Node ID 6acc19256bb90e5b8cc2fc63fc4dd29f63a9354f # Parent f1025f7d7d5e7023325b6a54d96e74f05a9ca067 Attempted to improve the computation of module ordering. diff -r f1025f7d7d5e -r 6acc19256bb9 importer.py --- a/importer.py Mon Dec 05 00:17:35 2016 +0100 +++ b/importer.py Mon Dec 05 00:20:28 2016 +0100 @@ -474,27 +474,43 @@ "Produce a module initialisation ordering." self.check_ordering() - return self.order_modules_for_module("__main__", set()) + + module_names = self.modules.keys() - def order_modules_for_module(self, module_name, visited): + # Record the number of modules using or depending on each module. + + usage = {} - """ - Order the modules required by 'module_name', using 'visited' to track - visited modules. - """ + for module_name in module_names: + usage[module_name] = 0 + + for module_name, depend_names in self.depends.items(): + if module_name in module_names: + for depend_name in depend_names: + if depend_name in module_names: + usage[depend_name] += 1 + + # Produce an ordering by obtaining exposed modules (required by modules + # already processed) and putting them at the start of the list. - if module_name in visited: - return [] + ordered = [] + + while usage: + for module_name, n in usage.items(): + if n == 0: + ordered.insert(0, module_name) + module_names = self.depends.get(module_name) - module = self.modules[module_name] - visited.add(module_name) - ordered = [module_name] + # Reduce usage of the referenced modules. - for module_name in module.required: - modules = self.order_modules_for_module(module_name, visited) - ordered[:0] = modules - visited.update(modules) + if module_names: + for name in module_names: + usage[name] -= 1 + del usage[module_name] + + ordered.remove("__main__") + ordered.append("__main__") return ordered def check_ordering(self):