diff options
author | Daniel Silverstone <daniel.silverstone@codethink.co.uk> | 2019-05-30 13:27:23 +0100 |
---|---|---|
committer | Daniel Silverstone <daniel.silverstone@codethink.co.uk> | 2019-05-30 14:42:33 +0100 |
commit | 4ad986861bed89a23fc99dcf3e398e7fc9afbc94 (patch) | |
tree | 4837ab44d25dd29282dbb4cf99a46c8af6f148a8 /src | |
parent | 02483728b310cac9b8f687b57f061adfe783f99c (diff) | |
download | buildstream-4ad986861bed89a23fc99dcf3e398e7fc9afbc94.tar.gz |
loader.py: Make _sort_dependencies() a static iterative method
The _sort_dependencies() method does not need to be an instance method,
nor does it need to be recursive. This fixes both of those things which
can get us closer to being able to cythonize the loader.
Signed-off-by: Daniel Silverstone <daniel.silverstone@codethink.co.uk>
Diffstat (limited to 'src')
-rw-r--r-- | src/buildstream/_loader/loader.py | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py index 5a1819e32..13b2d1213 100644 --- a/src/buildstream/_loader/loader.py +++ b/src/buildstream/_loader/loader.py @@ -391,15 +391,11 @@ class Loader(): # Args: # element (LoadElement): The element to sort # - def _sort_dependencies(self, element, visited=None): - if visited is None: - visited = set() - - if element in visited: - return + @staticmethod + def _sort_dependencies(element): - for dep in element.dependencies: - dep.element._loader._sort_dependencies(dep.element, visited=visited) + working_elements = [element] + visited = set(working_elements) def dependency_cmp(dep_a, dep_b): element_a = dep_a.element @@ -443,9 +439,16 @@ class Loader(): # Now dependency sort, we ensure that if any direct dependency # directly or indirectly depends on another direct dependency, # it is found later in the list. - element.dependencies.sort(key=cmp_to_key(dependency_cmp)) + while working_elements: + element = working_elements.pop() + for dep in element.dependencies: + dep_element = dep.element + if dep_element not in visited: + visited.add(dep_element) + working_elements.append(dep_element) + + element.dependencies.sort(key=cmp_to_key(dependency_cmp)) - visited.add(element) # _collect_element() # |