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
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
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),
"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: