1 /* 2 * Optional optimisations of built-in functions and methods. 3 * 4 * Required replacements of builtins are in Builtins.c. 5 * 6 * General object operations and protocols are in ObjectHandling.c. 7 */ 8 9 /////////////// append.proto /////////////// 10 11 static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x); /*proto*/ 12 13 /////////////// append /////////////// 14 //@requires: ListAppend 15 //@requires: ObjectHandling.c::PyObjectCallMethod 16 17 static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) { 18 if (likely(PyList_CheckExact(L))) { 19 if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return -1; 20 } else { 21 PyObject* retval = __Pyx_PyObject_CallMethod1(L, PYIDENT("append"), x); 22 if (unlikely(!retval)) 23 return -1; 24 Py_DECREF(retval); 25 } 26 return 0; 27 } 28 29 /////////////// ListAppend.proto /////////////// 30 31 #if CYTHON_COMPILING_IN_CPYTHON 32 static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { 33 PyListObject* L = (PyListObject*) list; 34 Py_ssize_t len = Py_SIZE(list); 35 if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { 36 Py_INCREF(x); 37 PyList_SET_ITEM(list, len, x); 38 Py_SIZE(list) = len+1; 39 return 0; 40 } 41 return PyList_Append(list, x); 42 } 43 #else 44 #define __Pyx_PyList_Append(L,x) PyList_Append(L,x) 45 #endif 46 47 /////////////// ListCompAppend.proto /////////////// 48 49 #if CYTHON_COMPILING_IN_CPYTHON 50 static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { 51 PyListObject* L = (PyListObject*) list; 52 Py_ssize_t len = Py_SIZE(list); 53 if (likely(L->allocated > len)) { 54 Py_INCREF(x); 55 PyList_SET_ITEM(list, len, x); 56 Py_SIZE(list) = len+1; 57 return 0; 58 } 59 return PyList_Append(list, x); 60 } 61 #else 62 #define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) 63 #endif 64 65 //////////////////// ListExtend.proto //////////////////// 66 67 static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { 68 #if CYTHON_COMPILING_IN_CPYTHON 69 PyObject* none = _PyList_Extend((PyListObject*)L, v); 70 if (unlikely(!none)) 71 return -1; 72 Py_DECREF(none); 73 return 0; 74 #else 75 return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); 76 #endif 77 } 78 79 /////////////// pop.proto /////////////// 80 81 #define __Pyx_PyObject_Pop(L) (PyList_CheckExact(L) ? \ 82 __Pyx_PyList_Pop(L) : __Pyx__PyObject_Pop(L)) 83 84 static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L); /*proto*/ 85 static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L); /*proto*/ 86 87 /////////////// pop /////////////// 88 //@requires: ObjectHandling.c::PyObjectCallMethod 89 90 static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L) { 91 #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02050000 92 if (Py_TYPE(L) == &PySet_Type) { 93 return PySet_Pop(L); 94 } 95 #endif 96 return __Pyx_PyObject_CallMethod0(L, PYIDENT("pop")); 97 } 98 99 static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L) { 100 #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000 101 /* Check that both the size is positive and no reallocation shrinking needs to be done. */ 102 if (likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) { 103 Py_SIZE(L) -= 1; 104 return PyList_GET_ITEM(L, PyList_GET_SIZE(L)); 105 } 106 #endif 107 return __Pyx_PyObject_CallMethod0(L, PYIDENT("pop")); 108 } 109 110 111 /////////////// pop_index.proto /////////////// 112 113 #define __Pyx_PyObject_PopIndex(L, ix) (PyList_CheckExact(L) ? \ 114 __Pyx_PyList_PopIndex(L, ix) : __Pyx__PyObject_PopIndex(L, ix)) 115 116 static PyObject* __Pyx_PyList_PopIndex(PyObject* L, Py_ssize_t ix); /*proto*/ 117 static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, Py_ssize_t ix); /*proto*/ 118 119 /////////////// pop_index /////////////// 120 //@requires: ObjectHandling.c::PyObjectCallMethod 121 122 static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, Py_ssize_t ix) { 123 PyObject *r, *py_ix; 124 py_ix = PyInt_FromSsize_t(ix); 125 if (!py_ix) return NULL; 126 r = __Pyx_PyObject_CallMethod1(L, PYIDENT("pop"), py_ix); 127 Py_DECREF(py_ix); 128 return r; 129 } 130 131 static PyObject* __Pyx_PyList_PopIndex(PyObject* L, Py_ssize_t ix) { 132 #if CYTHON_COMPILING_IN_CPYTHON 133 Py_ssize_t size = PyList_GET_SIZE(L); 134 if (likely(size > (((PyListObject*)L)->allocated >> 1))) { 135 Py_ssize_t cix = ix; 136 if (cix < 0) { 137 cix += size; 138 } 139 if (likely(0 <= cix && cix < size)) { 140 PyObject* v = PyList_GET_ITEM(L, cix); 141 Py_SIZE(L) -= 1; 142 size -= 1; 143 memmove(&PyList_GET_ITEM(L, cix), &PyList_GET_ITEM(L, cix+1), (size_t)(size-cix)*sizeof(PyObject*)); 144 return v; 145 } 146 } 147 #endif 148 return __Pyx__PyObject_PopIndex(L, ix); 149 } 150 151 152 /////////////// dict_getitem_default.proto /////////////// 153 154 static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); /*proto*/ 155 156 /////////////// dict_getitem_default /////////////// 157 158 static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { 159 PyObject* value; 160 #if PY_MAJOR_VERSION >= 3 161 value = PyDict_GetItemWithError(d, key); 162 if (unlikely(!value)) { 163 if (unlikely(PyErr_Occurred())) 164 return NULL; 165 value = default_value; 166 } 167 Py_INCREF(value); 168 #else 169 if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { 170 /* these presumably have safe hash functions */ 171 value = PyDict_GetItem(d, key); 172 if (unlikely(!value)) { 173 value = default_value; 174 } 175 Py_INCREF(value); 176 } else { 177 if (default_value == Py_None) 178 default_value = NULL; 179 value = PyObject_CallMethodObjArgs( 180 d, PYIDENT("get"), key, default_value, NULL); 181 } 182 #endif 183 return value; 184 } 185 186 187 /////////////// dict_setdefault.proto /////////////// 188 189 static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *default_value, int is_safe_type); /*proto*/ 190 191 /////////////// dict_setdefault /////////////// 192 //@requires: ObjectHandling.c::PyObjectCallMethod 193 194 static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *default_value, 195 CYTHON_UNUSED int is_safe_type) { 196 PyObject* value; 197 #if PY_VERSION_HEX >= 0x030400A0 198 // we keep the method call at the end to avoid "unused" C compiler warnings 199 if (1) { 200 value = PyDict_SetDefault(d, key, default_value); 201 if (unlikely(!value)) return NULL; 202 Py_INCREF(value); 203 #else 204 if (is_safe_type == 1 || (is_safe_type == -1 && 205 /* the following builtins presumably have repeatably safe and fast hash functions */ 206 #if PY_MAJOR_VERSION >= 3 207 (PyUnicode_CheckExact(key) || PyString_CheckExact(key) || PyLong_CheckExact(key)))) { 208 value = PyDict_GetItemWithError(d, key); 209 if (unlikely(!value)) { 210 if (unlikely(PyErr_Occurred())) 211 return NULL; 212 if (unlikely(PyDict_SetItem(d, key, default_value) == -1)) 213 return NULL; 214 value = default_value; 215 } 216 Py_INCREF(value); 217 #else 218 (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key) || PyLong_CheckExact(key)))) { 219 value = PyDict_GetItem(d, key); 220 if (unlikely(!value)) { 221 if (unlikely(PyDict_SetItem(d, key, default_value) == -1)) 222 return NULL; 223 value = default_value; 224 } 225 Py_INCREF(value); 226 #endif 227 #endif 228 } else { 229 value = __Pyx_PyObject_CallMethod2(d, PYIDENT("setdefault"), key, default_value); 230 } 231 return value; 232 } 233 234 235 /////////////// py_dict_clear.proto /////////////// 236 237 #define __Pyx_PyDict_Clear(d) (PyDict_Clear(d), 0) 238 239 /////////////// dict_iter.proto /////////////// 240 241 static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, 242 Py_ssize_t* p_orig_length, int* p_is_dict); 243 static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, 244 PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); 245 246 /////////////// dict_iter /////////////// 247 //@requires: ObjectHandling.c::UnpackTuple2 248 //@requires: ObjectHandling.c::IterFinish 249 //@requires: ObjectHandling.c::PyObjectCallMethod 250 251 static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, 252 Py_ssize_t* p_orig_length, int* p_source_is_dict) { 253 is_dict = is_dict || likely(PyDict_CheckExact(iterable)); 254 *p_source_is_dict = is_dict; 255 #if !CYTHON_COMPILING_IN_PYPY 256 if (is_dict) { 257 *p_orig_length = PyDict_Size(iterable); 258 Py_INCREF(iterable); 259 return iterable; 260 } 261 #endif 262 *p_orig_length = 0; 263 if (method_name) { 264 PyObject* iter; 265 iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); 266 if (!iterable) 267 return NULL; 268 #if !CYTHON_COMPILING_IN_PYPY 269 if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) 270 return iterable; 271 #endif 272 iter = PyObject_GetIter(iterable); 273 Py_DECREF(iterable); 274 return iter; 275 } 276 return PyObject_GetIter(iterable); 277 } 278 279 static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos, 280 PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { 281 PyObject* next_item; 282 #if !CYTHON_COMPILING_IN_PYPY 283 if (source_is_dict) { 284 PyObject *key, *value; 285 if (unlikely(orig_length != PyDict_Size(iter_obj))) { 286 PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); 287 return -1; 288 } 289 if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { 290 return 0; 291 } 292 if (pitem) { 293 PyObject* tuple = PyTuple_New(2); 294 if (unlikely(!tuple)) { 295 return -1; 296 } 297 Py_INCREF(key); 298 Py_INCREF(value); 299 PyTuple_SET_ITEM(tuple, 0, key); 300 PyTuple_SET_ITEM(tuple, 1, value); 301 *pitem = tuple; 302 } else { 303 if (pkey) { 304 Py_INCREF(key); 305 *pkey = key; 306 } 307 if (pvalue) { 308 Py_INCREF(value); 309 *pvalue = value; 310 } 311 } 312 return 1; 313 } else if (PyTuple_CheckExact(iter_obj)) { 314 Py_ssize_t pos = *ppos; 315 if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; 316 *ppos = pos + 1; 317 next_item = PyTuple_GET_ITEM(iter_obj, pos); 318 Py_INCREF(next_item); 319 } else if (PyList_CheckExact(iter_obj)) { 320 Py_ssize_t pos = *ppos; 321 if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; 322 *ppos = pos + 1; 323 next_item = PyList_GET_ITEM(iter_obj, pos); 324 Py_INCREF(next_item); 325 } else 326 #endif 327 { 328 next_item = PyIter_Next(iter_obj); 329 if (unlikely(!next_item)) { 330 return __Pyx_IterFinish(); 331 } 332 } 333 if (pitem) { 334 *pitem = next_item; 335 } else if (pkey && pvalue) { 336 if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) 337 return -1; 338 } else if (pkey) { 339 *pkey = next_item; 340 } else { 341 *pvalue = next_item; 342 } 343 return 1; 344 } 345 346 347 /////////////// unicode_iter.proto /////////////// 348 349 static CYTHON_INLINE int __Pyx_init_unicode_iteration( 350 PyObject* ustring, Py_ssize_t *length, void** data, int *kind); /* proto */ 351 352 /////////////// unicode_iter /////////////// 353 354 static CYTHON_INLINE int __Pyx_init_unicode_iteration( 355 PyObject* ustring, Py_ssize_t *length, void** data, int *kind) { 356 #if CYTHON_PEP393_ENABLED 357 if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1; 358 *kind = PyUnicode_KIND(ustring); 359 *length = PyUnicode_GET_LENGTH(ustring); 360 *data = PyUnicode_DATA(ustring); 361 #else 362 *kind = 0; 363 *length = PyUnicode_GET_SIZE(ustring); 364 *data = (void*)PyUnicode_AS_UNICODE(ustring); 365 #endif 366 return 0; 367 } 368 369 /////////////// pyobject_as_double.proto /////////////// 370 371 static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */ 372 373 #if CYTHON_COMPILING_IN_PYPY 374 #define __Pyx_PyObject_AsDouble(obj) \ 375 (likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \ 376 likely(PyInt_CheckExact(obj)) ? \ 377 PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) 378 #else 379 #define __Pyx_PyObject_AsDouble(obj) \ 380 ((likely(PyFloat_CheckExact(obj))) ? \ 381 PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj)) 382 #endif 383 384 /////////////// pyobject_as_double /////////////// 385 386 static double __Pyx__PyObject_AsDouble(PyObject* obj) { 387 PyObject* float_value; 388 #if CYTHON_COMPILING_IN_PYPY 389 float_value = PyNumber_Float(obj); 390 #else 391 PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number; 392 if (likely(nb) && likely(nb->nb_float)) { 393 float_value = nb->nb_float(obj); 394 if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) { 395 PyErr_Format(PyExc_TypeError, 396 "__float__ returned non-float (type %.200s)", 397 Py_TYPE(float_value)->tp_name); 398 Py_DECREF(float_value); 399 goto bad; 400 } 401 } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) { 402 #if PY_MAJOR_VERSION >= 3 403 float_value = PyFloat_FromString(obj); 404 #else 405 float_value = PyFloat_FromString(obj, 0); 406 #endif 407 } else { 408 PyObject* args = PyTuple_New(1); 409 if (unlikely(!args)) goto bad; 410 PyTuple_SET_ITEM(args, 0, obj); 411 float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0); 412 PyTuple_SET_ITEM(args, 0, 0); 413 Py_DECREF(args); 414 } 415 #endif 416 if (likely(float_value)) { 417 double value = PyFloat_AS_DOUBLE(float_value); 418 Py_DECREF(float_value); 419 return value; 420 } 421 bad: 422 return (double)-1; 423 } 424