| 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
|
|
|