Index: third_party/cython/src/Cython/Utility/Optimize.c |
diff --git a/third_party/cython/src/Cython/Utility/Optimize.c b/third_party/cython/src/Cython/Utility/Optimize.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a6a776e67b034c6a3a96313f407cc06500b68216 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Utility/Optimize.c |
@@ -0,0 +1,423 @@ |
+/* |
+ * Optional optimisations of built-in functions and methods. |
+ * |
+ * Required replacements of builtins are in Builtins.c. |
+ * |
+ * General object operations and protocols are in ObjectHandling.c. |
+ */ |
+ |
+/////////////// append.proto /////////////// |
+ |
+static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x); /*proto*/ |
+ |
+/////////////// append /////////////// |
+//@requires: ListAppend |
+//@requires: ObjectHandling.c::PyObjectCallMethod |
+ |
+static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) { |
+ if (likely(PyList_CheckExact(L))) { |
+ if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return -1; |
+ } else { |
+ PyObject* retval = __Pyx_PyObject_CallMethod1(L, PYIDENT("append"), x); |
+ if (unlikely(!retval)) |
+ return -1; |
+ Py_DECREF(retval); |
+ } |
+ return 0; |
+} |
+ |
+/////////////// ListAppend.proto /////////////// |
+ |
+#if CYTHON_COMPILING_IN_CPYTHON |
+static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { |
+ PyListObject* L = (PyListObject*) list; |
+ Py_ssize_t len = Py_SIZE(list); |
+ if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { |
+ Py_INCREF(x); |
+ PyList_SET_ITEM(list, len, x); |
+ Py_SIZE(list) = len+1; |
+ return 0; |
+ } |
+ return PyList_Append(list, x); |
+} |
+#else |
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) |
+#endif |
+ |
+/////////////// ListCompAppend.proto /////////////// |
+ |
+#if CYTHON_COMPILING_IN_CPYTHON |
+static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { |
+ PyListObject* L = (PyListObject*) list; |
+ Py_ssize_t len = Py_SIZE(list); |
+ if (likely(L->allocated > len)) { |
+ Py_INCREF(x); |
+ PyList_SET_ITEM(list, len, x); |
+ Py_SIZE(list) = len+1; |
+ return 0; |
+ } |
+ return PyList_Append(list, x); |
+} |
+#else |
+#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) |
+#endif |
+ |
+//////////////////// ListExtend.proto //////////////////// |
+ |
+static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { |
+#if CYTHON_COMPILING_IN_CPYTHON |
+ PyObject* none = _PyList_Extend((PyListObject*)L, v); |
+ if (unlikely(!none)) |
+ return -1; |
+ Py_DECREF(none); |
+ return 0; |
+#else |
+ return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); |
+#endif |
+} |
+ |
+/////////////// pop.proto /////////////// |
+ |
+#define __Pyx_PyObject_Pop(L) (PyList_CheckExact(L) ? \ |
+ __Pyx_PyList_Pop(L) : __Pyx__PyObject_Pop(L)) |
+ |
+static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L); /*proto*/ |
+static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L); /*proto*/ |
+ |
+/////////////// pop /////////////// |
+//@requires: ObjectHandling.c::PyObjectCallMethod |
+ |
+static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L) { |
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02050000 |
+ if (Py_TYPE(L) == &PySet_Type) { |
+ return PySet_Pop(L); |
+ } |
+#endif |
+ return __Pyx_PyObject_CallMethod0(L, PYIDENT("pop")); |
+} |
+ |
+static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L) { |
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000 |
+ /* Check that both the size is positive and no reallocation shrinking needs to be done. */ |
+ if (likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) { |
+ Py_SIZE(L) -= 1; |
+ return PyList_GET_ITEM(L, PyList_GET_SIZE(L)); |
+ } |
+#endif |
+ return __Pyx_PyObject_CallMethod0(L, PYIDENT("pop")); |
+} |
+ |
+ |
+/////////////// pop_index.proto /////////////// |
+ |
+#define __Pyx_PyObject_PopIndex(L, ix) (PyList_CheckExact(L) ? \ |
+ __Pyx_PyList_PopIndex(L, ix) : __Pyx__PyObject_PopIndex(L, ix)) |
+ |
+static PyObject* __Pyx_PyList_PopIndex(PyObject* L, Py_ssize_t ix); /*proto*/ |
+static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, Py_ssize_t ix); /*proto*/ |
+ |
+/////////////// pop_index /////////////// |
+//@requires: ObjectHandling.c::PyObjectCallMethod |
+ |
+static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, Py_ssize_t ix) { |
+ PyObject *r, *py_ix; |
+ py_ix = PyInt_FromSsize_t(ix); |
+ if (!py_ix) return NULL; |
+ r = __Pyx_PyObject_CallMethod1(L, PYIDENT("pop"), py_ix); |
+ Py_DECREF(py_ix); |
+ return r; |
+} |
+ |
+static PyObject* __Pyx_PyList_PopIndex(PyObject* L, Py_ssize_t ix) { |
+#if CYTHON_COMPILING_IN_CPYTHON |
+ Py_ssize_t size = PyList_GET_SIZE(L); |
+ if (likely(size > (((PyListObject*)L)->allocated >> 1))) { |
+ Py_ssize_t cix = ix; |
+ if (cix < 0) { |
+ cix += size; |
+ } |
+ if (likely(0 <= cix && cix < size)) { |
+ PyObject* v = PyList_GET_ITEM(L, cix); |
+ Py_SIZE(L) -= 1; |
+ size -= 1; |
+ memmove(&PyList_GET_ITEM(L, cix), &PyList_GET_ITEM(L, cix+1), (size_t)(size-cix)*sizeof(PyObject*)); |
+ return v; |
+ } |
+ } |
+#endif |
+ return __Pyx__PyObject_PopIndex(L, ix); |
+} |
+ |
+ |
+/////////////// dict_getitem_default.proto /////////////// |
+ |
+static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); /*proto*/ |
+ |
+/////////////// dict_getitem_default /////////////// |
+ |
+static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { |
+ PyObject* value; |
+#if PY_MAJOR_VERSION >= 3 |
+ value = PyDict_GetItemWithError(d, key); |
+ if (unlikely(!value)) { |
+ if (unlikely(PyErr_Occurred())) |
+ return NULL; |
+ value = default_value; |
+ } |
+ Py_INCREF(value); |
+#else |
+ if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { |
+ /* these presumably have safe hash functions */ |
+ value = PyDict_GetItem(d, key); |
+ if (unlikely(!value)) { |
+ value = default_value; |
+ } |
+ Py_INCREF(value); |
+ } else { |
+ if (default_value == Py_None) |
+ default_value = NULL; |
+ value = PyObject_CallMethodObjArgs( |
+ d, PYIDENT("get"), key, default_value, NULL); |
+ } |
+#endif |
+ return value; |
+} |
+ |
+ |
+/////////////// dict_setdefault.proto /////////////// |
+ |
+static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *default_value, int is_safe_type); /*proto*/ |
+ |
+/////////////// dict_setdefault /////////////// |
+//@requires: ObjectHandling.c::PyObjectCallMethod |
+ |
+static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *default_value, |
+ CYTHON_UNUSED int is_safe_type) { |
+ PyObject* value; |
+#if PY_VERSION_HEX >= 0x030400A0 |
+ // we keep the method call at the end to avoid "unused" C compiler warnings |
+ if (1) { |
+ value = PyDict_SetDefault(d, key, default_value); |
+ if (unlikely(!value)) return NULL; |
+ Py_INCREF(value); |
+#else |
+ if (is_safe_type == 1 || (is_safe_type == -1 && |
+ /* the following builtins presumably have repeatably safe and fast hash functions */ |
+#if PY_MAJOR_VERSION >= 3 |
+ (PyUnicode_CheckExact(key) || PyString_CheckExact(key) || PyLong_CheckExact(key)))) { |
+ value = PyDict_GetItemWithError(d, key); |
+ if (unlikely(!value)) { |
+ if (unlikely(PyErr_Occurred())) |
+ return NULL; |
+ if (unlikely(PyDict_SetItem(d, key, default_value) == -1)) |
+ return NULL; |
+ value = default_value; |
+ } |
+ Py_INCREF(value); |
+#else |
+ (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key) || PyLong_CheckExact(key)))) { |
+ value = PyDict_GetItem(d, key); |
+ if (unlikely(!value)) { |
+ if (unlikely(PyDict_SetItem(d, key, default_value) == -1)) |
+ return NULL; |
+ value = default_value; |
+ } |
+ Py_INCREF(value); |
+#endif |
+#endif |
+ } else { |
+ value = __Pyx_PyObject_CallMethod2(d, PYIDENT("setdefault"), key, default_value); |
+ } |
+ return value; |
+} |
+ |
+ |
+/////////////// py_dict_clear.proto /////////////// |
+ |
+#define __Pyx_PyDict_Clear(d) (PyDict_Clear(d), 0) |
+ |
+/////////////// dict_iter.proto /////////////// |
+ |
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, |
+ Py_ssize_t* p_orig_length, int* p_is_dict); |
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, |
+ PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); |
+ |
+/////////////// dict_iter /////////////// |
+//@requires: ObjectHandling.c::UnpackTuple2 |
+//@requires: ObjectHandling.c::IterFinish |
+//@requires: ObjectHandling.c::PyObjectCallMethod |
+ |
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, |
+ Py_ssize_t* p_orig_length, int* p_source_is_dict) { |
+ is_dict = is_dict || likely(PyDict_CheckExact(iterable)); |
+ *p_source_is_dict = is_dict; |
+#if !CYTHON_COMPILING_IN_PYPY |
+ if (is_dict) { |
+ *p_orig_length = PyDict_Size(iterable); |
+ Py_INCREF(iterable); |
+ return iterable; |
+ } |
+#endif |
+ *p_orig_length = 0; |
+ if (method_name) { |
+ PyObject* iter; |
+ iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); |
+ if (!iterable) |
+ return NULL; |
+#if !CYTHON_COMPILING_IN_PYPY |
+ if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) |
+ return iterable; |
+#endif |
+ iter = PyObject_GetIter(iterable); |
+ Py_DECREF(iterable); |
+ return iter; |
+ } |
+ return PyObject_GetIter(iterable); |
+} |
+ |
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos, |
+ PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { |
+ PyObject* next_item; |
+#if !CYTHON_COMPILING_IN_PYPY |
+ if (source_is_dict) { |
+ PyObject *key, *value; |
+ if (unlikely(orig_length != PyDict_Size(iter_obj))) { |
+ PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); |
+ return -1; |
+ } |
+ if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { |
+ return 0; |
+ } |
+ if (pitem) { |
+ PyObject* tuple = PyTuple_New(2); |
+ if (unlikely(!tuple)) { |
+ return -1; |
+ } |
+ Py_INCREF(key); |
+ Py_INCREF(value); |
+ PyTuple_SET_ITEM(tuple, 0, key); |
+ PyTuple_SET_ITEM(tuple, 1, value); |
+ *pitem = tuple; |
+ } else { |
+ if (pkey) { |
+ Py_INCREF(key); |
+ *pkey = key; |
+ } |
+ if (pvalue) { |
+ Py_INCREF(value); |
+ *pvalue = value; |
+ } |
+ } |
+ return 1; |
+ } else if (PyTuple_CheckExact(iter_obj)) { |
+ Py_ssize_t pos = *ppos; |
+ if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; |
+ *ppos = pos + 1; |
+ next_item = PyTuple_GET_ITEM(iter_obj, pos); |
+ Py_INCREF(next_item); |
+ } else if (PyList_CheckExact(iter_obj)) { |
+ Py_ssize_t pos = *ppos; |
+ if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; |
+ *ppos = pos + 1; |
+ next_item = PyList_GET_ITEM(iter_obj, pos); |
+ Py_INCREF(next_item); |
+ } else |
+#endif |
+ { |
+ next_item = PyIter_Next(iter_obj); |
+ if (unlikely(!next_item)) { |
+ return __Pyx_IterFinish(); |
+ } |
+ } |
+ if (pitem) { |
+ *pitem = next_item; |
+ } else if (pkey && pvalue) { |
+ if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) |
+ return -1; |
+ } else if (pkey) { |
+ *pkey = next_item; |
+ } else { |
+ *pvalue = next_item; |
+ } |
+ return 1; |
+} |
+ |
+ |
+/////////////// unicode_iter.proto /////////////// |
+ |
+static CYTHON_INLINE int __Pyx_init_unicode_iteration( |
+ PyObject* ustring, Py_ssize_t *length, void** data, int *kind); /* proto */ |
+ |
+/////////////// unicode_iter /////////////// |
+ |
+static CYTHON_INLINE int __Pyx_init_unicode_iteration( |
+ PyObject* ustring, Py_ssize_t *length, void** data, int *kind) { |
+#if CYTHON_PEP393_ENABLED |
+ if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1; |
+ *kind = PyUnicode_KIND(ustring); |
+ *length = PyUnicode_GET_LENGTH(ustring); |
+ *data = PyUnicode_DATA(ustring); |
+#else |
+ *kind = 0; |
+ *length = PyUnicode_GET_SIZE(ustring); |
+ *data = (void*)PyUnicode_AS_UNICODE(ustring); |
+#endif |
+ return 0; |
+} |
+ |
+/////////////// pyobject_as_double.proto /////////////// |
+ |
+static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */ |
+ |
+#if CYTHON_COMPILING_IN_PYPY |
+#define __Pyx_PyObject_AsDouble(obj) \ |
+(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \ |
+ likely(PyInt_CheckExact(obj)) ? \ |
+ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) |
+#else |
+#define __Pyx_PyObject_AsDouble(obj) \ |
+((likely(PyFloat_CheckExact(obj))) ? \ |
+ PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj)) |
+#endif |
+ |
+/////////////// pyobject_as_double /////////////// |
+ |
+static double __Pyx__PyObject_AsDouble(PyObject* obj) { |
+ PyObject* float_value; |
+#if CYTHON_COMPILING_IN_PYPY |
+ float_value = PyNumber_Float(obj); |
+#else |
+ PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number; |
+ if (likely(nb) && likely(nb->nb_float)) { |
+ float_value = nb->nb_float(obj); |
+ if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) { |
+ PyErr_Format(PyExc_TypeError, |
+ "__float__ returned non-float (type %.200s)", |
+ Py_TYPE(float_value)->tp_name); |
+ Py_DECREF(float_value); |
+ goto bad; |
+ } |
+ } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) { |
+#if PY_MAJOR_VERSION >= 3 |
+ float_value = PyFloat_FromString(obj); |
+#else |
+ float_value = PyFloat_FromString(obj, 0); |
+#endif |
+ } else { |
+ PyObject* args = PyTuple_New(1); |
+ if (unlikely(!args)) goto bad; |
+ PyTuple_SET_ITEM(args, 0, obj); |
+ float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0); |
+ PyTuple_SET_ITEM(args, 0, 0); |
+ Py_DECREF(args); |
+ } |
+#endif |
+ if (likely(float_value)) { |
+ double value = PyFloat_AS_DOUBLE(float_value); |
+ Py_DECREF(float_value); |
+ return value; |
+ } |
+bad: |
+ return (double)-1; |
+} |