Index: third_party/cython/src/Cython/Compiler/Options.py |
diff --git a/third_party/cython/src/Cython/Compiler/Options.py b/third_party/cython/src/Cython/Compiler/Options.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ab9177f002ba9af6d864409afa11547ee9cf7e0e |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Compiler/Options.py |
@@ -0,0 +1,343 @@ |
+# |
+# Cython - Compilation-wide options and pragma declarations |
+# |
+ |
+# Perform lookups on builtin names only once, at module initialisation |
+# time. This will prevent the module from getting imported if a |
+# builtin name that it uses cannot be found during initialisation. |
+cache_builtins = True |
+ |
+embed_pos_in_docstring = False |
+gcc_branch_hints = True |
+ |
+pre_import = None |
+docstrings = True |
+ |
+# Decref global variables in this module on exit for garbage collection. |
+# 0: None, 1+: interned objects, 2+: cdef globals, 3+: types objects |
+# Mostly for reducing noise for Valgrind, only executes at process exit |
+# (when all memory will be reclaimed anyways). |
+generate_cleanup_code = False |
+ |
+annotate = False |
+ |
+# This will abort the compilation on the first error occured rather than trying |
+# to keep going and printing further error messages. |
+fast_fail = False |
+ |
+# Make all warnings into errors. |
+warning_errors = False |
+ |
+# Make unknown names an error. Python raises a NameError when |
+# encountering unknown names at runtime, whereas this option makes |
+# them a compile time error. If you want full Python compatibility, |
+# you should disable this option and also 'cache_builtins'. |
+error_on_unknown_names = True |
+ |
+# Make uninitialized local variable reference a compile time error. |
+# Python raises UnboundLocalError at runtime, whereas this option makes |
+# them a compile time error. Note that this option affects only variables |
+# of "python object" type. |
+error_on_uninitialized = True |
+ |
+# This will convert statements of the form "for i in range(...)" |
+# to "for i from ..." when i is a cdef'd integer type, and the direction |
+# (i.e. sign of step) can be determined. |
+# WARNING: This may change the semantics if the range causes assignment to |
+# i to overflow. Specifically, if this option is set, an error will be |
+# raised before the loop is entered, wheras without this option the loop |
+# will execute until an overflowing value is encountered. |
+convert_range = True |
+ |
+# Enable this to allow one to write your_module.foo = ... to overwrite the |
+# definition if the cpdef function foo, at the cost of an extra dictionary |
+# lookup on every call. |
+# If this is 0 it simply creates a wrapper. |
+lookup_module_cpdef = False |
+ |
+# Whether or not to embed the Python interpreter, for use in making a |
+# standalone executable or calling from external libraries. |
+# This will provide a method which initalizes the interpreter and |
+# executes the body of this module. |
+embed = None |
+ |
+# In previous iterations of Cython, globals() gave the first non-Cython module |
+# globals in the call stack. Sage relies on this behavior for variable injection. |
+old_style_globals = False |
+ |
+# Allows cimporting from a pyx file without a pxd file. |
+cimport_from_pyx = False |
+ |
+# max # of dims for buffers -- set lower than number of dimensions in numpy, as |
+# slices are passed by value and involve a lot of copying |
+buffer_max_dims = 8 |
+ |
+# Number of function closure instances to keep in a freelist (0: no freelists) |
+closure_freelist_size = 8 |
+ |
+# Should tp_clear() set object fields to None instead of clearing them to NULL? |
+clear_to_none = True |
+ |
+ |
+# Declare compiler directives |
+directive_defaults = { |
+ 'boundscheck' : True, |
+ 'nonecheck' : False, |
+ 'initializedcheck' : True, |
+ 'embedsignature' : False, |
+ 'locals' : {}, |
+ 'auto_cpdef': False, |
+ 'cdivision': False, # was True before 0.12 |
+ 'cdivision_warnings': False, |
+ 'overflowcheck': False, |
+ 'overflowcheck.fold': True, |
+ 'always_allow_keywords': False, |
+ 'allow_none_for_extension_args': True, |
+ 'wraparound' : True, |
+ 'ccomplex' : False, # use C99/C++ for complex types and arith |
+ 'callspec' : "", |
+ 'final' : False, |
+ 'internal' : False, |
+ 'profile': False, |
+ 'no_gc_clear': False, |
+ 'linetrace': False, |
+ 'infer_types': None, |
+ 'infer_types.verbose': False, |
+ 'autotestdict': True, |
+ 'autotestdict.cdef': False, |
+ 'autotestdict.all': False, |
+ 'language_level': 2, |
+ 'fast_getattr': False, # Undocumented until we come up with a better way to handle this everywhere. |
+ 'py2_import': False, # For backward compatibility of Cython's source code in Py3 source mode |
+ 'c_string_type': 'bytes', |
+ 'c_string_encoding': '', |
+ 'type_version_tag': True, # enables Py_TPFLAGS_HAVE_VERSION_TAG on extension types |
+ 'unraisable_tracebacks': False, |
+ |
+ # set __file__ and/or __path__ to known source/target path at import time (instead of not having them available) |
+ 'set_initial_path' : None, # SOURCEFILE or "/full/path/to/module" |
+ |
+ 'warn': None, |
+ 'warn.undeclared': False, |
+ 'warn.unreachable': True, |
+ 'warn.maybe_uninitialized': False, |
+ 'warn.unused': False, |
+ 'warn.unused_arg': False, |
+ 'warn.unused_result': False, |
+ 'warn.multiple_declarators': True, |
+ |
+# optimizations |
+ 'optimize.inline_defnode_calls': True, |
+ |
+# remove unreachable code |
+ 'remove_unreachable': True, |
+ |
+# control flow debug directives |
+ 'control_flow.dot_output': "", # Graphviz output filename |
+ 'control_flow.dot_annotate_defs': False, # Annotate definitions |
+ |
+# test support |
+ 'test_assert_path_exists' : [], |
+ 'test_fail_if_path_exists' : [], |
+ |
+# experimental, subject to change |
+ 'binding': None, |
+ 'freelist': 0, |
+} |
+ |
+# Extra warning directives |
+extra_warnings = { |
+ 'warn.maybe_uninitialized': True, |
+ 'warn.unreachable': True, |
+ 'warn.unused': True, |
+} |
+ |
+def one_of(*args): |
+ def validate(name, value): |
+ if value not in args: |
+ raise ValueError("%s directive must be one of %s, got '%s'" % ( |
+ name, args, value)) |
+ else: |
+ return value |
+ return validate |
+ |
+ |
+def normalise_encoding_name(option_name, encoding): |
+ """ |
+ >>> normalise_encoding_name('c_string_encoding', 'ascii') |
+ 'ascii' |
+ >>> normalise_encoding_name('c_string_encoding', 'AsCIi') |
+ 'ascii' |
+ >>> normalise_encoding_name('c_string_encoding', 'us-ascii') |
+ 'ascii' |
+ >>> normalise_encoding_name('c_string_encoding', 'utF8') |
+ 'utf8' |
+ >>> normalise_encoding_name('c_string_encoding', 'utF-8') |
+ 'utf8' |
+ >>> normalise_encoding_name('c_string_encoding', 'deFAuLT') |
+ 'default' |
+ >>> normalise_encoding_name('c_string_encoding', 'default') |
+ 'default' |
+ >>> normalise_encoding_name('c_string_encoding', 'SeriousLyNoSuch--Encoding') |
+ 'SeriousLyNoSuch--Encoding' |
+ """ |
+ if not encoding: |
+ return '' |
+ if encoding.lower() in ('default', 'ascii', 'utf8'): |
+ return encoding.lower() |
+ import codecs |
+ try: |
+ decoder = codecs.getdecoder(encoding) |
+ except LookupError: |
+ return encoding # may exists at runtime ... |
+ for name in ('ascii', 'utf8'): |
+ if codecs.getdecoder(name) == decoder: |
+ return name |
+ return encoding |
+ |
+ |
+# Override types possibilities above, if needed |
+directive_types = { |
+ 'final' : bool, # final cdef classes and methods |
+ 'internal' : bool, # cdef class visibility in the module dict |
+ 'infer_types' : bool, # values can be True/None/False |
+ 'binding' : bool, |
+ 'cfunc' : None, # decorators do not take directive value |
+ 'ccall' : None, |
+ 'cclass' : None, |
+ 'returns' : type, |
+ 'set_initial_path': str, |
+ 'freelist': int, |
+ 'c_string_type': one_of('bytes', 'bytearray', 'str', 'unicode'), |
+ 'c_string_encoding': normalise_encoding_name, |
+} |
+ |
+for key, val in directive_defaults.items(): |
+ if key not in directive_types: |
+ directive_types[key] = type(val) |
+ |
+directive_scopes = { # defaults to available everywhere |
+ # 'module', 'function', 'class', 'with statement' |
+ 'final' : ('cclass', 'function'), |
+ 'no_gc_clear' : ('cclass',), |
+ 'internal' : ('cclass',), |
+ 'autotestdict' : ('module',), |
+ 'autotestdict.all' : ('module',), |
+ 'autotestdict.cdef' : ('module',), |
+ 'set_initial_path' : ('module',), |
+ 'test_assert_path_exists' : ('function', 'class', 'cclass'), |
+ 'test_fail_if_path_exists' : ('function', 'class', 'cclass'), |
+ 'freelist': ('cclass',), |
+ # Avoid scope-specific to/from_py_functions for c_string. |
+ 'c_string_type': ('module',), |
+ 'c_string_encoding': ('module',), |
+ 'type_version_tag': ('module', 'cclass'), |
+} |
+ |
+def parse_directive_value(name, value, relaxed_bool=False): |
+ """ |
+ Parses value as an option value for the given name and returns |
+ the interpreted value. None is returned if the option does not exist. |
+ |
+ >>> print parse_directive_value('nonexisting', 'asdf asdfd') |
+ None |
+ >>> parse_directive_value('boundscheck', 'True') |
+ True |
+ >>> parse_directive_value('boundscheck', 'true') |
+ Traceback (most recent call last): |
+ ... |
+ ValueError: boundscheck directive must be set to True or False, got 'true' |
+ |
+ >>> parse_directive_value('c_string_encoding', 'us-ascii') |
+ 'ascii' |
+ >>> parse_directive_value('c_string_type', 'str') |
+ 'str' |
+ >>> parse_directive_value('c_string_type', 'bytes') |
+ 'bytes' |
+ >>> parse_directive_value('c_string_type', 'bytearray') |
+ 'bytearray' |
+ >>> parse_directive_value('c_string_type', 'unicode') |
+ 'unicode' |
+ >>> parse_directive_value('c_string_type', 'unnicode') |
+ Traceback (most recent call last): |
+ ValueError: c_string_type directive must be one of ('bytes', 'bytearray', 'str', 'unicode'), got 'unnicode' |
+ """ |
+ type = directive_types.get(name) |
+ if not type: return None |
+ orig_value = value |
+ if type is bool: |
+ value = str(value) |
+ if value == 'True': return True |
+ if value == 'False': return False |
+ if relaxed_bool: |
+ value = value.lower() |
+ if value in ("true", "yes"): return True |
+ elif value in ("false", "no"): return False |
+ raise ValueError("%s directive must be set to True or False, got '%s'" % ( |
+ name, orig_value)) |
+ elif type is int: |
+ try: |
+ return int(value) |
+ except ValueError: |
+ raise ValueError("%s directive must be set to an integer, got '%s'" % ( |
+ name, orig_value)) |
+ elif type is str: |
+ return str(value) |
+ elif callable(type): |
+ return type(name, value) |
+ else: |
+ assert False |
+ |
+def parse_directive_list(s, relaxed_bool=False, ignore_unknown=False, |
+ current_settings=None): |
+ """ |
+ Parses a comma-separated list of pragma options. Whitespace |
+ is not considered. |
+ |
+ >>> parse_directive_list(' ') |
+ {} |
+ >>> (parse_directive_list('boundscheck=True') == |
+ ... {'boundscheck': True}) |
+ True |
+ >>> parse_directive_list(' asdf') |
+ Traceback (most recent call last): |
+ ... |
+ ValueError: Expected "=" in option "asdf" |
+ >>> parse_directive_list('boundscheck=hey') |
+ Traceback (most recent call last): |
+ ... |
+ ValueError: boundscheck directive must be set to True or False, got 'hey' |
+ >>> parse_directive_list('unknown=True') |
+ Traceback (most recent call last): |
+ ... |
+ ValueError: Unknown option: "unknown" |
+ >>> warnings = parse_directive_list('warn.all=True') |
+ >>> len(warnings) > 1 |
+ True |
+ >>> sum(warnings.values()) == len(warnings) # all true. |
+ True |
+ """ |
+ if current_settings is None: |
+ result = {} |
+ else: |
+ result = current_settings |
+ for item in s.split(','): |
+ item = item.strip() |
+ if not item: continue |
+ if not '=' in item: raise ValueError('Expected "=" in option "%s"' % item) |
+ name, value = [ s.strip() for s in item.strip().split('=', 1) ] |
+ if name not in directive_defaults: |
+ found = False |
+ if name.endswith('.all'): |
+ prefix = name[:-3] |
+ for directive in directive_defaults: |
+ if directive.startswith(prefix): |
+ found = True |
+ parsed_value = parse_directive_value(directive, value, relaxed_bool=relaxed_bool) |
+ result[directive] = parsed_value |
+ if not found and not ignore_unknown: |
+ raise ValueError('Unknown option: "%s"' % name) |
+ else: |
+ parsed_value = parse_directive_value(name, value, relaxed_bool=relaxed_bool) |
+ result[name] = parsed_value |
+ return result |