summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <daniel.silverstone@codethink.co.uk>2019-05-30 13:27:23 +0100
committerDaniel Silverstone <daniel.silverstone@codethink.co.uk>2019-05-30 14:42:33 +0100
commit4ad986861bed89a23fc99dcf3e398e7fc9afbc94 (patch)
tree4837ab44d25dd29282dbb4cf99a46c8af6f148a8
parent02483728b310cac9b8f687b57f061adfe783f99c (diff)
downloadbuildstream-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>
-rw-r--r--src/buildstream/_loader/loader.py23
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()
#