15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/*
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Optional optimisations of built-in functions and methods.
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Required replacements of builtins are in Builtins.c.
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * General object operations and protocols are in ObjectHandling.c.
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// append.proto ///////////////
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x); /*proto*/
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// append ///////////////
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ListAppend
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ObjectHandling.c::PyObjectCallMethod
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (likely(PyList_CheckExact(L))) {
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return -1;
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyObject* retval = __Pyx_PyObject_CallMethod1(L, PYIDENT("append"), x);
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!retval))
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return -1;
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_DECREF(retval);
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 0;
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// ListAppend.proto ///////////////
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyListObject* L = (PyListObject*) list;
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_ssize_t len = Py_SIZE(list);
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(x);
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyList_SET_ITEM(list, len, x);
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_SIZE(list) = len+1;
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return 0;
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return PyList_Append(list, x);
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// ListCompAppend.proto ///////////////
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyListObject* L = (PyListObject*) list;
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_ssize_t len = Py_SIZE(list);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (likely(L->allocated > len)) {
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(x);
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyList_SET_ITEM(list, len, x);
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_SIZE(list) = len+1;
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return 0;
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return PyList_Append(list, x);
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//////////////////// ListExtend.proto ////////////////////
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) {
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* none = _PyList_Extend((PyListObject*)L, v);
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (unlikely(!none))
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return -1;
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_DECREF(none);
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 0;
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v);
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// pop.proto ///////////////
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __Pyx_PyObject_Pop(L) (PyList_CheckExact(L) ? \
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    __Pyx_PyList_Pop(L) : __Pyx__PyObject_Pop(L))
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L); /*proto*/
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L); /*proto*/
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// pop ///////////////
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ObjectHandling.c::PyObjectCallMethod
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L) {
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02050000
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (Py_TYPE(L) == &PySet_Type) {
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return PySet_Pop(L);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return __Pyx_PyObject_CallMethod0(L, PYIDENT("pop"));
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L) {
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /* Check that both the size is positive and no reallocation shrinking needs to be done. */
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_SIZE(L) -= 1;
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return __Pyx_PyObject_CallMethod0(L, PYIDENT("pop"));
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// pop_index.proto ///////////////
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __Pyx_PyObject_PopIndex(L, ix) (PyList_CheckExact(L) ? \
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    __Pyx_PyList_PopIndex(L, ix) : __Pyx__PyObject_PopIndex(L, ix))
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyObject* __Pyx_PyList_PopIndex(PyObject* L, Py_ssize_t ix); /*proto*/
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, Py_ssize_t ix); /*proto*/
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// pop_index ///////////////
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ObjectHandling.c::PyObjectCallMethod
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, Py_ssize_t ix) {
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *r, *py_ix;
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_ix = PyInt_FromSsize_t(ix);
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!py_ix) return NULL;
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    r = __Pyx_PyObject_CallMethod1(L, PYIDENT("pop"), py_ix);
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_DECREF(py_ix);
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return r;
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyObject* __Pyx_PyList_PopIndex(PyObject* L, Py_ssize_t ix) {
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_ssize_t size = PyList_GET_SIZE(L);
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (likely(size > (((PyListObject*)L)->allocated >> 1))) {
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_ssize_t cix = ix;
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (cix < 0) {
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            cix += size;
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (likely(0 <= cix && cix < size)) {
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyObject* v = PyList_GET_ITEM(L, cix);
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_SIZE(L) -= 1;
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            size -= 1;
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            memmove(&PyList_GET_ITEM(L, cix), &PyList_GET_ITEM(L, cix+1), (size_t)(size-cix)*sizeof(PyObject*));
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return v;
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return __Pyx__PyObject_PopIndex(L, ix);
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// dict_getitem_default.proto ///////////////
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); /*proto*/
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// dict_getitem_default ///////////////
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) {
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* value;
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if PY_MAJOR_VERSION >= 3
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value = PyDict_GetItemWithError(d, key);
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (unlikely(!value)) {
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(PyErr_Occurred()))
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return NULL;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = default_value;
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_INCREF(value);
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) {
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        /* these presumably have safe hash functions */
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = PyDict_GetItem(d, key);
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!value)) {
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            value = default_value;
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(value);
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (default_value == Py_None)
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            default_value = NULL;
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = PyObject_CallMethodObjArgs(
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            d, PYIDENT("get"), key, default_value, NULL);
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return value;
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// dict_setdefault.proto ///////////////
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *default_value, int is_safe_type); /*proto*/
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// dict_setdefault ///////////////
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ObjectHandling.c::PyObjectCallMethod
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *default_value,
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                       CYTHON_UNUSED int is_safe_type) {
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* value;
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if PY_VERSION_HEX >= 0x030400A0
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // we keep the method call at the end to avoid "unused" C compiler warnings
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (1) {
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = PyDict_SetDefault(d, key, default_value);
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!value)) return NULL;
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(value);
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (is_safe_type == 1 || (is_safe_type == -1 &&
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        /* the following builtins presumably have repeatably safe and fast hash functions */
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if PY_MAJOR_VERSION >= 3
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            (PyUnicode_CheckExact(key) || PyString_CheckExact(key) || PyLong_CheckExact(key)))) {
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = PyDict_GetItemWithError(d, key);
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!value)) {
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (unlikely(PyErr_Occurred()))
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                return NULL;
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (unlikely(PyDict_SetItem(d, key, default_value) == -1))
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                return NULL;
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            value = default_value;
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(value);
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key) || PyLong_CheckExact(key)))) {
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = PyDict_GetItem(d, key);
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!value)) {
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (unlikely(PyDict_SetItem(d, key, default_value) == -1))
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                return NULL;
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            value = default_value;
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(value);
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = __Pyx_PyObject_CallMethod2(d, PYIDENT("setdefault"), key, default_value);
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return value;
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// py_dict_clear.proto ///////////////
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __Pyx_PyDict_Clear(d) (PyDict_Clear(d), 0)
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// dict_iter.proto ///////////////
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name,
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                   Py_ssize_t* p_orig_length, int* p_is_dict);
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// dict_iter ///////////////
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ObjectHandling.c::UnpackTuple2
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ObjectHandling.c::IterFinish
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ObjectHandling.c::PyObjectCallMethod
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name,
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                   Py_ssize_t* p_orig_length, int* p_source_is_dict) {
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    is_dict = is_dict || likely(PyDict_CheckExact(iterable));
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *p_source_is_dict = is_dict;
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if !CYTHON_COMPILING_IN_PYPY
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (is_dict) {
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        *p_orig_length = PyDict_Size(iterable);
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(iterable);
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return iterable;
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *p_orig_length = 0;
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (method_name) {
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyObject* iter;
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        iterable = __Pyx_PyObject_CallMethod0(iterable, method_name);
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!iterable)
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return NULL;
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if !CYTHON_COMPILING_IN_PYPY
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable))
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return iterable;
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        iter = PyObject_GetIter(iterable);
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_DECREF(iterable);
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return iter;
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return PyObject_GetIter(iterable);
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos,
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* next_item;
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if !CYTHON_COMPILING_IN_PYPY
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (source_is_dict) {
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyObject *key, *value;
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(orig_length != PyDict_Size(iter_obj))) {
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration");
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return -1;
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) {
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return 0;
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (pitem) {
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyObject* tuple = PyTuple_New(2);
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (unlikely(!tuple)) {
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                return -1;
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            }
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_INCREF(key);
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_INCREF(value);
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyTuple_SET_ITEM(tuple, 0, key);
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyTuple_SET_ITEM(tuple, 1, value);
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            *pitem = tuple;
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        } else {
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (pkey) {
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                Py_INCREF(key);
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                *pkey = key;
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            }
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (pvalue) {
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                Py_INCREF(value);
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                *pvalue = value;
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            }
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return 1;
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else if (PyTuple_CheckExact(iter_obj)) {
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_ssize_t pos = *ppos;
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0;
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        *ppos = pos + 1;
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        next_item = PyTuple_GET_ITEM(iter_obj, pos);
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(next_item);
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else if (PyList_CheckExact(iter_obj)) {
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_ssize_t pos = *ppos;
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0;
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        *ppos = pos + 1;
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        next_item = PyList_GET_ITEM(iter_obj, pos);
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(next_item);
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    {
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        next_item = PyIter_Next(iter_obj);
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!next_item)) {
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return __Pyx_IterFinish();
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (pitem) {
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        *pitem = next_item;
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else if (pkey && pvalue) {
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return -1;
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else if (pkey) {
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        *pkey = next_item;
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        *pvalue = next_item;
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 1;
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// unicode_iter.proto ///////////////
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_init_unicode_iteration(
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* ustring, Py_ssize_t *length, void** data, int *kind); /* proto */
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// unicode_iter ///////////////
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE int __Pyx_init_unicode_iteration(
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* ustring, Py_ssize_t *length, void** data, int *kind) {
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_PEP393_ENABLED
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1;
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *kind   = PyUnicode_KIND(ustring);
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *length = PyUnicode_GET_LENGTH(ustring);
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *data   = PyUnicode_DATA(ustring);
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *kind   = 0;
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *length = PyUnicode_GET_SIZE(ustring);
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *data   = (void*)PyUnicode_AS_UNICODE(ustring);
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 0;
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// pyobject_as_double.proto ///////////////
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_PYPY
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __Pyx_PyObject_AsDouble(obj) \
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) likely(PyInt_CheckExact(obj)) ? \
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __Pyx_PyObject_AsDouble(obj) \
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)((likely(PyFloat_CheckExact(obj))) ? \
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// pyobject_as_double ///////////////
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static double __Pyx__PyObject_AsDouble(PyObject* obj) {
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* float_value;
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_PYPY
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    float_value = PyNumber_Float(obj);
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number;
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (likely(nb) && likely(nb->nb_float)) {
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        float_value = nb->nb_float(obj);
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) {
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_Format(PyExc_TypeError,
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "__float__ returned non-float (type %.200s)",
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                Py_TYPE(float_value)->tp_name);
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_DECREF(float_value);
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto bad;
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if PY_MAJOR_VERSION >= 3
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        float_value = PyFloat_FromString(obj);
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        float_value = PyFloat_FromString(obj, 0);
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyObject* args = PyTuple_New(1);
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(!args)) goto bad;
4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyTuple_SET_ITEM(args, 0, obj);
4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0);
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyTuple_SET_ITEM(args, 0, 0);
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_DECREF(args);
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (likely(float_value)) {
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        double value = PyFloat_AS_DOUBLE(float_value);
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_DECREF(float_value);
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return value;
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bad:
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return (double)-1;
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
424