15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  Cython - Compilation-wide options and pragma declarations
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Perform lookups on builtin names only once, at module initialisation
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# time.  This will prevent the module from getting imported if a
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# builtin name that it uses cannot be found during initialisation.
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cache_builtins = True
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)embed_pos_in_docstring = False
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gcc_branch_hints = True
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)pre_import = None
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)docstrings = True
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Decref global variables in this module on exit for garbage collection.
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 0: None, 1+: interned objects, 2+: cdef globals, 3+: types objects
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Mostly for reducing noise for Valgrind, only executes at process exit
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# (when all memory will be reclaimed anyways).
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)generate_cleanup_code = False
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)annotate = False
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# This will abort the compilation on the first error occured rather than trying
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# to keep going and printing further error messages.
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)fast_fail = False
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Make all warnings into errors.
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)warning_errors = False
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Make unknown names an error.  Python raises a NameError when
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# encountering unknown names at runtime, whereas this option makes
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# them a compile time error.  If you want full Python compatibility,
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# you should disable this option and also 'cache_builtins'.
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)error_on_unknown_names = True
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Make uninitialized local variable reference a compile time error.
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Python raises UnboundLocalError at runtime, whereas this option makes
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# them a compile time error. Note that this option affects only variables
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# of "python object" type.
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)error_on_uninitialized = True
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# This will convert statements of the form "for i in range(...)"
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# to "for i from ..." when i is a cdef'd integer type, and the direction
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# (i.e. sign of step) can be determined.
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# WARNING: This may change the semantics if the range causes assignment to
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# i to overflow. Specifically, if this option is set, an error will be
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# raised before the loop is entered, wheras without this option the loop
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# will execute until an overflowing value is encountered.
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)convert_range = True
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Enable this to allow one to write your_module.foo = ... to overwrite the
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# definition if the cpdef function foo, at the cost of an extra dictionary
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# lookup on every call.
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# If this is 0 it simply creates a wrapper.
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)lookup_module_cpdef = False
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Whether or not to embed the Python interpreter, for use in making a
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# standalone executable or calling from external libraries.
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# This will provide a method which initalizes the interpreter and
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# executes the body of this module.
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)embed = None
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# In previous iterations of Cython, globals() gave the first non-Cython module
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# globals in the call stack.  Sage relies on this behavior for variable injection.
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)old_style_globals = False
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Allows cimporting from a pyx file without a pxd file.
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cimport_from_pyx = False
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# max # of dims for buffers -- set lower than number of dimensions in numpy, as
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# slices are passed by value and involve a lot of copying
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)buffer_max_dims = 8
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Number of function closure instances to keep in a freelist (0: no freelists)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)closure_freelist_size = 8
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Should tp_clear() set object fields to None instead of clearing them to NULL?
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)clear_to_none = True
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Declare compiler directives
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)directive_defaults = {
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'boundscheck' : True,
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'nonecheck' : False,
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'initializedcheck' : True,
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'embedsignature' : False,
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'locals' : {},
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'auto_cpdef': False,
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'cdivision': False, # was True before 0.12
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'cdivision_warnings': False,
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'overflowcheck': False,
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'overflowcheck.fold': True,
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'always_allow_keywords': False,
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'allow_none_for_extension_args': True,
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'wraparound' : True,
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'ccomplex' : False, # use C99/C++ for complex types and arith
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'callspec' : "",
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'final' : False,
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'internal' : False,
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'profile': False,
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'no_gc_clear': False,
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'linetrace': False,
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'infer_types': None,
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'infer_types.verbose': False,
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'autotestdict': True,
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'autotestdict.cdef': False,
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'autotestdict.all': False,
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'language_level': 2,
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'fast_getattr': False, # Undocumented until we come up with a better way to handle this everywhere.
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'py2_import': False, # For backward compatibility of Cython's source code in Py3 source mode
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'c_string_type': 'bytes',
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'c_string_encoding': '',
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'type_version_tag': True,   # enables Py_TPFLAGS_HAVE_VERSION_TAG on extension types
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'unraisable_tracebacks': False,
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # set __file__ and/or __path__ to known source/target path at import time (instead of not having them available)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'set_initial_path' : None,  # SOURCEFILE or "/full/path/to/module"
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn': None,
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.undeclared': False,
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.unreachable': True,
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.maybe_uninitialized': False,
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.unused': False,
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.unused_arg': False,
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.unused_result': False,
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.multiple_declarators': True,
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# optimizations
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'optimize.inline_defnode_calls': True,
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# remove unreachable code
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'remove_unreachable': True,
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# control flow debug directives
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'control_flow.dot_output': "", # Graphviz output filename
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'control_flow.dot_annotate_defs': False, # Annotate definitions
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# test support
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'test_assert_path_exists' : [],
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'test_fail_if_path_exists' : [],
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# experimental, subject to change
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'binding': None,
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'freelist': 0,
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Extra warning directives
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)extra_warnings = {
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.maybe_uninitialized': True,
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.unreachable': True,
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'warn.unused': True,
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def one_of(*args):
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def validate(name, value):
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if value not in args:
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            raise ValueError("%s directive must be one of %s, got '%s'" % (
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                name, args, value))
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        else:
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return value
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return validate
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def normalise_encoding_name(option_name, encoding):
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'ascii')
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'ascii'
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'AsCIi')
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'ascii'
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'us-ascii')
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'ascii'
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'utF8')
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'utf8'
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'utF-8')
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'utf8'
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'deFAuLT')
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'default'
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'default')
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'default'
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> normalise_encoding_name('c_string_encoding', 'SeriousLyNoSuch--Encoding')
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'SeriousLyNoSuch--Encoding'
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if not encoding:
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return ''
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if encoding.lower() in ('default', 'ascii', 'utf8'):
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return encoding.lower()
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    import codecs
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    try:
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        decoder = codecs.getdecoder(encoding)
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    except LookupError:
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return encoding  # may exists at runtime ...
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for name in ('ascii', 'utf8'):
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if codecs.getdecoder(name) == decoder:
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return name
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return encoding
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Override types possibilities above, if needed
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)directive_types = {
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'final' : bool,  # final cdef classes and methods
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'internal' : bool,  # cdef class visibility in the module dict
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'infer_types' : bool, # values can be True/None/False
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'binding' : bool,
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'cfunc' : None, # decorators do not take directive value
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'ccall' : None,
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'cclass' : None,
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'returns' : type,
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'set_initial_path': str,
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'freelist': int,
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'c_string_type': one_of('bytes', 'bytearray', 'str', 'unicode'),
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'c_string_encoding': normalise_encoding_name,
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)for key, val in directive_defaults.items():
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if key not in directive_types:
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        directive_types[key] = type(val)
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)directive_scopes = { # defaults to available everywhere
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # 'module', 'function', 'class', 'with statement'
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'final' : ('cclass', 'function'),
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'no_gc_clear' : ('cclass',),
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'internal' : ('cclass',),
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'autotestdict' : ('module',),
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'autotestdict.all' : ('module',),
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'autotestdict.cdef' : ('module',),
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'set_initial_path' : ('module',),
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'test_assert_path_exists' : ('function', 'class', 'cclass'),
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'test_fail_if_path_exists' : ('function', 'class', 'cclass'),
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'freelist': ('cclass',),
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # Avoid scope-specific to/from_py_functions for c_string.
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'c_string_type': ('module',),
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'c_string_encoding': ('module',),
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'type_version_tag': ('module', 'cclass'),
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def parse_directive_value(name, value, relaxed_bool=False):
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Parses value as an option value for the given name and returns
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    the interpreted value. None is returned if the option does not exist.
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> print parse_directive_value('nonexisting', 'asdf asdfd')
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    None
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('boundscheck', 'True')
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    True
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('boundscheck', 'true')
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Traceback (most recent call last):
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ...
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ValueError: boundscheck directive must be set to True or False, got 'true'
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('c_string_encoding', 'us-ascii')
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'ascii'
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('c_string_type', 'str')
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'str'
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('c_string_type', 'bytes')
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'bytes'
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('c_string_type', 'bytearray')
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'bytearray'
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('c_string_type', 'unicode')
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'unicode'
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_value('c_string_type', 'unnicode')
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Traceback (most recent call last):
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ValueError: c_string_type directive must be one of ('bytes', 'bytearray', 'str', 'unicode'), got 'unnicode'
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    type = directive_types.get(name)
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if not type: return None
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    orig_value = value
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if type is bool:
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = str(value)
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if value == 'True': return True
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if value == 'False': return False
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if relaxed_bool:
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            value = value.lower()
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if value in ("true", "yes"): return True
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            elif value in ("false", "no"): return False
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        raise ValueError("%s directive must be set to True or False, got '%s'" % (
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            name, orig_value))
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    elif type is int:
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        try:
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return int(value)
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        except ValueError:
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            raise ValueError("%s directive must be set to an integer, got '%s'" % (
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                name, orig_value))
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    elif type is str:
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return str(value)
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    elif callable(type):
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return type(name, value)
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    else:
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        assert False
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def parse_directive_list(s, relaxed_bool=False, ignore_unknown=False,
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         current_settings=None):
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Parses a comma-separated list of pragma options. Whitespace
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    is not considered.
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_list('      ')
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    {}
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> (parse_directive_list('boundscheck=True') ==
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ... {'boundscheck': True})
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    True
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_list('  asdf')
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Traceback (most recent call last):
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ...
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ValueError: Expected "=" in option "asdf"
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_list('boundscheck=hey')
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Traceback (most recent call last):
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ...
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ValueError: boundscheck directive must be set to True or False, got 'hey'
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> parse_directive_list('unknown=True')
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Traceback (most recent call last):
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ...
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ValueError: Unknown option: "unknown"
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> warnings = parse_directive_list('warn.all=True')
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> len(warnings) > 1
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    True
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    >>> sum(warnings.values()) == len(warnings)  # all true.
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    True
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if current_settings is None:
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        result = {}
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    else:
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        result = current_settings
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for item in s.split(','):
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        item = item.strip()
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if not item: continue
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if not '=' in item: raise ValueError('Expected "=" in option "%s"' % item)
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        name, value = [ s.strip() for s in item.strip().split('=', 1) ]
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if name not in directive_defaults:
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            found = False
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if name.endswith('.all'):
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                prefix = name[:-3]
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                for directive in directive_defaults:
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    if directive.startswith(prefix):
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        found = True
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        parsed_value = parse_directive_value(directive, value, relaxed_bool=relaxed_bool)
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        result[directive] = parsed_value
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if not found and not ignore_unknown:
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                raise ValueError('Unknown option: "%s"' % name)
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        else:
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            parsed_value = parse_directive_value(name, value, relaxed_bool=relaxed_bool)
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            result[name] = parsed_value
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return result
344