LCOV - code coverage report
Current view: top level - Modules/clinic - _struct.c.h (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 110 130 84.6 %
Date: 2022-07-20 13:12:14 Functions: 8 8 100.0 %
Branches: 54 98 55.1 %

           Branch data     Line data    Source code
       1                 :            : /*[clinic input]
       2                 :            : preserve
       3                 :            : [clinic start generated code]*/
       4                 :            : 
       5                 :            : PyDoc_STRVAR(Struct___init____doc__,
       6                 :            : "Struct(format)\n"
       7                 :            : "--\n"
       8                 :            : "\n"
       9                 :            : "Create a compiled struct object.\n"
      10                 :            : "\n"
      11                 :            : "Return a new Struct object which writes and reads binary data according to\n"
      12                 :            : "the format string.\n"
      13                 :            : "\n"
      14                 :            : "See help(struct) for more on format strings.");
      15                 :            : 
      16                 :            : static int
      17                 :            : Struct___init___impl(PyStructObject *self, PyObject *format);
      18                 :            : 
      19                 :            : static int
      20                 :     245168 : Struct___init__(PyObject *self, PyObject *args, PyObject *kwargs)
      21                 :            : {
      22                 :     245168 :     int return_value = -1;
      23                 :            :     static const char * const _keywords[] = {"format", NULL};
      24                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "Struct", 0};
      25                 :            :     PyObject *argsbuf[1];
      26                 :            :     PyObject * const *fastargs;
      27                 :     245168 :     Py_ssize_t nargs = PyTuple_GET_SIZE(args);
      28                 :            :     PyObject *format;
      29                 :            : 
      30   [ +  -  +  -  :     245168 :     fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf);
             +  -  +  - ]
      31         [ -  + ]:     245168 :     if (!fastargs) {
      32                 :          0 :         goto exit;
      33                 :            :     }
      34                 :     245168 :     format = fastargs[0];
      35                 :     245168 :     return_value = Struct___init___impl((PyStructObject *)self, format);
      36                 :            : 
      37                 :     245168 : exit:
      38                 :     245168 :     return return_value;
      39                 :            : }
      40                 :            : 
      41                 :            : PyDoc_STRVAR(Struct_unpack__doc__,
      42                 :            : "unpack($self, buffer, /)\n"
      43                 :            : "--\n"
      44                 :            : "\n"
      45                 :            : "Return a tuple containing unpacked values.\n"
      46                 :            : "\n"
      47                 :            : "Unpack according to the format string Struct.format. The buffer\'s size\n"
      48                 :            : "in bytes must be Struct.size.\n"
      49                 :            : "\n"
      50                 :            : "See help(struct) for more on format strings.");
      51                 :            : 
      52                 :            : #define STRUCT_UNPACK_METHODDEF    \
      53                 :            :     {"unpack", (PyCFunction)Struct_unpack, METH_O, Struct_unpack__doc__},
      54                 :            : 
      55                 :            : static PyObject *
      56                 :            : Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer);
      57                 :            : 
      58                 :            : static PyObject *
      59                 :       1515 : Struct_unpack(PyStructObject *self, PyObject *arg)
      60                 :            : {
      61                 :       1515 :     PyObject *return_value = NULL;
      62                 :       1515 :     Py_buffer buffer = {NULL, NULL};
      63                 :            : 
      64         [ -  + ]:       1515 :     if (PyObject_GetBuffer(arg, &buffer, PyBUF_SIMPLE) != 0) {
      65                 :          0 :         goto exit;
      66                 :            :     }
      67         [ -  + ]:       1515 :     if (!PyBuffer_IsContiguous(&buffer, 'C')) {
      68                 :          0 :         _PyArg_BadArgument("unpack", "argument", "contiguous buffer", arg);
      69                 :          0 :         goto exit;
      70                 :            :     }
      71                 :       1515 :     return_value = Struct_unpack_impl(self, &buffer);
      72                 :            : 
      73                 :       1515 : exit:
      74                 :            :     /* Cleanup for buffer */
      75         [ +  - ]:       1515 :     if (buffer.obj) {
      76                 :       1515 :        PyBuffer_Release(&buffer);
      77                 :            :     }
      78                 :            : 
      79                 :       1515 :     return return_value;
      80                 :            : }
      81                 :            : 
      82                 :            : PyDoc_STRVAR(Struct_unpack_from__doc__,
      83                 :            : "unpack_from($self, /, buffer, offset=0)\n"
      84                 :            : "--\n"
      85                 :            : "\n"
      86                 :            : "Return a tuple containing unpacked values.\n"
      87                 :            : "\n"
      88                 :            : "Values are unpacked according to the format string Struct.format.\n"
      89                 :            : "\n"
      90                 :            : "The buffer\'s size in bytes, starting at position offset, must be\n"
      91                 :            : "at least Struct.size.\n"
      92                 :            : "\n"
      93                 :            : "See help(struct) for more on format strings.");
      94                 :            : 
      95                 :            : #define STRUCT_UNPACK_FROM_METHODDEF    \
      96                 :            :     {"unpack_from", _PyCFunction_CAST(Struct_unpack_from), METH_FASTCALL|METH_KEYWORDS, Struct_unpack_from__doc__},
      97                 :            : 
      98                 :            : static PyObject *
      99                 :            : Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer,
     100                 :            :                         Py_ssize_t offset);
     101                 :            : 
     102                 :            : static PyObject *
     103                 :    1289232 : Struct_unpack_from(PyStructObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     104                 :            : {
     105                 :    1289232 :     PyObject *return_value = NULL;
     106                 :            :     static const char * const _keywords[] = {"buffer", "offset", NULL};
     107                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "unpack_from", 0};
     108                 :            :     PyObject *argsbuf[2];
     109         [ +  + ]:    1289232 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
     110                 :    1289232 :     Py_buffer buffer = {NULL, NULL};
     111                 :    1289232 :     Py_ssize_t offset = 0;
     112                 :            : 
     113   [ +  +  +  -  :    1289232 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
             +  -  -  + ]
     114         [ -  + ]:    1289232 :     if (!args) {
     115                 :          0 :         goto exit;
     116                 :            :     }
     117         [ -  + ]:    1289232 :     if (PyObject_GetBuffer(args[0], &buffer, PyBUF_SIMPLE) != 0) {
     118                 :          0 :         goto exit;
     119                 :            :     }
     120         [ -  + ]:    1289232 :     if (!PyBuffer_IsContiguous(&buffer, 'C')) {
     121                 :          0 :         _PyArg_BadArgument("unpack_from", "argument 'buffer'", "contiguous buffer", args[0]);
     122                 :          0 :         goto exit;
     123                 :            :     }
     124         [ +  + ]:    1289232 :     if (!noptargs) {
     125                 :    1289207 :         goto skip_optional_pos;
     126                 :            :     }
     127                 :            :     {
     128                 :         25 :         Py_ssize_t ival = -1;
     129                 :         25 :         PyObject *iobj = _PyNumber_Index(args[1]);
     130         [ +  - ]:         25 :         if (iobj != NULL) {
     131                 :         25 :             ival = PyLong_AsSsize_t(iobj);
     132                 :         25 :             Py_DECREF(iobj);
     133                 :            :         }
     134   [ -  +  -  - ]:         25 :         if (ival == -1 && PyErr_Occurred()) {
     135                 :          0 :             goto exit;
     136                 :            :         }
     137                 :         25 :         offset = ival;
     138                 :            :     }
     139                 :    1289232 : skip_optional_pos:
     140                 :    1289232 :     return_value = Struct_unpack_from_impl(self, &buffer, offset);
     141                 :            : 
     142                 :    1289232 : exit:
     143                 :            :     /* Cleanup for buffer */
     144         [ +  - ]:    1289232 :     if (buffer.obj) {
     145                 :    1289232 :        PyBuffer_Release(&buffer);
     146                 :            :     }
     147                 :            : 
     148                 :    1289232 :     return return_value;
     149                 :            : }
     150                 :            : 
     151                 :            : PyDoc_STRVAR(Struct_iter_unpack__doc__,
     152                 :            : "iter_unpack($self, buffer, /)\n"
     153                 :            : "--\n"
     154                 :            : "\n"
     155                 :            : "Return an iterator yielding tuples.\n"
     156                 :            : "\n"
     157                 :            : "Tuples are unpacked from the given bytes source, like a repeated\n"
     158                 :            : "invocation of unpack_from().\n"
     159                 :            : "\n"
     160                 :            : "Requires that the bytes length be a multiple of the struct size.");
     161                 :            : 
     162                 :            : #define STRUCT_ITER_UNPACK_METHODDEF    \
     163                 :            :     {"iter_unpack", (PyCFunction)Struct_iter_unpack, METH_O, Struct_iter_unpack__doc__},
     164                 :            : 
     165                 :            : PyDoc_STRVAR(_clearcache__doc__,
     166                 :            : "_clearcache($module, /)\n"
     167                 :            : "--\n"
     168                 :            : "\n"
     169                 :            : "Clear the internal cache.");
     170                 :            : 
     171                 :            : #define _CLEARCACHE_METHODDEF    \
     172                 :            :     {"_clearcache", (PyCFunction)_clearcache, METH_NOARGS, _clearcache__doc__},
     173                 :            : 
     174                 :            : static PyObject *
     175                 :            : _clearcache_impl(PyObject *module);
     176                 :            : 
     177                 :            : static PyObject *
     178                 :          1 : _clearcache(PyObject *module, PyObject *Py_UNUSED(ignored))
     179                 :            : {
     180                 :          1 :     return _clearcache_impl(module);
     181                 :            : }
     182                 :            : 
     183                 :            : PyDoc_STRVAR(calcsize__doc__,
     184                 :            : "calcsize($module, format, /)\n"
     185                 :            : "--\n"
     186                 :            : "\n"
     187                 :            : "Return size in bytes of the struct described by the format string.");
     188                 :            : 
     189                 :            : #define CALCSIZE_METHODDEF    \
     190                 :            :     {"calcsize", (PyCFunction)calcsize, METH_O, calcsize__doc__},
     191                 :            : 
     192                 :            : static Py_ssize_t
     193                 :            : calcsize_impl(PyObject *module, PyStructObject *s_object);
     194                 :            : 
     195                 :            : static PyObject *
     196                 :     166906 : calcsize(PyObject *module, PyObject *arg)
     197                 :            : {
     198                 :     166906 :     PyObject *return_value = NULL;
     199                 :     166906 :     PyStructObject *s_object = NULL;
     200                 :            :     Py_ssize_t _return_value;
     201                 :            : 
     202         [ +  + ]:     166906 :     if (!cache_struct_converter(module, arg, &s_object)) {
     203                 :         20 :         goto exit;
     204                 :            :     }
     205                 :     166886 :     _return_value = calcsize_impl(module, s_object);
     206   [ -  +  -  - ]:     166886 :     if ((_return_value == -1) && PyErr_Occurred()) {
     207                 :          0 :         goto exit;
     208                 :            :     }
     209                 :     166886 :     return_value = PyLong_FromSsize_t(_return_value);
     210                 :            : 
     211                 :     166906 : exit:
     212                 :            :     /* Cleanup for s_object */
     213                 :     166906 :     Py_XDECREF(s_object);
     214                 :            : 
     215                 :     166906 :     return return_value;
     216                 :            : }
     217                 :            : 
     218                 :            : PyDoc_STRVAR(unpack__doc__,
     219                 :            : "unpack($module, format, buffer, /)\n"
     220                 :            : "--\n"
     221                 :            : "\n"
     222                 :            : "Return a tuple containing values unpacked according to the format string.\n"
     223                 :            : "\n"
     224                 :            : "The buffer\'s size in bytes must be calcsize(format).\n"
     225                 :            : "\n"
     226                 :            : "See help(struct) for more on format strings.");
     227                 :            : 
     228                 :            : #define UNPACK_METHODDEF    \
     229                 :            :     {"unpack", _PyCFunction_CAST(unpack), METH_FASTCALL, unpack__doc__},
     230                 :            : 
     231                 :            : static PyObject *
     232                 :            : unpack_impl(PyObject *module, PyStructObject *s_object, Py_buffer *buffer);
     233                 :            : 
     234                 :            : static PyObject *
     235                 :    4176578 : unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     236                 :            : {
     237                 :    4176578 :     PyObject *return_value = NULL;
     238                 :    4176578 :     PyStructObject *s_object = NULL;
     239                 :    4176578 :     Py_buffer buffer = {NULL, NULL};
     240                 :            : 
     241   [ +  -  -  +  :    4176578 :     if (!_PyArg_CheckPositional("unpack", nargs, 2, 2)) {
                   -  - ]
     242                 :          0 :         goto exit;
     243                 :            :     }
     244         [ +  + ]:    4176578 :     if (!cache_struct_converter(module, args[0], &s_object)) {
     245                 :         12 :         goto exit;
     246                 :            :     }
     247         [ +  + ]:    4176566 :     if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) {
     248                 :          1 :         goto exit;
     249                 :            :     }
     250         [ -  + ]:    4176565 :     if (!PyBuffer_IsContiguous(&buffer, 'C')) {
     251                 :          0 :         _PyArg_BadArgument("unpack", "argument 2", "contiguous buffer", args[1]);
     252                 :          0 :         goto exit;
     253                 :            :     }
     254                 :    4176565 :     return_value = unpack_impl(module, s_object, &buffer);
     255                 :            : 
     256                 :    4176578 : exit:
     257                 :            :     /* Cleanup for s_object */
     258                 :    4176578 :     Py_XDECREF(s_object);
     259                 :            :     /* Cleanup for buffer */
     260         [ +  + ]:    4176578 :     if (buffer.obj) {
     261                 :    4176565 :        PyBuffer_Release(&buffer);
     262                 :            :     }
     263                 :            : 
     264                 :    4176578 :     return return_value;
     265                 :            : }
     266                 :            : 
     267                 :            : PyDoc_STRVAR(unpack_from__doc__,
     268                 :            : "unpack_from($module, format, /, buffer, offset=0)\n"
     269                 :            : "--\n"
     270                 :            : "\n"
     271                 :            : "Return a tuple containing values unpacked according to the format string.\n"
     272                 :            : "\n"
     273                 :            : "The buffer\'s size, minus offset, must be at least calcsize(format).\n"
     274                 :            : "\n"
     275                 :            : "See help(struct) for more on format strings.");
     276                 :            : 
     277                 :            : #define UNPACK_FROM_METHODDEF    \
     278                 :            :     {"unpack_from", _PyCFunction_CAST(unpack_from), METH_FASTCALL|METH_KEYWORDS, unpack_from__doc__},
     279                 :            : 
     280                 :            : static PyObject *
     281                 :            : unpack_from_impl(PyObject *module, PyStructObject *s_object,
     282                 :            :                  Py_buffer *buffer, Py_ssize_t offset);
     283                 :            : 
     284                 :            : static PyObject *
     285                 :     916976 : unpack_from(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     286                 :            : {
     287                 :     916976 :     PyObject *return_value = NULL;
     288                 :            :     static const char * const _keywords[] = {"", "buffer", "offset", NULL};
     289                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "unpack_from", 0};
     290                 :            :     PyObject *argsbuf[3];
     291         [ -  + ]:     916976 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
     292                 :     916976 :     PyStructObject *s_object = NULL;
     293                 :     916976 :     Py_buffer buffer = {NULL, NULL};
     294                 :     916976 :     Py_ssize_t offset = 0;
     295                 :            : 
     296   [ +  -  +  -  :     916976 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
             +  -  -  + ]
     297         [ -  + ]:     916976 :     if (!args) {
     298                 :          0 :         goto exit;
     299                 :            :     }
     300         [ +  + ]:     916976 :     if (!cache_struct_converter(module, args[0], &s_object)) {
     301                 :          3 :         goto exit;
     302                 :            :     }
     303         [ -  + ]:     916973 :     if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) {
     304                 :          0 :         goto exit;
     305                 :            :     }
     306         [ -  + ]:     916973 :     if (!PyBuffer_IsContiguous(&buffer, 'C')) {
     307                 :          0 :         _PyArg_BadArgument("unpack_from", "argument 'buffer'", "contiguous buffer", args[1]);
     308                 :          0 :         goto exit;
     309                 :            :     }
     310         [ +  + ]:     916973 :     if (!noptargs) {
     311                 :     122212 :         goto skip_optional_pos;
     312                 :            :     }
     313                 :            :     {
     314                 :     794761 :         Py_ssize_t ival = -1;
     315                 :     794761 :         PyObject *iobj = _PyNumber_Index(args[2]);
     316         [ +  - ]:     794761 :         if (iobj != NULL) {
     317                 :     794761 :             ival = PyLong_AsSsize_t(iobj);
     318                 :     794761 :             Py_DECREF(iobj);
     319                 :            :         }
     320   [ -  +  -  - ]:     794761 :         if (ival == -1 && PyErr_Occurred()) {
     321                 :          0 :             goto exit;
     322                 :            :         }
     323                 :     794761 :         offset = ival;
     324                 :            :     }
     325                 :     916973 : skip_optional_pos:
     326                 :     916973 :     return_value = unpack_from_impl(module, s_object, &buffer, offset);
     327                 :            : 
     328                 :     916976 : exit:
     329                 :            :     /* Cleanup for s_object */
     330                 :     916976 :     Py_XDECREF(s_object);
     331                 :            :     /* Cleanup for buffer */
     332         [ +  + ]:     916976 :     if (buffer.obj) {
     333                 :     916973 :        PyBuffer_Release(&buffer);
     334                 :            :     }
     335                 :            : 
     336                 :     916976 :     return return_value;
     337                 :            : }
     338                 :            : 
     339                 :            : PyDoc_STRVAR(iter_unpack__doc__,
     340                 :            : "iter_unpack($module, format, buffer, /)\n"
     341                 :            : "--\n"
     342                 :            : "\n"
     343                 :            : "Return an iterator yielding tuples unpacked from the given bytes.\n"
     344                 :            : "\n"
     345                 :            : "The bytes are unpacked according to the format string, like\n"
     346                 :            : "a repeated invocation of unpack_from().\n"
     347                 :            : "\n"
     348                 :            : "Requires that the bytes length be a multiple of the format struct size.");
     349                 :            : 
     350                 :            : #define ITER_UNPACK_METHODDEF    \
     351                 :            :     {"iter_unpack", _PyCFunction_CAST(iter_unpack), METH_FASTCALL, iter_unpack__doc__},
     352                 :            : 
     353                 :            : static PyObject *
     354                 :            : iter_unpack_impl(PyObject *module, PyStructObject *s_object,
     355                 :            :                  PyObject *buffer);
     356                 :            : 
     357                 :            : static PyObject *
     358                 :          2 : iter_unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     359                 :            : {
     360                 :          2 :     PyObject *return_value = NULL;
     361                 :          2 :     PyStructObject *s_object = NULL;
     362                 :            :     PyObject *buffer;
     363                 :            : 
     364   [ +  -  -  +  :          2 :     if (!_PyArg_CheckPositional("iter_unpack", nargs, 2, 2)) {
                   -  - ]
     365                 :          0 :         goto exit;
     366                 :            :     }
     367         [ -  + ]:          2 :     if (!cache_struct_converter(module, args[0], &s_object)) {
     368                 :          0 :         goto exit;
     369                 :            :     }
     370                 :          2 :     buffer = args[1];
     371                 :          2 :     return_value = iter_unpack_impl(module, s_object, buffer);
     372                 :            : 
     373                 :          2 : exit:
     374                 :            :     /* Cleanup for s_object */
     375                 :          2 :     Py_XDECREF(s_object);
     376                 :            : 
     377                 :          2 :     return return_value;
     378                 :            : }
     379                 :            : /*[clinic end generated code: output=2065c9b007be631c input=a9049054013a1b77]*/

Generated by: LCOV version 1.14