From a1e807904e241731233ef93b318449b19dc87b21 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Tue, 11 Sep 2007 21:12:49 +0200 Subject: [PATCH] use 'with GIL' instead of 'withGIL' to avoid introducing a non-Python keyword and to support later extension for other contexts --- Cython/Compiler/Parsing.py | 25 +++++++++++++++---------- Cython/Compiler/PyrexTypes.py | 2 +- Cython/Compiler/Scanning.py | 6 +++++- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Cython/Compiler/Parsing.py b/Cython/Compiler/Parsing.py index 08a40d94..9ed27639 100644 --- a/Cython/Compiler/Parsing.py +++ b/Cython/Compiler/Parsing.py @@ -5,7 +5,7 @@ import os, re from string import join, replace from types import ListType, TupleType -from Scanning import PyrexScanner +from Scanning import PyrexScanner, function_contexts import Nodes import ExprNodes from ModuleNode import ModuleNode @@ -1477,28 +1477,33 @@ def p_exception_value_clause(s): exc_val = p_simple_expr(s) #p_exception_value(s) return exc_val, exc_check -def p_c_with_gil(s): - if s.sy == 'withGIL': +def p_c_with(s): + if s.sy == 'with': s.next() - return True - return False + return p_ident_list(s) + return () def p_c_func_options(s): exc_val = None exc_check = 0 - with_gil = False + contexts = [] if s.sy == 'except': exc_val, exc_check = p_exception_value_clause(s) - with_gil = p_c_with_gil(s) - elif s.sy == 'withGIL': - with_gil = p_c_with_gil(s) + contexts = p_c_with(s) + elif s.sy == 'with': + contexts = p_c_with(s) exc_val, exc_check = p_exception_value_clause(s) + for context in contexts: + if context not in function_contexts: + s.error("Unknown context: " + context) + return None + ret = { 'exception_value': exc_val, 'exception_check': exc_check, - 'with_gil': with_gil, + 'with_gil': 'GIL' in contexts, } return ret diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index a19033d3..d05db0ce 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -596,7 +596,7 @@ class CFuncType(CType): elif self.exception_check: exc_clause = " except *" if self.with_gil: - with_gil_clause = " withGIL" + with_gil_clause = " with GIL" return self.return_type.declaration_code( "(%s(%s)%s%s)" % (entity_code, arg_decl_code, exc_clause, with_gil_clause), diff --git a/Cython/Compiler/Scanning.py b/Cython/Compiler/Scanning.py index d5713762..48ae39af 100644 --- a/Cython/Compiler/Scanning.py +++ b/Cython/Compiler/Scanning.py @@ -138,7 +138,11 @@ reserved_words = [ "raise", "import", "exec", "try", "except", "finally", "while", "if", "elif", "else", "for", "in", "assert", "and", "or", "not", "is", "in", "lambda", "from", - "NULL", "cimport", "by", "withGIL" + "NULL", "cimport", "by", "with" +] + +function_contexts = [ # allowed arguments to the "with" option + "GIL" ] class Method: -- 2.26.2