summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ParseTreeTransforms.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2018-09-14 22:06:26 +0200
committerStefan Behnel <stefan_ml@behnel.de>2018-09-14 22:06:26 +0200
commit4fc2fd38d559edea543e4fb6f208a1868811dfef (patch)
tree64a9ce63c0222cdd37faf3002abbaa8b5d928831 /Cython/Compiler/ParseTreeTransforms.py
parent70b3d15d3b4835ec837ebae3bf4f3f70cf66ab50 (diff)
downloadcython-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.py9
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