summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Schubert <contact@benschubert.me>2019-05-22 22:55:20 +0100
committerBenjamin Schubert <contact@benschubert.me>2019-05-22 22:55:20 +0100
commit760a9ab23285282d211b0ae6302f9a22f192d0df (patch)
treee8e67a71999e09ddec7b834dcdb761fd75008308
parent7d713b5487aa7d6ea9a6144152446c3d0504c186 (diff)
downloadbuildstream-more-cython.tar.gz
WIP: cythonize extract_depends_from_nodemore-cython
-rw-r--r--src/buildstream/_loader/_loader.pyx54
-rw-r--r--src/buildstream/_loader/loadelement.py47
-rw-r--r--src/buildstream/_loader/loader.py6
-rw-r--r--src/buildstream/_yaml.pxd3
-rw-r--r--src/buildstream/_yaml.pyx2
5 files changed, 60 insertions, 52 deletions
diff --git a/src/buildstream/_loader/_loader.pyx b/src/buildstream/_loader/_loader.pyx
index dc55dcbfb..2ab1491fb 100644
--- a/src/buildstream/_loader/_loader.pyx
+++ b/src/buildstream/_loader/_loader.pyx
@@ -1,3 +1,6 @@
+from .. cimport _yaml
+from .types import Symbol, Dependency
+
# Check if given filename containers valid characters.
#
# Args:
@@ -29,3 +32,54 @@ def valid_chars_name(str name):
return False
return True
+
+
+cdef _extract_depends_from_node(_yaml.Node node, str key):
+ cdef str default_dep_type
+
+ if key == Symbol.BUILD_DEPENDS:
+ default_dep_type = Symbol.BUILD
+ elif key == Symbol.RUNTIME_DEPENDS:
+ default_dep_type = Symbol.RUNTIME
+ elif key == Symbol.DEPENDS:
+ default_dep_type = None
+ else:
+ assert False, "Unexpected value of key '{}'".format(key)
+
+ cdef list depends = <list> _yaml.node_get(node, list, key, None, [])
+ cdef list output_deps = []
+ cdef int index
+ cdef str dep
+
+ for index, dep in enumerate(depends):
+ dep_provenance = _yaml.node_get_provenance(node, key=key, indices=[index])
+ dependency = Dependency(dep, dep_provenance, default_dep_type=default_dep_type)
+ output_deps.append(dependency)
+
+ # Now delete the field, we dont want it anymore
+ _yaml.node_del(node, key, True)
+ return output_deps
+
+
+# _extract_depends_from_node():
+#
+# Creates an array of Dependency objects from a given dict node 'node',
+# allows both strings and dicts for expressing the dependency and
+# throws a comprehensive LoadError in the case that the node is malformed.
+#
+# After extracting depends, the symbol is deleted from the node
+#
+# Args:
+# node (dict): A YAML loaded dictionary
+#
+# Returns:
+# (list): a list of Dependency objects
+#
+def extract_depends_from_node(_yaml.Node node):
+ cdef list build_depends, runtime_depends, depends
+
+ build_depends = _extract_depends_from_node(node, key=Symbol.BUILD_DEPENDS)
+ runtime_depends = _extract_depends_from_node(node, key=Symbol.RUNTIME_DEPENDS)
+ depends = _extract_depends_from_node(node, key=Symbol.DEPENDS)
+
+ return build_depends + runtime_depends + depends
diff --git a/src/buildstream/_loader/loadelement.py b/src/buildstream/_loader/loadelement.py
index 684c32554..d8dc70b8d 100644
--- a/src/buildstream/_loader/loadelement.py
+++ b/src/buildstream/_loader/loadelement.py
@@ -22,12 +22,8 @@ from itertools import count
from pyroaring import BitMap, FrozenBitMap # pylint: disable=no-name-in-module
-# BuildStream toplevel imports
from .. import _yaml
-# Local package imports
-from .types import Symbol, Dependency
-
# LoadElement():
#
@@ -136,46 +132,3 @@ class LoadElement():
self._dep_cache.update(elt._dep_cache)
self._dep_cache = FrozenBitMap(self._dep_cache)
-
-
-# _extract_depends_from_node():
-#
-# Creates an array of Dependency objects from a given dict node 'node',
-# allows both strings and dicts for expressing the dependency and
-# throws a comprehensive LoadError in the case that the node is malformed.
-#
-# After extracting depends, the symbol is deleted from the node
-#
-# Args:
-# node (dict): A YAML loaded dictionary
-#
-# Returns:
-# (list): a list of Dependency objects
-#
-def _extract_depends_from_node(node, *, key=None):
- if key is None:
- build_depends = _extract_depends_from_node(node, key=Symbol.BUILD_DEPENDS)
- runtime_depends = _extract_depends_from_node(node, key=Symbol.RUNTIME_DEPENDS)
- depends = _extract_depends_from_node(node, key=Symbol.DEPENDS)
- return build_depends + runtime_depends + depends
- elif key == Symbol.BUILD_DEPENDS:
- default_dep_type = Symbol.BUILD
- elif key == Symbol.RUNTIME_DEPENDS:
- default_dep_type = Symbol.RUNTIME
- elif key == Symbol.DEPENDS:
- default_dep_type = None
- else:
- assert False, "Unexpected value of key '{}'".format(key)
-
- depends = _yaml.node_get(node, list, key, default_value=[])
- output_deps = []
-
- for index, dep in enumerate(depends):
- dep_provenance = _yaml.node_get_provenance(node, key=key, indices=[index])
- dependency = Dependency(dep, dep_provenance, default_dep_type=default_dep_type)
- output_deps.append(dependency)
-
- # Now delete the field, we dont want it anymore
- _yaml.node_del(node, key, safe=True)
-
- return output_deps
diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py
index 9246bb1ab..e682f92f0 100644
--- a/src/buildstream/_loader/loader.py
+++ b/src/buildstream/_loader/loader.py
@@ -28,9 +28,9 @@ from ..element import Element
from .._profile import Topics, PROFILER
from .._includes import Includes
-from ._loader import valid_chars_name
+from ._loader import valid_chars_name, extract_depends_from_node
from .types import Symbol
-from .loadelement import LoadElement, _extract_depends_from_node
+from .loadelement import LoadElement
from .metaelement import MetaElement
from .metasource import MetaSource
from ..types import CoreWarnings
@@ -249,7 +249,7 @@ class Loader():
self._elements[filename] = element
- dependencies = _extract_depends_from_node(node)
+ dependencies = extract_depends_from_node(node)
# Load all dependency files for the new LoadElement
for dep in dependencies:
diff --git a/src/buildstream/_yaml.pxd b/src/buildstream/_yaml.pxd
index 8be11a519..62c00d30b 100644
--- a/src/buildstream/_yaml.pxd
+++ b/src/buildstream/_yaml.pxd
@@ -38,5 +38,6 @@ cdef class ProvenanceInformation:
cpdef object node_get(Node node, object expected_type, str key, list indices=*, object default_value=*, bint allow_none=*)
cpdef void node_set(Node node, object key, object value, list indices=*) except *
+cpdef void node_del(Node node, str key, bint safe=*) except *
cpdef list node_keys(object node)
-cpdef ProvenanceInformation node_get_provenance(Node node, str key=*, list indices=*) \ No newline at end of file
+cpdef ProvenanceInformation node_get_provenance(Node node, str key=*, list indices=*)
diff --git a/src/buildstream/_yaml.pyx b/src/buildstream/_yaml.pyx
index 886ac10fb..160db238d 100644
--- a/src/buildstream/_yaml.pyx
+++ b/src/buildstream/_yaml.pyx
@@ -716,7 +716,7 @@ cpdef list node_keys(object node):
# key (str): The key we want to remove
# safe (bool): Whether to raise a KeyError if unable
#
-def node_del(Node node, str key, bint safe=False):
+cpdef void node_del(Node node, str key, bint safe=False) except *:
try:
del node.value[key]
except KeyError: