Index: third_party/cython/src/Cython/Shadow.py |
diff --git a/third_party/cython/src/Cython/Shadow.py b/third_party/cython/src/Cython/Shadow.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c0434c702d0aa9ad5a79617842c2a64e32e93050 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Shadow.py |
@@ -0,0 +1,419 @@ |
+# cython.* namespace for pure mode. |
+__version__ = "0.20.2" |
+ |
+ |
+# BEGIN shameless copy from Cython/minivect/minitypes.py |
+ |
+class _ArrayType(object): |
+ |
+ is_array = True |
+ subtypes = ['dtype'] |
+ |
+ def __init__(self, dtype, ndim, is_c_contig=False, is_f_contig=False, |
+ inner_contig=False, broadcasting=None): |
+ self.dtype = dtype |
+ self.ndim = ndim |
+ self.is_c_contig = is_c_contig |
+ self.is_f_contig = is_f_contig |
+ self.inner_contig = inner_contig or is_c_contig or is_f_contig |
+ self.broadcasting = broadcasting |
+ |
+ def __repr__(self): |
+ axes = [":"] * self.ndim |
+ if self.is_c_contig: |
+ axes[-1] = "::1" |
+ elif self.is_f_contig: |
+ axes[0] = "::1" |
+ |
+ return "%s[%s]" % (self.dtype, ", ".join(axes)) |
+ |
+ |
+def index_type(base_type, item): |
+ """ |
+ Support array type creation by slicing, e.g. double[:, :] specifies |
+ a 2D strided array of doubles. The syntax is the same as for |
+ Cython memoryviews. |
+ """ |
+ assert isinstance(item, (tuple, slice)) |
+ |
+ class InvalidTypeSpecification(Exception): |
+ pass |
+ |
+ def verify_slice(s): |
+ if s.start or s.stop or s.step not in (None, 1): |
+ raise InvalidTypeSpecification( |
+ "Only a step of 1 may be provided to indicate C or " |
+ "Fortran contiguity") |
+ |
+ if isinstance(item, tuple): |
+ step_idx = None |
+ for idx, s in enumerate(item): |
+ verify_slice(s) |
+ if s.step and (step_idx or idx not in (0, len(item) - 1)): |
+ raise InvalidTypeSpecification( |
+ "Step may only be provided once, and only in the " |
+ "first or last dimension.") |
+ |
+ if s.step == 1: |
+ step_idx = idx |
+ |
+ return _ArrayType(base_type, len(item), |
+ is_c_contig=step_idx == len(item) - 1, |
+ is_f_contig=step_idx == 0) |
+ else: |
+ verify_slice(item) |
+ return _ArrayType(base_type, 1, is_c_contig=bool(item.step)) |
+ |
+# END shameless copy |
+ |
+ |
+compiled = False |
+ |
+_Unspecified = object() |
+ |
+# Function decorators |
+ |
+def _empty_decorator(x): |
+ return x |
+ |
+def locals(**arg_types): |
+ return _empty_decorator |
+ |
+def test_assert_path_exists(*paths): |
+ return _empty_decorator |
+ |
+def test_fail_if_path_exists(*paths): |
+ return _empty_decorator |
+ |
+class _EmptyDecoratorAndManager(object): |
+ def __call__(self, x): |
+ return x |
+ def __enter__(self): |
+ pass |
+ def __exit__(self, exc_type, exc_value, traceback): |
+ pass |
+ |
+cclass = ccall = cfunc = _EmptyDecoratorAndManager() |
+ |
+returns = lambda type_arg: _EmptyDecoratorAndManager() |
+ |
+final = internal = type_version_tag = no_gc_clear = _empty_decorator |
+ |
+def inline(f, *args, **kwds): |
+ if isinstance(f, basestring): |
+ from Cython.Build.Inline import cython_inline |
+ return cython_inline(f, *args, **kwds) |
+ else: |
+ assert len(args) == len(kwds) == 0 |
+ return f |
+ |
+def compile(f): |
+ from Cython.Build.Inline import RuntimeCompiledFunction |
+ return RuntimeCompiledFunction(f) |
+ |
+# Special functions |
+ |
+def cdiv(a, b): |
+ q = a / b |
+ if q < 0: |
+ q += 1 |
+ |
+def cmod(a, b): |
+ r = a % b |
+ if (a*b) < 0: |
+ r -= b |
+ return r |
+ |
+ |
+# Emulated language constructs |
+ |
+def cast(type, *args): |
+ if hasattr(type, '__call__'): |
+ return type(*args) |
+ else: |
+ return args[0] |
+ |
+def sizeof(arg): |
+ return 1 |
+ |
+def typeof(arg): |
+ return arg.__class__.__name__ |
+ # return type(arg) |
+ |
+def address(arg): |
+ return pointer(type(arg))([arg]) |
+ |
+def declare(type=None, value=_Unspecified, **kwds): |
+ if type not in (None, object) and hasattr(type, '__call__'): |
+ if value is not _Unspecified: |
+ return type(value) |
+ else: |
+ return type() |
+ else: |
+ return value |
+ |
+class _nogil(object): |
+ """Support for 'with nogil' statement |
+ """ |
+ def __enter__(self): |
+ pass |
+ def __exit__(self, exc_class, exc, tb): |
+ return exc_class is None |
+ |
+nogil = _nogil() |
+gil = _nogil() |
+del _nogil |
+ |
+# Emulated types |
+ |
+class CythonMetaType(type): |
+ |
+ def __getitem__(type, ix): |
+ return array(type, ix) |
+ |
+CythonTypeObject = CythonMetaType('CythonTypeObject', (object,), {}) |
+ |
+class CythonType(CythonTypeObject): |
+ |
+ def _pointer(self, n=1): |
+ for i in range(n): |
+ self = pointer(self) |
+ return self |
+ |
+class PointerType(CythonType): |
+ |
+ def __init__(self, value=None): |
+ if isinstance(value, (ArrayType, PointerType)): |
+ self._items = [cast(self._basetype, a) for a in value._items] |
+ elif isinstance(value, list): |
+ self._items = [cast(self._basetype, a) for a in value] |
+ elif value is None or value == 0: |
+ self._items = [] |
+ else: |
+ raise ValueError |
+ |
+ def __getitem__(self, ix): |
+ if ix < 0: |
+ raise IndexError("negative indexing not allowed in C") |
+ return self._items[ix] |
+ |
+ def __setitem__(self, ix, value): |
+ if ix < 0: |
+ raise IndexError("negative indexing not allowed in C") |
+ self._items[ix] = cast(self._basetype, value) |
+ |
+ def __eq__(self, value): |
+ if value is None and not self._items: |
+ return True |
+ elif type(self) != type(value): |
+ return False |
+ else: |
+ return not self._items and not value._items |
+ |
+ def __repr__(self): |
+ return "%s *" % (self._basetype,) |
+ |
+class ArrayType(PointerType): |
+ |
+ def __init__(self): |
+ self._items = [None] * self._n |
+ |
+ |
+class StructType(CythonType): |
+ |
+ def __init__(self, cast_from=_Unspecified, **data): |
+ if cast_from is not _Unspecified: |
+ # do cast |
+ if len(data) > 0: |
+ raise ValueError('Cannot accept keyword arguments when casting.') |
+ if type(cast_from) is not type(self): |
+ raise ValueError('Cannot cast from %s'%cast_from) |
+ for key, value in cast_from.__dict__.items(): |
+ setattr(self, key, value) |
+ else: |
+ for key, value in data.iteritems(): |
+ setattr(self, key, value) |
+ |
+ def __setattr__(self, key, value): |
+ if key in self._members: |
+ self.__dict__[key] = cast(self._members[key], value) |
+ else: |
+ raise AttributeError("Struct has no member '%s'" % key) |
+ |
+ |
+class UnionType(CythonType): |
+ |
+ def __init__(self, cast_from=_Unspecified, **data): |
+ if cast_from is not _Unspecified: |
+ # do type cast |
+ if len(data) > 0: |
+ raise ValueError('Cannot accept keyword arguments when casting.') |
+ if isinstance(cast_from, dict): |
+ datadict = cast_from |
+ elif type(cast_from) is type(self): |
+ datadict = cast_from.__dict__ |
+ else: |
+ raise ValueError('Cannot cast from %s'%cast_from) |
+ else: |
+ datadict = data |
+ if len(datadict) > 1: |
+ raise AttributeError("Union can only store one field at a time.") |
+ for key, value in datadict.iteritems(): |
+ setattr(self, key, value) |
+ |
+ def __setattr__(self, key, value): |
+ if key in '__dict__': |
+ CythonType.__setattr__(self, key, value) |
+ elif key in self._members: |
+ self.__dict__ = {key: cast(self._members[key], value)} |
+ else: |
+ raise AttributeError("Union has no member '%s'" % key) |
+ |
+def pointer(basetype): |
+ class PointerInstance(PointerType): |
+ _basetype = basetype |
+ return PointerInstance |
+ |
+def array(basetype, n): |
+ class ArrayInstance(ArrayType): |
+ _basetype = basetype |
+ _n = n |
+ return ArrayInstance |
+ |
+def struct(**members): |
+ class StructInstance(StructType): |
+ _members = members |
+ for key in members: |
+ setattr(StructInstance, key, None) |
+ return StructInstance |
+ |
+def union(**members): |
+ class UnionInstance(UnionType): |
+ _members = members |
+ for key in members: |
+ setattr(UnionInstance, key, None) |
+ return UnionInstance |
+ |
+class typedef(CythonType): |
+ |
+ def __init__(self, type, name=None): |
+ self._basetype = type |
+ self.name = name |
+ |
+ def __call__(self, *arg): |
+ value = cast(self._basetype, *arg) |
+ return value |
+ |
+ def __repr__(self): |
+ return self.name or str(self._basetype) |
+ |
+ __getitem__ = index_type |
+ |
+class _FusedType(CythonType): |
+ pass |
+ |
+ |
+def fused_type(*args): |
+ if not args: |
+ raise TypeError("Expected at least one type as argument") |
+ |
+ # Find the numeric type with biggest rank if all types are numeric |
+ rank = -1 |
+ for type in args: |
+ if type not in (py_int, py_long, py_float, py_complex): |
+ break |
+ |
+ if type_ordering.index(type) > rank: |
+ result_type = type |
+ else: |
+ return result_type |
+ |
+ # Not a simple numeric type, return a fused type instance. The result |
+ # isn't really meant to be used, as we can't keep track of the context in |
+ # pure-mode. Casting won't do anything in this case. |
+ return _FusedType() |
+ |
+ |
+def _specialized_from_args(signatures, args, kwargs): |
+ "Perhaps this should be implemented in a TreeFragment in Cython code" |
+ raise Exception("yet to be implemented") |
+ |
+ |
+py_int = typedef(int, "int") |
+try: |
+ py_long = typedef(long, "long") |
+except NameError: # Py3 |
+ py_long = typedef(int, "long") |
+py_float = typedef(float, "float") |
+py_complex = typedef(complex, "double complex") |
+ |
+ |
+# Predefined types |
+ |
+int_types = ['char', 'short', 'Py_UNICODE', 'int', 'long', 'longlong', 'Py_ssize_t', 'size_t'] |
+float_types = ['longdouble', 'double', 'float'] |
+complex_types = ['longdoublecomplex', 'doublecomplex', 'floatcomplex', 'complex'] |
+other_types = ['bint', 'void'] |
+ |
+to_repr = { |
+ 'longlong': 'long long', |
+ 'longdouble': 'long double', |
+ 'longdoublecomplex': 'long double complex', |
+ 'doublecomplex': 'double complex', |
+ 'floatcomplex': 'float complex', |
+}.get |
+ |
+gs = globals() |
+ |
+for name in int_types: |
+ reprname = to_repr(name, name) |
+ gs[name] = typedef(py_int, reprname) |
+ if name != 'Py_UNICODE' and not name.endswith('size_t'): |
+ gs['u'+name] = typedef(py_int, "unsigned " + reprname) |
+ gs['s'+name] = typedef(py_int, "signed " + reprname) |
+ |
+for name in float_types: |
+ gs[name] = typedef(py_float, to_repr(name, name)) |
+ |
+for name in complex_types: |
+ gs[name] = typedef(py_complex, to_repr(name, name)) |
+ |
+bint = typedef(bool, "bint") |
+void = typedef(int, "void") |
+ |
+for t in int_types + float_types + complex_types + other_types: |
+ for i in range(1, 4): |
+ gs["%s_%s" % ('p'*i, t)] = globals()[t]._pointer(i) |
+ |
+void = typedef(None, "void") |
+NULL = p_void(0) |
+ |
+integral = floating = numeric = _FusedType() |
+ |
+type_ordering = [py_int, py_long, py_float, py_complex] |
+ |
+class CythonDotParallel(object): |
+ """ |
+ The cython.parallel module. |
+ """ |
+ |
+ __all__ = ['parallel', 'prange', 'threadid'] |
+ |
+ def parallel(self, num_threads=None): |
+ return nogil |
+ |
+ def prange(self, start=0, stop=None, step=1, schedule=None, nogil=False): |
+ if stop is None: |
+ stop = start |
+ start = 0 |
+ return range(start, stop, step) |
+ |
+ def threadid(self): |
+ return 0 |
+ |
+ # def threadsavailable(self): |
+ # return 1 |
+ |
+import sys |
+sys.modules['cython.parallel'] = CythonDotParallel() |
+del sys |