diff options
-rw-r--r-- | .pylintrc | 1 | ||||
-rwxr-xr-x | setup.py | 1 | ||||
-rw-r--r-- | src/buildstream/_loader/loadelement.pyx (renamed from src/buildstream/_loader/loadelement.py) | 68 | ||||
-rw-r--r-- | src/buildstream/_loader/loader.py | 15 |
4 files changed, 56 insertions, 29 deletions
@@ -6,6 +6,7 @@ extension-pkg-whitelist= buildstream.node, buildstream._loader._loader, + buildstream._loader.loadelement, buildstream._loader.types, buildstream._utils, buildstream._variables, @@ -404,6 +404,7 @@ BUILD_EXTENSIONS = [] register_cython_module("buildstream.node") register_cython_module("buildstream._loader._loader") +register_cython_module("buildstream._loader.loadelement") register_cython_module("buildstream._loader.types", dependencies=["buildstream.node"]) register_cython_module("buildstream._yaml", dependencies=["buildstream.node"]) register_cython_module("buildstream._utils") diff --git a/src/buildstream/_loader/loadelement.py b/src/buildstream/_loader/loadelement.pyx index 773675e2b..f68d8615a 100644 --- a/src/buildstream/_loader/loadelement.py +++ b/src/buildstream/_loader/loadelement.pyx @@ -17,11 +17,38 @@ # Authors: # Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> -# System imports -from itertools import count - from pyroaring import BitMap, FrozenBitMap # pylint: disable=no-name-in-module +from ..node cimport MappingNode + + +# Counter to get ids to LoadElements +cdef int _counter = 0 + +cdef int _next_synthetic_counter(): + global _counter + _counter += 1 + return _counter + + +# Dependency(): +# +# A link from a LoadElement to its dependencies. +# +# Keeps a link to one of the current Element's dependencies, together with +# its dependency type. +# +# Args: +# element (LoadElement): a LoadElement on which there is a dependency +# dep_type (str): the type of dependency this dependency link is +cdef class Dependency: + cdef readonly LoadElement element + cdef readonly str dep_type + + def __init__(self, element, dep_type): + self.element = element + self.dep_type = dep_type + # LoadElement(): # @@ -33,25 +60,19 @@ from pyroaring import BitMap, FrozenBitMap # pylint: disable=no-name-in-module # name (str): The element name # loader (Loader): The Loader object for this element # -class LoadElement(): - # Dependency(): - # - # A link from a LoadElement to its dependencies. - # - # Keeps a link to one of the current Element's dependencies, together with - # its dependency type. - # - # Args: - # element (LoadElement): a LoadElement on which there is a dependency - # dep_type (str): the type of dependency this dependency link is - class Dependency: - def __init__(self, element, dep_type): - self.element = element - self.dep_type = dep_type +cdef class LoadElement: - _counter = count() + cdef readonly MappingNode node + cdef readonly str name + cdef readonly full_name + cdef public bint meta_done + cdef int node_id + cdef readonly object _loader + # TODO: if/when pyroaring exports symbols, we could type this statically + cdef object _dep_cache + cdef readonly list dependencies - def __init__(self, node, filename, loader): + def __init__(self, MappingNode node, str filename, object loader): # # Public members @@ -60,7 +81,7 @@ class LoadElement(): self.name = filename # The element name self.full_name = None # The element full name (with associated junction) self.meta_done = False # If the MetaElement for this LoadElement is done - self.node_id = next(self._counter) + self.node_id = _next_synthetic_counter() # # Private members @@ -103,14 +124,15 @@ class LoadElement(): # Returns: # (bool): True if this LoadElement depends on 'other' # - def depends(self, other): + def depends(self, LoadElement other not None): self._ensure_depends_cache() return other.node_id in self._dep_cache ########################################### # Private Methods # ########################################### - def _ensure_depends_cache(self): + cdef void _ensure_depends_cache(self): + cdef Dependency dep if self._dep_cache: return diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py index 33ccfb6fe..337d25844 100644 --- a/src/buildstream/_loader/loader.py +++ b/src/buildstream/_loader/loader.py @@ -30,7 +30,7 @@ from .._includes import Includes from ._loader import valid_chars_name from .types import Symbol, extract_depends_from_node -from .loadelement import LoadElement +from .loadelement import Dependency, LoadElement from .metaelement import MetaElement from .metasource import MetaSource from ..types import CoreWarnings @@ -121,8 +121,9 @@ class Loader(): # Set up a dummy element that depends on all top-level targets # to resolve potential circular dependencies between them dummy_target = LoadElement(Node.from_dict({}), "", self) - dummy_target.dependencies.extend( - LoadElement.Dependency(element, Symbol.RUNTIME) + # Pylint is not very happy with Cython and can't understand 'dependencies' is a list + dummy_target.dependencies.extend( # pylint: disable=no-member + Dependency(element, Symbol.RUNTIME) for element in target_elements ) @@ -334,13 +335,15 @@ class Loader(): dep_deps = extract_depends_from_node(dep_element.node) loader_queue.append((dep_element, list(reversed(dep_deps)), [])) - if dep_element.node.get_str(Symbol.KIND) == 'junction': + # Pylint is not very happy about Cython and can't understand 'node' is a 'MappingNode' + if dep_element.node.get_str(Symbol.KIND) == 'junction': # pylint: disable=no-member raise LoadError("{}: Cannot depend on junction" .format(dep.provenance), LoadErrorReason.INVALID_DATA) # All is well, push the dependency onto the LoadElement - current_element[0].dependencies.append( - LoadElement.Dependency(dep_element, dep.dep_type)) + # Pylint is not very happy with Cython and can't understand 'dependencies' is a list + current_element[0].dependencies.append( # pylint: disable=no-member + Dependency(dep_element, dep.dep_type)) else: # We do not have any more dependencies to load for this # element on the queue, report any invalid dep names |