LCOV - code coverage report
Current view: top level - Objects - abstract.c (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 1125 1458 77.2 %
Date: 2022-07-20 13:12:14 Functions: 111 131 84.7 %
Branches: 724 986 73.4 %

           Branch data     Line data    Source code
       1                 :            : /* Abstract Object Interface (many thanks to Jim Fulton) */
       2                 :            : 
       3                 :            : #include "Python.h"
       4                 :            : #include "pycore_abstract.h"      // _PyIndex_Check()
       5                 :            : #include "pycore_call.h"          // _PyObject_CallNoArgs()
       6                 :            : #include "pycore_ceval.h"         // _Py_EnterRecursiveCallTstate()
       7                 :            : #include "pycore_object.h"        // _Py_CheckSlotResult()
       8                 :            : #include "pycore_pyerrors.h"      // _PyErr_Occurred()
       9                 :            : #include "pycore_pystate.h"       // _PyThreadState_GET()
      10                 :            : #include "pycore_unionobject.h"   // _PyUnion_Check()
      11                 :            : #include <ctype.h>
      12                 :            : #include <stddef.h>               // offsetof()
      13                 :            : 
      14                 :            : 
      15                 :            : 
      16                 :            : /* Shorthands to return certain errors */
      17                 :            : 
      18                 :            : static PyObject *
      19                 :      89336 : type_error(const char *msg, PyObject *obj)
      20                 :            : {
      21                 :      89336 :     PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name);
      22                 :      89336 :     return NULL;
      23                 :            : }
      24                 :            : 
      25                 :            : static PyObject *
      26                 :          0 : null_error(void)
      27                 :            : {
      28                 :          0 :     PyThreadState *tstate = _PyThreadState_GET();
      29         [ #  # ]:          0 :     if (!_PyErr_Occurred(tstate)) {
      30                 :          0 :         _PyErr_SetString(tstate, PyExc_SystemError,
      31                 :            :                          "null argument to internal routine");
      32                 :            :     }
      33                 :          0 :     return NULL;
      34                 :            : }
      35                 :            : 
      36                 :            : /* Operations on any object */
      37                 :            : 
      38                 :            : PyObject *
      39                 :      26827 : PyObject_Type(PyObject *o)
      40                 :            : {
      41                 :            :     PyObject *v;
      42                 :            : 
      43         [ -  + ]:      26827 :     if (o == NULL) {
      44                 :          0 :         return null_error();
      45                 :            :     }
      46                 :            : 
      47                 :      26827 :     v = (PyObject *)Py_TYPE(o);
      48                 :      26827 :     Py_INCREF(v);
      49                 :      26827 :     return v;
      50                 :            : }
      51                 :            : 
      52                 :            : Py_ssize_t
      53                 :   32240355 : PyObject_Size(PyObject *o)
      54                 :            : {
      55         [ -  + ]:   32240355 :     if (o == NULL) {
      56                 :          0 :         null_error();
      57                 :          0 :         return -1;
      58                 :            :     }
      59                 :            : 
      60                 :   32240355 :     PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
      61   [ +  +  +  + ]:   32240355 :     if (m && m->sq_length) {
      62                 :   31030903 :         Py_ssize_t len = m->sq_length(o);
      63                 :            :         assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
      64                 :   31030903 :         return len;
      65                 :            :     }
      66                 :            : 
      67                 :    1209452 :     return PyMapping_Size(o);
      68                 :            : }
      69                 :            : 
      70                 :            : #undef PyObject_Length
      71                 :            : Py_ssize_t
      72                 :          0 : PyObject_Length(PyObject *o)
      73                 :            : {
      74                 :          0 :     return PyObject_Size(o);
      75                 :            : }
      76                 :            : #define PyObject_Length PyObject_Size
      77                 :            : 
      78                 :            : int
      79                 :    1761252 : _PyObject_HasLen(PyObject *o) {
      80   [ +  +  +  + ]:    3274856 :     return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
      81   [ +  +  +  + ]:    1513604 :         (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
      82                 :            : }
      83                 :            : 
      84                 :            : /* The length hint function returns a non-negative value from o.__len__()
      85                 :            :    or o.__length_hint__(). If those methods aren't found the defaultvalue is
      86                 :            :    returned.  If one of the calls fails with an exception other than TypeError
      87                 :            :    this function returns -1.
      88                 :            : */
      89                 :            : 
      90                 :            : Py_ssize_t
      91                 :    1751842 : PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
      92                 :            : {
      93                 :            :     PyObject *hint, *result;
      94                 :            :     Py_ssize_t res;
      95         [ +  + ]:    1751842 :     if (_PyObject_HasLen(o)) {
      96                 :     372516 :         res = PyObject_Length(o);
      97         [ +  + ]:     372516 :         if (res < 0) {
      98                 :          5 :             PyThreadState *tstate = _PyThreadState_GET();
      99                 :            :             assert(_PyErr_Occurred(tstate));
     100         [ +  + ]:          5 :             if (!_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
     101                 :          3 :                 return -1;
     102                 :            :             }
     103                 :          2 :             _PyErr_Clear(tstate);
     104                 :            :         }
     105                 :            :         else {
     106                 :     372511 :             return res;
     107                 :            :         }
     108                 :            :     }
     109                 :    1379328 :     hint = _PyObject_LookupSpecial(o, &_Py_ID(__length_hint__));
     110         [ +  + ]:    1379328 :     if (hint == NULL) {
     111         [ +  + ]:     962767 :         if (PyErr_Occurred()) {
     112                 :          1 :             return -1;
     113                 :            :         }
     114                 :     962766 :         return defaultvalue;
     115                 :            :     }
     116                 :     416561 :     result = _PyObject_CallNoArgs(hint);
     117                 :     416561 :     Py_DECREF(hint);
     118         [ +  + ]:     416561 :     if (result == NULL) {
     119                 :          7 :         PyThreadState *tstate = _PyThreadState_GET();
     120         [ +  + ]:          7 :         if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
     121                 :          2 :             _PyErr_Clear(tstate);
     122                 :          2 :             return defaultvalue;
     123                 :            :         }
     124                 :          5 :         return -1;
     125                 :            :     }
     126         [ +  + ]:     416554 :     else if (result == Py_NotImplemented) {
     127                 :         49 :         Py_DECREF(result);
     128                 :         49 :         return defaultvalue;
     129                 :            :     }
     130         [ +  + ]:     416505 :     if (!PyLong_Check(result)) {
     131                 :          1 :         PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
     132                 :          1 :             Py_TYPE(result)->tp_name);
     133                 :          1 :         Py_DECREF(result);
     134                 :          1 :         return -1;
     135                 :            :     }
     136                 :     416504 :     res = PyLong_AsSsize_t(result);
     137                 :     416504 :     Py_DECREF(result);
     138   [ +  +  -  + ]:     416504 :     if (res < 0 && PyErr_Occurred()) {
     139                 :          0 :         return -1;
     140                 :            :     }
     141         [ +  + ]:     416504 :     if (res < 0) {
     142                 :          1 :         PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
     143                 :          1 :         return -1;
     144                 :            :     }
     145                 :     416503 :     return res;
     146                 :            : }
     147                 :            : 
     148                 :            : PyObject *
     149                 :  130694002 : PyObject_GetItem(PyObject *o, PyObject *key)
     150                 :            : {
     151   [ +  -  -  + ]:  130694002 :     if (o == NULL || key == NULL) {
     152                 :          0 :         return null_error();
     153                 :            :     }
     154                 :            : 
     155                 :  130694002 :     PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
     156   [ +  +  +  + ]:  130694002 :     if (m && m->mp_subscript) {
     157                 :  130558404 :         PyObject *item = m->mp_subscript(o, key);
     158                 :            :         assert(_Py_CheckSlotResult(o, "__getitem__", item != NULL));
     159                 :  130558404 :         return item;
     160                 :            :     }
     161                 :            : 
     162                 :     135598 :     PySequenceMethods *ms = Py_TYPE(o)->tp_as_sequence;
     163   [ +  +  +  + ]:     135598 :     if (ms && ms->sq_item) {
     164         [ +  - ]:     106586 :         if (_PyIndex_Check(key)) {
     165                 :            :             Py_ssize_t key_value;
     166                 :     106586 :             key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
     167   [ +  +  -  + ]:     106586 :             if (key_value == -1 && PyErr_Occurred())
     168                 :          0 :                 return NULL;
     169                 :     106586 :             return PySequence_GetItem(o, key_value);
     170                 :            :         }
     171                 :            :         else {
     172                 :          0 :             return type_error("sequence index must "
     173                 :            :                               "be integer, not '%.200s'", key);
     174                 :            :         }
     175                 :            :     }
     176                 :            : 
     177         [ +  + ]:      29012 :     if (PyType_Check(o)) {
     178                 :            :         PyObject *meth, *result;
     179                 :            : 
     180                 :            :         // Special case type[int], but disallow other types so str[int] fails
     181         [ +  + ]:      27332 :         if ((PyTypeObject*)o == &PyType_Type) {
     182                 :       1382 :             return Py_GenericAlias(o, key);
     183                 :            :         }
     184                 :            : 
     185         [ -  + ]:      25950 :         if (_PyObject_LookupAttr(o, &_Py_ID(__class_getitem__), &meth) < 0) {
     186                 :          0 :             return NULL;
     187                 :            :         }
     188   [ +  +  +  + ]:      25950 :         if (meth && meth != Py_None) {
     189                 :      25941 :             result = PyObject_CallOneArg(meth, key);
     190                 :      25941 :             Py_DECREF(meth);
     191                 :      25941 :             return result;
     192                 :            :         }
     193                 :          9 :         Py_XDECREF(meth);
     194                 :          9 :         PyErr_Format(PyExc_TypeError, "type '%.200s' is not subscriptable",
     195                 :            :                      ((PyTypeObject *)o)->tp_name);
     196                 :          9 :         return NULL;
     197                 :            :     }
     198                 :            : 
     199                 :       1680 :     return type_error("'%.200s' object is not subscriptable", o);
     200                 :            : }
     201                 :            : 
     202                 :            : int
     203                 :   10712809 : PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
     204                 :            : {
     205   [ +  -  +  -  :   10712809 :     if (o == NULL || key == NULL || value == NULL) {
                   -  + ]
     206                 :          0 :         null_error();
     207                 :          0 :         return -1;
     208                 :            :     }
     209                 :            : 
     210                 :   10712809 :     PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
     211   [ +  +  +  + ]:   10712809 :     if (m && m->mp_ass_subscript) {
     212                 :   10707720 :         int res = m->mp_ass_subscript(o, key, value);
     213                 :            :         assert(_Py_CheckSlotResult(o, "__setitem__", res >= 0));
     214                 :   10707720 :         return res;
     215                 :            :     }
     216                 :            : 
     217         [ +  - ]:       5089 :     if (Py_TYPE(o)->tp_as_sequence) {
     218         [ +  + ]:       5089 :         if (_PyIndex_Check(key)) {
     219                 :            :             Py_ssize_t key_value;
     220                 :       5030 :             key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
     221   [ -  +  -  - ]:       5030 :             if (key_value == -1 && PyErr_Occurred())
     222                 :          0 :                 return -1;
     223                 :       5030 :             return PySequence_SetItem(o, key_value, value);
     224                 :            :         }
     225         [ +  + ]:         59 :         else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
     226                 :          2 :             type_error("sequence index must be "
     227                 :            :                        "integer, not '%.200s'", key);
     228                 :          2 :             return -1;
     229                 :            :         }
     230                 :            :     }
     231                 :            : 
     232                 :         57 :     type_error("'%.200s' object does not support item assignment", o);
     233                 :         57 :     return -1;
     234                 :            : }
     235                 :            : 
     236                 :            : int
     237                 :    1852898 : PyObject_DelItem(PyObject *o, PyObject *key)
     238                 :            : {
     239   [ +  -  -  + ]:    1852898 :     if (o == NULL || key == NULL) {
     240                 :          0 :         null_error();
     241                 :          0 :         return -1;
     242                 :            :     }
     243                 :            : 
     244                 :    1852898 :     PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
     245   [ +  +  +  + ]:    1852898 :     if (m && m->mp_ass_subscript) {
     246                 :    1849345 :         int res = m->mp_ass_subscript(o, key, (PyObject*)NULL);
     247                 :            :         assert(_Py_CheckSlotResult(o, "__delitem__", res >= 0));
     248                 :    1849345 :         return res;
     249                 :            :     }
     250                 :            : 
     251         [ +  - ]:       3553 :     if (Py_TYPE(o)->tp_as_sequence) {
     252         [ +  + ]:       3553 :         if (_PyIndex_Check(key)) {
     253                 :            :             Py_ssize_t key_value;
     254                 :       3548 :             key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
     255   [ +  +  -  + ]:       3548 :             if (key_value == -1 && PyErr_Occurred())
     256                 :          0 :                 return -1;
     257                 :       3548 :             return PySequence_DelItem(o, key_value);
     258                 :            :         }
     259         [ -  + ]:          5 :         else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
     260                 :          0 :             type_error("sequence index must be "
     261                 :            :                        "integer, not '%.200s'", key);
     262                 :          0 :             return -1;
     263                 :            :         }
     264                 :            :     }
     265                 :            : 
     266                 :          5 :     type_error("'%.200s' object does not support item deletion", o);
     267                 :          5 :     return -1;
     268                 :            : }
     269                 :            : 
     270                 :            : int
     271                 :          0 : PyObject_DelItemString(PyObject *o, const char *key)
     272                 :            : {
     273                 :            :     PyObject *okey;
     274                 :            :     int ret;
     275                 :            : 
     276   [ #  #  #  # ]:          0 :     if (o == NULL || key == NULL) {
     277                 :          0 :         null_error();
     278                 :          0 :         return -1;
     279                 :            :     }
     280                 :          0 :     okey = PyUnicode_FromString(key);
     281         [ #  # ]:          0 :     if (okey == NULL)
     282                 :          0 :         return -1;
     283                 :          0 :     ret = PyObject_DelItem(o, okey);
     284                 :          0 :     Py_DECREF(okey);
     285                 :          0 :     return ret;
     286                 :            : }
     287                 :            : 
     288                 :            : 
     289                 :            : /* Return 1 if the getbuffer function is available, otherwise return 0. */
     290                 :            : int
     291                 :    7227290 : PyObject_CheckBuffer(PyObject *obj)
     292                 :            : {
     293                 :    7227290 :     PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer;
     294   [ +  +  +  + ]:    7227290 :     return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL);
     295                 :            : }
     296                 :            : 
     297                 :            : 
     298                 :            : /* We release the buffer right after use of this function which could
     299                 :            :    cause issues later on.  Don't use these functions in new code.
     300                 :            :  */
     301                 :            : int
     302                 :          0 : PyObject_CheckReadBuffer(PyObject *obj)
     303                 :            : {
     304                 :          0 :     PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
     305                 :            :     Py_buffer view;
     306                 :            : 
     307         [ #  # ]:          0 :     if (pb == NULL ||
     308         [ #  # ]:          0 :         pb->bf_getbuffer == NULL)
     309                 :          0 :         return 0;
     310         [ #  # ]:          0 :     if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
     311                 :          0 :         PyErr_Clear();
     312                 :          0 :         return 0;
     313                 :            :     }
     314                 :          0 :     PyBuffer_Release(&view);
     315                 :          0 :     return 1;
     316                 :            : }
     317                 :            : 
     318                 :            : static int
     319                 :          0 : as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len)
     320                 :            : {
     321                 :            :     Py_buffer view;
     322                 :            : 
     323   [ #  #  #  #  :          0 :     if (obj == NULL || buffer == NULL || buffer_len == NULL) {
                   #  # ]
     324                 :          0 :         null_error();
     325                 :          0 :         return -1;
     326                 :            :     }
     327         [ #  # ]:          0 :     if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
     328                 :          0 :         return -1;
     329                 :            : 
     330                 :          0 :     *buffer = view.buf;
     331                 :          0 :     *buffer_len = view.len;
     332                 :          0 :     PyBuffer_Release(&view);
     333                 :          0 :     return 0;
     334                 :            : }
     335                 :            : 
     336                 :            : int
     337                 :          0 : PyObject_AsCharBuffer(PyObject *obj,
     338                 :            :                       const char **buffer,
     339                 :            :                       Py_ssize_t *buffer_len)
     340                 :            : {
     341                 :          0 :     return as_read_buffer(obj, (const void **)buffer, buffer_len);
     342                 :            : }
     343                 :            : 
     344                 :          0 : int PyObject_AsReadBuffer(PyObject *obj,
     345                 :            :                           const void **buffer,
     346                 :            :                           Py_ssize_t *buffer_len)
     347                 :            : {
     348                 :          0 :     return as_read_buffer(obj, buffer, buffer_len);
     349                 :            : }
     350                 :            : 
     351                 :          0 : int PyObject_AsWriteBuffer(PyObject *obj,
     352                 :            :                            void **buffer,
     353                 :            :                            Py_ssize_t *buffer_len)
     354                 :            : {
     355                 :            :     PyBufferProcs *pb;
     356                 :            :     Py_buffer view;
     357                 :            : 
     358   [ #  #  #  #  :          0 :     if (obj == NULL || buffer == NULL || buffer_len == NULL) {
                   #  # ]
     359                 :          0 :         null_error();
     360                 :          0 :         return -1;
     361                 :            :     }
     362                 :          0 :     pb = Py_TYPE(obj)->tp_as_buffer;
     363         [ #  # ]:          0 :     if (pb == NULL ||
     364   [ #  #  #  # ]:          0 :         pb->bf_getbuffer == NULL ||
     365                 :          0 :         ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
     366                 :          0 :         PyErr_SetString(PyExc_TypeError,
     367                 :            :                         "expected a writable bytes-like object");
     368                 :          0 :         return -1;
     369                 :            :     }
     370                 :            : 
     371                 :          0 :     *buffer = view.buf;
     372                 :          0 :     *buffer_len = view.len;
     373                 :          0 :     PyBuffer_Release(&view);
     374                 :          0 :     return 0;
     375                 :            : }
     376                 :            : 
     377                 :            : /* Buffer C-API for Python 3.0 */
     378                 :            : 
     379                 :            : int
     380                 :   25891554 : PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
     381                 :            : {
     382                 :   25891554 :     PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
     383                 :            : 
     384   [ +  +  +  + ]:   25891554 :     if (pb == NULL || pb->bf_getbuffer == NULL) {
     385                 :      23471 :         PyErr_Format(PyExc_TypeError,
     386                 :            :                      "a bytes-like object is required, not '%.100s'",
     387                 :      23471 :                      Py_TYPE(obj)->tp_name);
     388                 :      23471 :         return -1;
     389                 :            :     }
     390                 :   25868083 :     int res = (*pb->bf_getbuffer)(obj, view, flags);
     391                 :            :     assert(_Py_CheckSlotResult(obj, "getbuffer", res >= 0));
     392                 :   25868083 :     return res;
     393                 :            : }
     394                 :            : 
     395                 :            : static int
     396                 :     999226 : _IsFortranContiguous(const Py_buffer *view)
     397                 :            : {
     398                 :            :     Py_ssize_t sd, dim;
     399                 :            :     int i;
     400                 :            : 
     401                 :            :     /* 1) len = product(shape) * itemsize
     402                 :            :        2) itemsize > 0
     403                 :            :        3) len = 0 <==> exists i: shape[i] = 0 */
     404         [ +  + ]:     999226 :     if (view->len == 0) return 1;
     405         [ +  + ]:     998882 :     if (view->strides == NULL) {  /* C-contiguous by definition */
     406                 :            :         /* Trivially F-contiguous */
     407         [ +  + ]:       6863 :         if (view->ndim <= 1) return 1;
     408                 :            : 
     409                 :            :         /* ndim > 1 implies shape != NULL */
     410                 :            :         assert(view->shape != NULL);
     411                 :            : 
     412                 :            :         /* Effectively 1-d */
     413                 :        982 :         sd = 0;
     414         [ +  + ]:       3610 :         for (i=0; i<view->ndim; i++) {
     415         [ +  + ]:       2628 :             if (view->shape[i] > 1) sd += 1;
     416                 :            :         }
     417                 :        982 :         return sd <= 1;
     418                 :            :     }
     419                 :            : 
     420                 :            :     /* strides != NULL implies both of these */
     421                 :            :     assert(view->ndim > 0);
     422                 :            :     assert(view->shape != NULL);
     423                 :            : 
     424                 :     992019 :     sd = view->itemsize;
     425         [ +  + ]:    2012309 :     for (i=0; i<view->ndim; i++) {
     426                 :    1485041 :         dim = view->shape[i];
     427   [ +  +  +  + ]:    1485041 :         if (dim > 1 && view->strides[i] != sd) {
     428                 :     464751 :             return 0;
     429                 :            :         }
     430                 :    1020290 :         sd *= dim;
     431                 :            :     }
     432                 :     527268 :     return 1;
     433                 :            : }
     434                 :            : 
     435                 :            : static int
     436                 :   12510566 : _IsCContiguous(const Py_buffer *view)
     437                 :            : {
     438                 :            :     Py_ssize_t sd, dim;
     439                 :            :     int i;
     440                 :            : 
     441                 :            :     /* 1) len = product(shape) * itemsize
     442                 :            :        2) itemsize > 0
     443                 :            :        3) len = 0 <==> exists i: shape[i] = 0 */
     444         [ +  + ]:   12510566 :     if (view->len == 0) return 1;
     445         [ +  + ]:   12197664 :     if (view->strides == NULL) return 1; /* C-contiguous by definition */
     446                 :            : 
     447                 :            :     /* strides != NULL implies both of these */
     448                 :            :     assert(view->ndim > 0);
     449                 :            :     assert(view->shape != NULL);
     450                 :            : 
     451                 :    1323536 :     sd = view->itemsize;
     452         [ +  + ]:    2839300 :     for (i=view->ndim-1; i>=0; i--) {
     453                 :    1977334 :         dim = view->shape[i];
     454   [ +  +  +  + ]:    1977334 :         if (dim > 1 && view->strides[i] != sd) {
     455                 :     461570 :             return 0;
     456                 :            :         }
     457                 :    1515764 :         sd *= dim;
     458                 :            :     }
     459                 :     861966 :     return 1;
     460                 :            : }
     461                 :            : 
     462                 :            : int
     463                 :   13939922 : PyBuffer_IsContiguous(const Py_buffer *view, char order)
     464                 :            : {
     465                 :            : 
     466         [ +  + ]:   13939922 :     if (view->suboffsets != NULL) return 0;
     467                 :            : 
     468         [ +  + ]:   13461693 :     if (order == 'C')
     469                 :   12429832 :         return _IsCContiguous(view);
     470         [ +  + ]:    1031861 :     else if (order == 'F')
     471                 :     951127 :         return _IsFortranContiguous(view);
     472         [ +  - ]:      80734 :     else if (order == 'A')
     473   [ +  +  +  + ]:      80734 :         return (_IsCContiguous(view) || _IsFortranContiguous(view));
     474                 :          0 :     return 0;
     475                 :            : }
     476                 :            : 
     477                 :            : 
     478                 :            : void*
     479                 :      89035 : PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices)
     480                 :            : {
     481                 :            :     char* pointer;
     482                 :            :     int i;
     483                 :      89035 :     pointer = (char *)view->buf;
     484         [ +  + ]:     246968 :     for (i = 0; i < view->ndim; i++) {
     485                 :     157933 :         pointer += view->strides[i]*indices[i];
     486   [ +  +  +  + ]:     157933 :         if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
     487                 :      26553 :             pointer = *((char**)pointer) + view->suboffsets[i];
     488                 :            :         }
     489                 :            :     }
     490                 :      89035 :     return (void*)pointer;
     491                 :            : }
     492                 :            : 
     493                 :            : 
     494                 :            : void
     495                 :          0 : _Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
     496                 :            : {
     497                 :            :     int k;
     498                 :            : 
     499         [ #  # ]:          0 :     for (k=0; k<nd; k++) {
     500         [ #  # ]:          0 :         if (index[k] < shape[k]-1) {
     501                 :          0 :             index[k]++;
     502                 :          0 :             break;
     503                 :            :         }
     504                 :            :         else {
     505                 :          0 :             index[k] = 0;
     506                 :            :         }
     507                 :            :     }
     508                 :          0 : }
     509                 :            : 
     510                 :            : void
     511                 :         10 : _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
     512                 :            : {
     513                 :            :     int k;
     514                 :            : 
     515         [ +  + ]:         12 :     for (k=nd-1; k>=0; k--) {
     516         [ +  + ]:         10 :         if (index[k] < shape[k]-1) {
     517                 :          8 :             index[k]++;
     518                 :          8 :             break;
     519                 :            :         }
     520                 :            :         else {
     521                 :          2 :             index[k] = 0;
     522                 :            :         }
     523                 :            :     }
     524                 :         10 : }
     525                 :            : 
     526                 :            : Py_ssize_t
     527                 :          3 : PyBuffer_SizeFromFormat(const char *format)
     528                 :            : {
     529                 :          3 :     PyObject *calcsize = NULL;
     530                 :          3 :     PyObject *res = NULL;
     531                 :          3 :     PyObject *fmt = NULL;
     532                 :          3 :     Py_ssize_t itemsize = -1;
     533                 :            : 
     534                 :          3 :     calcsize = _PyImport_GetModuleAttrString("struct", "calcsize");
     535         [ -  + ]:          3 :     if (calcsize == NULL) {
     536                 :          0 :         goto done;
     537                 :            :     }
     538                 :            : 
     539                 :          3 :     fmt = PyUnicode_FromString(format);
     540         [ -  + ]:          3 :     if (fmt == NULL) {
     541                 :          0 :         goto done;
     542                 :            :     }
     543                 :            : 
     544                 :          3 :     res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL);
     545         [ -  + ]:          3 :     if (res == NULL) {
     546                 :          0 :         goto done;
     547                 :            :     }
     548                 :            : 
     549                 :          3 :     itemsize = PyLong_AsSsize_t(res);
     550         [ +  - ]:          3 :     if (itemsize < 0) {
     551                 :          0 :         goto done;
     552                 :            :     }
     553                 :            : 
     554                 :          3 : done:
     555                 :          3 :     Py_XDECREF(calcsize);
     556                 :          3 :     Py_XDECREF(fmt);
     557                 :          3 :     Py_XDECREF(res);
     558                 :          3 :     return itemsize;
     559                 :            : }
     560                 :            : 
     561                 :            : int
     562                 :          2 : PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, Py_ssize_t len, char fort)
     563                 :            : {
     564                 :            :     int k;
     565                 :            :     void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
     566                 :            :     Py_ssize_t *indices, elements;
     567                 :            :     char *ptr;
     568                 :            :     const char *src;
     569                 :            : 
     570         [ -  + ]:          2 :     if (len > view->len) {
     571                 :          0 :         len = view->len;
     572                 :            :     }
     573                 :            : 
     574         [ -  + ]:          2 :     if (PyBuffer_IsContiguous(view, fort)) {
     575                 :            :         /* simplest copy is all that is needed */
     576                 :          0 :         memcpy(view->buf, buf, len);
     577                 :          0 :         return 0;
     578                 :            :     }
     579                 :            : 
     580                 :            :     /* Otherwise a more elaborate scheme is needed */
     581                 :            : 
     582                 :            :     /* view->ndim <= 64 */
     583                 :          2 :     indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
     584         [ -  + ]:          2 :     if (indices == NULL) {
     585                 :            :         PyErr_NoMemory();
     586                 :          0 :         return -1;
     587                 :            :     }
     588         [ +  + ]:          4 :     for (k=0; k<view->ndim;k++) {
     589                 :          2 :         indices[k] = 0;
     590                 :            :     }
     591                 :            : 
     592         [ -  + ]:          2 :     if (fort == 'F') {
     593                 :          0 :         addone = _Py_add_one_to_index_F;
     594                 :            :     }
     595                 :            :     else {
     596                 :          2 :         addone = _Py_add_one_to_index_C;
     597                 :            :     }
     598                 :          2 :     src = buf;
     599                 :            :     /* XXX : This is not going to be the fastest code in the world
     600                 :            :              several optimizations are possible.
     601                 :            :      */
     602                 :          2 :     elements = len / view->itemsize;
     603         [ +  + ]:         12 :     while (elements--) {
     604                 :         10 :         ptr = PyBuffer_GetPointer(view, indices);
     605                 :         10 :         memcpy(ptr, src, view->itemsize);
     606                 :         10 :         src += view->itemsize;
     607                 :         10 :         addone(view->ndim, indices, view->shape);
     608                 :            :     }
     609                 :            : 
     610                 :          2 :     PyMem_Free(indices);
     611                 :          2 :     return 0;
     612                 :            : }
     613                 :            : 
     614                 :          0 : int PyObject_CopyData(PyObject *dest, PyObject *src)
     615                 :            : {
     616                 :            :     Py_buffer view_dest, view_src;
     617                 :            :     int k;
     618                 :            :     Py_ssize_t *indices, elements;
     619                 :            :     char *dptr, *sptr;
     620                 :            : 
     621   [ #  #  #  # ]:          0 :     if (!PyObject_CheckBuffer(dest) ||
     622                 :          0 :         !PyObject_CheckBuffer(src)) {
     623                 :          0 :         PyErr_SetString(PyExc_TypeError,
     624                 :            :                         "both destination and source must be "\
     625                 :            :                         "bytes-like objects");
     626                 :          0 :         return -1;
     627                 :            :     }
     628                 :            : 
     629         [ #  # ]:          0 :     if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
     630         [ #  # ]:          0 :     if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
     631                 :          0 :         PyBuffer_Release(&view_dest);
     632                 :          0 :         return -1;
     633                 :            :     }
     634                 :            : 
     635         [ #  # ]:          0 :     if (view_dest.len < view_src.len) {
     636                 :          0 :         PyErr_SetString(PyExc_BufferError,
     637                 :            :                         "destination is too small to receive data from source");
     638                 :          0 :         PyBuffer_Release(&view_dest);
     639                 :          0 :         PyBuffer_Release(&view_src);
     640                 :          0 :         return -1;
     641                 :            :     }
     642                 :            : 
     643   [ #  #  #  # ]:          0 :     if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
     644         [ #  # ]:          0 :          PyBuffer_IsContiguous(&view_src, 'C')) ||
     645         [ #  # ]:          0 :         (PyBuffer_IsContiguous(&view_dest, 'F') &&
     646                 :          0 :          PyBuffer_IsContiguous(&view_src, 'F'))) {
     647                 :            :         /* simplest copy is all that is needed */
     648                 :          0 :         memcpy(view_dest.buf, view_src.buf, view_src.len);
     649                 :          0 :         PyBuffer_Release(&view_dest);
     650                 :          0 :         PyBuffer_Release(&view_src);
     651                 :          0 :         return 0;
     652                 :            :     }
     653                 :            : 
     654                 :            :     /* Otherwise a more elaborate copy scheme is needed */
     655                 :            : 
     656                 :            :     /* XXX(nnorwitz): need to check for overflow! */
     657                 :          0 :     indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
     658         [ #  # ]:          0 :     if (indices == NULL) {
     659                 :            :         PyErr_NoMemory();
     660                 :          0 :         PyBuffer_Release(&view_dest);
     661                 :          0 :         PyBuffer_Release(&view_src);
     662                 :          0 :         return -1;
     663                 :            :     }
     664         [ #  # ]:          0 :     for (k=0; k<view_src.ndim;k++) {
     665                 :          0 :         indices[k] = 0;
     666                 :            :     }
     667                 :          0 :     elements = 1;
     668         [ #  # ]:          0 :     for (k=0; k<view_src.ndim; k++) {
     669                 :            :         /* XXX(nnorwitz): can this overflow? */
     670                 :          0 :         elements *= view_src.shape[k];
     671                 :            :     }
     672         [ #  # ]:          0 :     while (elements--) {
     673                 :          0 :         _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
     674                 :          0 :         dptr = PyBuffer_GetPointer(&view_dest, indices);
     675                 :          0 :         sptr = PyBuffer_GetPointer(&view_src, indices);
     676                 :          0 :         memcpy(dptr, sptr, view_src.itemsize);
     677                 :            :     }
     678                 :          0 :     PyMem_Free(indices);
     679                 :          0 :     PyBuffer_Release(&view_dest);
     680                 :          0 :     PyBuffer_Release(&view_src);
     681                 :          0 :     return 0;
     682                 :            : }
     683                 :            : 
     684                 :            : void
     685                 :          0 : PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
     686                 :            :                                Py_ssize_t *strides, int itemsize,
     687                 :            :                                char fort)
     688                 :            : {
     689                 :            :     int k;
     690                 :            :     Py_ssize_t sd;
     691                 :            : 
     692                 :          0 :     sd = itemsize;
     693         [ #  # ]:          0 :     if (fort == 'F') {
     694         [ #  # ]:          0 :         for (k=0; k<nd; k++) {
     695                 :          0 :             strides[k] = sd;
     696                 :          0 :             sd *= shape[k];
     697                 :            :         }
     698                 :            :     }
     699                 :            :     else {
     700         [ #  # ]:          0 :         for (k=nd-1; k>=0; k--) {
     701                 :          0 :             strides[k] = sd;
     702                 :          0 :             sd *= shape[k];
     703                 :            :         }
     704                 :            :     }
     705                 :          0 :     return;
     706                 :            : }
     707                 :            : 
     708                 :            : int
     709                 :   21699652 : PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
     710                 :            :                   int readonly, int flags)
     711                 :            : {
     712         [ +  + ]:   21699652 :     if (view == NULL) {
     713                 :          1 :         PyErr_SetString(PyExc_BufferError,
     714                 :            :                         "PyBuffer_FillInfo: view==NULL argument is obsolete");
     715                 :          1 :         return -1;
     716                 :            :     }
     717                 :            : 
     718   [ +  +  +  + ]:   21699651 :     if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
     719                 :            :         (readonly == 1)) {
     720                 :         16 :         PyErr_SetString(PyExc_BufferError,
     721                 :            :                         "Object is not writable.");
     722                 :         16 :         return -1;
     723                 :            :     }
     724                 :            : 
     725                 :   21699635 :     view->obj = obj;
     726         [ +  + ]:   21699635 :     if (obj)
     727                 :   20627591 :         Py_INCREF(obj);
     728                 :   21699635 :     view->buf = buf;
     729                 :   21699635 :     view->len = len;
     730                 :   21699635 :     view->readonly = readonly;
     731                 :   21699635 :     view->itemsize = 1;
     732                 :   21699635 :     view->format = NULL;
     733         [ +  + ]:   21699635 :     if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
     734                 :     936213 :         view->format = "B";
     735                 :   21699635 :     view->ndim = 1;
     736                 :   21699635 :     view->shape = NULL;
     737         [ +  + ]:   21699635 :     if ((flags & PyBUF_ND) == PyBUF_ND)
     738                 :    5394279 :         view->shape = &(view->len);
     739                 :   21699635 :     view->strides = NULL;
     740         [ +  + ]:   21699635 :     if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
     741                 :     936213 :         view->strides = &(view->itemsize);
     742                 :   21699635 :     view->suboffsets = NULL;
     743                 :   21699635 :     view->internal = NULL;
     744                 :   21699635 :     return 0;
     745                 :            : }
     746                 :            : 
     747                 :            : void
     748                 :   28578553 : PyBuffer_Release(Py_buffer *view)
     749                 :            : {
     750                 :   28578553 :     PyObject *obj = view->obj;
     751                 :            :     PyBufferProcs *pb;
     752         [ +  + ]:   28578553 :     if (obj == NULL)
     753                 :    1437978 :         return;
     754                 :   27140575 :     pb = Py_TYPE(obj)->tp_as_buffer;
     755   [ +  +  +  + ]:   27140575 :     if (pb && pb->bf_releasebuffer) {
     756                 :    6820473 :         pb->bf_releasebuffer(obj, view);
     757                 :            :     }
     758                 :   27140575 :     view->obj = NULL;
     759                 :   27140575 :     Py_DECREF(obj);
     760                 :            : }
     761                 :            : 
     762                 :            : PyObject *
     763                 :    4024727 : PyObject_Format(PyObject *obj, PyObject *format_spec)
     764                 :            : {
     765                 :            :     PyObject *meth;
     766                 :    4024727 :     PyObject *empty = NULL;
     767                 :    4024727 :     PyObject *result = NULL;
     768                 :            : 
     769   [ +  +  -  + ]:    4024727 :     if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
     770                 :          0 :         PyErr_Format(PyExc_SystemError,
     771                 :            :                      "Format specifier must be a string, not %.200s",
     772                 :          0 :                      Py_TYPE(format_spec)->tp_name);
     773                 :          0 :         return NULL;
     774                 :            :     }
     775                 :            : 
     776                 :            :     /* Fast path for common types. */
     777   [ +  +  +  + ]:    4024727 :     if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
     778         [ +  + ]:     364726 :         if (PyUnicode_CheckExact(obj)) {
     779                 :        216 :             Py_INCREF(obj);
     780                 :        216 :             return obj;
     781                 :            :         }
     782         [ +  + ]:     364510 :         if (PyLong_CheckExact(obj)) {
     783                 :     348679 :             return PyObject_Str(obj);
     784                 :            :         }
     785                 :            :     }
     786                 :            : 
     787                 :            :     /* If no format_spec is provided, use an empty string */
     788         [ +  + ]:    3675832 :     if (format_spec == NULL) {
     789                 :      14967 :         empty = PyUnicode_New(0, 0);
     790                 :      14967 :         format_spec = empty;
     791                 :            :     }
     792                 :            : 
     793                 :            :     /* Find the (unbound!) __format__ method */
     794                 :    3675832 :     meth = _PyObject_LookupSpecial(obj, &_Py_ID(__format__));
     795         [ +  + ]:    3675832 :     if (meth == NULL) {
     796                 :          1 :         PyThreadState *tstate = _PyThreadState_GET();
     797         [ -  + ]:          1 :         if (!_PyErr_Occurred(tstate)) {
     798                 :          0 :             _PyErr_Format(tstate, PyExc_TypeError,
     799                 :            :                           "Type %.100s doesn't define __format__",
     800                 :          0 :                           Py_TYPE(obj)->tp_name);
     801                 :            :         }
     802                 :          1 :         goto done;
     803                 :            :     }
     804                 :            : 
     805                 :            :     /* And call it. */
     806                 :    3675831 :     result = PyObject_CallOneArg(meth, format_spec);
     807                 :    3675831 :     Py_DECREF(meth);
     808                 :            : 
     809   [ +  +  +  + ]:    3675831 :     if (result && !PyUnicode_Check(result)) {
     810                 :          1 :         PyErr_Format(PyExc_TypeError,
     811                 :            :                      "__format__ must return a str, not %.200s",
     812                 :          1 :                      Py_TYPE(result)->tp_name);
     813                 :          1 :         Py_DECREF(result);
     814                 :          1 :         result = NULL;
     815                 :          1 :         goto done;
     816                 :            :     }
     817                 :            : 
     818                 :    3675830 : done:
     819                 :    3675832 :     Py_XDECREF(empty);
     820                 :    3675832 :     return result;
     821                 :            : }
     822                 :            : /* Operations on numbers */
     823                 :            : 
     824                 :            : int
     825                 :    1385851 : PyNumber_Check(PyObject *o)
     826                 :            : {
     827         [ -  + ]:    1385851 :     if (o == NULL)
     828                 :          0 :         return 0;
     829                 :    1385851 :     PyNumberMethods *nb = Py_TYPE(o)->tp_as_number;
     830   [ +  +  +  +  :    1385851 :     return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o));
          +  +  +  -  +  
                      + ]
     831                 :            : }
     832                 :            : 
     833                 :            : /* Binary operators */
     834                 :            : 
     835                 :            : #define NB_SLOT(x) offsetof(PyNumberMethods, x)
     836                 :            : #define NB_BINOP(nb_methods, slot) \
     837                 :            :         (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
     838                 :            : #define NB_TERNOP(nb_methods, slot) \
     839                 :            :         (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
     840                 :            : 
     841                 :            : /*
     842                 :            :   Calling scheme used for binary operations:
     843                 :            : 
     844                 :            :   Order operations are tried until either a valid result or error:
     845                 :            :     w.op(v,w)[*], v.op(v,w), w.op(v,w)
     846                 :            : 
     847                 :            :   [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of
     848                 :            :       Py_TYPE(v)
     849                 :            :  */
     850                 :            : 
     851                 :            : static PyObject *
     852                 :   60126009 : binary_op1(PyObject *v, PyObject *w, const int op_slot
     853                 :            : #ifndef NDEBUG
     854                 :            :            , const char *op_name
     855                 :            : #endif
     856                 :            :            )
     857                 :            : {
     858                 :            :     binaryfunc slotv;
     859         [ +  + ]:   60126009 :     if (Py_TYPE(v)->tp_as_number != NULL) {
     860                 :   59206634 :         slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot);
     861                 :            :     }
     862                 :            :     else {
     863                 :     919375 :         slotv = NULL;
     864                 :            :     }
     865                 :            : 
     866                 :            :     binaryfunc slotw;
     867   [ +  +  +  + ]:   60126009 :     if (!Py_IS_TYPE(w, Py_TYPE(v)) && Py_TYPE(w)->tp_as_number != NULL) {
     868                 :    6097196 :         slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot);
     869         [ +  + ]:    6097196 :         if (slotw == slotv) {
     870                 :    1030811 :             slotw = NULL;
     871                 :            :         }
     872                 :            :     }
     873                 :            :     else {
     874                 :   54028813 :         slotw = NULL;
     875                 :            :     }
     876                 :            : 
     877         [ +  + ]:   60126009 :     if (slotv) {
     878                 :            :         PyObject *x;
     879   [ +  +  +  + ]:   52540679 :         if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
     880                 :     265723 :             x = slotw(v, w);
     881         [ +  - ]:     265723 :             if (x != Py_NotImplemented)
     882                 :     265723 :                 return x;
     883                 :          0 :             Py_DECREF(x); /* can't do it */
     884                 :          0 :             slotw = NULL;
     885                 :            :         }
     886                 :   52274956 :         x = slotv(v, w);
     887                 :            :         assert(_Py_CheckSlotResult(v, op_name, x != NULL));
     888         [ +  + ]:   52274956 :         if (x != Py_NotImplemented) {
     889                 :   50706833 :             return x;
     890                 :            :         }
     891                 :    1568123 :         Py_DECREF(x); /* can't do it */
     892                 :            :     }
     893         [ +  + ]:    9153453 :     if (slotw) {
     894                 :    3251103 :         PyObject *x = slotw(v, w);
     895                 :            :         assert(_Py_CheckSlotResult(w, op_name, x != NULL));
     896         [ +  + ]:    3251103 :         if (x != Py_NotImplemented) {
     897                 :    1476837 :             return x;
     898                 :            :         }
     899                 :    1774266 :         Py_DECREF(x); /* can't do it */
     900                 :            :     }
     901                 :    7676616 :     Py_RETURN_NOTIMPLEMENTED;
     902                 :            : }
     903                 :            : 
     904                 :            : #ifdef NDEBUG
     905                 :            : #  define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot)
     906                 :            : #else
     907                 :            : #  define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot, op_name)
     908                 :            : #endif
     909                 :            : 
     910                 :            : static PyObject *
     911                 :        691 : binop_type_error(PyObject *v, PyObject *w, const char *op_name)
     912                 :            : {
     913                 :        691 :     PyErr_Format(PyExc_TypeError,
     914                 :            :                  "unsupported operand type(s) for %.100s: "
     915                 :            :                  "'%.100s' and '%.100s'",
     916                 :            :                  op_name,
     917                 :        691 :                  Py_TYPE(v)->tp_name,
     918                 :        691 :                  Py_TYPE(w)->tp_name);
     919                 :        691 :     return NULL;
     920                 :            : }
     921                 :            : 
     922                 :            : static PyObject *
     923                 :   30067171 : binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
     924                 :            : {
     925                 :   30067171 :     PyObject *result = BINARY_OP1(v, w, op_slot, op_name);
     926         [ +  + ]:   30067171 :     if (result == Py_NotImplemented) {
     927                 :        304 :         Py_DECREF(result);
     928                 :            : 
     929   [ +  +  +  + ]:        325 :         if (op_slot == NB_SLOT(nb_rshift) &&
     930                 :         21 :             PyCFunction_CheckExact(v) &&
     931         [ +  + ]:          3 :             strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
     932                 :            :         {
     933                 :          2 :             PyErr_Format(PyExc_TypeError,
     934                 :            :                 "unsupported operand type(s) for %.100s: "
     935                 :            :                 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
     936                 :            :                 "file=<output_stream>)\"?",
     937                 :            :                 op_name,
     938                 :          2 :                 Py_TYPE(v)->tp_name,
     939                 :          2 :                 Py_TYPE(w)->tp_name);
     940                 :          2 :             return NULL;
     941                 :            :         }
     942                 :        302 :         return binop_type_error(v, w, op_name);
     943                 :            :     }
     944                 :   30066867 :     return result;
     945                 :            : }
     946                 :            : 
     947                 :            : 
     948                 :            : /*
     949                 :            :   Calling scheme used for ternary operations:
     950                 :            : 
     951                 :            :   Order operations are tried until either a valid result or error:
     952                 :            :     v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
     953                 :            :  */
     954                 :            : 
     955                 :            : static PyObject *
     956                 :    1825286 : ternary_op(PyObject *v,
     957                 :            :            PyObject *w,
     958                 :            :            PyObject *z,
     959                 :            :            const int op_slot,
     960                 :            :            const char *op_name
     961                 :            :            )
     962                 :            : {
     963                 :    1825286 :     PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
     964                 :    1825286 :     PyNumberMethods *mw = Py_TYPE(w)->tp_as_number;
     965                 :            : 
     966                 :            :     ternaryfunc slotv;
     967         [ +  + ]:    1825286 :     if (mv != NULL) {
     968                 :    1825285 :         slotv = NB_TERNOP(mv, op_slot);
     969                 :            :     }
     970                 :            :     else {
     971                 :          1 :         slotv = NULL;
     972                 :            :     }
     973                 :            : 
     974                 :            :     ternaryfunc slotw;
     975   [ +  +  +  - ]:    1825286 :     if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) {
     976                 :     358458 :         slotw = NB_TERNOP(mw, op_slot);
     977         [ +  + ]:     358458 :         if (slotw == slotv) {
     978                 :         16 :             slotw = NULL;
     979                 :            :         }
     980                 :            :     }
     981                 :            :     else {
     982                 :    1466828 :         slotw = NULL;
     983                 :            :     }
     984                 :            : 
     985         [ +  + ]:    1825286 :     if (slotv) {
     986                 :            :         PyObject *x;
     987   [ +  +  +  + ]:    1825276 :         if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
     988                 :          1 :             x = slotw(v, w, z);
     989         [ +  - ]:          1 :             if (x != Py_NotImplemented) {
     990                 :          1 :                 return x;
     991                 :            :             }
     992                 :          0 :             Py_DECREF(x); /* can't do it */
     993                 :          0 :             slotw = NULL;
     994                 :            :         }
     995                 :    1825275 :         x = slotv(v, w, z);
     996                 :            :         assert(_Py_CheckSlotResult(v, op_name, x != NULL));
     997         [ +  + ]:    1825275 :         if (x != Py_NotImplemented) {
     998                 :    1825141 :             return x;
     999                 :            :         }
    1000                 :        134 :         Py_DECREF(x); /* can't do it */
    1001                 :            :     }
    1002         [ +  + ]:        144 :     if (slotw) {
    1003                 :        139 :         PyObject *x = slotw(v, w, z);
    1004                 :            :         assert(_Py_CheckSlotResult(w, op_name, x != NULL));
    1005         [ +  + ]:        139 :         if (x != Py_NotImplemented) {
    1006                 :        128 :             return x;
    1007                 :            :         }
    1008                 :         11 :         Py_DECREF(x); /* can't do it */
    1009                 :            :     }
    1010                 :            : 
    1011                 :         16 :     PyNumberMethods *mz = Py_TYPE(z)->tp_as_number;
    1012         [ +  - ]:         16 :     if (mz != NULL) {
    1013                 :         16 :         ternaryfunc slotz = NB_TERNOP(mz, op_slot);
    1014   [ +  +  +  + ]:         16 :         if (slotz == slotv || slotz == slotw) {
    1015                 :         10 :             slotz = NULL;
    1016                 :            :         }
    1017         [ +  + ]:         16 :         if (slotz) {
    1018                 :          1 :             PyObject *x = slotz(v, w, z);
    1019                 :            :             assert(_Py_CheckSlotResult(z, op_name, x != NULL));
    1020         [ +  - ]:          1 :             if (x != Py_NotImplemented) {
    1021                 :          1 :                 return x;
    1022                 :            :             }
    1023                 :          0 :             Py_DECREF(x); /* can't do it */
    1024                 :            :         }
    1025                 :            :     }
    1026                 :            : 
    1027         [ +  + ]:         15 :     if (z == Py_None) {
    1028                 :         13 :         PyErr_Format(
    1029                 :            :             PyExc_TypeError,
    1030                 :            :             "unsupported operand type(s) for %.100s: "
    1031                 :            :             "'%.100s' and '%.100s'",
    1032                 :            :             op_name,
    1033                 :         13 :             Py_TYPE(v)->tp_name,
    1034                 :         13 :             Py_TYPE(w)->tp_name);
    1035                 :            :     }
    1036                 :            :     else {
    1037                 :          2 :         PyErr_Format(
    1038                 :            :             PyExc_TypeError,
    1039                 :            :             "unsupported operand type(s) for %.100s: "
    1040                 :            :             "'%.100s', '%.100s', '%.100s'",
    1041                 :            :             op_name,
    1042                 :          2 :             Py_TYPE(v)->tp_name,
    1043                 :          2 :             Py_TYPE(w)->tp_name,
    1044                 :          2 :             Py_TYPE(z)->tp_name);
    1045                 :            :     }
    1046                 :         15 :     return NULL;
    1047                 :            : }
    1048                 :            : 
    1049                 :            : #define BINARY_FUNC(func, op, op_name) \
    1050                 :            :     PyObject * \
    1051                 :            :     func(PyObject *v, PyObject *w) { \
    1052                 :            :         return binary_op(v, w, NB_SLOT(op), op_name); \
    1053                 :            :     }
    1054                 :            : 
    1055                 :    1464194 : BINARY_FUNC(PyNumber_Or, nb_or, "|")
    1056                 :     390134 : BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
    1057                 :    7297698 : BINARY_FUNC(PyNumber_And, nb_and, "&")
    1058                 :     879746 : BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
    1059                 :    1443203 : BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
    1060                 :    4563422 : BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
    1061                 :    1447687 : BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
    1062                 :            : 
    1063                 :            : PyObject *
    1064                 :   15448988 : PyNumber_Add(PyObject *v, PyObject *w)
    1065                 :            : {
    1066                 :   15448988 :     PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_add), "+");
    1067         [ +  + ]:   15448988 :     if (result != Py_NotImplemented) {
    1068                 :   10044099 :         return result;
    1069                 :            :     }
    1070                 :    5404889 :     Py_DECREF(result);
    1071                 :            : 
    1072                 :    5404889 :     PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
    1073   [ +  +  +  + ]:    5404889 :     if (m && m->sq_concat) {
    1074                 :    5404631 :         result = (*m->sq_concat)(v, w);
    1075                 :            :         assert(_Py_CheckSlotResult(v, "+", result != NULL));
    1076                 :    5404631 :         return result;
    1077                 :            :     }
    1078                 :            : 
    1079                 :        258 :     return binop_type_error(v, w, "+");
    1080                 :            : }
    1081                 :            : 
    1082                 :            : static PyObject *
    1083                 :    1864797 : sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
    1084                 :            : {
    1085                 :            :     Py_ssize_t count;
    1086         [ +  + ]:    1864797 :     if (_PyIndex_Check(n)) {
    1087                 :    1864781 :         count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
    1088   [ +  +  +  + ]:    1864781 :         if (count == -1 && PyErr_Occurred()) {
    1089                 :          2 :             return NULL;
    1090                 :            :         }
    1091                 :            :     }
    1092                 :            :     else {
    1093                 :         16 :         return type_error("can't multiply sequence by "
    1094                 :            :                           "non-int of type '%.200s'", n);
    1095                 :            :     }
    1096                 :    1864779 :     PyObject *res = (*repeatfunc)(seq, count);
    1097                 :            :     assert(_Py_CheckSlotResult(seq, "*", res != NULL));
    1098                 :    1864779 :     return res;
    1099                 :            : }
    1100                 :            : 
    1101                 :            : PyObject *
    1102                 :    9503191 : PyNumber_Multiply(PyObject *v, PyObject *w)
    1103                 :            : {
    1104                 :    9503191 :     PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_multiply), "*");
    1105         [ +  + ]:    9503191 :     if (result == Py_NotImplemented) {
    1106                 :    1864151 :         PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
    1107                 :    1864151 :         PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
    1108                 :    1864151 :         Py_DECREF(result);
    1109   [ +  +  +  + ]:    1864151 :         if  (mv && mv->sq_repeat) {
    1110                 :    1773721 :             return sequence_repeat(mv->sq_repeat, v, w);
    1111                 :            :         }
    1112   [ +  +  +  + ]:      90430 :         else if (mw && mw->sq_repeat) {
    1113                 :      90397 :             return sequence_repeat(mw->sq_repeat, w, v);
    1114                 :            :         }
    1115                 :         33 :         result = binop_type_error(v, w, "*");
    1116                 :            :     }
    1117                 :    7639073 :     return result;
    1118                 :            : }
    1119                 :            : 
    1120                 :            : PyObject *
    1121                 :         22 : PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
    1122                 :            : {
    1123                 :         22 :     return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
    1124                 :            : }
    1125                 :            : 
    1126                 :            : PyObject *
    1127                 :    3345071 : PyNumber_FloorDivide(PyObject *v, PyObject *w)
    1128                 :            : {
    1129                 :    3345071 :     return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
    1130                 :            : }
    1131                 :            : 
    1132                 :            : PyObject *
    1133                 :    6400256 : PyNumber_TrueDivide(PyObject *v, PyObject *w)
    1134                 :            : {
    1135                 :    6400256 :     return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
    1136                 :            : }
    1137                 :            : 
    1138                 :            : PyObject *
    1139                 :    2835738 : PyNumber_Remainder(PyObject *v, PyObject *w)
    1140                 :            : {
    1141                 :    2835738 :     return binary_op(v, w, NB_SLOT(nb_remainder), "%");
    1142                 :            : }
    1143                 :            : 
    1144                 :            : PyObject *
    1145                 :    1825269 : PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
    1146                 :            : {
    1147                 :    1825269 :     return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
    1148                 :            : }
    1149                 :            : 
    1150                 :            : PyObject *
    1151                 :    1695877 : _PyNumber_PowerNoMod(PyObject *lhs, PyObject *rhs)
    1152                 :            : {
    1153                 :    1695877 :     return PyNumber_Power(lhs, rhs, Py_None);
    1154                 :            : }
    1155                 :            : 
    1156                 :            : /* Binary in-place operators */
    1157                 :            : 
    1158                 :            : /* The in-place operators are defined to fall back to the 'normal',
    1159                 :            :    non in-place operations, if the in-place methods are not in place.
    1160                 :            : 
    1161                 :            :    - If the left hand object has the appropriate struct members, and
    1162                 :            :      they are filled, call the appropriate function and return the
    1163                 :            :      result.  No coercion is done on the arguments; the left-hand object
    1164                 :            :      is the one the operation is performed on, and it's up to the
    1165                 :            :      function to deal with the right-hand object.
    1166                 :            : 
    1167                 :            :    - Otherwise, in-place modification is not supported. Handle it exactly as
    1168                 :            :      a non in-place operation of the same kind.
    1169                 :            : 
    1170                 :            :    */
    1171                 :            : 
    1172                 :            : static PyObject *
    1173                 :    7513122 : binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot
    1174                 :            : #ifndef NDEBUG
    1175                 :            :             , const char *op_name
    1176                 :            : #endif
    1177                 :            :             )
    1178                 :            : {
    1179                 :    7513122 :     PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
    1180         [ +  + ]:    7513122 :     if (mv != NULL) {
    1181                 :    7271479 :         binaryfunc slot = NB_BINOP(mv, iop_slot);
    1182         [ +  + ]:    7271479 :         if (slot) {
    1183                 :    2406525 :             PyObject *x = (slot)(v, w);
    1184                 :            :             assert(_Py_CheckSlotResult(v, op_name, x != NULL));
    1185         [ +  + ]:    2406525 :             if (x != Py_NotImplemented) {
    1186                 :    2406465 :                 return x;
    1187                 :            :             }
    1188                 :         60 :             Py_DECREF(x);
    1189                 :            :         }
    1190                 :            :     }
    1191                 :            : #ifdef NDEBUG
    1192                 :    5106657 :     return binary_op1(v, w, op_slot);
    1193                 :            : #else
    1194                 :            :     return binary_op1(v, w, op_slot, op_name);
    1195                 :            : #endif
    1196                 :            : }
    1197                 :            : 
    1198                 :            : #ifdef NDEBUG
    1199                 :            : #  define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot)
    1200                 :            : #else
    1201                 :            : #  define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot, op_name)
    1202                 :            : #endif
    1203                 :            : 
    1204                 :            : static PyObject *
    1205                 :    6076335 : binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
    1206                 :            :                 const char *op_name)
    1207                 :            : {
    1208                 :    6076335 :     PyObject *result = BINARY_IOP1(v, w, iop_slot, op_slot, op_name);
    1209         [ +  + ]:    6076335 :     if (result == Py_NotImplemented) {
    1210                 :         85 :         Py_DECREF(result);
    1211                 :         85 :         return binop_type_error(v, w, op_name);
    1212                 :            :     }
    1213                 :    6076250 :     return result;
    1214                 :            : }
    1215                 :            : 
    1216                 :            : static PyObject *
    1217                 :         21 : ternary_iop(PyObject *v, PyObject *w, PyObject *z, const int iop_slot, const int op_slot,
    1218                 :            :                 const char *op_name)
    1219                 :            : {
    1220                 :         21 :     PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
    1221         [ +  + ]:         21 :     if (mv != NULL) {
    1222                 :         20 :         ternaryfunc slot = NB_TERNOP(mv, iop_slot);
    1223         [ +  + ]:         20 :         if (slot) {
    1224                 :          9 :             PyObject *x = (slot)(v, w, z);
    1225         [ +  + ]:          9 :             if (x != Py_NotImplemented) {
    1226                 :          4 :                 return x;
    1227                 :            :             }
    1228                 :          5 :             Py_DECREF(x);
    1229                 :            :         }
    1230                 :            :     }
    1231                 :         17 :     return ternary_op(v, w, z, op_slot, op_name);
    1232                 :            : }
    1233                 :            : 
    1234                 :            : #define INPLACE_BINOP(func, iop, op, op_name) \
    1235                 :            :     PyObject * \
    1236                 :            :     func(PyObject *v, PyObject *w) { \
    1237                 :            :         return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
    1238                 :            :     }
    1239                 :            : 
    1240                 :    2979685 : INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
    1241                 :      13844 : INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
    1242                 :      59121 : INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
    1243                 :     566584 : INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
    1244                 :       5327 : INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
    1245                 :      44802 : INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
    1246                 :         16 : INPLACE_BINOP(PyNumber_InPlaceMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
    1247                 :     307400 : INPLACE_BINOP(PyNumber_InPlaceFloorDivide, nb_inplace_floor_divide, nb_floor_divide, "//=")
    1248                 :    2098959 : INPLACE_BINOP(PyNumber_InPlaceTrueDivide, nb_inplace_true_divide, nb_true_divide,  "/=")
    1249                 :        597 : INPLACE_BINOP(PyNumber_InPlaceRemainder, nb_inplace_remainder, nb_remainder, "%=")
    1250                 :            : 
    1251                 :            : PyObject *
    1252                 :    1425594 : PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
    1253                 :            : {
    1254                 :    1425594 :     PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_add),
    1255                 :            :                                    NB_SLOT(nb_add), "+=");
    1256         [ +  + ]:    1425594 :     if (result == Py_NotImplemented) {
    1257                 :     406502 :         PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
    1258                 :     406502 :         Py_DECREF(result);
    1259         [ +  - ]:     406502 :         if (m != NULL) {
    1260                 :     406502 :             binaryfunc func = m->sq_inplace_concat;
    1261         [ +  + ]:     406502 :             if (func == NULL)
    1262                 :     210905 :                 func = m->sq_concat;
    1263         [ +  + ]:     406502 :             if (func != NULL) {
    1264                 :     406495 :                 result = func(v, w);
    1265                 :            :                 assert(_Py_CheckSlotResult(v, "+=", result != NULL));
    1266                 :     406495 :                 return result;
    1267                 :            :             }
    1268                 :            :         }
    1269                 :          7 :         result = binop_type_error(v, w, "+=");
    1270                 :            :     }
    1271                 :    1019099 :     return result;
    1272                 :            : }
    1273                 :            : 
    1274                 :            : PyObject *
    1275                 :      11192 : PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
    1276                 :            : {
    1277                 :      11192 :     PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_multiply),
    1278                 :            :                                    NB_SLOT(nb_multiply), "*=");
    1279         [ +  + ]:      11192 :     if (result == Py_NotImplemented) {
    1280                 :        685 :         ssizeargfunc f = NULL;
    1281                 :        685 :         PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
    1282                 :        685 :         PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
    1283                 :        685 :         Py_DECREF(result);
    1284         [ +  + ]:        685 :         if (mv != NULL) {
    1285                 :        205 :             f = mv->sq_inplace_repeat;
    1286         [ +  + ]:        205 :             if (f == NULL)
    1287                 :         50 :                 f = mv->sq_repeat;
    1288         [ +  + ]:        205 :             if (f != NULL)
    1289                 :        199 :                 return sequence_repeat(f, v, w);
    1290                 :            :         }
    1291         [ +  - ]:        480 :         else if (mw != NULL) {
    1292                 :            :             /* Note that the right hand operand should not be
    1293                 :            :              * mutated in this case so sq_inplace_repeat is not
    1294                 :            :              * used. */
    1295         [ +  - ]:        480 :             if (mw->sq_repeat)
    1296                 :        480 :                 return sequence_repeat(mw->sq_repeat, w, v);
    1297                 :            :         }
    1298                 :          6 :         result = binop_type_error(v, w, "*=");
    1299                 :            :     }
    1300                 :      10513 :     return result;
    1301                 :            : }
    1302                 :            : 
    1303                 :            : PyObject *
    1304                 :         21 : PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
    1305                 :            : {
    1306                 :         21 :     return ternary_iop(v, w, z, NB_SLOT(nb_inplace_power),
    1307                 :            :                                 NB_SLOT(nb_power), "**=");
    1308                 :            : }
    1309                 :            : 
    1310                 :            : PyObject *
    1311                 :         20 : _PyNumber_InPlacePowerNoMod(PyObject *lhs, PyObject *rhs)
    1312                 :            : {
    1313                 :         20 :     return PyNumber_InPlacePower(lhs, rhs, Py_None);
    1314                 :            : }
    1315                 :            : 
    1316                 :            : 
    1317                 :            : /* Unary operators and functions */
    1318                 :            : 
    1319                 :            : PyObject *
    1320                 :    1562863 : PyNumber_Negative(PyObject *o)
    1321                 :            : {
    1322         [ -  + ]:    1562863 :     if (o == NULL) {
    1323                 :          0 :         return null_error();
    1324                 :            :     }
    1325                 :            : 
    1326                 :    1562863 :     PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
    1327   [ +  -  +  + ]:    1562863 :     if (m && m->nb_negative) {
    1328                 :    1562855 :         PyObject *res = (*m->nb_negative)(o);
    1329                 :            :         assert(_Py_CheckSlotResult(o, "__neg__", res != NULL));
    1330                 :    1562855 :         return res;
    1331                 :            :     }
    1332                 :            : 
    1333                 :          8 :     return type_error("bad operand type for unary -: '%.200s'", o);
    1334                 :            : }
    1335                 :            : 
    1336                 :            : PyObject *
    1337                 :        605 : PyNumber_Positive(PyObject *o)
    1338                 :            : {
    1339         [ -  + ]:        605 :     if (o == NULL) {
    1340                 :          0 :         return null_error();
    1341                 :            :     }
    1342                 :            : 
    1343                 :        605 :     PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
    1344   [ +  -  +  + ]:        605 :     if (m && m->nb_positive) {
    1345                 :        599 :         PyObject *res = (*m->nb_positive)(o);
    1346                 :            :         assert(_Py_CheckSlotResult(o, "__pos__", res != NULL));
    1347                 :        599 :         return res;
    1348                 :            :     }
    1349                 :            : 
    1350                 :          6 :     return type_error("bad operand type for unary +: '%.200s'", o);
    1351                 :            : }
    1352                 :            : 
    1353                 :            : PyObject *
    1354                 :     727897 : PyNumber_Invert(PyObject *o)
    1355                 :            : {
    1356         [ -  + ]:     727897 :     if (o == NULL) {
    1357                 :          0 :         return null_error();
    1358                 :            :     }
    1359                 :            : 
    1360                 :     727897 :     PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
    1361   [ +  -  +  + ]:     727897 :     if (m && m->nb_invert) {
    1362                 :     727886 :         PyObject *res = (*m->nb_invert)(o);
    1363                 :            :         assert(_Py_CheckSlotResult(o, "__invert__", res != NULL));
    1364                 :     727886 :         return res;
    1365                 :            :     }
    1366                 :            : 
    1367                 :         11 :     return type_error("bad operand type for unary ~: '%.200s'", o);
    1368                 :            : }
    1369                 :            : 
    1370                 :            : PyObject *
    1371                 :    2894173 : PyNumber_Absolute(PyObject *o)
    1372                 :            : {
    1373         [ -  + ]:    2894173 :     if (o == NULL) {
    1374                 :          0 :         return null_error();
    1375                 :            :     }
    1376                 :            : 
    1377                 :    2894173 :     PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
    1378   [ +  -  +  + ]:    2894173 :     if (m && m->nb_absolute) {
    1379                 :    2894169 :         PyObject *res = m->nb_absolute(o);
    1380                 :            :         assert(_Py_CheckSlotResult(o, "__abs__", res != NULL));
    1381                 :    2894169 :         return res;
    1382                 :            :     }
    1383                 :            : 
    1384                 :          4 :     return type_error("bad operand type for abs(): '%.200s'", o);
    1385                 :            : }
    1386                 :            : 
    1387                 :            : 
    1388                 :            : int
    1389                 :    9673867 : PyIndex_Check(PyObject *obj)
    1390                 :            : {
    1391                 :    9673867 :     return _PyIndex_Check(obj);
    1392                 :            : }
    1393                 :            : 
    1394                 :            : 
    1395                 :            : /* Return a Python int from the object item.
    1396                 :            :    Can return an instance of int subclass.
    1397                 :            :    Raise TypeError if the result is not an int
    1398                 :            :    or if the object cannot be interpreted as an index.
    1399                 :            : */
    1400                 :            : PyObject *
    1401                 :  203420296 : _PyNumber_Index(PyObject *item)
    1402                 :            : {
    1403         [ -  + ]:  203420296 :     if (item == NULL) {
    1404                 :          0 :         return null_error();
    1405                 :            :     }
    1406                 :            : 
    1407         [ +  + ]:  203420296 :     if (PyLong_Check(item)) {
    1408                 :  202389852 :         Py_INCREF(item);
    1409                 :  202389852 :         return item;
    1410                 :            :     }
    1411         [ +  + ]:    1030444 :     if (!_PyIndex_Check(item)) {
    1412                 :    1027106 :         PyErr_Format(PyExc_TypeError,
    1413                 :            :                      "'%.200s' object cannot be interpreted "
    1414                 :    1027106 :                      "as an integer", Py_TYPE(item)->tp_name);
    1415                 :    1027106 :         return NULL;
    1416                 :            :     }
    1417                 :            : 
    1418                 :       3338 :     PyObject *result = Py_TYPE(item)->tp_as_number->nb_index(item);
    1419                 :            :     assert(_Py_CheckSlotResult(item, "__index__", result != NULL));
    1420   [ +  +  +  + ]:       3338 :     if (!result || PyLong_CheckExact(result)) {
    1421                 :       2963 :         return result;
    1422                 :            :     }
    1423                 :            : 
    1424         [ +  + ]:        375 :     if (!PyLong_Check(result)) {
    1425                 :        363 :         PyErr_Format(PyExc_TypeError,
    1426                 :            :                      "__index__ returned non-int (type %.200s)",
    1427                 :        363 :                      Py_TYPE(result)->tp_name);
    1428                 :        363 :         Py_DECREF(result);
    1429                 :        363 :         return NULL;
    1430                 :            :     }
    1431                 :            :     /* Issue #17576: warn if 'result' not of exact type int. */
    1432         [ -  + ]:         12 :     if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
    1433                 :            :             "__index__ returned non-int (type %.200s).  "
    1434                 :            :             "The ability to return an instance of a strict subclass of int "
    1435                 :            :             "is deprecated, and may be removed in a future version of Python.",
    1436                 :         12 :             Py_TYPE(result)->tp_name)) {
    1437                 :          0 :         Py_DECREF(result);
    1438                 :          0 :         return NULL;
    1439                 :            :     }
    1440                 :         12 :     return result;
    1441                 :            : }
    1442                 :            : 
    1443                 :            : /* Return an exact Python int from the object item.
    1444                 :            :    Raise TypeError if the result is not an int
    1445                 :            :    or if the object cannot be interpreted as an index.
    1446                 :            : */
    1447                 :            : PyObject *
    1448                 :    8704703 : PyNumber_Index(PyObject *item)
    1449                 :            : {
    1450                 :    8704703 :     PyObject *result = _PyNumber_Index(item);
    1451   [ +  +  +  + ]:    8704703 :     if (result != NULL && !PyLong_CheckExact(result)) {
    1452                 :         58 :         Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
    1453                 :            :     }
    1454                 :    8704703 :     return result;
    1455                 :            : }
    1456                 :            : 
    1457                 :            : /* Return an error on Overflow only if err is not NULL*/
    1458                 :            : 
    1459                 :            : Py_ssize_t
    1460                 :  180339691 : PyNumber_AsSsize_t(PyObject *item, PyObject *err)
    1461                 :            : {
    1462                 :            :     Py_ssize_t result;
    1463                 :            :     PyObject *runerr;
    1464                 :  180339691 :     PyObject *value = _PyNumber_Index(item);
    1465         [ +  + ]:  180339691 :     if (value == NULL)
    1466                 :     737085 :         return -1;
    1467                 :            : 
    1468                 :            :     /* We're done if PyLong_AsSsize_t() returns without error. */
    1469                 :  179602606 :     result = PyLong_AsSsize_t(value);
    1470         [ +  + ]:  179602606 :     if (result != -1)
    1471                 :  164933261 :         goto finish;
    1472                 :            : 
    1473                 :   14669345 :     PyThreadState *tstate = _PyThreadState_GET();
    1474                 :   14669345 :     runerr = _PyErr_Occurred(tstate);
    1475         [ +  + ]:   14669345 :     if (!runerr) {
    1476                 :   14666789 :         goto finish;
    1477                 :            :     }
    1478                 :            : 
    1479                 :            :     /* Error handling code -- only manage OverflowError differently */
    1480         [ -  + ]:       2556 :     if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
    1481                 :          0 :         goto finish;
    1482                 :            :     }
    1483                 :       2556 :     _PyErr_Clear(tstate);
    1484                 :            : 
    1485                 :            :     /* If no error-handling desired then the default clipping
    1486                 :            :        is sufficient. */
    1487         [ +  + ]:       2556 :     if (!err) {
    1488                 :            :         assert(PyLong_Check(value));
    1489                 :            :         /* Whether or not it is less than or equal to
    1490                 :            :            zero is determined by the sign of ob_size
    1491                 :            :         */
    1492         [ +  + ]:       2526 :         if (_PyLong_Sign(value) < 0)
    1493                 :         25 :             result = PY_SSIZE_T_MIN;
    1494                 :            :         else
    1495                 :       2501 :             result = PY_SSIZE_T_MAX;
    1496                 :            :     }
    1497                 :            :     else {
    1498                 :            :         /* Otherwise replace the error with caller's error object. */
    1499                 :         30 :         _PyErr_Format(tstate, err,
    1500                 :            :                       "cannot fit '%.200s' into an index-sized integer",
    1501                 :         30 :                       Py_TYPE(item)->tp_name);
    1502                 :            :     }
    1503                 :            : 
    1504                 :  179602606 :  finish:
    1505                 :  179602606 :     Py_DECREF(value);
    1506                 :  179602606 :     return result;
    1507                 :            : }
    1508                 :            : 
    1509                 :            : 
    1510                 :            : PyObject *
    1511                 :    3348520 : PyNumber_Long(PyObject *o)
    1512                 :            : {
    1513                 :            :     PyObject *result;
    1514                 :            :     PyNumberMethods *m;
    1515                 :            :     PyObject *trunc_func;
    1516                 :            :     Py_buffer view;
    1517                 :            : 
    1518         [ -  + ]:    3348520 :     if (o == NULL) {
    1519                 :          0 :         return null_error();
    1520                 :            :     }
    1521                 :            : 
    1522         [ +  + ]:    3348520 :     if (PyLong_CheckExact(o)) {
    1523                 :    1062057 :         Py_INCREF(o);
    1524                 :    1062057 :         return o;
    1525                 :            :     }
    1526                 :    2286463 :     m = Py_TYPE(o)->tp_as_number;
    1527   [ +  +  +  + ]:    2286463 :     if (m && m->nb_int) { /* This should include subclasses of int */
    1528                 :            :         /* Convert using the nb_int slot, which should return something
    1529                 :            :            of exact type int. */
    1530                 :    1448391 :         result = m->nb_int(o);
    1531                 :            :         assert(_Py_CheckSlotResult(o, "__int__", result != NULL));
    1532   [ +  +  +  + ]:    1448391 :         if (!result || PyLong_CheckExact(result)) {
    1533                 :    1448388 :             return result;
    1534                 :            :         }
    1535                 :            : 
    1536         [ +  + ]:          3 :         if (!PyLong_Check(result)) {
    1537                 :          1 :             PyErr_Format(PyExc_TypeError,
    1538                 :            :                          "__int__ returned non-int (type %.200s)",
    1539                 :          1 :                          Py_TYPE(result)->tp_name);
    1540                 :          1 :             Py_DECREF(result);
    1541                 :          1 :             return NULL;
    1542                 :            :         }
    1543                 :            :         /* Issue #17576: warn if 'result' not of exact type int. */
    1544         [ -  + ]:          2 :         if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
    1545                 :            :                 "__int__ returned non-int (type %.200s).  "
    1546                 :            :                 "The ability to return an instance of a strict subclass of int "
    1547                 :            :                 "is deprecated, and may be removed in a future version of Python.",
    1548                 :          2 :                 Py_TYPE(result)->tp_name)) {
    1549                 :          0 :             Py_DECREF(result);
    1550                 :          0 :             return NULL;
    1551                 :            :         }
    1552                 :          2 :         Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
    1553                 :          2 :         return result;
    1554                 :            :     }
    1555   [ +  +  +  + ]:     838072 :     if (m && m->nb_index) {
    1556                 :          1 :         return PyNumber_Index(o);
    1557                 :            :     }
    1558                 :     838071 :     trunc_func = _PyObject_LookupSpecial(o, &_Py_ID(__trunc__));
    1559         [ +  + ]:     838071 :     if (trunc_func) {
    1560         [ -  + ]:         25 :         if (PyErr_WarnEx(PyExc_DeprecationWarning,
    1561                 :            :                 "The delegation of int() to __trunc__ is deprecated.", 1)) {
    1562                 :          0 :             Py_DECREF(trunc_func);
    1563                 :          0 :             return NULL;
    1564                 :            :         }
    1565                 :         25 :         result = _PyObject_CallNoArgs(trunc_func);
    1566                 :         25 :         Py_DECREF(trunc_func);
    1567   [ +  +  +  + ]:         25 :         if (result == NULL || PyLong_CheckExact(result)) {
    1568                 :          5 :             return result;
    1569                 :            :         }
    1570         [ +  + ]:         20 :         if (PyLong_Check(result)) {
    1571                 :          2 :             Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
    1572                 :          2 :             return result;
    1573                 :            :         }
    1574                 :            :         /* __trunc__ is specified to return an Integral type,
    1575                 :            :            but int() needs to return an int. */
    1576         [ +  + ]:         18 :         if (!PyIndex_Check(result)) {
    1577                 :          9 :             PyErr_Format(
    1578                 :            :                 PyExc_TypeError,
    1579                 :            :                 "__trunc__ returned non-Integral (type %.200s)",
    1580                 :          9 :                 Py_TYPE(result)->tp_name);
    1581                 :          9 :             Py_DECREF(result);
    1582                 :          9 :             return NULL;
    1583                 :            :         }
    1584                 :          9 :         Py_SETREF(result, PyNumber_Index(result));
    1585                 :          9 :         return result;
    1586                 :            :     }
    1587         [ -  + ]:     838046 :     if (PyErr_Occurred())
    1588                 :          0 :         return NULL;
    1589                 :            : 
    1590         [ +  + ]:     838046 :     if (PyUnicode_Check(o))
    1591                 :            :         /* The below check is done in PyLong_FromUnicodeObject(). */
    1592                 :     632102 :         return PyLong_FromUnicodeObject(o, 10);
    1593                 :            : 
    1594         [ +  + ]:     205944 :     if (PyBytes_Check(o))
    1595                 :            :         /* need to do extra error checking that PyLong_FromString()
    1596                 :            :          * doesn't do.  In particular int('9\x005') must raise an
    1597                 :            :          * exception, not truncate at the null.
    1598                 :            :          */
    1599                 :     156824 :         return _PyLong_FromBytes(PyBytes_AS_STRING(o),
    1600                 :            :                                  PyBytes_GET_SIZE(o), 10);
    1601                 :            : 
    1602         [ +  + ]:      49120 :     if (PyByteArray_Check(o))
    1603                 :      26197 :         return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
    1604                 :            :                                  PyByteArray_GET_SIZE(o), 10);
    1605                 :            : 
    1606         [ +  + ]:      22923 :     if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
    1607                 :            :         PyObject *bytes;
    1608                 :            : 
    1609                 :            :         /* Copy to NUL-terminated buffer. */
    1610                 :          9 :         bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
    1611         [ -  + ]:          9 :         if (bytes == NULL) {
    1612                 :          0 :             PyBuffer_Release(&view);
    1613                 :          0 :             return NULL;
    1614                 :            :         }
    1615                 :          9 :         result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
    1616                 :            :                                    PyBytes_GET_SIZE(bytes), 10);
    1617                 :          9 :         Py_DECREF(bytes);
    1618                 :          9 :         PyBuffer_Release(&view);
    1619                 :          9 :         return result;
    1620                 :            :     }
    1621                 :            : 
    1622                 :      22914 :     return type_error("int() argument must be a string, a bytes-like object "
    1623                 :            :                       "or a real number, not '%.200s'", o);
    1624                 :            : }
    1625                 :            : 
    1626                 :            : PyObject *
    1627                 :    3414513 : PyNumber_Float(PyObject *o)
    1628                 :            : {
    1629         [ -  + ]:    3414513 :     if (o == NULL) {
    1630                 :          0 :         return null_error();
    1631                 :            :     }
    1632                 :            : 
    1633         [ +  + ]:    3414513 :     if (PyFloat_CheckExact(o)) {
    1634                 :      17457 :         return Py_NewRef(o);
    1635                 :            :     }
    1636                 :            : 
    1637                 :    3397056 :     PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
    1638   [ +  +  +  + ]:    3397056 :     if (m && m->nb_float) { /* This should include subclasses of float */
    1639                 :    3396902 :         PyObject *res = m->nb_float(o);
    1640                 :            :         assert(_Py_CheckSlotResult(o, "__float__", res != NULL));
    1641   [ +  +  +  + ]:    3396902 :         if (!res || PyFloat_CheckExact(res)) {
    1642                 :    3396894 :             return res;
    1643                 :            :         }
    1644                 :            : 
    1645         [ +  + ]:          8 :         if (!PyFloat_Check(res)) {
    1646                 :          3 :             PyErr_Format(PyExc_TypeError,
    1647                 :            :                          "%.50s.__float__ returned non-float (type %.50s)",
    1648                 :          3 :                          Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name);
    1649                 :          3 :             Py_DECREF(res);
    1650                 :          3 :             return NULL;
    1651                 :            :         }
    1652                 :            :         /* Issue #26983: warn if 'res' not of exact type float. */
    1653         [ -  + ]:          5 :         if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
    1654                 :            :                 "%.50s.__float__ returned non-float (type %.50s).  "
    1655                 :            :                 "The ability to return an instance of a strict subclass of float "
    1656                 :            :                 "is deprecated, and may be removed in a future version of Python.",
    1657                 :          5 :                 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) {
    1658                 :          0 :             Py_DECREF(res);
    1659                 :          0 :             return NULL;
    1660                 :            :         }
    1661                 :          5 :         double val = PyFloat_AS_DOUBLE(res);
    1662                 :          5 :         Py_DECREF(res);
    1663                 :          5 :         return PyFloat_FromDouble(val);
    1664                 :            :     }
    1665                 :            : 
    1666   [ +  +  +  + ]:        154 :     if (m && m->nb_index) {
    1667                 :          6 :         PyObject *res = _PyNumber_Index(o);
    1668         [ -  + ]:          6 :         if (!res) {
    1669                 :          0 :             return NULL;
    1670                 :            :         }
    1671                 :          6 :         double val = PyLong_AsDouble(res);
    1672                 :          6 :         Py_DECREF(res);
    1673   [ +  +  +  - ]:          6 :         if (val == -1.0 && PyErr_Occurred()) {
    1674                 :          3 :             return NULL;
    1675                 :            :         }
    1676                 :          3 :         return PyFloat_FromDouble(val);
    1677                 :            :     }
    1678                 :            : 
    1679                 :            :     /* A float subclass with nb_float == NULL */
    1680         [ -  + ]:        148 :     if (PyFloat_Check(o)) {
    1681                 :          0 :         return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
    1682                 :            :     }
    1683                 :        148 :     return PyFloat_FromString(o);
    1684                 :            : }
    1685                 :            : 
    1686                 :            : 
    1687                 :            : PyObject *
    1688                 :     685984 : PyNumber_ToBase(PyObject *n, int base)
    1689                 :            : {
    1690   [ +  +  +  +  :     685984 :     if (!(base == 2 || base == 8 || base == 10 || base == 16)) {
             +  +  +  + ]
    1691                 :          1 :         PyErr_SetString(PyExc_SystemError,
    1692                 :            :                         "PyNumber_ToBase: base must be 2, 8, 10 or 16");
    1693                 :          1 :         return NULL;
    1694                 :            :     }
    1695                 :     685983 :     PyObject *index = _PyNumber_Index(n);
    1696         [ +  + ]:     685983 :     if (!index)
    1697                 :         13 :         return NULL;
    1698                 :     685970 :     PyObject *res = _PyLong_Format(index, base);
    1699                 :     685970 :     Py_DECREF(index);
    1700                 :     685970 :     return res;
    1701                 :            : }
    1702                 :            : 
    1703                 :            : 
    1704                 :            : /* Operations on sequences */
    1705                 :            : 
    1706                 :            : int
    1707                 :     787942 : PySequence_Check(PyObject *s)
    1708                 :            : {
    1709         [ +  + ]:     787942 :     if (PyDict_Check(s))
    1710                 :          1 :         return 0;
    1711         [ +  + ]:    1552341 :     return Py_TYPE(s)->tp_as_sequence &&
    1712         [ +  + ]:     764400 :         Py_TYPE(s)->tp_as_sequence->sq_item != NULL;
    1713                 :            : }
    1714                 :            : 
    1715                 :            : Py_ssize_t
    1716                 :     445844 : PySequence_Size(PyObject *s)
    1717                 :            : {
    1718         [ -  + ]:     445844 :     if (s == NULL) {
    1719                 :          0 :         null_error();
    1720                 :          0 :         return -1;
    1721                 :            :     }
    1722                 :            : 
    1723                 :     445844 :     PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
    1724   [ +  +  +  + ]:     445844 :     if (m && m->sq_length) {
    1725                 :     445828 :         Py_ssize_t len = m->sq_length(s);
    1726                 :            :         assert(_Py_CheckSlotResult(s, "__len__", len >= 0));
    1727                 :     445828 :         return len;
    1728                 :            :     }
    1729                 :            : 
    1730   [ +  +  +  + ]:         16 :     if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) {
    1731                 :          2 :         type_error("%.200s is not a sequence", s);
    1732                 :          2 :         return -1;
    1733                 :            :     }
    1734                 :         14 :     type_error("object of type '%.200s' has no len()", s);
    1735                 :         14 :     return -1;
    1736                 :            : }
    1737                 :            : 
    1738                 :            : #undef PySequence_Length
    1739                 :            : Py_ssize_t
    1740                 :          0 : PySequence_Length(PyObject *s)
    1741                 :            : {
    1742                 :          0 :     return PySequence_Size(s);
    1743                 :            : }
    1744                 :            : #define PySequence_Length PySequence_Size
    1745                 :            : 
    1746                 :            : PyObject *
    1747                 :      53665 : PySequence_Concat(PyObject *s, PyObject *o)
    1748                 :            : {
    1749   [ +  -  -  + ]:      53665 :     if (s == NULL || o == NULL) {
    1750                 :          0 :         return null_error();
    1751                 :            :     }
    1752                 :            : 
    1753                 :      53665 :     PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
    1754   [ +  +  +  + ]:      53665 :     if (m && m->sq_concat) {
    1755                 :      53661 :         PyObject *res = m->sq_concat(s, o);
    1756                 :            :         assert(_Py_CheckSlotResult(s, "+", res != NULL));
    1757                 :      53661 :         return res;
    1758                 :            :     }
    1759                 :            : 
    1760                 :            :     /* Instances of user classes defining an __add__() method only
    1761                 :            :        have an nb_add slot, not an sq_concat slot.      So we fall back
    1762                 :            :        to nb_add if both arguments appear to be sequences. */
    1763   [ +  +  +  - ]:          4 :     if (PySequence_Check(s) && PySequence_Check(o)) {
    1764                 :          2 :         PyObject *result = BINARY_OP1(s, o, NB_SLOT(nb_add), "+");
    1765         [ +  - ]:          2 :         if (result != Py_NotImplemented)
    1766                 :          2 :             return result;
    1767                 :          0 :         Py_DECREF(result);
    1768                 :            :     }
    1769                 :          2 :     return type_error("'%.200s' object can't be concatenated", s);
    1770                 :            : }
    1771                 :            : 
    1772                 :            : PyObject *
    1773                 :          0 : PySequence_Repeat(PyObject *o, Py_ssize_t count)
    1774                 :            : {
    1775         [ #  # ]:          0 :     if (o == NULL) {
    1776                 :          0 :         return null_error();
    1777                 :            :     }
    1778                 :            : 
    1779                 :          0 :     PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
    1780   [ #  #  #  # ]:          0 :     if (m && m->sq_repeat) {
    1781                 :          0 :         PyObject *res = m->sq_repeat(o, count);
    1782                 :            :         assert(_Py_CheckSlotResult(o, "*", res != NULL));
    1783                 :          0 :         return res;
    1784                 :            :     }
    1785                 :            : 
    1786                 :            :     /* Instances of user classes defining a __mul__() method only
    1787                 :            :        have an nb_multiply slot, not an sq_repeat slot. so we fall back
    1788                 :            :        to nb_multiply if o appears to be a sequence. */
    1789         [ #  # ]:          0 :     if (PySequence_Check(o)) {
    1790                 :            :         PyObject *n, *result;
    1791                 :          0 :         n = PyLong_FromSsize_t(count);
    1792         [ #  # ]:          0 :         if (n == NULL)
    1793                 :          0 :             return NULL;
    1794                 :          0 :         result = BINARY_OP1(o, n, NB_SLOT(nb_multiply), "*");
    1795                 :          0 :         Py_DECREF(n);
    1796         [ #  # ]:          0 :         if (result != Py_NotImplemented)
    1797                 :          0 :             return result;
    1798                 :          0 :         Py_DECREF(result);
    1799                 :            :     }
    1800                 :          0 :     return type_error("'%.200s' object can't be repeated", o);
    1801                 :            : }
    1802                 :            : 
    1803                 :            : PyObject *
    1804                 :          1 : PySequence_InPlaceConcat(PyObject *s, PyObject *o)
    1805                 :            : {
    1806   [ +  -  -  + ]:          1 :     if (s == NULL || o == NULL) {
    1807                 :          0 :         return null_error();
    1808                 :            :     }
    1809                 :            : 
    1810                 :          1 :     PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
    1811   [ +  -  -  + ]:          1 :     if (m && m->sq_inplace_concat) {
    1812                 :          0 :         PyObject *res = m->sq_inplace_concat(s, o);
    1813                 :            :         assert(_Py_CheckSlotResult(s, "+=", res != NULL));
    1814                 :          0 :         return res;
    1815                 :            :     }
    1816   [ +  -  -  + ]:          1 :     if (m && m->sq_concat) {
    1817                 :          0 :         PyObject *res = m->sq_concat(s, o);
    1818                 :            :         assert(_Py_CheckSlotResult(s, "+", res != NULL));
    1819                 :          0 :         return res;
    1820                 :            :     }
    1821                 :            : 
    1822   [ +  -  +  - ]:          1 :     if (PySequence_Check(s) && PySequence_Check(o)) {
    1823                 :          1 :         PyObject *result = BINARY_IOP1(s, o, NB_SLOT(nb_inplace_add),
    1824                 :            :                                        NB_SLOT(nb_add), "+=");
    1825         [ +  - ]:          1 :         if (result != Py_NotImplemented)
    1826                 :          1 :             return result;
    1827                 :          0 :         Py_DECREF(result);
    1828                 :            :     }
    1829                 :          0 :     return type_error("'%.200s' object can't be concatenated", s);
    1830                 :            : }
    1831                 :            : 
    1832                 :            : PyObject *
    1833                 :          0 : PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
    1834                 :            : {
    1835         [ #  # ]:          0 :     if (o == NULL) {
    1836                 :          0 :         return null_error();
    1837                 :            :     }
    1838                 :            : 
    1839                 :          0 :     PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
    1840   [ #  #  #  # ]:          0 :     if (m && m->sq_inplace_repeat) {
    1841                 :          0 :         PyObject *res = m->sq_inplace_repeat(o, count);
    1842                 :            :         assert(_Py_CheckSlotResult(o, "*=", res != NULL));
    1843                 :          0 :         return res;
    1844                 :            :     }
    1845   [ #  #  #  # ]:          0 :     if (m && m->sq_repeat) {
    1846                 :          0 :         PyObject *res = m->sq_repeat(o, count);
    1847                 :            :         assert(_Py_CheckSlotResult(o, "*", res != NULL));
    1848                 :          0 :         return res;
    1849                 :            :     }
    1850                 :            : 
    1851         [ #  # ]:          0 :     if (PySequence_Check(o)) {
    1852                 :            :         PyObject *n, *result;
    1853                 :          0 :         n = PyLong_FromSsize_t(count);
    1854         [ #  # ]:          0 :         if (n == NULL)
    1855                 :          0 :             return NULL;
    1856                 :          0 :         result = BINARY_IOP1(o, n, NB_SLOT(nb_inplace_multiply),
    1857                 :            :                              NB_SLOT(nb_multiply), "*=");
    1858                 :          0 :         Py_DECREF(n);
    1859         [ #  # ]:          0 :         if (result != Py_NotImplemented)
    1860                 :          0 :             return result;
    1861                 :          0 :         Py_DECREF(result);
    1862                 :            :     }
    1863                 :          0 :     return type_error("'%.200s' object can't be repeated", o);
    1864                 :            : }
    1865                 :            : 
    1866                 :            : PyObject *
    1867                 :    7353398 : PySequence_GetItem(PyObject *s, Py_ssize_t i)
    1868                 :            : {
    1869         [ -  + ]:    7353398 :     if (s == NULL) {
    1870                 :          0 :         return null_error();
    1871                 :            :     }
    1872                 :            : 
    1873                 :    7353398 :     PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
    1874   [ +  -  +  + ]:    7353398 :     if (m && m->sq_item) {
    1875         [ +  + ]:    7353393 :         if (i < 0) {
    1876         [ +  - ]:      32134 :             if (m->sq_length) {
    1877                 :      32134 :                 Py_ssize_t l = (*m->sq_length)(s);
    1878                 :            :                 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
    1879         [ -  + ]:      32134 :                 if (l < 0) {
    1880                 :          0 :                     return NULL;
    1881                 :            :                 }
    1882                 :      32134 :                 i += l;
    1883                 :            :             }
    1884                 :            :         }
    1885                 :    7353393 :         PyObject *res = m->sq_item(s, i);
    1886                 :            :         assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
    1887                 :    7353393 :         return res;
    1888                 :            :     }
    1889                 :            : 
    1890   [ +  -  -  + ]:          5 :     if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) {
    1891                 :          0 :         return type_error("%.200s is not a sequence", s);
    1892                 :            :     }
    1893                 :          5 :     return type_error("'%.200s' object does not support indexing", s);
    1894                 :            : }
    1895                 :            : 
    1896                 :            : PyObject *
    1897                 :      17292 : PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
    1898                 :            : {
    1899         [ -  + ]:      17292 :     if (!s) {
    1900                 :          0 :         return null_error();
    1901                 :            :     }
    1902                 :            : 
    1903                 :      17292 :     PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
    1904   [ +  -  +  - ]:      17292 :     if (mp && mp->mp_subscript) {
    1905                 :      17292 :         PyObject *slice = _PySlice_FromIndices(i1, i2);
    1906         [ -  + ]:      17292 :         if (!slice) {
    1907                 :          0 :             return NULL;
    1908                 :            :         }
    1909                 :      17292 :         PyObject *res = mp->mp_subscript(s, slice);
    1910                 :            :         assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
    1911                 :      17292 :         Py_DECREF(slice);
    1912                 :      17292 :         return res;
    1913                 :            :     }
    1914                 :            : 
    1915                 :          0 :     return type_error("'%.200s' object is unsliceable", s);
    1916                 :            : }
    1917                 :            : 
    1918                 :            : int
    1919                 :       5894 : PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
    1920                 :            : {
    1921         [ -  + ]:       5894 :     if (s == NULL) {
    1922                 :          0 :         null_error();
    1923                 :          0 :         return -1;
    1924                 :            :     }
    1925                 :            : 
    1926                 :       5894 :     PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
    1927   [ +  -  +  + ]:       5894 :     if (m && m->sq_ass_item) {
    1928         [ -  + ]:       5886 :         if (i < 0) {
    1929         [ #  # ]:          0 :             if (m->sq_length) {
    1930                 :          0 :                 Py_ssize_t l = (*m->sq_length)(s);
    1931                 :            :                 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
    1932         [ #  # ]:          0 :                 if (l < 0) {
    1933                 :          0 :                     return -1;
    1934                 :            :                 }
    1935                 :          0 :                 i += l;
    1936                 :            :             }
    1937                 :            :         }
    1938                 :       5886 :         int res = m->sq_ass_item(s, i, o);
    1939                 :            :         assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
    1940                 :       5886 :         return res;
    1941                 :            :     }
    1942                 :            : 
    1943   [ +  -  -  + ]:          8 :     if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
    1944                 :          0 :         type_error("%.200s is not a sequence", s);
    1945                 :          0 :         return -1;
    1946                 :            :     }
    1947                 :          8 :     type_error("'%.200s' object does not support item assignment", s);
    1948                 :          8 :     return -1;
    1949                 :            : }
    1950                 :            : 
    1951                 :            : int
    1952                 :     351682 : PySequence_DelItem(PyObject *s, Py_ssize_t i)
    1953                 :            : {
    1954         [ -  + ]:     351682 :     if (s == NULL) {
    1955                 :          0 :         null_error();
    1956                 :          0 :         return -1;
    1957                 :            :     }
    1958                 :            : 
    1959                 :     351682 :     PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
    1960   [ +  -  +  + ]:     351682 :     if (m && m->sq_ass_item) {
    1961         [ +  + ]:     351680 :         if (i < 0) {
    1962         [ +  - ]:        268 :             if (m->sq_length) {
    1963                 :        268 :                 Py_ssize_t l = (*m->sq_length)(s);
    1964                 :            :                 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
    1965         [ -  + ]:        268 :                 if (l < 0) {
    1966                 :          0 :                     return -1;
    1967                 :            :                 }
    1968                 :        268 :                 i += l;
    1969                 :            :             }
    1970                 :            :         }
    1971                 :     351680 :         int res = m->sq_ass_item(s, i, (PyObject *)NULL);
    1972                 :            :         assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
    1973                 :     351680 :         return res;
    1974                 :            :     }
    1975                 :            : 
    1976   [ +  -  -  + ]:          2 :     if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
    1977                 :          0 :         type_error("%.200s is not a sequence", s);
    1978                 :          0 :         return -1;
    1979                 :            :     }
    1980                 :          2 :     type_error("'%.200s' object doesn't support item deletion", s);
    1981                 :          2 :     return -1;
    1982                 :            : }
    1983                 :            : 
    1984                 :            : int
    1985                 :          0 : PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
    1986                 :            : {
    1987         [ #  # ]:          0 :     if (s == NULL) {
    1988                 :          0 :         null_error();
    1989                 :          0 :         return -1;
    1990                 :            :     }
    1991                 :            : 
    1992                 :          0 :     PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
    1993   [ #  #  #  # ]:          0 :     if (mp && mp->mp_ass_subscript) {
    1994                 :          0 :         PyObject *slice = _PySlice_FromIndices(i1, i2);
    1995         [ #  # ]:          0 :         if (!slice)
    1996                 :          0 :             return -1;
    1997                 :          0 :         int res = mp->mp_ass_subscript(s, slice, o);
    1998                 :            :         assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
    1999                 :          0 :         Py_DECREF(slice);
    2000                 :          0 :         return res;
    2001                 :            :     }
    2002                 :            : 
    2003                 :          0 :     type_error("'%.200s' object doesn't support slice assignment", s);
    2004                 :          0 :     return -1;
    2005                 :            : }
    2006                 :            : 
    2007                 :            : int
    2008                 :          0 : PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
    2009                 :            : {
    2010         [ #  # ]:          0 :     if (s == NULL) {
    2011                 :          0 :         null_error();
    2012                 :          0 :         return -1;
    2013                 :            :     }
    2014                 :            : 
    2015                 :          0 :     PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
    2016   [ #  #  #  # ]:          0 :     if (mp && mp->mp_ass_subscript) {
    2017                 :          0 :         PyObject *slice = _PySlice_FromIndices(i1, i2);
    2018         [ #  # ]:          0 :         if (!slice) {
    2019                 :          0 :             return -1;
    2020                 :            :         }
    2021                 :          0 :         int res = mp->mp_ass_subscript(s, slice, NULL);
    2022                 :            :         assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
    2023                 :          0 :         Py_DECREF(slice);
    2024                 :          0 :         return res;
    2025                 :            :     }
    2026                 :          0 :     type_error("'%.200s' object doesn't support slice deletion", s);
    2027                 :          0 :     return -1;
    2028                 :            : }
    2029                 :            : 
    2030                 :            : PyObject *
    2031                 :   11466355 : PySequence_Tuple(PyObject *v)
    2032                 :            : {
    2033                 :            :     PyObject *it;  /* iter(v) */
    2034                 :            :     Py_ssize_t n;             /* guess for result tuple size */
    2035                 :   11466355 :     PyObject *result = NULL;
    2036                 :            :     Py_ssize_t j;
    2037                 :            : 
    2038         [ -  + ]:   11466355 :     if (v == NULL) {
    2039                 :          0 :         return null_error();
    2040                 :            :     }
    2041                 :            : 
    2042                 :            :     /* Special-case the common tuple and list cases, for efficiency. */
    2043         [ +  + ]:   11466355 :     if (PyTuple_CheckExact(v)) {
    2044                 :            :         /* Note that we can't know whether it's safe to return
    2045                 :            :            a tuple *subclass* instance as-is, hence the restriction
    2046                 :            :            to exact tuples here.  In contrast, lists always make
    2047                 :            :            a copy, so there's no need for exactness below. */
    2048                 :    9994496 :         Py_INCREF(v);
    2049                 :    9994496 :         return v;
    2050                 :            :     }
    2051         [ +  + ]:    1471859 :     if (PyList_CheckExact(v))
    2052                 :    1198293 :         return PyList_AsTuple(v);
    2053                 :            : 
    2054                 :            :     /* Get iterator. */
    2055                 :     273566 :     it = PyObject_GetIter(v);
    2056         [ +  + ]:     273566 :     if (it == NULL)
    2057                 :         33 :         return NULL;
    2058                 :            : 
    2059                 :            :     /* Guess result size and allocate space. */
    2060                 :     273533 :     n = PyObject_LengthHint(v, 10);
    2061         [ -  + ]:     273533 :     if (n == -1)
    2062                 :          0 :         goto Fail;
    2063                 :     273533 :     result = PyTuple_New(n);
    2064         [ -  + ]:     273533 :     if (result == NULL)
    2065                 :          0 :         goto Fail;
    2066                 :            : 
    2067                 :            :     /* Fill the tuple. */
    2068                 :    3827069 :     for (j = 0; ; ++j) {
    2069                 :    3827069 :         PyObject *item = PyIter_Next(it);
    2070         [ +  + ]:    3827069 :         if (item == NULL) {
    2071         [ +  + ]:     273533 :             if (PyErr_Occurred())
    2072                 :         67 :                 goto Fail;
    2073                 :     273466 :             break;
    2074                 :            :         }
    2075         [ +  + ]:    3553536 :         if (j >= n) {
    2076                 :       7159 :             size_t newn = (size_t)n;
    2077                 :            :             /* The over-allocation strategy can grow a bit faster
    2078                 :            :                than for lists because unlike lists the
    2079                 :            :                over-allocation isn't permanent -- we reclaim
    2080                 :            :                the excess before the end of this routine.
    2081                 :            :                So, grow by ten and then add 25%.
    2082                 :            :             */
    2083                 :       7159 :             newn += 10u;
    2084                 :       7159 :             newn += newn >> 2;
    2085         [ -  + ]:       7159 :             if (newn > PY_SSIZE_T_MAX) {
    2086                 :            :                 /* Check for overflow */
    2087                 :            :                 PyErr_NoMemory();
    2088                 :          0 :                 Py_DECREF(item);
    2089                 :          0 :                 goto Fail;
    2090                 :            :             }
    2091                 :       7159 :             n = (Py_ssize_t)newn;
    2092         [ -  + ]:       7159 :             if (_PyTuple_Resize(&result, n) != 0) {
    2093                 :          0 :                 Py_DECREF(item);
    2094                 :          0 :                 goto Fail;
    2095                 :            :             }
    2096                 :            :         }
    2097                 :    3553536 :         PyTuple_SET_ITEM(result, j, item);
    2098                 :            :     }
    2099                 :            : 
    2100                 :            :     /* Cut tuple back if guess was too large. */
    2101   [ +  +  -  + ]:     431485 :     if (j < n &&
    2102                 :     158019 :         _PyTuple_Resize(&result, j) != 0)
    2103                 :          0 :         goto Fail;
    2104                 :            : 
    2105                 :     273466 :     Py_DECREF(it);
    2106                 :     273466 :     return result;
    2107                 :            : 
    2108                 :         67 : Fail:
    2109                 :         67 :     Py_XDECREF(result);
    2110                 :         67 :     Py_DECREF(it);
    2111                 :         67 :     return NULL;
    2112                 :            : }
    2113                 :            : 
    2114                 :            : PyObject *
    2115                 :    1689678 : PySequence_List(PyObject *v)
    2116                 :            : {
    2117                 :            :     PyObject *result;  /* result list */
    2118                 :            :     PyObject *rv;          /* return value from PyList_Extend */
    2119                 :            : 
    2120         [ -  + ]:    1689678 :     if (v == NULL) {
    2121                 :          0 :         return null_error();
    2122                 :            :     }
    2123                 :            : 
    2124                 :    1689678 :     result = PyList_New(0);
    2125         [ -  + ]:    1689678 :     if (result == NULL)
    2126                 :          0 :         return NULL;
    2127                 :            : 
    2128                 :    1689678 :     rv = _PyList_Extend((PyListObject *)result, v);
    2129         [ +  + ]:    1689678 :     if (rv == NULL) {
    2130                 :         32 :         Py_DECREF(result);
    2131                 :         32 :         return NULL;
    2132                 :            :     }
    2133                 :    1689646 :     Py_DECREF(rv);
    2134                 :    1689646 :     return result;
    2135                 :            : }
    2136                 :            : 
    2137                 :            : PyObject *
    2138                 :   20167871 : PySequence_Fast(PyObject *v, const char *m)
    2139                 :            : {
    2140                 :            :     PyObject *it;
    2141                 :            : 
    2142         [ -  + ]:   20167871 :     if (v == NULL) {
    2143                 :          0 :         return null_error();
    2144                 :            :     }
    2145                 :            : 
    2146   [ +  +  +  + ]:   20167871 :     if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
    2147                 :   19624038 :         Py_INCREF(v);
    2148                 :   19624038 :         return v;
    2149                 :            :     }
    2150                 :            : 
    2151                 :     543833 :     it = PyObject_GetIter(v);
    2152         [ +  + ]:     543833 :     if (it == NULL) {
    2153                 :         33 :         PyThreadState *tstate = _PyThreadState_GET();
    2154         [ +  - ]:         33 :         if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
    2155                 :         33 :             _PyErr_SetString(tstate, PyExc_TypeError, m);
    2156                 :            :         }
    2157                 :         33 :         return NULL;
    2158                 :            :     }
    2159                 :            : 
    2160                 :     543800 :     v = PySequence_List(it);
    2161                 :     543800 :     Py_DECREF(it);
    2162                 :            : 
    2163                 :     543800 :     return v;
    2164                 :            : }
    2165                 :            : 
    2166                 :            : /* Iterate over seq.  Result depends on the operation:
    2167                 :            :    PY_ITERSEARCH_COUNT:  -1 if error, else # of times obj appears in seq.
    2168                 :            :    PY_ITERSEARCH_INDEX:  0-based index of first occurrence of obj in seq;
    2169                 :            :     set ValueError and return -1 if none found; also return -1 on error.
    2170                 :            :    Py_ITERSEARCH_CONTAINS:  return 1 if obj in seq, else 0; -1 on error.
    2171                 :            : */
    2172                 :            : Py_ssize_t
    2173                 :       1101 : _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
    2174                 :            : {
    2175                 :            :     Py_ssize_t n;
    2176                 :            :     int wrapped;  /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
    2177                 :            :     PyObject *it;  /* iter(seq) */
    2178                 :            : 
    2179   [ +  -  -  + ]:       1101 :     if (seq == NULL || obj == NULL) {
    2180                 :          0 :         null_error();
    2181                 :          0 :         return -1;
    2182                 :            :     }
    2183                 :            : 
    2184                 :       1101 :     it = PyObject_GetIter(seq);
    2185         [ +  + ]:       1101 :     if (it == NULL) {
    2186         [ +  + ]:         36 :         if (PyErr_ExceptionMatches(PyExc_TypeError)) {
    2187                 :         30 :             type_error("argument of type '%.200s' is not iterable", seq);
    2188                 :            :         }
    2189                 :         36 :         return -1;
    2190                 :            :     }
    2191                 :            : 
    2192                 :       1065 :     n = wrapped = 0;
    2193                 :       4216 :     for (;;) {
    2194                 :            :         int cmp;
    2195                 :       5281 :         PyObject *item = PyIter_Next(it);
    2196         [ +  + ]:       5281 :         if (item == NULL) {
    2197         [ +  + ]:        105 :             if (PyErr_Occurred())
    2198                 :          2 :                 goto Fail;
    2199                 :        103 :             break;
    2200                 :            :         }
    2201                 :            : 
    2202                 :       5176 :         cmp = PyObject_RichCompareBool(item, obj, Py_EQ);
    2203                 :       5176 :         Py_DECREF(item);
    2204         [ +  + ]:       5176 :         if (cmp < 0)
    2205                 :          2 :             goto Fail;
    2206         [ +  + ]:       5174 :         if (cmp > 0) {
    2207   [ +  +  +  - ]:        994 :             switch (operation) {
    2208                 :         36 :             case PY_ITERSEARCH_COUNT:
    2209         [ -  + ]:         36 :                 if (n == PY_SSIZE_T_MAX) {
    2210                 :          0 :                     PyErr_SetString(PyExc_OverflowError,
    2211                 :            :                            "count exceeds C integer size");
    2212                 :          0 :                     goto Fail;
    2213                 :            :                 }
    2214                 :         36 :                 ++n;
    2215                 :         36 :                 break;
    2216                 :            : 
    2217                 :        364 :             case PY_ITERSEARCH_INDEX:
    2218         [ -  + ]:        364 :                 if (wrapped) {
    2219                 :          0 :                     PyErr_SetString(PyExc_OverflowError,
    2220                 :            :                            "index exceeds C integer size");
    2221                 :          0 :                     goto Fail;
    2222                 :            :                 }
    2223                 :        364 :                 goto Done;
    2224                 :            : 
    2225                 :        594 :             case PY_ITERSEARCH_CONTAINS:
    2226                 :        594 :                 n = 1;
    2227                 :        594 :                 goto Done;
    2228                 :            : 
    2229                 :          0 :             default:
    2230                 :          0 :                 Py_UNREACHABLE();
    2231                 :            :             }
    2232                 :            :         }
    2233                 :            : 
    2234         [ +  + ]:       4216 :         if (operation == PY_ITERSEARCH_INDEX) {
    2235         [ -  + ]:        464 :             if (n == PY_SSIZE_T_MAX)
    2236                 :          0 :                 wrapped = 1;
    2237                 :        464 :             ++n;
    2238                 :            :         }
    2239                 :            :     }
    2240                 :            : 
    2241         [ +  + ]:        103 :     if (operation != PY_ITERSEARCH_INDEX)
    2242                 :         96 :         goto Done;
    2243                 :            : 
    2244                 :          7 :     PyErr_SetString(PyExc_ValueError,
    2245                 :            :                     "sequence.index(x): x not in sequence");
    2246                 :            :     /* fall into failure code */
    2247                 :         11 : Fail:
    2248                 :         11 :     n = -1;
    2249                 :            :     /* fall through */
    2250                 :       1065 : Done:
    2251                 :       1065 :     Py_DECREF(it);
    2252                 :       1065 :     return n;
    2253                 :            : 
    2254                 :            : }
    2255                 :            : 
    2256                 :            : /* Return # of times o appears in s. */
    2257                 :            : Py_ssize_t
    2258                 :         23 : PySequence_Count(PyObject *s, PyObject *o)
    2259                 :            : {
    2260                 :         23 :     return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
    2261                 :            : }
    2262                 :            : 
    2263                 :            : /* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
    2264                 :            :  * Use sq_contains if possible, else defer to _PySequence_IterSearch().
    2265                 :            :  */
    2266                 :            : int
    2267                 :   92910593 : PySequence_Contains(PyObject *seq, PyObject *ob)
    2268                 :            : {
    2269                 :   92910593 :     PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence;
    2270   [ +  +  +  + ]:   92910593 :     if (sqm != NULL && sqm->sq_contains != NULL) {
    2271                 :   92909911 :         int res = (*sqm->sq_contains)(seq, ob);
    2272                 :            :         assert(_Py_CheckSlotResult(seq, "__contains__", res >= 0));
    2273                 :   92909911 :         return res;
    2274                 :            :     }
    2275                 :        682 :     Py_ssize_t result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
    2276                 :        682 :     return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
    2277                 :            : }
    2278                 :            : 
    2279                 :            : /* Backwards compatibility */
    2280                 :            : #undef PySequence_In
    2281                 :            : int
    2282                 :          0 : PySequence_In(PyObject *w, PyObject *v)
    2283                 :            : {
    2284                 :          0 :     return PySequence_Contains(w, v);
    2285                 :            : }
    2286                 :            : 
    2287                 :            : Py_ssize_t
    2288                 :        375 : PySequence_Index(PyObject *s, PyObject *o)
    2289                 :            : {
    2290                 :        375 :     return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
    2291                 :            : }
    2292                 :            : 
    2293                 :            : /* Operations on mappings */
    2294                 :            : 
    2295                 :            : int
    2296                 :    3768372 : PyMapping_Check(PyObject *o)
    2297                 :            : {
    2298   [ +  -  +  + ]:    6826713 :     return o && Py_TYPE(o)->tp_as_mapping &&
    2299         [ +  + ]:    3058341 :         Py_TYPE(o)->tp_as_mapping->mp_subscript;
    2300                 :            : }
    2301                 :            : 
    2302                 :            : Py_ssize_t
    2303                 :    1209546 : PyMapping_Size(PyObject *o)
    2304                 :            : {
    2305         [ -  + ]:    1209546 :     if (o == NULL) {
    2306                 :          0 :         null_error();
    2307                 :          0 :         return -1;
    2308                 :            :     }
    2309                 :            : 
    2310                 :    1209546 :     PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
    2311   [ +  +  +  + ]:    1209546 :     if (m && m->mp_length) {
    2312                 :    1209208 :         Py_ssize_t len = m->mp_length(o);
    2313                 :            :         assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
    2314                 :    1209208 :         return len;
    2315                 :            :     }
    2316                 :            : 
    2317   [ +  +  -  + ]:        338 :     if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) {
    2318                 :          0 :         type_error("%.200s is not a mapping", o);
    2319                 :          0 :         return -1;
    2320                 :            :     }
    2321                 :            :     /* PyMapping_Size() can be called from PyObject_Size(). */
    2322                 :        338 :     type_error("object of type '%.200s' has no len()", o);
    2323                 :        338 :     return -1;
    2324                 :            : }
    2325                 :            : 
    2326                 :            : #undef PyMapping_Length
    2327                 :            : Py_ssize_t
    2328                 :          0 : PyMapping_Length(PyObject *o)
    2329                 :            : {
    2330                 :          0 :     return PyMapping_Size(o);
    2331                 :            : }
    2332                 :            : #define PyMapping_Length PyMapping_Size
    2333                 :            : 
    2334                 :            : PyObject *
    2335                 :      16806 : PyMapping_GetItemString(PyObject *o, const char *key)
    2336                 :            : {
    2337                 :            :     PyObject *okey, *r;
    2338                 :            : 
    2339         [ -  + ]:      16806 :     if (key == NULL) {
    2340                 :          0 :         return null_error();
    2341                 :            :     }
    2342                 :            : 
    2343                 :      16806 :     okey = PyUnicode_FromString(key);
    2344         [ -  + ]:      16806 :     if (okey == NULL)
    2345                 :          0 :         return NULL;
    2346                 :      16806 :     r = PyObject_GetItem(o, okey);
    2347                 :      16806 :     Py_DECREF(okey);
    2348                 :      16806 :     return r;
    2349                 :            : }
    2350                 :            : 
    2351                 :            : int
    2352                 :       8503 : PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
    2353                 :            : {
    2354                 :            :     PyObject *okey;
    2355                 :            :     int r;
    2356                 :            : 
    2357         [ -  + ]:       8503 :     if (key == NULL) {
    2358                 :          0 :         null_error();
    2359                 :          0 :         return -1;
    2360                 :            :     }
    2361                 :            : 
    2362                 :       8503 :     okey = PyUnicode_FromString(key);
    2363         [ -  + ]:       8503 :     if (okey == NULL)
    2364                 :          0 :         return -1;
    2365                 :       8503 :     r = PyObject_SetItem(o, okey, value);
    2366                 :       8503 :     Py_DECREF(okey);
    2367                 :       8503 :     return r;
    2368                 :            : }
    2369                 :            : 
    2370                 :            : int
    2371                 :          0 : PyMapping_HasKeyString(PyObject *o, const char *key)
    2372                 :            : {
    2373                 :            :     PyObject *v;
    2374                 :            : 
    2375                 :          0 :     v = PyMapping_GetItemString(o, key);
    2376         [ #  # ]:          0 :     if (v) {
    2377                 :          0 :         Py_DECREF(v);
    2378                 :          0 :         return 1;
    2379                 :            :     }
    2380                 :          0 :     PyErr_Clear();
    2381                 :          0 :     return 0;
    2382                 :            : }
    2383                 :            : 
    2384                 :            : int
    2385                 :          0 : PyMapping_HasKey(PyObject *o, PyObject *key)
    2386                 :            : {
    2387                 :            :     PyObject *v;
    2388                 :            : 
    2389                 :          0 :     v = PyObject_GetItem(o, key);
    2390         [ #  # ]:          0 :     if (v) {
    2391                 :          0 :         Py_DECREF(v);
    2392                 :          0 :         return 1;
    2393                 :            :     }
    2394                 :          0 :     PyErr_Clear();
    2395                 :          0 :     return 0;
    2396                 :            : }
    2397                 :            : 
    2398                 :            : /* This function is quite similar to PySequence_Fast(), but specialized to be
    2399                 :            :    a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
    2400                 :            :  */
    2401                 :            : static PyObject *
    2402                 :     275326 : method_output_as_list(PyObject *o, PyObject *meth)
    2403                 :            : {
    2404                 :            :     PyObject *it, *result, *meth_output;
    2405                 :            : 
    2406                 :            :     assert(o != NULL);
    2407                 :     275326 :     meth_output = PyObject_CallMethodNoArgs(o, meth);
    2408   [ +  +  +  + ]:     275326 :     if (meth_output == NULL || PyList_CheckExact(meth_output)) {
    2409                 :         41 :         return meth_output;
    2410                 :            :     }
    2411                 :     275285 :     it = PyObject_GetIter(meth_output);
    2412         [ +  + ]:     275285 :     if (it == NULL) {
    2413                 :          4 :         PyThreadState *tstate = _PyThreadState_GET();
    2414         [ +  - ]:          4 :         if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
    2415                 :          4 :             _PyErr_Format(tstate, PyExc_TypeError,
    2416                 :            :                           "%.200s.%U() returned a non-iterable (type %.200s)",
    2417                 :          4 :                           Py_TYPE(o)->tp_name,
    2418                 :            :                           meth,
    2419                 :          4 :                           Py_TYPE(meth_output)->tp_name);
    2420                 :            :         }
    2421                 :          4 :         Py_DECREF(meth_output);
    2422                 :          4 :         return NULL;
    2423                 :            :     }
    2424                 :     275281 :     Py_DECREF(meth_output);
    2425                 :     275281 :     result = PySequence_List(it);
    2426                 :     275281 :     Py_DECREF(it);
    2427                 :     275281 :     return result;
    2428                 :            : }
    2429                 :            : 
    2430                 :            : PyObject *
    2431                 :     126349 : PyMapping_Keys(PyObject *o)
    2432                 :            : {
    2433         [ -  + ]:     126349 :     if (o == NULL) {
    2434                 :          0 :         return null_error();
    2435                 :            :     }
    2436         [ +  + ]:     126349 :     if (PyDict_CheckExact(o)) {
    2437                 :      26674 :         return PyDict_Keys(o);
    2438                 :            :     }
    2439                 :      99675 :     return method_output_as_list(o, &_Py_ID(keys));
    2440                 :            : }
    2441                 :            : 
    2442                 :            : PyObject *
    2443                 :     176766 : PyMapping_Items(PyObject *o)
    2444                 :            : {
    2445         [ -  + ]:     176766 :     if (o == NULL) {
    2446                 :          0 :         return null_error();
    2447                 :            :     }
    2448         [ +  + ]:     176766 :     if (PyDict_CheckExact(o)) {
    2449                 :       1212 :         return PyDict_Items(o);
    2450                 :            :     }
    2451                 :     175554 :     return method_output_as_list(o, &_Py_ID(items));
    2452                 :            : }
    2453                 :            : 
    2454                 :            : PyObject *
    2455                 :        104 : PyMapping_Values(PyObject *o)
    2456                 :            : {
    2457         [ -  + ]:        104 :     if (o == NULL) {
    2458                 :          0 :         return null_error();
    2459                 :            :     }
    2460         [ +  + ]:        104 :     if (PyDict_CheckExact(o)) {
    2461                 :          7 :         return PyDict_Values(o);
    2462                 :            :     }
    2463                 :         97 :     return method_output_as_list(o, &_Py_ID(values));
    2464                 :            : }
    2465                 :            : 
    2466                 :            : /* isinstance(), issubclass() */
    2467                 :            : 
    2468                 :            : /* abstract_get_bases() has logically 4 return states:
    2469                 :            :  *
    2470                 :            :  * 1. getattr(cls, '__bases__') could raise an AttributeError
    2471                 :            :  * 2. getattr(cls, '__bases__') could raise some other exception
    2472                 :            :  * 3. getattr(cls, '__bases__') could return a tuple
    2473                 :            :  * 4. getattr(cls, '__bases__') could return something other than a tuple
    2474                 :            :  *
    2475                 :            :  * Only state #3 is a non-error state and only it returns a non-NULL object
    2476                 :            :  * (it returns the retrieved tuple).
    2477                 :            :  *
    2478                 :            :  * Any raised AttributeErrors are masked by clearing the exception and
    2479                 :            :  * returning NULL.  If an object other than a tuple comes out of __bases__,
    2480                 :            :  * then again, the return value is NULL.  So yes, these two situations
    2481                 :            :  * produce exactly the same results: NULL is returned and no error is set.
    2482                 :            :  *
    2483                 :            :  * If some exception other than AttributeError is raised, then NULL is also
    2484                 :            :  * returned, but the exception is not cleared.  That's because we want the
    2485                 :            :  * exception to be propagated along.
    2486                 :            :  *
    2487                 :            :  * Callers are expected to test for PyErr_Occurred() when the return value
    2488                 :            :  * is NULL to decide whether a valid exception should be propagated or not.
    2489                 :            :  * When there's no exception to propagate, it's customary for the caller to
    2490                 :            :  * set a TypeError.
    2491                 :            :  */
    2492                 :            : static PyObject *
    2493                 :        268 : abstract_get_bases(PyObject *cls)
    2494                 :            : {
    2495                 :            :     PyObject *bases;
    2496                 :            : 
    2497                 :        268 :     (void)_PyObject_LookupAttr(cls, &_Py_ID(__bases__), &bases);
    2498   [ +  +  -  + ]:        268 :     if (bases != NULL && !PyTuple_Check(bases)) {
    2499                 :          0 :         Py_DECREF(bases);
    2500                 :          0 :         return NULL;
    2501                 :            :     }
    2502                 :        268 :     return bases;
    2503                 :            : }
    2504                 :            : 
    2505                 :            : 
    2506                 :            : static int
    2507                 :        105 : abstract_issubclass(PyObject *derived, PyObject *cls)
    2508                 :            : {
    2509                 :        105 :     PyObject *bases = NULL;
    2510                 :            :     Py_ssize_t i, n;
    2511                 :        105 :     int r = 0;
    2512                 :            : 
    2513                 :            :     while (1) {
    2514         [ +  + ]:        118 :         if (derived == cls) {
    2515                 :          7 :             Py_XDECREF(bases); /* See below comment */
    2516                 :          7 :             return 1;
    2517                 :            :         }
    2518                 :            :         /* Use XSETREF to drop bases reference *after* finishing with
    2519                 :            :            derived; bases might be the only reference to it.
    2520                 :            :            XSETREF is used instead of SETREF, because bases is NULL on the
    2521                 :            :            first iteration of the loop.
    2522                 :            :         */
    2523                 :        111 :         Py_XSETREF(bases, abstract_get_bases(derived));
    2524         [ +  + ]:        111 :         if (bases == NULL) {
    2525         [ +  + ]:          4 :             if (PyErr_Occurred())
    2526                 :          3 :                 return -1;
    2527                 :          1 :             return 0;
    2528                 :            :         }
    2529                 :        107 :         n = PyTuple_GET_SIZE(bases);
    2530         [ +  + ]:        107 :         if (n == 0) {
    2531                 :         10 :             Py_DECREF(bases);
    2532                 :         10 :             return 0;
    2533                 :            :         }
    2534                 :            :         /* Avoid recursivity in the single inheritance case */
    2535         [ +  + ]:         97 :         if (n == 1) {
    2536                 :         13 :             derived = PyTuple_GET_ITEM(bases, 0);
    2537                 :         13 :             continue;
    2538                 :            :         }
    2539                 :         84 :         break;
    2540                 :            :     }
    2541                 :            :     assert(n >= 2);
    2542         [ -  + ]:         84 :     if (_Py_EnterRecursiveCall(" in __issubclass__")) {
    2543                 :          0 :         Py_DECREF(bases);
    2544                 :          0 :         return -1;
    2545                 :            :     }
    2546         [ +  - ]:         84 :     for (i = 0; i < n; i++) {
    2547                 :         84 :         r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
    2548         [ +  - ]:         84 :         if (r != 0) {
    2549                 :         84 :             break;
    2550                 :            :         }
    2551                 :            :     }
    2552                 :         84 :     _Py_LeaveRecursiveCall();
    2553                 :         84 :     Py_DECREF(bases);
    2554                 :         84 :     return r;
    2555                 :            : }
    2556                 :            : 
    2557                 :            : static int
    2558                 :        157 : check_class(PyObject *cls, const char *error)
    2559                 :            : {
    2560                 :        157 :     PyObject *bases = abstract_get_bases(cls);
    2561         [ +  + ]:        157 :     if (bases == NULL) {
    2562                 :            :         /* Do not mask errors. */
    2563                 :        104 :         PyThreadState *tstate = _PyThreadState_GET();
    2564         [ +  + ]:        104 :         if (!_PyErr_Occurred(tstate)) {
    2565                 :         97 :             _PyErr_SetString(tstate, PyExc_TypeError, error);
    2566                 :            :         }
    2567                 :        104 :         return 0;
    2568                 :            :     }
    2569                 :         53 :     Py_DECREF(bases);
    2570                 :         53 :     return -1;
    2571                 :            : }
    2572                 :            : 
    2573                 :            : static int
    2574                 :   24295904 : object_isinstance(PyObject *inst, PyObject *cls)
    2575                 :            : {
    2576                 :            :     PyObject *icls;
    2577                 :            :     int retval;
    2578         [ +  + ]:   24295904 :     if (PyType_Check(cls)) {
    2579                 :   24295889 :         retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
    2580         [ +  + ]:   24295889 :         if (retval == 0) {
    2581                 :   21710195 :             retval = _PyObject_LookupAttr(inst, &_Py_ID(__class__), &icls);
    2582         [ +  + ]:   21710195 :             if (icls != NULL) {
    2583   [ +  +  +  + ]:   21710192 :                 if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) {
    2584                 :       1203 :                     retval = PyType_IsSubtype(
    2585                 :            :                         (PyTypeObject *)icls,
    2586                 :            :                         (PyTypeObject *)cls);
    2587                 :            :                 }
    2588                 :            :                 else {
    2589                 :   21708989 :                     retval = 0;
    2590                 :            :                 }
    2591                 :   21710192 :                 Py_DECREF(icls);
    2592                 :            :             }
    2593                 :            :         }
    2594                 :            :     }
    2595                 :            :     else {
    2596         [ +  + ]:         15 :         if (!check_class(cls,
    2597                 :            :             "isinstance() arg 2 must be a type, a tuple of types, or a union"))
    2598                 :          6 :             return -1;
    2599                 :          9 :         retval = _PyObject_LookupAttr(inst, &_Py_ID(__class__), &icls);
    2600         [ +  - ]:          9 :         if (icls != NULL) {
    2601                 :          9 :             retval = abstract_issubclass(icls, cls);
    2602                 :          9 :             Py_DECREF(icls);
    2603                 :            :         }
    2604                 :            :     }
    2605                 :            : 
    2606                 :   24295898 :     return retval;
    2607                 :            : }
    2608                 :            : 
    2609                 :            : static int
    2610                 :   48025224 : object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls)
    2611                 :            : {
    2612                 :            :     /* Quick test for an exact match */
    2613         [ +  + ]:   48025224 :     if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) {
    2614                 :   19391099 :         return 1;
    2615                 :            :     }
    2616                 :            : 
    2617                 :            :     /* We know what type's __instancecheck__ does. */
    2618         [ +  + ]:   28634125 :     if (PyType_CheckExact(cls)) {
    2619                 :   23894337 :         return object_isinstance(inst, cls);
    2620                 :            :     }
    2621                 :            : 
    2622         [ +  + ]:    4739788 :     if (_PyUnion_Check(cls)) {
    2623                 :         20 :         cls = _Py_union_args(cls);
    2624                 :            :     }
    2625                 :            : 
    2626         [ +  + ]:    4739788 :     if (PyTuple_Check(cls)) {
    2627                 :            :         /* Not a general sequence -- that opens up the road to
    2628                 :            :            recursion and stack overflow. */
    2629         [ +  + ]:    3793835 :         if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) {
    2630                 :          2 :             return -1;
    2631                 :            :         }
    2632                 :    3793833 :         Py_ssize_t n = PyTuple_GET_SIZE(cls);
    2633                 :    3793833 :         int r = 0;
    2634         [ +  + ]:    5210342 :         for (Py_ssize_t i = 0; i < n; ++i) {
    2635                 :    4660564 :             PyObject *item = PyTuple_GET_ITEM(cls, i);
    2636                 :    4660564 :             r = object_recursive_isinstance(tstate, inst, item);
    2637         [ +  + ]:    4660564 :             if (r != 0) {
    2638                 :            :                 /* either found it, or got an error */
    2639                 :    3244055 :                 break;
    2640                 :            :             }
    2641                 :            :         }
    2642                 :    3793833 :         _Py_LeaveRecursiveCallTstate(tstate);
    2643                 :    3793833 :         return r;
    2644                 :            :     }
    2645                 :            : 
    2646                 :     945953 :     PyObject *checker = _PyObject_LookupSpecial(cls, &_Py_ID(__instancecheck__));
    2647         [ +  + ]:     945953 :     if (checker != NULL) {
    2648         [ -  + ]:     945937 :         if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) {
    2649                 :          0 :             Py_DECREF(checker);
    2650                 :          0 :             return -1;
    2651                 :            :         }
    2652                 :            : 
    2653                 :     945937 :         PyObject *res = PyObject_CallOneArg(checker, inst);
    2654                 :     945937 :         _Py_LeaveRecursiveCallTstate(tstate);
    2655                 :     945937 :         Py_DECREF(checker);
    2656                 :            : 
    2657         [ +  + ]:     945937 :         if (res == NULL) {
    2658                 :         50 :             return -1;
    2659                 :            :         }
    2660                 :     945887 :         int ok = PyObject_IsTrue(res);
    2661                 :     945887 :         Py_DECREF(res);
    2662                 :            : 
    2663                 :     945887 :         return ok;
    2664                 :            :     }
    2665         [ +  + ]:         16 :     else if (_PyErr_Occurred(tstate)) {
    2666                 :          1 :         return -1;
    2667                 :            :     }
    2668                 :            : 
    2669                 :            :     /* cls has no __instancecheck__() method */
    2670                 :         15 :     return object_isinstance(inst, cls);
    2671                 :            : }
    2672                 :            : 
    2673                 :            : 
    2674                 :            : int
    2675                 :   43364660 : PyObject_IsInstance(PyObject *inst, PyObject *cls)
    2676                 :            : {
    2677                 :   43364660 :     PyThreadState *tstate = _PyThreadState_GET();
    2678                 :   43364660 :     return object_recursive_isinstance(tstate, inst, cls);
    2679                 :            : }
    2680                 :            : 
    2681                 :            : 
    2682                 :            : static  int
    2683                 :    6131096 : recursive_issubclass(PyObject *derived, PyObject *cls)
    2684                 :            : {
    2685   [ +  +  +  + ]:    6131096 :     if (PyType_Check(cls) && PyType_Check(derived)) {
    2686                 :            :         /* Fast path (non-recursive) */
    2687                 :    6130986 :         return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
    2688                 :            :     }
    2689         [ +  + ]:        110 :     if (!check_class(derived,
    2690                 :            :                      "issubclass() arg 1 must be a class"))
    2691                 :         78 :         return -1;
    2692                 :            : 
    2693   [ +  -  +  + ]:         32 :     if (!_PyUnion_Check(cls) && !check_class(cls,
    2694                 :            :                             "issubclass() arg 2 must be a class,"
    2695                 :            :                             " a tuple of classes, or a union")) {
    2696                 :         20 :         return -1;
    2697                 :            :     }
    2698                 :            : 
    2699                 :         12 :     return abstract_issubclass(derived, cls);
    2700                 :            : }
    2701                 :            : 
    2702                 :            : static int
    2703                 :    3129564 : object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
    2704                 :            : {
    2705                 :            :     PyObject *checker;
    2706                 :            : 
    2707                 :            :     /* We know what type's __subclasscheck__ does. */
    2708         [ +  + ]:    3129564 :     if (PyType_CheckExact(cls)) {
    2709                 :            :         /* Quick test for an exact match */
    2710         [ +  + ]:    2586223 :         if (derived == cls)
    2711                 :    1971217 :             return 1;
    2712                 :     615006 :         return recursive_issubclass(derived, cls);
    2713                 :            :     }
    2714                 :            : 
    2715         [ +  + ]:     543341 :     if (_PyUnion_Check(cls)) {
    2716                 :         18 :         cls = _Py_union_args(cls);
    2717                 :            :     }
    2718                 :            : 
    2719         [ +  + ]:     543341 :     if (PyTuple_Check(cls)) {
    2720                 :            : 
    2721         [ +  + ]:      33802 :         if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) {
    2722                 :          1 :             return -1;
    2723                 :            :         }
    2724                 :      33801 :         Py_ssize_t n = PyTuple_GET_SIZE(cls);
    2725                 :      33801 :         int r = 0;
    2726         [ +  + ]:      58108 :         for (Py_ssize_t i = 0; i < n; ++i) {
    2727                 :      58070 :             PyObject *item = PyTuple_GET_ITEM(cls, i);
    2728                 :      58070 :             r = object_issubclass(tstate, derived, item);
    2729         [ +  + ]:      58070 :             if (r != 0)
    2730                 :            :                 /* either found it, or got an error */
    2731                 :      33763 :                 break;
    2732                 :            :         }
    2733                 :      33801 :         _Py_LeaveRecursiveCallTstate(tstate);
    2734                 :      33801 :         return r;
    2735                 :            :     }
    2736                 :            : 
    2737                 :     509539 :     checker = _PyObject_LookupSpecial(cls, &_Py_ID(__subclasscheck__));
    2738         [ +  + ]:     509539 :     if (checker != NULL) {
    2739                 :     509510 :         int ok = -1;
    2740         [ -  + ]:     509510 :         if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) {
    2741                 :          0 :             Py_DECREF(checker);
    2742                 :          0 :             return ok;
    2743                 :            :         }
    2744                 :     509510 :         PyObject *res = PyObject_CallOneArg(checker, derived);
    2745                 :     509510 :         _Py_LeaveRecursiveCallTstate(tstate);
    2746                 :     509510 :         Py_DECREF(checker);
    2747         [ +  + ]:     509510 :         if (res != NULL) {
    2748                 :     509441 :             ok = PyObject_IsTrue(res);
    2749                 :     509441 :             Py_DECREF(res);
    2750                 :            :         }
    2751                 :     509510 :         return ok;
    2752                 :            :     }
    2753         [ +  + ]:         29 :     else if (_PyErr_Occurred(tstate)) {
    2754                 :          1 :         return -1;
    2755                 :            :     }
    2756                 :            : 
    2757                 :            :     /* Probably never reached anymore. */
    2758                 :         28 :     return recursive_issubclass(derived, cls);
    2759                 :            : }
    2760                 :            : 
    2761                 :            : 
    2762                 :            : int
    2763                 :    3071494 : PyObject_IsSubclass(PyObject *derived, PyObject *cls)
    2764                 :            : {
    2765                 :    3071494 :     PyThreadState *tstate = _PyThreadState_GET();
    2766                 :    3071494 :     return object_issubclass(tstate, derived, cls);
    2767                 :            : }
    2768                 :            : 
    2769                 :            : 
    2770                 :            : int
    2771                 :     401552 : _PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
    2772                 :            : {
    2773                 :     401552 :     return object_isinstance(inst, cls);
    2774                 :            : }
    2775                 :            : 
    2776                 :            : int
    2777                 :    5516062 : _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
    2778                 :            : {
    2779                 :    5516062 :     return recursive_issubclass(derived, cls);
    2780                 :            : }
    2781                 :            : 
    2782                 :            : 
    2783                 :            : PyObject *
    2784                 :   74638433 : PyObject_GetIter(PyObject *o)
    2785                 :            : {
    2786                 :   74638433 :     PyTypeObject *t = Py_TYPE(o);
    2787                 :            :     getiterfunc f;
    2788                 :            : 
    2789                 :   74638433 :     f = t->tp_iter;
    2790         [ +  + ]:   74638433 :     if (f == NULL) {
    2791         [ +  + ]:     414690 :         if (PySequence_Check(o))
    2792                 :     350459 :             return PySeqIter_New(o);
    2793                 :      64231 :         return type_error("'%.200s' object is not iterable", o);
    2794                 :            :     }
    2795                 :            :     else {
    2796                 :   74223743 :         PyObject *res = (*f)(o);
    2797   [ +  +  +  + ]:   74223743 :         if (res != NULL && !PyIter_Check(res)) {
    2798                 :        199 :             PyErr_Format(PyExc_TypeError,
    2799                 :            :                          "iter() returned non-iterator "
    2800                 :            :                          "of type '%.100s'",
    2801                 :        199 :                          Py_TYPE(res)->tp_name);
    2802                 :        199 :             Py_DECREF(res);
    2803                 :        199 :             res = NULL;
    2804                 :            :         }
    2805                 :   74223743 :         return res;
    2806                 :            :     }
    2807                 :            : }
    2808                 :            : 
    2809                 :            : PyObject *
    2810                 :          5 : PyObject_GetAIter(PyObject *o) {
    2811                 :          5 :     PyTypeObject *t = Py_TYPE(o);
    2812                 :            :     unaryfunc f;
    2813                 :            : 
    2814   [ +  +  -  + ]:          5 :     if (t->tp_as_async == NULL || t->tp_as_async->am_aiter == NULL) {
    2815                 :          1 :         return type_error("'%.200s' object is not an async iterable", o);
    2816                 :            :     }
    2817                 :          4 :     f = t->tp_as_async->am_aiter;
    2818                 :          4 :     PyObject *it = (*f)(o);
    2819   [ +  -  -  + ]:          4 :     if (it != NULL && !PyAIter_Check(it)) {
    2820                 :          0 :         PyErr_Format(PyExc_TypeError,
    2821                 :            :                      "aiter() returned not an async iterator of type '%.100s'",
    2822                 :          0 :                      Py_TYPE(it)->tp_name);
    2823                 :          0 :         Py_DECREF(it);
    2824                 :          0 :         it = NULL;
    2825                 :            :     }
    2826                 :          4 :     return it;
    2827                 :            : }
    2828                 :            : 
    2829                 :            : int
    2830                 :   78288386 : PyIter_Check(PyObject *obj)
    2831                 :            : {
    2832                 :   78288386 :     PyTypeObject *tp = Py_TYPE(obj);
    2833         [ +  + ]:  156576606 :     return (tp->tp_iternext != NULL &&
    2834         [ +  + ]:   78288220 :             tp->tp_iternext != &_PyObject_NextNotImplemented);
    2835                 :            : }
    2836                 :            : 
    2837                 :            : int
    2838                 :          4 : PyAIter_Check(PyObject *obj)
    2839                 :            : {
    2840                 :          4 :     PyTypeObject *tp = Py_TYPE(obj);
    2841                 :          8 :     return (tp->tp_as_async != NULL &&
    2842   [ +  -  +  - ]:          8 :             tp->tp_as_async->am_anext != NULL &&
    2843         [ +  - ]:          4 :             tp->tp_as_async->am_anext != &_PyObject_NextNotImplemented);
    2844                 :            : }
    2845                 :            : 
    2846                 :            : /* Return next item.
    2847                 :            :  * If an error occurs, return NULL.  PyErr_Occurred() will be true.
    2848                 :            :  * If the iteration terminates normally, return NULL and clear the
    2849                 :            :  * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
    2850                 :            :  * will be false.
    2851                 :            :  * Else return the next object.  PyErr_Occurred() will be false.
    2852                 :            :  */
    2853                 :            : PyObject *
    2854                 :  121743538 : PyIter_Next(PyObject *iter)
    2855                 :            : {
    2856                 :            :     PyObject *result;
    2857                 :  121743538 :     result = (*Py_TYPE(iter)->tp_iternext)(iter);
    2858         [ +  + ]:  121743538 :     if (result == NULL) {
    2859                 :   14781840 :         PyThreadState *tstate = _PyThreadState_GET();
    2860         [ +  + ]:   14781840 :         if (_PyErr_Occurred(tstate)
    2861         [ +  + ]:        899 :             && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
    2862                 :            :         {
    2863                 :        308 :             _PyErr_Clear(tstate);
    2864                 :            :         }
    2865                 :            :     }
    2866                 :  121743538 :     return result;
    2867                 :            : }
    2868                 :            : 
    2869                 :            : PySendResult
    2870                 :    6775554 : PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result)
    2871                 :            : {
    2872                 :            :     assert(arg != NULL);
    2873                 :            :     assert(result != NULL);
    2874   [ +  +  +  + ]:    6775554 :     if (Py_TYPE(iter)->tp_as_async && Py_TYPE(iter)->tp_as_async->am_send) {
    2875                 :    5691121 :         PySendResult res = Py_TYPE(iter)->tp_as_async->am_send(iter, arg, result);
    2876                 :            :         assert(_Py_CheckSlotResult(iter, "am_send", res != PYGEN_ERROR));
    2877                 :    5691121 :         return res;
    2878                 :            :     }
    2879   [ +  +  +  + ]:    1084433 :     if (arg == Py_None && PyIter_Check(iter)) {
    2880                 :    1084420 :         *result = Py_TYPE(iter)->tp_iternext(iter);
    2881                 :            :     }
    2882                 :            :     else {
    2883                 :         13 :         *result = PyObject_CallMethodOneArg(iter, &_Py_ID(send), arg);
    2884                 :            :     }
    2885         [ +  + ]:    1084433 :     if (*result != NULL) {
    2886                 :    1074908 :         return PYGEN_NEXT;
    2887                 :            :     }
    2888         [ +  + ]:       9525 :     if (_PyGen_FetchStopIterationValue(result) == 0) {
    2889                 :       9346 :         return PYGEN_RETURN;
    2890                 :            :     }
    2891                 :        179 :     return PYGEN_ERROR;
    2892                 :            : }
    2893                 :            : 
    2894                 :            : /*
    2895                 :            :  * Flatten a sequence of bytes() objects into a C array of
    2896                 :            :  * NULL terminated string pointers with a NULL char* terminating the array.
    2897                 :            :  * (ie: an argv or env list)
    2898                 :            :  *
    2899                 :            :  * Memory allocated for the returned list is allocated using PyMem_Malloc()
    2900                 :            :  * and MUST be freed by _Py_FreeCharPArray().
    2901                 :            :  */
    2902                 :            : char *const *
    2903                 :      13025 : _PySequence_BytesToCharpArray(PyObject* self)
    2904                 :            : {
    2905                 :            :     char **array;
    2906                 :            :     Py_ssize_t i, argc;
    2907                 :      13025 :     PyObject *item = NULL;
    2908                 :            :     Py_ssize_t size;
    2909                 :            : 
    2910                 :      13025 :     argc = PySequence_Size(self);
    2911         [ +  + ]:      13025 :     if (argc == -1)
    2912                 :          2 :         return NULL;
    2913                 :            : 
    2914                 :            :     assert(argc >= 0);
    2915                 :            : 
    2916         [ +  + ]:      13023 :     if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
    2917                 :            :         PyErr_NoMemory();
    2918                 :          1 :         return NULL;
    2919                 :            :     }
    2920                 :            : 
    2921                 :      13022 :     array = PyMem_Malloc((argc + 1) * sizeof(char *));
    2922         [ -  + ]:      13022 :     if (array == NULL) {
    2923                 :            :         PyErr_NoMemory();
    2924                 :          0 :         return NULL;
    2925                 :            :     }
    2926         [ +  + ]:     252284 :     for (i = 0; i < argc; ++i) {
    2927                 :            :         char *data;
    2928                 :     239269 :         item = PySequence_GetItem(self, i);
    2929         [ +  + ]:     239269 :         if (item == NULL) {
    2930                 :            :             /* NULL terminate before freeing. */
    2931                 :          1 :             array[i] = NULL;
    2932                 :          7 :             goto fail;
    2933                 :            :         }
    2934                 :            :         /* check for embedded null bytes */
    2935         [ +  + ]:     239268 :         if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
    2936                 :            :             /* NULL terminate before freeing. */
    2937                 :          6 :             array[i] = NULL;
    2938                 :          6 :             goto fail;
    2939                 :            :         }
    2940                 :     239262 :         size = PyBytes_GET_SIZE(item) + 1;
    2941                 :     239262 :         array[i] = PyMem_Malloc(size);
    2942         [ -  + ]:     239262 :         if (!array[i]) {
    2943                 :            :             PyErr_NoMemory();
    2944                 :          0 :             goto fail;
    2945                 :            :         }
    2946                 :     239262 :         memcpy(array[i], data, size);
    2947                 :     239262 :         Py_DECREF(item);
    2948                 :            :     }
    2949                 :      13015 :     array[argc] = NULL;
    2950                 :            : 
    2951                 :      13015 :     return array;
    2952                 :            : 
    2953                 :          7 : fail:
    2954                 :          7 :     Py_XDECREF(item);
    2955                 :          7 :     _Py_FreeCharPArray(array);
    2956                 :          7 :     return NULL;
    2957                 :            : }
    2958                 :            : 
    2959                 :            : 
    2960                 :            : /* Free's a NULL terminated char** array of C strings. */
    2961                 :            : void
    2962                 :      13022 : _Py_FreeCharPArray(char *const array[])
    2963                 :            : {
    2964                 :            :     Py_ssize_t i;
    2965         [ +  + ]:     252284 :     for (i = 0; array[i] != NULL; ++i) {
    2966                 :     239262 :         PyMem_Free(array[i]);
    2967                 :            :     }
    2968                 :      13022 :     PyMem_Free((void*)array);
    2969                 :      13022 : }

Generated by: LCOV version 1.14