Index: third_party/cython/src/Cython/Utility/TypeConversion.c |
diff --git a/third_party/cython/src/Cython/Utility/TypeConversion.c b/third_party/cython/src/Cython/Utility/TypeConversion.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cc2c51de3683f1a2e8c07ff52f3862c9d15a49b9 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Utility/TypeConversion.c |
@@ -0,0 +1,629 @@ |
+/////////////// TypeConversions.proto /////////////// |
+ |
+/* Type Conversion Predeclarations */ |
+ |
+#define __Pyx_fits_Py_ssize_t(v, type, is_signed) ( \ |
+ (sizeof(type) < sizeof(Py_ssize_t)) || \ |
+ (sizeof(type) > sizeof(Py_ssize_t) && \ |
+ likely(v < (type)PY_SSIZE_T_MAX || \ |
+ v == (type)PY_SSIZE_T_MAX) && \ |
+ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN || \ |
+ v == (type)PY_SSIZE_T_MIN))) || \ |
+ (sizeof(type) == sizeof(Py_ssize_t) && \ |
+ (is_signed || likely(v < (type)PY_SSIZE_T_MAX || \ |
+ v == (type)PY_SSIZE_T_MAX))) ) |
+ |
+static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); |
+static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); |
+ |
+#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) |
+#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) |
+#define __Pyx_PyBytes_FromString PyBytes_FromString |
+#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize |
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); |
+ |
+#if PY_MAJOR_VERSION < 3 |
+ #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString |
+ #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize |
+#else |
+ #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString |
+ #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize |
+#endif |
+ |
+#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) |
+#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) |
+#define __Pyx_PyObject_FromUString(s) __Pyx_PyObject_FromString((const char*)s) |
+#define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((const char*)s) |
+#define __Pyx_PyByteArray_FromUString(s) __Pyx_PyByteArray_FromString((const char*)s) |
+#define __Pyx_PyStr_FromUString(s) __Pyx_PyStr_FromString((const char*)s) |
+#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((const char*)s) |
+ |
+#if PY_MAJOR_VERSION < 3 |
+static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) |
+{ |
+ const Py_UNICODE *u_end = u; |
+ while (*u_end++) ; |
+ return (size_t)(u_end - u - 1); |
+} |
+#else |
+#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen |
+#endif |
+ |
+#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) |
+#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode |
+#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode |
+ |
+#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) |
+#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) |
+static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); |
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); |
+ |
+static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); |
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); |
+ |
+#if CYTHON_COMPILING_IN_CPYTHON |
+#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) |
+#else |
+#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) |
+#endif |
+#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) |
+ |
+#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII |
+static int __Pyx_sys_getdefaultencoding_not_ascii; |
+static int __Pyx_init_sys_getdefaultencoding_params(void) { |
+ PyObject* sys; |
+ PyObject* default_encoding = NULL; |
+ PyObject* ascii_chars_u = NULL; |
+ PyObject* ascii_chars_b = NULL; |
+ const char* default_encoding_c; |
+ sys = PyImport_ImportModule("sys"); |
+ if (!sys) goto bad; |
+ default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); |
+ Py_DECREF(sys); |
+ if (!default_encoding) goto bad; |
+ default_encoding_c = PyBytes_AsString(default_encoding); |
+ if (!default_encoding_c) goto bad; |
+ if (strcmp(default_encoding_c, "ascii") == 0) { |
+ __Pyx_sys_getdefaultencoding_not_ascii = 0; |
+ } else { |
+ char ascii_chars[128]; |
+ int c; |
+ for (c = 0; c < 128; c++) { |
+ ascii_chars[c] = c; |
+ } |
+ __Pyx_sys_getdefaultencoding_not_ascii = 1; |
+ ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); |
+ if (!ascii_chars_u) goto bad; |
+ ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); |
+ if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { |
+ PyErr_Format( |
+ PyExc_ValueError, |
+ "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", |
+ default_encoding_c); |
+ goto bad; |
+ } |
+ Py_DECREF(ascii_chars_u); |
+ Py_DECREF(ascii_chars_b); |
+ } |
+ Py_DECREF(default_encoding); |
+ return 0; |
+bad: |
+ Py_XDECREF(default_encoding); |
+ Py_XDECREF(ascii_chars_u); |
+ Py_XDECREF(ascii_chars_b); |
+ return -1; |
+} |
+#endif |
+ |
+#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 |
+#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) |
+#else |
+#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) |
+ |
+// __PYX_DEFAULT_STRING_ENCODING is either a user provided string constant |
+// or we need to look it up here |
+#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT |
+static char* __PYX_DEFAULT_STRING_ENCODING; |
+ |
+static int __Pyx_init_sys_getdefaultencoding_params(void) { |
+ PyObject* sys; |
+ PyObject* default_encoding = NULL; |
+ char* default_encoding_c; |
+ |
+ sys = PyImport_ImportModule("sys"); |
+ if (!sys) goto bad; |
+ default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); |
+ Py_DECREF(sys); |
+ if (!default_encoding) goto bad; |
+ default_encoding_c = PyBytes_AsString(default_encoding); |
+ if (!default_encoding_c) goto bad; |
+ __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); |
+ if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; |
+ strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); |
+ Py_DECREF(default_encoding); |
+ return 0; |
+bad: |
+ Py_XDECREF(default_encoding); |
+ return -1; |
+} |
+#endif |
+#endif |
+ |
+/////////////// TypeConversions /////////////// |
+ |
+/* Type Conversion Functions */ |
+ |
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { |
+ return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); |
+} |
+ |
+static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { |
+ Py_ssize_t ignore; |
+ return __Pyx_PyObject_AsStringAndSize(o, &ignore); |
+} |
+ |
+static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { |
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT |
+ if ( |
+#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII |
+ __Pyx_sys_getdefaultencoding_not_ascii && |
+#endif |
+ PyUnicode_Check(o)) { |
+#if PY_VERSION_HEX < 0x03030000 |
+ char* defenc_c; |
+ // borrowed, cached reference |
+ PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); |
+ if (!defenc) return NULL; |
+ defenc_c = PyBytes_AS_STRING(defenc); |
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII |
+ { |
+ char* end = defenc_c + PyBytes_GET_SIZE(defenc); |
+ char* c; |
+ for (c = defenc_c; c < end; c++) { |
+ if ((unsigned char) (*c) >= 128) { |
+ // raise the error |
+ PyUnicode_AsASCIIString(o); |
+ return NULL; |
+ } |
+ } |
+ } |
+#endif /*__PYX_DEFAULT_STRING_ENCODING_IS_ASCII*/ |
+ *length = PyBytes_GET_SIZE(defenc); |
+ return defenc_c; |
+#else /* PY_VERSION_HEX < 0x03030000 */ |
+ if (PyUnicode_READY(o) == -1) return NULL; |
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII |
+ if (PyUnicode_IS_ASCII(o)) { |
+ // cached for the lifetime of the object |
+ *length = PyUnicode_GET_LENGTH(o); |
+ return PyUnicode_AsUTF8(o); |
+ } else { |
+ // raise the error |
+ PyUnicode_AsASCIIString(o); |
+ return NULL; |
+ } |
+#else /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */ |
+ return PyUnicode_AsUTF8AndSize(o, length); |
+#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */ |
+#endif /* PY_VERSION_HEX < 0x03030000 */ |
+ } else |
+#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT */ |
+ |
+#if !CYTHON_COMPILING_IN_PYPY |
+#if PY_VERSION_HEX >= 0x02060000 |
+ if (PyByteArray_Check(o)) { |
+ *length = PyByteArray_GET_SIZE(o); |
+ return PyByteArray_AS_STRING(o); |
+ } else |
+#endif |
+#endif |
+ { |
+ char* result; |
+ int r = PyBytes_AsStringAndSize(o, &result, length); |
+ if (unlikely(r < 0)) { |
+ return NULL; |
+ } else { |
+ return result; |
+ } |
+ } |
+} |
+ |
+/* Note: __Pyx_PyObject_IsTrue is written to minimize branching. */ |
+static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { |
+ int is_true = x == Py_True; |
+ if (is_true | (x == Py_False) | (x == Py_None)) return is_true; |
+ else return PyObject_IsTrue(x); |
+} |
+ |
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { |
+ PyNumberMethods *m; |
+ const char *name = NULL; |
+ PyObject *res = NULL; |
+#if PY_MAJOR_VERSION < 3 |
+ if (PyInt_Check(x) || PyLong_Check(x)) |
+#else |
+ if (PyLong_Check(x)) |
+#endif |
+ return Py_INCREF(x), x; |
+ m = Py_TYPE(x)->tp_as_number; |
+#if PY_MAJOR_VERSION < 3 |
+ if (m && m->nb_int) { |
+ name = "int"; |
+ res = PyNumber_Int(x); |
+ } |
+ else if (m && m->nb_long) { |
+ name = "long"; |
+ res = PyNumber_Long(x); |
+ } |
+#else |
+ if (m && m->nb_int) { |
+ name = "int"; |
+ res = PyNumber_Long(x); |
+ } |
+#endif |
+ if (res) { |
+#if PY_MAJOR_VERSION < 3 |
+ if (!PyInt_Check(res) && !PyLong_Check(res)) { |
+#else |
+ if (!PyLong_Check(res)) { |
+#endif |
+ PyErr_Format(PyExc_TypeError, |
+ "__%.4s__ returned non-%.4s (type %.200s)", |
+ name, name, Py_TYPE(res)->tp_name); |
+ Py_DECREF(res); |
+ return NULL; |
+ } |
+ } |
+ else if (!PyErr_Occurred()) { |
+ PyErr_SetString(PyExc_TypeError, |
+ "an integer is required"); |
+ } |
+ return res; |
+} |
+ |
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 |
+ #if CYTHON_USE_PYLONG_INTERNALS |
+ #include "longintrepr.h" |
+ #endif |
+#endif |
+static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { |
+ Py_ssize_t ival; |
+ PyObject *x; |
+#if PY_MAJOR_VERSION < 3 |
+ if (likely(PyInt_CheckExact(b))) |
+ return PyInt_AS_LONG(b); |
+#endif |
+ if (likely(PyLong_CheckExact(b))) { |
+ #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 |
+ #if CYTHON_USE_PYLONG_INTERNALS |
+ switch (Py_SIZE(b)) { |
+ case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0]; |
+ case 0: return 0; |
+ case 1: return ((PyLongObject*)b)->ob_digit[0]; |
+ } |
+ #endif |
+ #endif |
+ #if PY_VERSION_HEX < 0x02060000 |
+ return PyInt_AsSsize_t(b); |
+ #else |
+ return PyLong_AsSsize_t(b); |
+ #endif |
+ } |
+ x = PyNumber_Index(b); |
+ if (!x) return -1; |
+ ival = PyInt_AsSsize_t(x); |
+ Py_DECREF(x); |
+ return ival; |
+} |
+ |
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { |
+#if PY_VERSION_HEX < 0x02050000 |
+ if (ival <= LONG_MAX) |
+ return PyInt_FromLong((long)ival); |
+ else { |
+ unsigned char *bytes = (unsigned char *) &ival; |
+ int one = 1; int little = (int)*(unsigned char*)&one; |
+ return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); |
+ } |
+#else |
+ return PyInt_FromSize_t(ival); |
+#endif |
+} |
+ |
+ |
+/////////////// FromPyStructUtility.proto /////////////// |
+{{struct_type_decl}}; |
+static {{struct_type_decl}} {{funcname}}(PyObject *); |
+ |
+/////////////// FromPyStructUtility /////////////// |
+static {{struct_type_decl}} {{funcname}}(PyObject * o) { |
+ {{struct_type_decl}} result; |
+ PyObject *value = NULL; |
+ |
+ if (!PyMapping_Check(o)) { |
+ PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "a mapping", Py_TYPE(o)->tp_name); |
+ goto bad; |
+ } |
+ |
+ {{for member in var_entries:}} |
+ {{py:attr = "result." + member.cname}} |
+ |
+ value = PyObject_GetItem(o, PYIDENT("{{member.name}}")); |
+ if (!value) { |
+ PyErr_Format(PyExc_ValueError, \ |
+ "No value specified for struct attribute '%.{{max(200, len(member.name))}}s'", "{{member.name}}"); |
+ goto bad; |
+ } |
+ {{attr}} = {{member.type.from_py_function}}(value); |
+ if ({{member.type.error_condition(attr)}}) |
+ goto bad; |
+ |
+ Py_DECREF(value); |
+ {{endfor}} |
+ |
+ return result; |
+bad: |
+ Py_XDECREF(value); |
+ return result; |
+} |
+ |
+/////////////// ObjectAsUCS4.proto /////////////// |
+ |
+static CYTHON_INLINE Py_UCS4 __Pyx_PyObject_AsPy_UCS4(PyObject*); |
+ |
+/////////////// ObjectAsUCS4 /////////////// |
+ |
+static CYTHON_INLINE Py_UCS4 __Pyx_PyObject_AsPy_UCS4(PyObject* x) { |
+ long ival; |
+ if (PyUnicode_Check(x)) { |
+ Py_ssize_t length; |
+ #if CYTHON_PEP393_ENABLED |
+ length = PyUnicode_GET_LENGTH(x); |
+ if (likely(length == 1)) { |
+ return PyUnicode_READ_CHAR(x, 0); |
+ } |
+ #else |
+ length = PyUnicode_GET_SIZE(x); |
+ if (likely(length == 1)) { |
+ return PyUnicode_AS_UNICODE(x)[0]; |
+ } |
+ #if Py_UNICODE_SIZE == 2 |
+ else if (PyUnicode_GET_SIZE(x) == 2) { |
+ Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; |
+ if (high_val >= 0xD800 && high_val <= 0xDBFF) { |
+ Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; |
+ if (low_val >= 0xDC00 && low_val <= 0xDFFF) { |
+ return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); |
+ } |
+ } |
+ } |
+ #endif |
+ #endif |
+ PyErr_Format(PyExc_ValueError, |
+ "only single character unicode strings can be converted to Py_UCS4, " |
+ "got length %" CYTHON_FORMAT_SSIZE_T "d", length); |
+ return (Py_UCS4)-1; |
+ } |
+ ival = __Pyx_PyInt_As_long(x); |
+ if (unlikely(ival < 0)) { |
+ if (!PyErr_Occurred()) |
+ PyErr_SetString(PyExc_OverflowError, |
+ "cannot convert negative value to Py_UCS4"); |
+ return (Py_UCS4)-1; |
+ } else if (unlikely(ival > 1114111)) { |
+ PyErr_SetString(PyExc_OverflowError, |
+ "value too large to convert to Py_UCS4"); |
+ return (Py_UCS4)-1; |
+ } |
+ return (Py_UCS4)ival; |
+} |
+ |
+/////////////// ObjectAsPyUnicode.proto /////////////// |
+ |
+static CYTHON_INLINE Py_UNICODE __Pyx_PyObject_AsPy_UNICODE(PyObject*); |
+ |
+/////////////// ObjectAsPyUnicode /////////////// |
+ |
+static CYTHON_INLINE Py_UNICODE __Pyx_PyObject_AsPy_UNICODE(PyObject* x) { |
+ long ival; |
+ #if CYTHON_PEP393_ENABLED |
+ #if Py_UNICODE_SIZE > 2 |
+ const long maxval = 1114111; |
+ #else |
+ const long maxval = 65535; |
+ #endif |
+ #else |
+ static long maxval = 0; |
+ #endif |
+ if (PyUnicode_Check(x)) { |
+ if (unlikely(__Pyx_PyUnicode_GET_LENGTH(x) != 1)) { |
+ PyErr_Format(PyExc_ValueError, |
+ "only single character unicode strings can be converted to Py_UNICODE, " |
+ "got length %" CYTHON_FORMAT_SSIZE_T "d", __Pyx_PyUnicode_GET_LENGTH(x)); |
+ return (Py_UNICODE)-1; |
+ } |
+ #if CYTHON_PEP393_ENABLED |
+ ival = PyUnicode_READ_CHAR(x, 0); |
+ #else |
+ return PyUnicode_AS_UNICODE(x)[0]; |
+ #endif |
+ } else { |
+ #if !CYTHON_PEP393_ENABLED |
+ if (unlikely(!maxval)) |
+ maxval = (long)PyUnicode_GetMax(); |
+ #endif |
+ ival = __Pyx_PyInt_As_long(x); |
+ } |
+ if (unlikely(ival < 0)) { |
+ if (!PyErr_Occurred()) |
+ PyErr_SetString(PyExc_OverflowError, |
+ "cannot convert negative value to Py_UNICODE"); |
+ return (Py_UNICODE)-1; |
+ } else if (unlikely(ival > maxval)) { |
+ PyErr_SetString(PyExc_OverflowError, |
+ "value too large to convert to Py_UNICODE"); |
+ return (Py_UNICODE)-1; |
+ } |
+ return (Py_UNICODE)ival; |
+} |
+ |
+ |
+/////////////// CIntToPy.proto /////////////// |
+ |
+static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value); |
+ |
+/////////////// CIntToPy /////////////// |
+ |
+static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value) { |
+ const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = 0; |
+ const int is_unsigned = neg_one > const_zero; |
+ if (is_unsigned) { |
+ if (sizeof({{TYPE}}) < sizeof(long)) { |
+ return PyInt_FromLong((long) value); |
+ } else if (sizeof({{TYPE}}) <= sizeof(unsigned long)) { |
+ return PyLong_FromUnsignedLong((unsigned long) value); |
+ } else if (sizeof({{TYPE}}) <= sizeof(unsigned long long)) { |
+ return PyLong_FromUnsignedLongLong((unsigned long long) value); |
+ } |
+ } else { |
+ if (sizeof({{TYPE}}) <= sizeof(long)) { |
+ return PyInt_FromLong((long) value); |
+ } else if (sizeof({{TYPE}}) <= sizeof(long long)) { |
+ return PyLong_FromLongLong((long long) value); |
+ } |
+ } |
+ { |
+ int one = 1; int little = (int)*(unsigned char *)&one; |
+ unsigned char *bytes = (unsigned char *)&value; |
+ return _PyLong_FromByteArray(bytes, sizeof({{TYPE}}), |
+ little, !is_unsigned); |
+ } |
+} |
+ |
+ |
+/////////////// CIntFromPyVerify /////////////// |
+ |
+#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func) \ |
+ { \ |
+ func_type value = func(x); \ |
+ if (sizeof(target_type) < sizeof(func_type)) { \ |
+ if (unlikely(value != (func_type) (target_type) value)) { \ |
+ func_type zero = 0; \ |
+ PyErr_SetString(PyExc_OverflowError, \ |
+ (is_unsigned && unlikely(value < zero)) ? \ |
+ "can't convert negative value to " #target_type : \ |
+ "value too large to convert to " #target_type); \ |
+ return (target_type) -1; \ |
+ } \ |
+ } \ |
+ return (target_type) value; \ |
+ } |
+ |
+ |
+/////////////// CIntFromPy.proto /////////////// |
+ |
+static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *); |
+ |
+/////////////// CIntFromPy /////////////// |
+//@requires: CIntFromPyVerify |
+ |
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 |
+ #if CYTHON_USE_PYLONG_INTERNALS |
+ #include "longintrepr.h" |
+ #endif |
+#endif |
+static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *x) { |
+ const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = 0; |
+ const int is_unsigned = neg_one > const_zero; |
+#if PY_MAJOR_VERSION < 3 |
+ if (likely(PyInt_Check(x))) { |
+ if (sizeof({{TYPE}}) < sizeof(long)) { |
+ __PYX_VERIFY_RETURN_INT({{TYPE}}, long, PyInt_AS_LONG) |
+ } else { |
+ long val = PyInt_AS_LONG(x); |
+ if (is_unsigned && unlikely(val < 0)) { |
+ PyErr_SetString(PyExc_OverflowError, |
+ "can't convert negative value to {{TYPE}}"); |
+ return ({{TYPE}}) -1; |
+ } |
+ return ({{TYPE}}) val; |
+ } |
+ } else |
+#endif |
+ if (likely(PyLong_Check(x))) { |
+ if (is_unsigned) { |
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 |
+ #if CYTHON_USE_PYLONG_INTERNALS |
+ if (sizeof(digit) <= sizeof({{TYPE}})) { |
+ switch (Py_SIZE(x)) { |
+ case 0: return 0; |
+ case 1: return ({{TYPE}}) ((PyLongObject*)x)->ob_digit[0]; |
+ } |
+ } |
+ #endif |
+#endif |
+ if (unlikely(Py_SIZE(x) < 0)) { |
+ PyErr_SetString(PyExc_OverflowError, |
+ "can't convert negative value to {{TYPE}}"); |
+ return ({{TYPE}}) -1; |
+ } |
+ if (sizeof({{TYPE}}) <= sizeof(unsigned long)) { |
+ __PYX_VERIFY_RETURN_INT({{TYPE}}, unsigned long, PyLong_AsUnsignedLong) |
+ } else if (sizeof({{TYPE}}) <= sizeof(unsigned long long)) { |
+ __PYX_VERIFY_RETURN_INT({{TYPE}}, unsigned long long, PyLong_AsUnsignedLongLong) |
+ } |
+ } else { |
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 |
+ #if CYTHON_USE_PYLONG_INTERNALS |
+ if (sizeof(digit) <= sizeof({{TYPE}})) { |
+ switch (Py_SIZE(x)) { |
+ case 0: return 0; |
+ case 1: return +({{TYPE}}) ((PyLongObject*)x)->ob_digit[0]; |
+ case -1: return -({{TYPE}}) ((PyLongObject*)x)->ob_digit[0]; |
+ } |
+ } |
+ #endif |
+#endif |
+ if (sizeof({{TYPE}}) <= sizeof(long)) { |
+ __PYX_VERIFY_RETURN_INT({{TYPE}}, long, PyLong_AsLong) |
+ } else if (sizeof({{TYPE}}) <= sizeof(long long)) { |
+ __PYX_VERIFY_RETURN_INT({{TYPE}}, long long, PyLong_AsLongLong) |
+ } |
+ } |
+ { |
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) |
+ PyErr_SetString(PyExc_RuntimeError, |
+ "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); |
+#else |
+ {{TYPE}} val; |
+ PyObject *v = __Pyx_PyNumber_Int(x); |
+ #if PY_MAJOR_VERSION < 3 |
+ if (likely(v) && !PyLong_Check(v)) { |
+ PyObject *tmp = v; |
+ v = PyNumber_Long(tmp); |
+ Py_DECREF(tmp); |
+ } |
+ #endif |
+ if (likely(v)) { |
+ int one = 1; int is_little = (int)*(unsigned char *)&one; |
+ unsigned char *bytes = (unsigned char *)&val; |
+ int ret = _PyLong_AsByteArray((PyLongObject *)v, |
+ bytes, sizeof(val), |
+ is_little, !is_unsigned); |
+ Py_DECREF(v); |
+ if (likely(!ret)) |
+ return val; |
+ } |
+#endif |
+ return ({{TYPE}}) -1; |
+ } |
+ } else { |
+ {{TYPE}} val; |
+ PyObject *tmp = __Pyx_PyNumber_Int(x); |
+ if (!tmp) return ({{TYPE}}) -1; |
+ val = {{FROM_PY_FUNCTION}}(tmp); |
+ Py_DECREF(tmp); |
+ return val; |
+ } |
+} |
+ |