LCOV - code coverage report
Current view: top level - Objects/clinic - bytearrayobject.c.h (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 337 385 87.5 %
Date: 2022-07-20 13:12:14 Functions: 24 25 96.0 %
Branches: 202 294 68.7 %

           Branch data     Line data    Source code
       1                 :            : /*[clinic input]
       2                 :            : preserve
       3                 :            : [clinic start generated code]*/
       4                 :            : 
       5                 :            : static int
       6                 :            : bytearray___init___impl(PyByteArrayObject *self, PyObject *arg,
       7                 :            :                         const char *encoding, const char *errors);
       8                 :            : 
       9                 :            : static int
      10                 :     894855 : bytearray___init__(PyObject *self, PyObject *args, PyObject *kwargs)
      11                 :            : {
      12                 :     894855 :     int return_value = -1;
      13                 :            :     static const char * const _keywords[] = {"source", "encoding", "errors", NULL};
      14                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "bytearray", 0};
      15                 :            :     PyObject *argsbuf[3];
      16                 :            :     PyObject * const *fastargs;
      17                 :     894855 :     Py_ssize_t nargs = PyTuple_GET_SIZE(args);
      18         [ +  + ]:     894855 :     Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
      19                 :     894855 :     PyObject *arg = NULL;
      20                 :     894855 :     const char *encoding = NULL;
      21                 :     894855 :     const char *errors = NULL;
      22                 :            : 
      23   [ +  +  +  -  :     894855 :     fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 3, 0, argsbuf);
             +  -  +  - ]
      24         [ -  + ]:     894855 :     if (!fastargs) {
      25                 :          0 :         goto exit;
      26                 :            :     }
      27         [ +  + ]:     894855 :     if (!noptargs) {
      28                 :     633236 :         goto skip_optional_pos;
      29                 :            :     }
      30         [ +  + ]:     261619 :     if (fastargs[0]) {
      31                 :     261617 :         arg = fastargs[0];
      32         [ +  + ]:     261617 :         if (!--noptargs) {
      33                 :     261576 :             goto skip_optional_pos;
      34                 :            :         }
      35                 :            :     }
      36         [ +  + ]:         43 :     if (fastargs[1]) {
      37         [ +  + ]:         39 :         if (!PyUnicode_Check(fastargs[1])) {
      38                 :          1 :             _PyArg_BadArgument("bytearray", "argument 'encoding'", "str", fastargs[1]);
      39                 :          1 :             goto exit;
      40                 :            :         }
      41                 :            :         Py_ssize_t encoding_length;
      42                 :         38 :         encoding = PyUnicode_AsUTF8AndSize(fastargs[1], &encoding_length);
      43         [ -  + ]:         38 :         if (encoding == NULL) {
      44                 :          0 :             goto exit;
      45                 :            :         }
      46         [ -  + ]:         38 :         if (strlen(encoding) != (size_t)encoding_length) {
      47                 :          0 :             PyErr_SetString(PyExc_ValueError, "embedded null character");
      48                 :          0 :             goto exit;
      49                 :            :         }
      50         [ +  + ]:         38 :         if (!--noptargs) {
      51                 :         29 :             goto skip_optional_pos;
      52                 :            :         }
      53                 :            :     }
      54         [ +  + ]:         13 :     if (!PyUnicode_Check(fastargs[2])) {
      55                 :          1 :         _PyArg_BadArgument("bytearray", "argument 'errors'", "str", fastargs[2]);
      56                 :          1 :         goto exit;
      57                 :            :     }
      58                 :            :     Py_ssize_t errors_length;
      59                 :         12 :     errors = PyUnicode_AsUTF8AndSize(fastargs[2], &errors_length);
      60         [ -  + ]:         12 :     if (errors == NULL) {
      61                 :          0 :         goto exit;
      62                 :            :     }
      63         [ -  + ]:         12 :     if (strlen(errors) != (size_t)errors_length) {
      64                 :          0 :         PyErr_SetString(PyExc_ValueError, "embedded null character");
      65                 :          0 :         goto exit;
      66                 :            :     }
      67                 :         12 : skip_optional_pos:
      68                 :     894853 :     return_value = bytearray___init___impl((PyByteArrayObject *)self, arg, encoding, errors);
      69                 :            : 
      70                 :     894855 : exit:
      71                 :     894855 :     return return_value;
      72                 :            : }
      73                 :            : 
      74                 :            : PyDoc_STRVAR(bytearray_clear__doc__,
      75                 :            : "clear($self, /)\n"
      76                 :            : "--\n"
      77                 :            : "\n"
      78                 :            : "Remove all items from the bytearray.");
      79                 :            : 
      80                 :            : #define BYTEARRAY_CLEAR_METHODDEF    \
      81                 :            :     {"clear", (PyCFunction)bytearray_clear, METH_NOARGS, bytearray_clear__doc__},
      82                 :            : 
      83                 :            : static PyObject *
      84                 :            : bytearray_clear_impl(PyByteArrayObject *self);
      85                 :            : 
      86                 :            : static PyObject *
      87                 :       1519 : bytearray_clear(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
      88                 :            : {
      89                 :       1519 :     return bytearray_clear_impl(self);
      90                 :            : }
      91                 :            : 
      92                 :            : PyDoc_STRVAR(bytearray_copy__doc__,
      93                 :            : "copy($self, /)\n"
      94                 :            : "--\n"
      95                 :            : "\n"
      96                 :            : "Return a copy of B.");
      97                 :            : 
      98                 :            : #define BYTEARRAY_COPY_METHODDEF    \
      99                 :            :     {"copy", (PyCFunction)bytearray_copy, METH_NOARGS, bytearray_copy__doc__},
     100                 :            : 
     101                 :            : static PyObject *
     102                 :            : bytearray_copy_impl(PyByteArrayObject *self);
     103                 :            : 
     104                 :            : static PyObject *
     105                 :          5 : bytearray_copy(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
     106                 :            : {
     107                 :          5 :     return bytearray_copy_impl(self);
     108                 :            : }
     109                 :            : 
     110                 :            : PyDoc_STRVAR(bytearray_removeprefix__doc__,
     111                 :            : "removeprefix($self, prefix, /)\n"
     112                 :            : "--\n"
     113                 :            : "\n"
     114                 :            : "Return a bytearray with the given prefix string removed if present.\n"
     115                 :            : "\n"
     116                 :            : "If the bytearray starts with the prefix string, return\n"
     117                 :            : "bytearray[len(prefix):].  Otherwise, return a copy of the original\n"
     118                 :            : "bytearray.");
     119                 :            : 
     120                 :            : #define BYTEARRAY_REMOVEPREFIX_METHODDEF    \
     121                 :            :     {"removeprefix", (PyCFunction)bytearray_removeprefix, METH_O, bytearray_removeprefix__doc__},
     122                 :            : 
     123                 :            : static PyObject *
     124                 :            : bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix);
     125                 :            : 
     126                 :            : static PyObject *
     127                 :         11 : bytearray_removeprefix(PyByteArrayObject *self, PyObject *arg)
     128                 :            : {
     129                 :         11 :     PyObject *return_value = NULL;
     130                 :         11 :     Py_buffer prefix = {NULL, NULL};
     131                 :            : 
     132         [ +  + ]:         11 :     if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) {
     133                 :          2 :         goto exit;
     134                 :            :     }
     135         [ -  + ]:          9 :     if (!PyBuffer_IsContiguous(&prefix, 'C')) {
     136                 :          0 :         _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg);
     137                 :          0 :         goto exit;
     138                 :            :     }
     139                 :          9 :     return_value = bytearray_removeprefix_impl(self, &prefix);
     140                 :            : 
     141                 :         11 : exit:
     142                 :            :     /* Cleanup for prefix */
     143         [ +  + ]:         11 :     if (prefix.obj) {
     144                 :          9 :        PyBuffer_Release(&prefix);
     145                 :            :     }
     146                 :            : 
     147                 :         11 :     return return_value;
     148                 :            : }
     149                 :            : 
     150                 :            : PyDoc_STRVAR(bytearray_removesuffix__doc__,
     151                 :            : "removesuffix($self, suffix, /)\n"
     152                 :            : "--\n"
     153                 :            : "\n"
     154                 :            : "Return a bytearray with the given suffix string removed if present.\n"
     155                 :            : "\n"
     156                 :            : "If the bytearray ends with the suffix string and that suffix is not\n"
     157                 :            : "empty, return bytearray[:-len(suffix)].  Otherwise, return a copy of\n"
     158                 :            : "the original bytearray.");
     159                 :            : 
     160                 :            : #define BYTEARRAY_REMOVESUFFIX_METHODDEF    \
     161                 :            :     {"removesuffix", (PyCFunction)bytearray_removesuffix, METH_O, bytearray_removesuffix__doc__},
     162                 :            : 
     163                 :            : static PyObject *
     164                 :            : bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix);
     165                 :            : 
     166                 :            : static PyObject *
     167                 :         11 : bytearray_removesuffix(PyByteArrayObject *self, PyObject *arg)
     168                 :            : {
     169                 :         11 :     PyObject *return_value = NULL;
     170                 :         11 :     Py_buffer suffix = {NULL, NULL};
     171                 :            : 
     172         [ +  + ]:         11 :     if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) {
     173                 :          2 :         goto exit;
     174                 :            :     }
     175         [ -  + ]:          9 :     if (!PyBuffer_IsContiguous(&suffix, 'C')) {
     176                 :          0 :         _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg);
     177                 :          0 :         goto exit;
     178                 :            :     }
     179                 :          9 :     return_value = bytearray_removesuffix_impl(self, &suffix);
     180                 :            : 
     181                 :         11 : exit:
     182                 :            :     /* Cleanup for suffix */
     183         [ +  + ]:         11 :     if (suffix.obj) {
     184                 :          9 :        PyBuffer_Release(&suffix);
     185                 :            :     }
     186                 :            : 
     187                 :         11 :     return return_value;
     188                 :            : }
     189                 :            : 
     190                 :            : PyDoc_STRVAR(bytearray_translate__doc__,
     191                 :            : "translate($self, table, /, delete=b\'\')\n"
     192                 :            : "--\n"
     193                 :            : "\n"
     194                 :            : "Return a copy with each character mapped by the given translation table.\n"
     195                 :            : "\n"
     196                 :            : "  table\n"
     197                 :            : "    Translation table, which must be a bytes object of length 256.\n"
     198                 :            : "\n"
     199                 :            : "All characters occurring in the optional argument delete are removed.\n"
     200                 :            : "The remaining characters are mapped through the given translation table.");
     201                 :            : 
     202                 :            : #define BYTEARRAY_TRANSLATE_METHODDEF    \
     203                 :            :     {"translate", _PyCFunction_CAST(bytearray_translate), METH_FASTCALL|METH_KEYWORDS, bytearray_translate__doc__},
     204                 :            : 
     205                 :            : static PyObject *
     206                 :            : bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
     207                 :            :                          PyObject *deletechars);
     208                 :            : 
     209                 :            : static PyObject *
     210                 :      32323 : bytearray_translate(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     211                 :            : {
     212                 :      32323 :     PyObject *return_value = NULL;
     213                 :            :     static const char * const _keywords[] = {"", "delete", NULL};
     214                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "translate", 0};
     215                 :            :     PyObject *argsbuf[2];
     216         [ +  + ]:      32323 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
     217                 :            :     PyObject *table;
     218                 :      32323 :     PyObject *deletechars = NULL;
     219                 :            : 
     220   [ +  +  +  +  :      32323 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
             +  -  -  + ]
     221         [ +  + ]:      32323 :     if (!args) {
     222                 :          1 :         goto exit;
     223                 :            :     }
     224                 :      32322 :     table = args[0];
     225         [ +  + ]:      32322 :     if (!noptargs) {
     226                 :      32312 :         goto skip_optional_pos;
     227                 :            :     }
     228                 :         10 :     deletechars = args[1];
     229                 :      32322 : skip_optional_pos:
     230                 :      32322 :     return_value = bytearray_translate_impl(self, table, deletechars);
     231                 :            : 
     232                 :      32323 : exit:
     233                 :      32323 :     return return_value;
     234                 :            : }
     235                 :            : 
     236                 :            : PyDoc_STRVAR(bytearray_maketrans__doc__,
     237                 :            : "maketrans(frm, to, /)\n"
     238                 :            : "--\n"
     239                 :            : "\n"
     240                 :            : "Return a translation table useable for the bytes or bytearray translate method.\n"
     241                 :            : "\n"
     242                 :            : "The returned table will be one where each byte in frm is mapped to the byte at\n"
     243                 :            : "the same position in to.\n"
     244                 :            : "\n"
     245                 :            : "The bytes objects frm and to must be of the same length.");
     246                 :            : 
     247                 :            : #define BYTEARRAY_MAKETRANS_METHODDEF    \
     248                 :            :     {"maketrans", _PyCFunction_CAST(bytearray_maketrans), METH_FASTCALL|METH_STATIC, bytearray_maketrans__doc__},
     249                 :            : 
     250                 :            : static PyObject *
     251                 :            : bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to);
     252                 :            : 
     253                 :            : static PyObject *
     254                 :         76 : bytearray_maketrans(void *null, PyObject *const *args, Py_ssize_t nargs)
     255                 :            : {
     256                 :         76 :     PyObject *return_value = NULL;
     257                 :         76 :     Py_buffer frm = {NULL, NULL};
     258                 :         76 :     Py_buffer to = {NULL, NULL};
     259                 :            : 
     260   [ +  -  -  +  :         76 :     if (!_PyArg_CheckPositional("maketrans", nargs, 2, 2)) {
                   -  - ]
     261                 :          0 :         goto exit;
     262                 :            :     }
     263         [ +  + ]:         76 :     if (PyObject_GetBuffer(args[0], &frm, PyBUF_SIMPLE) != 0) {
     264                 :          1 :         goto exit;
     265                 :            :     }
     266         [ -  + ]:         75 :     if (!PyBuffer_IsContiguous(&frm, 'C')) {
     267                 :          0 :         _PyArg_BadArgument("maketrans", "argument 1", "contiguous buffer", args[0]);
     268                 :          0 :         goto exit;
     269                 :            :     }
     270         [ -  + ]:         75 :     if (PyObject_GetBuffer(args[1], &to, PyBUF_SIMPLE) != 0) {
     271                 :          0 :         goto exit;
     272                 :            :     }
     273         [ -  + ]:         75 :     if (!PyBuffer_IsContiguous(&to, 'C')) {
     274                 :          0 :         _PyArg_BadArgument("maketrans", "argument 2", "contiguous buffer", args[1]);
     275                 :          0 :         goto exit;
     276                 :            :     }
     277                 :         75 :     return_value = bytearray_maketrans_impl(&frm, &to);
     278                 :            : 
     279                 :         76 : exit:
     280                 :            :     /* Cleanup for frm */
     281         [ +  + ]:         76 :     if (frm.obj) {
     282                 :         75 :        PyBuffer_Release(&frm);
     283                 :            :     }
     284                 :            :     /* Cleanup for to */
     285         [ +  + ]:         76 :     if (to.obj) {
     286                 :         75 :        PyBuffer_Release(&to);
     287                 :            :     }
     288                 :            : 
     289                 :         76 :     return return_value;
     290                 :            : }
     291                 :            : 
     292                 :            : PyDoc_STRVAR(bytearray_replace__doc__,
     293                 :            : "replace($self, old, new, count=-1, /)\n"
     294                 :            : "--\n"
     295                 :            : "\n"
     296                 :            : "Return a copy with all occurrences of substring old replaced by new.\n"
     297                 :            : "\n"
     298                 :            : "  count\n"
     299                 :            : "    Maximum number of occurrences to replace.\n"
     300                 :            : "    -1 (the default value) means replace all occurrences.\n"
     301                 :            : "\n"
     302                 :            : "If the optional argument count is given, only the first count occurrences are\n"
     303                 :            : "replaced.");
     304                 :            : 
     305                 :            : #define BYTEARRAY_REPLACE_METHODDEF    \
     306                 :            :     {"replace", _PyCFunction_CAST(bytearray_replace), METH_FASTCALL, bytearray_replace__doc__},
     307                 :            : 
     308                 :            : static PyObject *
     309                 :            : bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
     310                 :            :                        Py_buffer *new, Py_ssize_t count);
     311                 :            : 
     312                 :            : static PyObject *
     313                 :      64909 : bytearray_replace(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs)
     314                 :            : {
     315                 :      64909 :     PyObject *return_value = NULL;
     316                 :      64909 :     Py_buffer old = {NULL, NULL};
     317                 :      64909 :     Py_buffer new = {NULL, NULL};
     318                 :      64909 :     Py_ssize_t count = -1;
     319                 :            : 
     320   [ +  +  -  +  :      64909 :     if (!_PyArg_CheckPositional("replace", nargs, 2, 3)) {
                   +  - ]
     321                 :          2 :         goto exit;
     322                 :            :     }
     323         [ +  + ]:      64907 :     if (PyObject_GetBuffer(args[0], &old, PyBUF_SIMPLE) != 0) {
     324                 :          2 :         goto exit;
     325                 :            :     }
     326         [ -  + ]:      64905 :     if (!PyBuffer_IsContiguous(&old, 'C')) {
     327                 :          0 :         _PyArg_BadArgument("replace", "argument 1", "contiguous buffer", args[0]);
     328                 :          0 :         goto exit;
     329                 :            :     }
     330         [ +  + ]:      64905 :     if (PyObject_GetBuffer(args[1], &new, PyBUF_SIMPLE) != 0) {
     331                 :          1 :         goto exit;
     332                 :            :     }
     333         [ -  + ]:      64904 :     if (!PyBuffer_IsContiguous(&new, 'C')) {
     334                 :          0 :         _PyArg_BadArgument("replace", "argument 2", "contiguous buffer", args[1]);
     335                 :          0 :         goto exit;
     336                 :            :     }
     337         [ +  + ]:      64904 :     if (nargs < 3) {
     338                 :      64836 :         goto skip_optional;
     339                 :            :     }
     340                 :            :     {
     341                 :         68 :         Py_ssize_t ival = -1;
     342                 :         68 :         PyObject *iobj = _PyNumber_Index(args[2]);
     343         [ +  - ]:         68 :         if (iobj != NULL) {
     344                 :         68 :             ival = PyLong_AsSsize_t(iobj);
     345                 :         68 :             Py_DECREF(iobj);
     346                 :            :         }
     347   [ +  +  -  + ]:         68 :         if (ival == -1 && PyErr_Occurred()) {
     348                 :          0 :             goto exit;
     349                 :            :         }
     350                 :         68 :         count = ival;
     351                 :            :     }
     352                 :      64904 : skip_optional:
     353                 :      64904 :     return_value = bytearray_replace_impl(self, &old, &new, count);
     354                 :            : 
     355                 :      64909 : exit:
     356                 :            :     /* Cleanup for old */
     357         [ +  + ]:      64909 :     if (old.obj) {
     358                 :      64905 :        PyBuffer_Release(&old);
     359                 :            :     }
     360                 :            :     /* Cleanup for new */
     361         [ +  + ]:      64909 :     if (new.obj) {
     362                 :      64904 :        PyBuffer_Release(&new);
     363                 :            :     }
     364                 :            : 
     365                 :      64909 :     return return_value;
     366                 :            : }
     367                 :            : 
     368                 :            : PyDoc_STRVAR(bytearray_split__doc__,
     369                 :            : "split($self, /, sep=None, maxsplit=-1)\n"
     370                 :            : "--\n"
     371                 :            : "\n"
     372                 :            : "Return a list of the sections in the bytearray, using sep as the delimiter.\n"
     373                 :            : "\n"
     374                 :            : "  sep\n"
     375                 :            : "    The delimiter according which to split the bytearray.\n"
     376                 :            : "    None (the default value) means split on ASCII whitespace characters\n"
     377                 :            : "    (space, tab, return, newline, formfeed, vertical tab).\n"
     378                 :            : "  maxsplit\n"
     379                 :            : "    Maximum number of splits to do.\n"
     380                 :            : "    -1 (the default value) means no limit.");
     381                 :            : 
     382                 :            : #define BYTEARRAY_SPLIT_METHODDEF    \
     383                 :            :     {"split", _PyCFunction_CAST(bytearray_split), METH_FASTCALL|METH_KEYWORDS, bytearray_split__doc__},
     384                 :            : 
     385                 :            : static PyObject *
     386                 :            : bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
     387                 :            :                      Py_ssize_t maxsplit);
     388                 :            : 
     389                 :            : static PyObject *
     390                 :       2183 : bytearray_split(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     391                 :            : {
     392                 :       2183 :     PyObject *return_value = NULL;
     393                 :            :     static const char * const _keywords[] = {"sep", "maxsplit", NULL};
     394                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "split", 0};
     395                 :            :     PyObject *argsbuf[2];
     396         [ +  + ]:       2183 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     397                 :       2183 :     PyObject *sep = Py_None;
     398                 :       2183 :     Py_ssize_t maxsplit = -1;
     399                 :            : 
     400   [ +  +  +  -  :       2183 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
             +  +  -  + ]
     401         [ +  + ]:       2183 :     if (!args) {
     402                 :          1 :         goto exit;
     403                 :            :     }
     404         [ +  + ]:       2182 :     if (!noptargs) {
     405                 :         19 :         goto skip_optional_pos;
     406                 :            :     }
     407         [ +  + ]:       2163 :     if (args[0]) {
     408                 :       2162 :         sep = args[0];
     409         [ +  + ]:       2162 :         if (!--noptargs) {
     410                 :         30 :             goto skip_optional_pos;
     411                 :            :         }
     412                 :            :     }
     413                 :            :     {
     414                 :       2133 :         Py_ssize_t ival = -1;
     415                 :       2133 :         PyObject *iobj = _PyNumber_Index(args[1]);
     416         [ +  - ]:       2133 :         if (iobj != NULL) {
     417                 :       2133 :             ival = PyLong_AsSsize_t(iobj);
     418                 :       2133 :             Py_DECREF(iobj);
     419                 :            :         }
     420   [ -  +  -  - ]:       2133 :         if (ival == -1 && PyErr_Occurred()) {
     421                 :          0 :             goto exit;
     422                 :            :         }
     423                 :       2133 :         maxsplit = ival;
     424                 :            :     }
     425                 :       2182 : skip_optional_pos:
     426                 :       2182 :     return_value = bytearray_split_impl(self, sep, maxsplit);
     427                 :            : 
     428                 :       2183 : exit:
     429                 :       2183 :     return return_value;
     430                 :            : }
     431                 :            : 
     432                 :            : PyDoc_STRVAR(bytearray_partition__doc__,
     433                 :            : "partition($self, sep, /)\n"
     434                 :            : "--\n"
     435                 :            : "\n"
     436                 :            : "Partition the bytearray into three parts using the given separator.\n"
     437                 :            : "\n"
     438                 :            : "This will search for the separator sep in the bytearray. If the separator is\n"
     439                 :            : "found, returns a 3-tuple containing the part before the separator, the\n"
     440                 :            : "separator itself, and the part after it as new bytearray objects.\n"
     441                 :            : "\n"
     442                 :            : "If the separator is not found, returns a 3-tuple containing the copy of the\n"
     443                 :            : "original bytearray object and two empty bytearray objects.");
     444                 :            : 
     445                 :            : #define BYTEARRAY_PARTITION_METHODDEF    \
     446                 :            :     {"partition", (PyCFunction)bytearray_partition, METH_O, bytearray_partition__doc__},
     447                 :            : 
     448                 :            : PyDoc_STRVAR(bytearray_rpartition__doc__,
     449                 :            : "rpartition($self, sep, /)\n"
     450                 :            : "--\n"
     451                 :            : "\n"
     452                 :            : "Partition the bytearray into three parts using the given separator.\n"
     453                 :            : "\n"
     454                 :            : "This will search for the separator sep in the bytearray, starting at the end.\n"
     455                 :            : "If the separator is found, returns a 3-tuple containing the part before the\n"
     456                 :            : "separator, the separator itself, and the part after it as new bytearray\n"
     457                 :            : "objects.\n"
     458                 :            : "\n"
     459                 :            : "If the separator is not found, returns a 3-tuple containing two empty bytearray\n"
     460                 :            : "objects and the copy of the original bytearray object.");
     461                 :            : 
     462                 :            : #define BYTEARRAY_RPARTITION_METHODDEF    \
     463                 :            :     {"rpartition", (PyCFunction)bytearray_rpartition, METH_O, bytearray_rpartition__doc__},
     464                 :            : 
     465                 :            : PyDoc_STRVAR(bytearray_rsplit__doc__,
     466                 :            : "rsplit($self, /, sep=None, maxsplit=-1)\n"
     467                 :            : "--\n"
     468                 :            : "\n"
     469                 :            : "Return a list of the sections in the bytearray, using sep as the delimiter.\n"
     470                 :            : "\n"
     471                 :            : "  sep\n"
     472                 :            : "    The delimiter according which to split the bytearray.\n"
     473                 :            : "    None (the default value) means split on ASCII whitespace characters\n"
     474                 :            : "    (space, tab, return, newline, formfeed, vertical tab).\n"
     475                 :            : "  maxsplit\n"
     476                 :            : "    Maximum number of splits to do.\n"
     477                 :            : "    -1 (the default value) means no limit.\n"
     478                 :            : "\n"
     479                 :            : "Splitting is done starting at the end of the bytearray and working to the front.");
     480                 :            : 
     481                 :            : #define BYTEARRAY_RSPLIT_METHODDEF    \
     482                 :            :     {"rsplit", _PyCFunction_CAST(bytearray_rsplit), METH_FASTCALL|METH_KEYWORDS, bytearray_rsplit__doc__},
     483                 :            : 
     484                 :            : static PyObject *
     485                 :            : bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
     486                 :            :                       Py_ssize_t maxsplit);
     487                 :            : 
     488                 :            : static PyObject *
     489                 :         88 : bytearray_rsplit(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     490                 :            : {
     491                 :         88 :     PyObject *return_value = NULL;
     492                 :            :     static const char * const _keywords[] = {"sep", "maxsplit", NULL};
     493                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "rsplit", 0};
     494                 :            :     PyObject *argsbuf[2];
     495         [ +  + ]:         88 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     496                 :         88 :     PyObject *sep = Py_None;
     497                 :         88 :     Py_ssize_t maxsplit = -1;
     498                 :            : 
     499   [ +  +  +  -  :         88 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
             +  +  -  + ]
     500         [ +  + ]:         88 :     if (!args) {
     501                 :          1 :         goto exit;
     502                 :            :     }
     503         [ +  + ]:         87 :     if (!noptargs) {
     504                 :         13 :         goto skip_optional_pos;
     505                 :            :     }
     506         [ +  + ]:         74 :     if (args[0]) {
     507                 :         73 :         sep = args[0];
     508         [ +  + ]:         73 :         if (!--noptargs) {
     509                 :         29 :             goto skip_optional_pos;
     510                 :            :         }
     511                 :            :     }
     512                 :            :     {
     513                 :         45 :         Py_ssize_t ival = -1;
     514                 :         45 :         PyObject *iobj = _PyNumber_Index(args[1]);
     515         [ +  - ]:         45 :         if (iobj != NULL) {
     516                 :         45 :             ival = PyLong_AsSsize_t(iobj);
     517                 :         45 :             Py_DECREF(iobj);
     518                 :            :         }
     519   [ -  +  -  - ]:         45 :         if (ival == -1 && PyErr_Occurred()) {
     520                 :          0 :             goto exit;
     521                 :            :         }
     522                 :         45 :         maxsplit = ival;
     523                 :            :     }
     524                 :         87 : skip_optional_pos:
     525                 :         87 :     return_value = bytearray_rsplit_impl(self, sep, maxsplit);
     526                 :            : 
     527                 :         88 : exit:
     528                 :         88 :     return return_value;
     529                 :            : }
     530                 :            : 
     531                 :            : PyDoc_STRVAR(bytearray_reverse__doc__,
     532                 :            : "reverse($self, /)\n"
     533                 :            : "--\n"
     534                 :            : "\n"
     535                 :            : "Reverse the order of the values in B in place.");
     536                 :            : 
     537                 :            : #define BYTEARRAY_REVERSE_METHODDEF    \
     538                 :            :     {"reverse", (PyCFunction)bytearray_reverse, METH_NOARGS, bytearray_reverse__doc__},
     539                 :            : 
     540                 :            : static PyObject *
     541                 :            : bytearray_reverse_impl(PyByteArrayObject *self);
     542                 :            : 
     543                 :            : static PyObject *
     544                 :          3 : bytearray_reverse(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
     545                 :            : {
     546                 :          3 :     return bytearray_reverse_impl(self);
     547                 :            : }
     548                 :            : 
     549                 :            : PyDoc_STRVAR(bytearray_insert__doc__,
     550                 :            : "insert($self, index, item, /)\n"
     551                 :            : "--\n"
     552                 :            : "\n"
     553                 :            : "Insert a single item into the bytearray before the given index.\n"
     554                 :            : "\n"
     555                 :            : "  index\n"
     556                 :            : "    The index where the value is to be inserted.\n"
     557                 :            : "  item\n"
     558                 :            : "    The item to be inserted.");
     559                 :            : 
     560                 :            : #define BYTEARRAY_INSERT_METHODDEF    \
     561                 :            :     {"insert", _PyCFunction_CAST(bytearray_insert), METH_FASTCALL, bytearray_insert__doc__},
     562                 :            : 
     563                 :            : static PyObject *
     564                 :            : bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item);
     565                 :            : 
     566                 :            : static PyObject *
     567                 :         55 : bytearray_insert(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs)
     568                 :            : {
     569                 :         55 :     PyObject *return_value = NULL;
     570                 :            :     Py_ssize_t index;
     571                 :            :     int item;
     572                 :            : 
     573   [ +  -  -  +  :         55 :     if (!_PyArg_CheckPositional("insert", nargs, 2, 2)) {
                   -  - ]
     574                 :          0 :         goto exit;
     575                 :            :     }
     576                 :            :     {
     577                 :         55 :         Py_ssize_t ival = -1;
     578                 :         55 :         PyObject *iobj = _PyNumber_Index(args[0]);
     579         [ +  - ]:         55 :         if (iobj != NULL) {
     580                 :         55 :             ival = PyLong_AsSsize_t(iobj);
     581                 :         55 :             Py_DECREF(iobj);
     582                 :            :         }
     583   [ -  +  -  - ]:         55 :         if (ival == -1 && PyErr_Occurred()) {
     584                 :          0 :             goto exit;
     585                 :            :         }
     586                 :         55 :         index = ival;
     587                 :            :     }
     588         [ +  + ]:         55 :     if (!_getbytevalue(args[1], &item)) {
     589                 :          1 :         goto exit;
     590                 :            :     }
     591                 :         54 :     return_value = bytearray_insert_impl(self, index, item);
     592                 :            : 
     593                 :         55 : exit:
     594                 :         55 :     return return_value;
     595                 :            : }
     596                 :            : 
     597                 :            : PyDoc_STRVAR(bytearray_append__doc__,
     598                 :            : "append($self, item, /)\n"
     599                 :            : "--\n"
     600                 :            : "\n"
     601                 :            : "Append a single item to the end of the bytearray.\n"
     602                 :            : "\n"
     603                 :            : "  item\n"
     604                 :            : "    The item to be appended.");
     605                 :            : 
     606                 :            : #define BYTEARRAY_APPEND_METHODDEF    \
     607                 :            :     {"append", (PyCFunction)bytearray_append, METH_O, bytearray_append__doc__},
     608                 :            : 
     609                 :            : static PyObject *
     610                 :            : bytearray_append_impl(PyByteArrayObject *self, int item);
     611                 :            : 
     612                 :            : static PyObject *
     613                 :     814168 : bytearray_append(PyByteArrayObject *self, PyObject *arg)
     614                 :            : {
     615                 :     814168 :     PyObject *return_value = NULL;
     616                 :            :     int item;
     617                 :            : 
     618         [ +  + ]:     814168 :     if (!_getbytevalue(arg, &item)) {
     619                 :          1 :         goto exit;
     620                 :            :     }
     621                 :     814167 :     return_value = bytearray_append_impl(self, item);
     622                 :            : 
     623                 :     814168 : exit:
     624                 :     814168 :     return return_value;
     625                 :            : }
     626                 :            : 
     627                 :            : PyDoc_STRVAR(bytearray_extend__doc__,
     628                 :            : "extend($self, iterable_of_ints, /)\n"
     629                 :            : "--\n"
     630                 :            : "\n"
     631                 :            : "Append all the items from the iterator or sequence to the end of the bytearray.\n"
     632                 :            : "\n"
     633                 :            : "  iterable_of_ints\n"
     634                 :            : "    The iterable of items to append.");
     635                 :            : 
     636                 :            : #define BYTEARRAY_EXTEND_METHODDEF    \
     637                 :            :     {"extend", (PyCFunction)bytearray_extend, METH_O, bytearray_extend__doc__},
     638                 :            : 
     639                 :            : PyDoc_STRVAR(bytearray_pop__doc__,
     640                 :            : "pop($self, index=-1, /)\n"
     641                 :            : "--\n"
     642                 :            : "\n"
     643                 :            : "Remove and return a single item from B.\n"
     644                 :            : "\n"
     645                 :            : "  index\n"
     646                 :            : "    The index from where to remove the item.\n"
     647                 :            : "    -1 (the default value) means remove the last item.\n"
     648                 :            : "\n"
     649                 :            : "If no index argument is given, will pop the last item.");
     650                 :            : 
     651                 :            : #define BYTEARRAY_POP_METHODDEF    \
     652                 :            :     {"pop", _PyCFunction_CAST(bytearray_pop), METH_FASTCALL, bytearray_pop__doc__},
     653                 :            : 
     654                 :            : static PyObject *
     655                 :            : bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index);
     656                 :            : 
     657                 :            : static PyObject *
     658                 :          8 : bytearray_pop(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs)
     659                 :            : {
     660                 :          8 :     PyObject *return_value = NULL;
     661                 :          8 :     Py_ssize_t index = -1;
     662                 :            : 
     663   [ +  -  -  +  :          8 :     if (!_PyArg_CheckPositional("pop", nargs, 0, 1)) {
                   -  - ]
     664                 :          0 :         goto exit;
     665                 :            :     }
     666         [ +  + ]:          8 :     if (nargs < 1) {
     667                 :          4 :         goto skip_optional;
     668                 :            :     }
     669                 :            :     {
     670                 :          4 :         Py_ssize_t ival = -1;
     671                 :          4 :         PyObject *iobj = _PyNumber_Index(args[0]);
     672         [ +  - ]:          4 :         if (iobj != NULL) {
     673                 :          4 :             ival = PyLong_AsSsize_t(iobj);
     674                 :          4 :             Py_DECREF(iobj);
     675                 :            :         }
     676   [ -  +  -  - ]:          4 :         if (ival == -1 && PyErr_Occurred()) {
     677                 :          0 :             goto exit;
     678                 :            :         }
     679                 :          4 :         index = ival;
     680                 :            :     }
     681                 :          8 : skip_optional:
     682                 :          8 :     return_value = bytearray_pop_impl(self, index);
     683                 :            : 
     684                 :          8 : exit:
     685                 :          8 :     return return_value;
     686                 :            : }
     687                 :            : 
     688                 :            : PyDoc_STRVAR(bytearray_remove__doc__,
     689                 :            : "remove($self, value, /)\n"
     690                 :            : "--\n"
     691                 :            : "\n"
     692                 :            : "Remove the first occurrence of a value in the bytearray.\n"
     693                 :            : "\n"
     694                 :            : "  value\n"
     695                 :            : "    The value to remove.");
     696                 :            : 
     697                 :            : #define BYTEARRAY_REMOVE_METHODDEF    \
     698                 :            :     {"remove", (PyCFunction)bytearray_remove, METH_O, bytearray_remove__doc__},
     699                 :            : 
     700                 :            : static PyObject *
     701                 :            : bytearray_remove_impl(PyByteArrayObject *self, int value);
     702                 :            : 
     703                 :            : static PyObject *
     704                 :         12 : bytearray_remove(PyByteArrayObject *self, PyObject *arg)
     705                 :            : {
     706                 :         12 :     PyObject *return_value = NULL;
     707                 :            :     int value;
     708                 :            : 
     709         [ +  + ]:         12 :     if (!_getbytevalue(arg, &value)) {
     710                 :          3 :         goto exit;
     711                 :            :     }
     712                 :          9 :     return_value = bytearray_remove_impl(self, value);
     713                 :            : 
     714                 :         12 : exit:
     715                 :         12 :     return return_value;
     716                 :            : }
     717                 :            : 
     718                 :            : PyDoc_STRVAR(bytearray_strip__doc__,
     719                 :            : "strip($self, bytes=None, /)\n"
     720                 :            : "--\n"
     721                 :            : "\n"
     722                 :            : "Strip leading and trailing bytes contained in the argument.\n"
     723                 :            : "\n"
     724                 :            : "If the argument is omitted or None, strip leading and trailing ASCII whitespace.");
     725                 :            : 
     726                 :            : #define BYTEARRAY_STRIP_METHODDEF    \
     727                 :            :     {"strip", _PyCFunction_CAST(bytearray_strip), METH_FASTCALL, bytearray_strip__doc__},
     728                 :            : 
     729                 :            : static PyObject *
     730                 :            : bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes);
     731                 :            : 
     732                 :            : static PyObject *
     733                 :         24 : bytearray_strip(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs)
     734                 :            : {
     735                 :         24 :     PyObject *return_value = NULL;
     736                 :         24 :     PyObject *bytes = Py_None;
     737                 :            : 
     738   [ +  -  +  +  :         24 :     if (!_PyArg_CheckPositional("strip", nargs, 0, 1)) {
                   +  - ]
     739                 :          1 :         goto exit;
     740                 :            :     }
     741         [ +  + ]:         23 :     if (nargs < 1) {
     742                 :         13 :         goto skip_optional;
     743                 :            :     }
     744                 :         10 :     bytes = args[0];
     745                 :         23 : skip_optional:
     746                 :         23 :     return_value = bytearray_strip_impl(self, bytes);
     747                 :            : 
     748                 :         24 : exit:
     749                 :         24 :     return return_value;
     750                 :            : }
     751                 :            : 
     752                 :            : PyDoc_STRVAR(bytearray_lstrip__doc__,
     753                 :            : "lstrip($self, bytes=None, /)\n"
     754                 :            : "--\n"
     755                 :            : "\n"
     756                 :            : "Strip leading bytes contained in the argument.\n"
     757                 :            : "\n"
     758                 :            : "If the argument is omitted or None, strip leading ASCII whitespace.");
     759                 :            : 
     760                 :            : #define BYTEARRAY_LSTRIP_METHODDEF    \
     761                 :            :     {"lstrip", _PyCFunction_CAST(bytearray_lstrip), METH_FASTCALL, bytearray_lstrip__doc__},
     762                 :            : 
     763                 :            : static PyObject *
     764                 :            : bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes);
     765                 :            : 
     766                 :            : static PyObject *
     767                 :         11 : bytearray_lstrip(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs)
     768                 :            : {
     769                 :         11 :     PyObject *return_value = NULL;
     770                 :         11 :     PyObject *bytes = Py_None;
     771                 :            : 
     772   [ +  -  +  +  :         11 :     if (!_PyArg_CheckPositional("lstrip", nargs, 0, 1)) {
                   +  - ]
     773                 :          1 :         goto exit;
     774                 :            :     }
     775         [ +  + ]:         10 :     if (nargs < 1) {
     776                 :          4 :         goto skip_optional;
     777                 :            :     }
     778                 :          6 :     bytes = args[0];
     779                 :         10 : skip_optional:
     780                 :         10 :     return_value = bytearray_lstrip_impl(self, bytes);
     781                 :            : 
     782                 :         11 : exit:
     783                 :         11 :     return return_value;
     784                 :            : }
     785                 :            : 
     786                 :            : PyDoc_STRVAR(bytearray_rstrip__doc__,
     787                 :            : "rstrip($self, bytes=None, /)\n"
     788                 :            : "--\n"
     789                 :            : "\n"
     790                 :            : "Strip trailing bytes contained in the argument.\n"
     791                 :            : "\n"
     792                 :            : "If the argument is omitted or None, strip trailing ASCII whitespace.");
     793                 :            : 
     794                 :            : #define BYTEARRAY_RSTRIP_METHODDEF    \
     795                 :            :     {"rstrip", _PyCFunction_CAST(bytearray_rstrip), METH_FASTCALL, bytearray_rstrip__doc__},
     796                 :            : 
     797                 :            : static PyObject *
     798                 :            : bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes);
     799                 :            : 
     800                 :            : static PyObject *
     801                 :         84 : bytearray_rstrip(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs)
     802                 :            : {
     803                 :         84 :     PyObject *return_value = NULL;
     804                 :         84 :     PyObject *bytes = Py_None;
     805                 :            : 
     806   [ +  -  +  +  :         84 :     if (!_PyArg_CheckPositional("rstrip", nargs, 0, 1)) {
                   +  - ]
     807                 :          1 :         goto exit;
     808                 :            :     }
     809         [ +  + ]:         83 :     if (nargs < 1) {
     810                 :          4 :         goto skip_optional;
     811                 :            :     }
     812                 :         79 :     bytes = args[0];
     813                 :         83 : skip_optional:
     814                 :         83 :     return_value = bytearray_rstrip_impl(self, bytes);
     815                 :            : 
     816                 :         84 : exit:
     817                 :         84 :     return return_value;
     818                 :            : }
     819                 :            : 
     820                 :            : PyDoc_STRVAR(bytearray_decode__doc__,
     821                 :            : "decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n"
     822                 :            : "--\n"
     823                 :            : "\n"
     824                 :            : "Decode the bytearray using the codec registered for encoding.\n"
     825                 :            : "\n"
     826                 :            : "  encoding\n"
     827                 :            : "    The encoding with which to decode the bytearray.\n"
     828                 :            : "  errors\n"
     829                 :            : "    The error handling scheme to use for the handling of decoding errors.\n"
     830                 :            : "    The default is \'strict\' meaning that decoding errors raise a\n"
     831                 :            : "    UnicodeDecodeError. Other possible values are \'ignore\' and \'replace\'\n"
     832                 :            : "    as well as any other name registered with codecs.register_error that\n"
     833                 :            : "    can handle UnicodeDecodeErrors.");
     834                 :            : 
     835                 :            : #define BYTEARRAY_DECODE_METHODDEF    \
     836                 :            :     {"decode", _PyCFunction_CAST(bytearray_decode), METH_FASTCALL|METH_KEYWORDS, bytearray_decode__doc__},
     837                 :            : 
     838                 :            : static PyObject *
     839                 :            : bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
     840                 :            :                       const char *errors);
     841                 :            : 
     842                 :            : static PyObject *
     843                 :     552234 : bytearray_decode(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     844                 :            : {
     845                 :     552234 :     PyObject *return_value = NULL;
     846                 :            :     static const char * const _keywords[] = {"encoding", "errors", NULL};
     847                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0};
     848                 :            :     PyObject *argsbuf[2];
     849         [ +  + ]:     552234 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     850                 :     552234 :     const char *encoding = NULL;
     851                 :     552234 :     const char *errors = NULL;
     852                 :            : 
     853   [ +  +  +  -  :     552234 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
             +  -  -  + ]
     854         [ -  + ]:     552234 :     if (!args) {
     855                 :          0 :         goto exit;
     856                 :            :     }
     857         [ +  + ]:     552234 :     if (!noptargs) {
     858                 :       2088 :         goto skip_optional_pos;
     859                 :            :     }
     860         [ +  - ]:     550146 :     if (args[0]) {
     861         [ -  + ]:     550146 :         if (!PyUnicode_Check(args[0])) {
     862                 :          0 :             _PyArg_BadArgument("decode", "argument 'encoding'", "str", args[0]);
     863                 :          0 :             goto exit;
     864                 :            :         }
     865                 :            :         Py_ssize_t encoding_length;
     866                 :     550146 :         encoding = PyUnicode_AsUTF8AndSize(args[0], &encoding_length);
     867         [ -  + ]:     550146 :         if (encoding == NULL) {
     868                 :          0 :             goto exit;
     869                 :            :         }
     870         [ -  + ]:     550146 :         if (strlen(encoding) != (size_t)encoding_length) {
     871                 :          0 :             PyErr_SetString(PyExc_ValueError, "embedded null character");
     872                 :          0 :             goto exit;
     873                 :            :         }
     874         [ +  + ]:     550146 :         if (!--noptargs) {
     875                 :     550144 :             goto skip_optional_pos;
     876                 :            :         }
     877                 :            :     }
     878         [ -  + ]:          2 :     if (!PyUnicode_Check(args[1])) {
     879                 :          0 :         _PyArg_BadArgument("decode", "argument 'errors'", "str", args[1]);
     880                 :          0 :         goto exit;
     881                 :            :     }
     882                 :            :     Py_ssize_t errors_length;
     883                 :          2 :     errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length);
     884         [ -  + ]:          2 :     if (errors == NULL) {
     885                 :          0 :         goto exit;
     886                 :            :     }
     887         [ -  + ]:          2 :     if (strlen(errors) != (size_t)errors_length) {
     888                 :          0 :         PyErr_SetString(PyExc_ValueError, "embedded null character");
     889                 :          0 :         goto exit;
     890                 :            :     }
     891                 :          2 : skip_optional_pos:
     892                 :     552234 :     return_value = bytearray_decode_impl(self, encoding, errors);
     893                 :            : 
     894                 :     552234 : exit:
     895                 :     552234 :     return return_value;
     896                 :            : }
     897                 :            : 
     898                 :            : PyDoc_STRVAR(bytearray_join__doc__,
     899                 :            : "join($self, iterable_of_bytes, /)\n"
     900                 :            : "--\n"
     901                 :            : "\n"
     902                 :            : "Concatenate any number of bytes/bytearray objects.\n"
     903                 :            : "\n"
     904                 :            : "The bytearray whose method is called is inserted in between each pair.\n"
     905                 :            : "\n"
     906                 :            : "The result is returned as a new bytearray object.");
     907                 :            : 
     908                 :            : #define BYTEARRAY_JOIN_METHODDEF    \
     909                 :            :     {"join", (PyCFunction)bytearray_join, METH_O, bytearray_join__doc__},
     910                 :            : 
     911                 :            : PyDoc_STRVAR(bytearray_splitlines__doc__,
     912                 :            : "splitlines($self, /, keepends=False)\n"
     913                 :            : "--\n"
     914                 :            : "\n"
     915                 :            : "Return a list of the lines in the bytearray, breaking at line boundaries.\n"
     916                 :            : "\n"
     917                 :            : "Line breaks are not included in the resulting list unless keepends is given and\n"
     918                 :            : "true.");
     919                 :            : 
     920                 :            : #define BYTEARRAY_SPLITLINES_METHODDEF    \
     921                 :            :     {"splitlines", _PyCFunction_CAST(bytearray_splitlines), METH_FASTCALL|METH_KEYWORDS, bytearray_splitlines__doc__},
     922                 :            : 
     923                 :            : static PyObject *
     924                 :            : bytearray_splitlines_impl(PyByteArrayObject *self, int keepends);
     925                 :            : 
     926                 :            : static PyObject *
     927                 :         21 : bytearray_splitlines(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     928                 :            : {
     929                 :         21 :     PyObject *return_value = NULL;
     930                 :            :     static const char * const _keywords[] = {"keepends", NULL};
     931                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "splitlines", 0};
     932                 :            :     PyObject *argsbuf[1];
     933         [ +  + ]:         21 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     934                 :         21 :     int keepends = 0;
     935                 :            : 
     936   [ +  +  +  -  :         21 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
             +  +  -  + ]
     937         [ +  + ]:         21 :     if (!args) {
     938                 :          1 :         goto exit;
     939                 :            :     }
     940         [ +  + ]:         20 :     if (!noptargs) {
     941                 :         16 :         goto skip_optional_pos;
     942                 :            :     }
     943                 :          4 :     keepends = _PyLong_AsInt(args[0]);
     944   [ -  +  -  - ]:          4 :     if (keepends == -1 && PyErr_Occurred()) {
     945                 :          0 :         goto exit;
     946                 :            :     }
     947                 :          4 : skip_optional_pos:
     948                 :         20 :     return_value = bytearray_splitlines_impl(self, keepends);
     949                 :            : 
     950                 :         21 : exit:
     951                 :         21 :     return return_value;
     952                 :            : }
     953                 :            : 
     954                 :            : PyDoc_STRVAR(bytearray_fromhex__doc__,
     955                 :            : "fromhex($type, string, /)\n"
     956                 :            : "--\n"
     957                 :            : "\n"
     958                 :            : "Create a bytearray object from a string of hexadecimal numbers.\n"
     959                 :            : "\n"
     960                 :            : "Spaces between two numbers are accepted.\n"
     961                 :            : "Example: bytearray.fromhex(\'B9 01EF\') -> bytearray(b\'\\\\xb9\\\\x01\\\\xef\')");
     962                 :            : 
     963                 :            : #define BYTEARRAY_FROMHEX_METHODDEF    \
     964                 :            :     {"fromhex", (PyCFunction)bytearray_fromhex, METH_O|METH_CLASS, bytearray_fromhex__doc__},
     965                 :            : 
     966                 :            : static PyObject *
     967                 :            : bytearray_fromhex_impl(PyTypeObject *type, PyObject *string);
     968                 :            : 
     969                 :            : static PyObject *
     970                 :         37 : bytearray_fromhex(PyTypeObject *type, PyObject *arg)
     971                 :            : {
     972                 :         37 :     PyObject *return_value = NULL;
     973                 :            :     PyObject *string;
     974                 :            : 
     975         [ +  + ]:         37 :     if (!PyUnicode_Check(arg)) {
     976                 :          2 :         _PyArg_BadArgument("fromhex", "argument", "str", arg);
     977                 :          2 :         goto exit;
     978                 :            :     }
     979         [ -  + ]:         35 :     if (PyUnicode_READY(arg) == -1) {
     980                 :          0 :         goto exit;
     981                 :            :     }
     982                 :         35 :     string = arg;
     983                 :         35 :     return_value = bytearray_fromhex_impl(type, string);
     984                 :            : 
     985                 :         37 : exit:
     986                 :         37 :     return return_value;
     987                 :            : }
     988                 :            : 
     989                 :            : PyDoc_STRVAR(bytearray_hex__doc__,
     990                 :            : "hex($self, /, sep=<unrepresentable>, bytes_per_sep=1)\n"
     991                 :            : "--\n"
     992                 :            : "\n"
     993                 :            : "Create a string of hexadecimal numbers from a bytearray object.\n"
     994                 :            : "\n"
     995                 :            : "  sep\n"
     996                 :            : "    An optional single character or byte to separate hex bytes.\n"
     997                 :            : "  bytes_per_sep\n"
     998                 :            : "    How many bytes between separators.  Positive values count from the\n"
     999                 :            : "    right, negative values count from the left.\n"
    1000                 :            : "\n"
    1001                 :            : "Example:\n"
    1002                 :            : ">>> value = bytearray([0xb9, 0x01, 0xef])\n"
    1003                 :            : ">>> value.hex()\n"
    1004                 :            : "\'b901ef\'\n"
    1005                 :            : ">>> value.hex(\':\')\n"
    1006                 :            : "\'b9:01:ef\'\n"
    1007                 :            : ">>> value.hex(\':\', 2)\n"
    1008                 :            : "\'b9:01ef\'\n"
    1009                 :            : ">>> value.hex(\':\', -2)\n"
    1010                 :            : "\'b901:ef\'");
    1011                 :            : 
    1012                 :            : #define BYTEARRAY_HEX_METHODDEF    \
    1013                 :            :     {"hex", _PyCFunction_CAST(bytearray_hex), METH_FASTCALL|METH_KEYWORDS, bytearray_hex__doc__},
    1014                 :            : 
    1015                 :            : static PyObject *
    1016                 :            : bytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep);
    1017                 :            : 
    1018                 :            : static PyObject *
    1019                 :         46 : bytearray_hex(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
    1020                 :            : {
    1021                 :         46 :     PyObject *return_value = NULL;
    1022                 :            :     static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL};
    1023                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "hex", 0};
    1024                 :            :     PyObject *argsbuf[2];
    1025         [ -  + ]:         46 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
    1026                 :         46 :     PyObject *sep = NULL;
    1027                 :         46 :     int bytes_per_sep = 1;
    1028                 :            : 
    1029   [ +  -  +  -  :         46 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
             +  -  -  + ]
    1030         [ -  + ]:         46 :     if (!args) {
    1031                 :          0 :         goto exit;
    1032                 :            :     }
    1033         [ +  + ]:         46 :     if (!noptargs) {
    1034                 :          8 :         goto skip_optional_pos;
    1035                 :            :     }
    1036         [ +  - ]:         38 :     if (args[0]) {
    1037                 :         38 :         sep = args[0];
    1038         [ +  + ]:         38 :         if (!--noptargs) {
    1039                 :         13 :             goto skip_optional_pos;
    1040                 :            :         }
    1041                 :            :     }
    1042                 :         25 :     bytes_per_sep = _PyLong_AsInt(args[1]);
    1043   [ +  +  +  - ]:         25 :     if (bytes_per_sep == -1 && PyErr_Occurred()) {
    1044                 :          0 :         goto exit;
    1045                 :            :     }
    1046                 :         25 : skip_optional_pos:
    1047                 :         46 :     return_value = bytearray_hex_impl(self, sep, bytes_per_sep);
    1048                 :            : 
    1049                 :         46 : exit:
    1050                 :         46 :     return return_value;
    1051                 :            : }
    1052                 :            : 
    1053                 :            : PyDoc_STRVAR(bytearray_reduce__doc__,
    1054                 :            : "__reduce__($self, /)\n"
    1055                 :            : "--\n"
    1056                 :            : "\n"
    1057                 :            : "Return state information for pickling.");
    1058                 :            : 
    1059                 :            : #define BYTEARRAY_REDUCE_METHODDEF    \
    1060                 :            :     {"__reduce__", (PyCFunction)bytearray_reduce, METH_NOARGS, bytearray_reduce__doc__},
    1061                 :            : 
    1062                 :            : static PyObject *
    1063                 :            : bytearray_reduce_impl(PyByteArrayObject *self);
    1064                 :            : 
    1065                 :            : static PyObject *
    1066                 :          0 : bytearray_reduce(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
    1067                 :            : {
    1068                 :          0 :     return bytearray_reduce_impl(self);
    1069                 :            : }
    1070                 :            : 
    1071                 :            : PyDoc_STRVAR(bytearray_reduce_ex__doc__,
    1072                 :            : "__reduce_ex__($self, proto=0, /)\n"
    1073                 :            : "--\n"
    1074                 :            : "\n"
    1075                 :            : "Return state information for pickling.");
    1076                 :            : 
    1077                 :            : #define BYTEARRAY_REDUCE_EX_METHODDEF    \
    1078                 :            :     {"__reduce_ex__", _PyCFunction_CAST(bytearray_reduce_ex), METH_FASTCALL, bytearray_reduce_ex__doc__},
    1079                 :            : 
    1080                 :            : static PyObject *
    1081                 :            : bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto);
    1082                 :            : 
    1083                 :            : static PyObject *
    1084                 :         30 : bytearray_reduce_ex(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs)
    1085                 :            : {
    1086                 :         30 :     PyObject *return_value = NULL;
    1087                 :         30 :     int proto = 0;
    1088                 :            : 
    1089   [ +  -  -  +  :         30 :     if (!_PyArg_CheckPositional("__reduce_ex__", nargs, 0, 1)) {
                   -  - ]
    1090                 :          0 :         goto exit;
    1091                 :            :     }
    1092         [ -  + ]:         30 :     if (nargs < 1) {
    1093                 :          0 :         goto skip_optional;
    1094                 :            :     }
    1095                 :         30 :     proto = _PyLong_AsInt(args[0]);
    1096   [ -  +  -  - ]:         30 :     if (proto == -1 && PyErr_Occurred()) {
    1097                 :          0 :         goto exit;
    1098                 :            :     }
    1099                 :         30 : skip_optional:
    1100                 :         30 :     return_value = bytearray_reduce_ex_impl(self, proto);
    1101                 :            : 
    1102                 :         30 : exit:
    1103                 :         30 :     return return_value;
    1104                 :            : }
    1105                 :            : 
    1106                 :            : PyDoc_STRVAR(bytearray_sizeof__doc__,
    1107                 :            : "__sizeof__($self, /)\n"
    1108                 :            : "--\n"
    1109                 :            : "\n"
    1110                 :            : "Returns the size of the bytearray object in memory, in bytes.");
    1111                 :            : 
    1112                 :            : #define BYTEARRAY_SIZEOF_METHODDEF    \
    1113                 :            :     {"__sizeof__", (PyCFunction)bytearray_sizeof, METH_NOARGS, bytearray_sizeof__doc__},
    1114                 :            : 
    1115                 :            : static PyObject *
    1116                 :            : bytearray_sizeof_impl(PyByteArrayObject *self);
    1117                 :            : 
    1118                 :            : static PyObject *
    1119                 :          6 : bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
    1120                 :            : {
    1121                 :          6 :     return bytearray_sizeof_impl(self);
    1122                 :            : }
    1123                 :            : /*[clinic end generated code: output=033e9eb5f2bb0139 input=a9049054013a1b77]*/

Generated by: LCOV version 1.14