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