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