summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Schubert <ben.c.schubert@gmail.com>2019-07-22 15:17:42 +0100
committerBenjamin Schubert <contact@benschubert.me>2019-07-26 08:55:26 +0100
commitfada80df076fc1ccf3991a3f9344c68a1db8bcda (patch)
treeaa4dc37194b68dced5c5d1bb55ce13f06f3e396e
parent6d70e5d432bd1197012201d00ecbe84d31725e7d (diff)
downloadbuildstream-fada80df076fc1ccf3991a3f9344c68a1db8bcda.tar.gz
loadelement: Move loadelement to Cython
-rw-r--r--.pylintrc1
-rwxr-xr-xsetup.py1
-rw-r--r--src/buildstream/_loader/loadelement.pyx (renamed from src/buildstream/_loader/loadelement.py)68
-rw-r--r--src/buildstream/_loader/loader.py15
4 files changed, 56 insertions, 29 deletions
diff --git a/.pylintrc b/.pylintrc
index e07219a41..cb4967a2f 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -6,6 +6,7 @@
extension-pkg-whitelist=
buildstream.node,
buildstream._loader._loader,
+ buildstream._loader.loadelement,
buildstream._loader.types,
buildstream._utils,
buildstream._variables,
diff --git a/setup.py b/setup.py
index 284e74d7f..141fb0539 100755
--- a/setup.py
+++ b/setup.py
@@ -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