1.1 --- a/importer.py Mon Dec 05 00:17:35 2016 +0100
1.2 +++ b/importer.py Mon Dec 05 00:20:28 2016 +0100
1.3 @@ -474,27 +474,43 @@
1.4 "Produce a module initialisation ordering."
1.5
1.6 self.check_ordering()
1.7 - return self.order_modules_for_module("__main__", set())
1.8 +
1.9 + module_names = self.modules.keys()
1.10
1.11 - def order_modules_for_module(self, module_name, visited):
1.12 + # Record the number of modules using or depending on each module.
1.13 +
1.14 + usage = {}
1.15
1.16 - """
1.17 - Order the modules required by 'module_name', using 'visited' to track
1.18 - visited modules.
1.19 - """
1.20 + for module_name in module_names:
1.21 + usage[module_name] = 0
1.22 +
1.23 + for module_name, depend_names in self.depends.items():
1.24 + if module_name in module_names:
1.25 + for depend_name in depend_names:
1.26 + if depend_name in module_names:
1.27 + usage[depend_name] += 1
1.28 +
1.29 + # Produce an ordering by obtaining exposed modules (required by modules
1.30 + # already processed) and putting them at the start of the list.
1.31
1.32 - if module_name in visited:
1.33 - return []
1.34 + ordered = []
1.35 +
1.36 + while usage:
1.37 + for module_name, n in usage.items():
1.38 + if n == 0:
1.39 + ordered.insert(0, module_name)
1.40 + module_names = self.depends.get(module_name)
1.41
1.42 - module = self.modules[module_name]
1.43 - visited.add(module_name)
1.44 - ordered = [module_name]
1.45 + # Reduce usage of the referenced modules.
1.46
1.47 - for module_name in module.required:
1.48 - modules = self.order_modules_for_module(module_name, visited)
1.49 - ordered[:0] = modules
1.50 - visited.update(modules)
1.51 + if module_names:
1.52 + for name in module_names:
1.53 + usage[name] -= 1
1.54
1.55 + del usage[module_name]
1.56 +
1.57 + ordered.remove("__main__")
1.58 + ordered.append("__main__")
1.59 return ordered
1.60
1.61 def check_ordering(self):