diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2018-09-14 22:06:26 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2018-09-14 22:06:26 +0200 |
commit | 4fc2fd38d559edea543e4fb6f208a1868811dfef (patch) | |
tree | 64a9ce63c0222cdd37faf3002abbaa8b5d928831 /Cython/Compiler/ParseTreeTransforms.py | |
parent | 70b3d15d3b4835ec837ebae3bf4f3f70cf66ab50 (diff) | |
download | cython-4fc2fd38d559edea543e4fb6f208a1868811dfef.tar.gz |
Support "@cython.nogil" decorator in pure mode.
Closes #2557.
Diffstat (limited to 'Cython/Compiler/ParseTreeTransforms.py')
-rw-r--r-- | Cython/Compiler/ParseTreeTransforms.py | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index be473316b..6d56e5aac 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -2333,6 +2333,7 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations): @cython.cclass @cython.ccall @cython.inline + @cython.nogil """ def visit_ModuleNode(self, node): @@ -2352,6 +2353,7 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations): modifiers = [] if 'inline' in self.directives: modifiers.append('inline') + nogil = self.directives.get('nogil') except_val = self.directives.get('exceptval') return_type_node = self.directives.get('returns') if return_type_node is None and self.directives['annotation_typing']: @@ -2364,7 +2366,7 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations): except_val = (None, False) if 'ccall' in self.directives: node = node.as_cfunction( - overridable=True, modifiers=modifiers, + overridable=True, modifiers=modifiers, nogil=nogil, returns=return_type_node, except_val=except_val) return self.visit(node) if 'cfunc' in self.directives: @@ -2372,11 +2374,14 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations): error(node.pos, "cfunc directive is not allowed here") else: node = node.as_cfunction( - overridable=False, modifiers=modifiers, + overridable=False, modifiers=modifiers, nogil=nogil, returns=return_type_node, except_val=except_val) return self.visit(node) if 'inline' in modifiers: error(node.pos, "Python functions cannot be declared 'inline'") + if nogil: + # TODO: turn this into a "with gil" declaration. + error(node.pos, "Python functions cannot be declared 'nogil'") self.visitchildren(node) return node |