LCOV - code coverage report
Current view: top level - Python - modsupport.c (source / functions) Hit Total Coverage
Test: CPython lcov report Lines: 270 350 77.1 %
Date: 2022-07-07 18:19:46 Functions: 20 21 95.2 %

          Line data    Source code
       1             : 
       2             : /* Module support implementation */
       3             : 
       4             : #include "Python.h"
       5             : #include "pycore_abstract.h"   // _PyIndex_Check()
       6             : 
       7             : #define FLAG_SIZE_T 1
       8             : typedef double va_double;
       9             : 
      10             : static PyObject *va_build_value(const char *, va_list, int);
      11             : static PyObject **va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, const char *, va_list, int, Py_ssize_t*);
      12             : 
      13             : /* Package context -- the full module name for package imports */
      14             : const char *_Py_PackageContext = NULL;
      15             : 
      16             : 
      17             : int
      18    11998300 : _Py_convert_optional_to_ssize_t(PyObject *obj, void *result)
      19             : {
      20             :     Py_ssize_t limit;
      21    11998300 :     if (obj == Py_None) {
      22         107 :         return 1;
      23             :     }
      24    11998200 :     else if (_PyIndex_Check(obj)) {
      25    11998200 :         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
      26    11998200 :         if (limit == -1 && PyErr_Occurred()) {
      27           5 :             return 0;
      28             :         }
      29             :     }
      30             :     else {
      31          23 :         PyErr_Format(PyExc_TypeError,
      32             :                      "argument should be integer or None, not '%.200s'",
      33          23 :                      Py_TYPE(obj)->tp_name);
      34          23 :         return 0;
      35             :     }
      36    11998200 :     *((Py_ssize_t *)result) = limit;
      37    11998200 :     return 1;
      38             : }
      39             : 
      40             : 
      41             : /* Helper for mkvalue() to scan the length of a format */
      42             : 
      43             : static Py_ssize_t
      44    14025800 : countformat(const char *format, char endchar)
      45             : {
      46    14025800 :     Py_ssize_t count = 0;
      47    14025800 :     int level = 0;
      48    60623900 :     while (level > 0 || *format != endchar) {
      49    46598100 :         switch (*format) {
      50           0 :         case '\0':
      51             :             /* Premature end */
      52           0 :             PyErr_SetString(PyExc_SystemError,
      53             :                             "unmatched paren in format");
      54           0 :             return -1;
      55     3226590 :         case '(':
      56             :         case '[':
      57             :         case '{':
      58     3226590 :             if (level == 0) {
      59     3205670 :                 count++;
      60             :             }
      61     3226590 :             level++;
      62     3226590 :             break;
      63     3226590 :         case ')':
      64             :         case ']':
      65             :         case '}':
      66     3226590 :             level--;
      67     3226590 :             break;
      68     5653760 :         case '#':
      69             :         case '&':
      70             :         case ',':
      71             :         case ':':
      72             :         case ' ':
      73             :         case '\t':
      74     5653760 :             break;
      75    34491100 :         default:
      76    34491100 :             if (level == 0) {
      77    25396200 :                 count++;
      78             :             }
      79             :         }
      80    46598100 :         format++;
      81             :     }
      82    14025800 :     return count;
      83             : }
      84             : 
      85             : 
      86             : /* Generic function to create a value -- the inverse of getargs() */
      87             : /* After an original idea and first implementation by Steven Miale */
      88             : 
      89             : static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t, int);
      90             : static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t, int);
      91             : static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t, int);
      92             : static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t, int);
      93             : static PyObject *do_mkvalue(const char**, va_list *, int);
      94             : 
      95             : 
      96             : static void
      97          24 : do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
      98             : {
      99             :     PyObject *v;
     100             :     Py_ssize_t i;
     101          24 :     assert(PyErr_Occurred());
     102          24 :     v = PyTuple_New(n);
     103          50 :     for (i = 0; i < n; i++) {
     104             :         PyObject *exception, *value, *tb, *w;
     105             : 
     106          26 :         PyErr_Fetch(&exception, &value, &tb);
     107          26 :         w = do_mkvalue(p_format, p_va, flags);
     108          26 :         PyErr_Restore(exception, value, tb);
     109          26 :         if (w != NULL) {
     110          26 :             if (v != NULL) {
     111          26 :                 PyTuple_SET_ITEM(v, i, w);
     112             :             }
     113             :             else {
     114           0 :                 Py_DECREF(w);
     115             :             }
     116             :         }
     117             :     }
     118          24 :     Py_XDECREF(v);
     119          24 :     if (**p_format != endchar) {
     120           0 :         PyErr_SetString(PyExc_SystemError,
     121             :                         "Unmatched paren in format");
     122           0 :         return;
     123             :     }
     124          24 :     if (endchar) {
     125          12 :         ++*p_format;
     126             :     }
     127             : }
     128             : 
     129             : static PyObject *
     130      209660 : do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
     131             : {
     132             :     PyObject *d;
     133             :     Py_ssize_t i;
     134      209660 :     if (n < 0)
     135           0 :         return NULL;
     136      209660 :     if (n % 2) {
     137           0 :         PyErr_SetString(PyExc_SystemError,
     138             :                         "Bad dict format");
     139           0 :         do_ignore(p_format, p_va, endchar, n, flags);
     140           0 :         return NULL;
     141             :     }
     142             :     /* Note that we can't bail immediately on error as this will leak
     143             :        refcounts on any 'N' arguments. */
     144      209660 :     if ((d = PyDict_New()) == NULL) {
     145           0 :         do_ignore(p_format, p_va, endchar, n, flags);
     146           0 :         return NULL;
     147             :     }
     148      939848 :     for (i = 0; i < n; i+= 2) {
     149             :         PyObject *k, *v;
     150             : 
     151      730192 :         k = do_mkvalue(p_format, p_va, flags);
     152      730192 :         if (k == NULL) {
     153           2 :             do_ignore(p_format, p_va, endchar, n - i - 1, flags);
     154           2 :             Py_DECREF(d);
     155           2 :             return NULL;
     156             :         }
     157      730190 :         v = do_mkvalue(p_format, p_va, flags);
     158      730190 :         if (v == NULL || PyDict_SetItem(d, k, v) < 0) {
     159           2 :             do_ignore(p_format, p_va, endchar, n - i - 2, flags);
     160           2 :             Py_DECREF(k);
     161           2 :             Py_XDECREF(v);
     162           2 :             Py_DECREF(d);
     163           2 :             return NULL;
     164             :         }
     165      730188 :         Py_DECREF(k);
     166      730188 :         Py_DECREF(v);
     167             :     }
     168      209656 :     if (**p_format != endchar) {
     169           0 :         Py_DECREF(d);
     170           0 :         PyErr_SetString(PyExc_SystemError,
     171             :                         "Unmatched paren in format");
     172           0 :         return NULL;
     173             :     }
     174      209656 :     if (endchar)
     175      209656 :         ++*p_format;
     176      209656 :     return d;
     177             : }
     178             : 
     179             : static PyObject *
     180           5 : do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
     181             : {
     182             :     PyObject *v;
     183             :     Py_ssize_t i;
     184           5 :     if (n < 0)
     185           0 :         return NULL;
     186             :     /* Note that we can't bail immediately on error as this will leak
     187             :        refcounts on any 'N' arguments. */
     188           5 :     v = PyList_New(n);
     189           5 :     if (v == NULL) {
     190           0 :         do_ignore(p_format, p_va, endchar, n, flags);
     191           0 :         return NULL;
     192             :     }
     193          13 :     for (i = 0; i < n; i++) {
     194          10 :         PyObject *w = do_mkvalue(p_format, p_va, flags);
     195          10 :         if (w == NULL) {
     196           2 :             do_ignore(p_format, p_va, endchar, n - i - 1, flags);
     197           2 :             Py_DECREF(v);
     198           2 :             return NULL;
     199             :         }
     200           8 :         PyList_SET_ITEM(v, i, w);
     201             :     }
     202           3 :     if (**p_format != endchar) {
     203           0 :         Py_DECREF(v);
     204           0 :         PyErr_SetString(PyExc_SystemError,
     205             :                         "Unmatched paren in format");
     206           0 :         return NULL;
     207             :     }
     208           3 :     if (endchar)
     209           3 :         ++*p_format;
     210           3 :     return v;
     211             : }
     212             : 
     213             : static int
     214     2198990 : do_mkstack(PyObject **stack, const char **p_format, va_list *p_va,
     215             :            char endchar, Py_ssize_t n, int flags)
     216             : {
     217             :     Py_ssize_t i;
     218             : 
     219     2198990 :     if (n < 0) {
     220           0 :         return -1;
     221             :     }
     222             :     /* Note that we can't bail immediately on error as this will leak
     223             :        refcounts on any 'N' arguments. */
     224     9017060 :     for (i = 0; i < n; i++) {
     225     6818070 :         PyObject *w = do_mkvalue(p_format, p_va, flags);
     226     6818070 :         if (w == NULL) {
     227           0 :             do_ignore(p_format, p_va, endchar, n - i - 1, flags);
     228           0 :             goto error;
     229             :         }
     230     6818070 :         stack[i] = w;
     231             :     }
     232     2198990 :     if (**p_format != endchar) {
     233           0 :         PyErr_SetString(PyExc_SystemError,
     234             :                         "Unmatched paren in format");
     235           0 :         goto error;
     236             :     }
     237     2198990 :     if (endchar) {
     238           0 :         ++*p_format;
     239             :     }
     240     2198990 :     return 0;
     241             : 
     242           0 : error:
     243           0 :     n = i;
     244           0 :     for (i=0; i < n; i++) {
     245           0 :         Py_DECREF(stack[i]);
     246             :     }
     247           0 :     return -1;
     248             : }
     249             : 
     250             : static PyObject *
     251     6377950 : do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
     252             : {
     253             :     PyObject *v;
     254             :     Py_ssize_t i;
     255     6377950 :     if (n < 0)
     256           0 :         return NULL;
     257             :     /* Note that we can't bail immediately on error as this will leak
     258             :        refcounts on any 'N' arguments. */
     259     6377950 :     if ((v = PyTuple_New(n)) == NULL) {
     260           0 :         do_ignore(p_format, p_va, endchar, n, flags);
     261           0 :         return NULL;
     262             :     }
     263    21462200 :     for (i = 0; i < n; i++) {
     264    15084200 :         PyObject *w = do_mkvalue(p_format, p_va, flags);
     265    15084200 :         if (w == NULL) {
     266          18 :             do_ignore(p_format, p_va, endchar, n - i - 1, flags);
     267          18 :             Py_DECREF(v);
     268          18 :             return NULL;
     269             :         }
     270    15084200 :         PyTuple_SET_ITEM(v, i, w);
     271             :     }
     272     6377930 :     if (**p_format != endchar) {
     273           0 :         Py_DECREF(v);
     274           0 :         PyErr_SetString(PyExc_SystemError,
     275             :                         "Unmatched paren in format");
     276           0 :         return NULL;
     277             :     }
     278     6377930 :     if (endchar)
     279     2996000 :         ++*p_format;
     280     6377930 :     return v;
     281             : }
     282             : 
     283             : static PyObject *
     284    28602300 : do_mkvalue(const char **p_format, va_list *p_va, int flags)
     285             : {
     286             : #define ERROR_NEED_PY_SSIZE_T_CLEAN \
     287             :     { \
     288             :         PyErr_SetString(PyExc_SystemError, \
     289             :                         "PY_SSIZE_T_CLEAN macro must be defined for '#' formats"); \
     290             :         return NULL; \
     291             :     }
     292             : 
     293             :     for (;;) {
     294    28602300 :         switch (*(*p_format)++) {
     295     2996000 :         case '(':
     296     2996000 :             return do_mktuple(p_format, p_va, ')',
     297             :                               countformat(*p_format, ')'), flags);
     298             : 
     299           5 :         case '[':
     300           5 :             return do_mklist(p_format, p_va, ']',
     301             :                              countformat(*p_format, ']'), flags);
     302             : 
     303      209660 :         case '{':
     304      209660 :             return do_mkdict(p_format, p_va, '}',
     305             :                              countformat(*p_format, '}'), flags);
     306             : 
     307     5340440 :         case 'b':
     308             :         case 'B':
     309             :         case 'h':
     310             :         case 'i':
     311     5340440 :             return PyLong_FromLong((long)va_arg(*p_va, int));
     312             : 
     313           0 :         case 'H':
     314           0 :             return PyLong_FromLong((long)va_arg(*p_va, unsigned int));
     315             : 
     316       45348 :         case 'I':
     317             :         {
     318             :             unsigned int n;
     319       45348 :             n = va_arg(*p_va, unsigned int);
     320       45348 :             return PyLong_FromUnsignedLong(n);
     321             :         }
     322             : 
     323      747174 :         case 'n':
     324             : #if SIZEOF_SIZE_T!=SIZEOF_LONG
     325             :             return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t));
     326             : #endif
     327             :             /* Fall through from 'n' to 'l' if Py_ssize_t is long */
     328             :         case 'l':
     329      747174 :             return PyLong_FromLong(va_arg(*p_va, long));
     330             : 
     331         986 :         case 'k':
     332             :         {
     333             :             unsigned long n;
     334         986 :             n = va_arg(*p_va, unsigned long);
     335         986 :             return PyLong_FromUnsignedLong(n);
     336             :         }
     337             : 
     338           2 :         case 'L':
     339           2 :             return PyLong_FromLongLong((long long)va_arg(*p_va, long long));
     340             : 
     341       38328 :         case 'K':
     342       38328 :             return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long));
     343             : 
     344         101 :         case 'u':
     345             :         {
     346             :             PyObject *v;
     347         101 :             Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
     348             :             Py_ssize_t n;
     349         101 :             if (**p_format == '#') {
     350           1 :                 ++*p_format;
     351           1 :                 if (flags & FLAG_SIZE_T) {
     352           0 :                     n = va_arg(*p_va, Py_ssize_t);
     353             :                 }
     354             :                 else {
     355           1 :                     n = va_arg(*p_va, int);
     356           1 :                     ERROR_NEED_PY_SSIZE_T_CLEAN;
     357             :                 }
     358             :             }
     359             :             else
     360         100 :                 n = -1;
     361         100 :             if (u == NULL) {
     362           0 :                 v = Py_None;
     363           0 :                 Py_INCREF(v);
     364             :             }
     365             :             else {
     366         100 :                 if (n < 0)
     367         100 :                     n = wcslen(u);
     368         100 :                 v = PyUnicode_FromWideChar(u, n);
     369             :             }
     370         100 :             return v;
     371             :         }
     372      534507 :         case 'f':
     373             :         case 'd':
     374      534507 :             return PyFloat_FromDouble(
     375      534507 :                 (double)va_arg(*p_va, va_double));
     376             : 
     377           0 :         case 'D':
     378           0 :             return PyComplex_FromCComplex(
     379           0 :                 *((Py_complex *)va_arg(*p_va, Py_complex *)));
     380             : 
     381       58806 :         case 'c':
     382             :         {
     383             :             char p[1];
     384       58806 :             p[0] = (char)va_arg(*p_va, int);
     385       58806 :             return PyBytes_FromStringAndSize(p, 1);
     386             :         }
     387       72705 :         case 'C':
     388             :         {
     389       72705 :             int i = va_arg(*p_va, int);
     390       72705 :             return PyUnicode_FromOrdinal(i);
     391             :         }
     392             : 
     393     2429480 :         case 's':
     394             :         case 'z':
     395             :         case 'U':   /* XXX deprecated alias */
     396             :         {
     397             :             PyObject *v;
     398     2429480 :             const char *str = va_arg(*p_va, const char *);
     399             :             Py_ssize_t n;
     400     2429480 :             if (**p_format == '#') {
     401         539 :                 ++*p_format;
     402         539 :                 if (flags & FLAG_SIZE_T) {
     403         537 :                     n = va_arg(*p_va, Py_ssize_t);
     404             :                 }
     405             :                 else {
     406           2 :                     n = va_arg(*p_va, int);
     407           2 :                     ERROR_NEED_PY_SSIZE_T_CLEAN;
     408             :                 }
     409             :             }
     410             :             else
     411     2428940 :                 n = -1;
     412     2429480 :             if (str == NULL) {
     413       23566 :                 v = Py_None;
     414       23566 :                 Py_INCREF(v);
     415             :             }
     416             :             else {
     417     2405910 :                 if (n < 0) {
     418     2405370 :                     size_t m = strlen(str);
     419     2405370 :                     if (m > PY_SSIZE_T_MAX) {
     420           0 :                         PyErr_SetString(PyExc_OverflowError,
     421             :                             "string too long for Python string");
     422           0 :                         return NULL;
     423             :                     }
     424     2405370 :                     n = (Py_ssize_t)m;
     425             :                 }
     426     2405910 :                 v = PyUnicode_FromStringAndSize(str, n);
     427             :             }
     428     2429480 :             return v;
     429             :         }
     430             : 
     431      111222 :         case 'y':
     432             :         {
     433             :             PyObject *v;
     434      111222 :             const char *str = va_arg(*p_va, const char *);
     435             :             Py_ssize_t n;
     436      111222 :             if (**p_format == '#') {
     437       37049 :                 ++*p_format;
     438       37049 :                 if (flags & FLAG_SIZE_T) {
     439       37048 :                     n = va_arg(*p_va, Py_ssize_t);
     440             :                 }
     441             :                 else {
     442           1 :                     n = va_arg(*p_va, int);
     443           1 :                     ERROR_NEED_PY_SSIZE_T_CLEAN;
     444             :                 }
     445             :             }
     446             :             else
     447       74173 :                 n = -1;
     448      111221 :             if (str == NULL) {
     449           0 :                 v = Py_None;
     450           0 :                 Py_INCREF(v);
     451             :             }
     452             :             else {
     453      111221 :                 if (n < 0) {
     454       74173 :                     size_t m = strlen(str);
     455       74173 :                     if (m > PY_SSIZE_T_MAX) {
     456           0 :                         PyErr_SetString(PyExc_OverflowError,
     457             :                             "string too long for Python bytes");
     458           0 :                         return NULL;
     459             :                     }
     460       74173 :                     n = (Py_ssize_t)m;
     461             :                 }
     462      111221 :                 v = PyBytes_FromStringAndSize(str, n);
     463             :             }
     464      111221 :             return v;
     465             :         }
     466             : 
     467    16017200 :         case 'N':
     468             :         case 'S':
     469             :         case 'O':
     470    16017200 :         if (**p_format == '&') {
     471             :             typedef PyObject *(*converter)(void *);
     472     2807670 :             converter func = va_arg(*p_va, converter);
     473     2807670 :             void *arg = va_arg(*p_va, void *);
     474     2807670 :             ++*p_format;
     475     2807670 :             return (*func)(arg);
     476             :         }
     477             :         else {
     478             :             PyObject *v;
     479    13209500 :             v = va_arg(*p_va, PyObject *);
     480    13209500 :             if (v != NULL) {
     481    13209500 :                 if (*(*p_format - 1) != 'N')
     482    12183500 :                     Py_INCREF(v);
     483             :             }
     484          10 :             else if (!PyErr_Occurred())
     485             :                 /* If a NULL was passed
     486             :                  * because a call that should
     487             :                  * have constructed a value
     488             :                  * failed, that's OK, and we
     489             :                  * pass the error on; but if
     490             :                  * no error occurred it's not
     491             :                  * clear that the caller knew
     492             :                  * what she was doing. */
     493           0 :                 PyErr_SetString(PyExc_SystemError,
     494             :                     "NULL object passed to Py_BuildValue");
     495    13209500 :             return v;
     496             :         }
     497             : 
     498         393 :         case ':':
     499             :         case ',':
     500             :         case ' ':
     501             :         case '\t':
     502         393 :             break;
     503             : 
     504           0 :         default:
     505           0 :             PyErr_SetString(PyExc_SystemError,
     506             :                 "bad format char passed to Py_BuildValue");
     507           0 :             return NULL;
     508             : 
     509             :         }
     510             :     }
     511             : 
     512             : #undef ERROR_NEED_PY_SSIZE_T_CLEAN
     513             : }
     514             : 
     515             : 
     516             : PyObject *
     517     2845450 : Py_BuildValue(const char *format, ...)
     518             : {
     519             :     va_list va;
     520             :     PyObject* retval;
     521     2845450 :     va_start(va, format);
     522     2845450 :     retval = va_build_value(format, va, 0);
     523     2845450 :     va_end(va);
     524     2845450 :     return retval;
     525             : }
     526             : 
     527             : PyObject *
     528     1392570 : _Py_BuildValue_SizeT(const char *format, ...)
     529             : {
     530             :     va_list va;
     531             :     PyObject* retval;
     532     1392570 :     va_start(va, format);
     533     1392570 :     retval = va_build_value(format, va, FLAG_SIZE_T);
     534     1392570 :     va_end(va);
     535     1392570 :     return retval;
     536             : }
     537             : 
     538             : PyObject *
     539           0 : Py_VaBuildValue(const char *format, va_list va)
     540             : {
     541           0 :     return va_build_value(format, va, 0);
     542             : }
     543             : 
     544             : PyObject *
     545     4383130 : _Py_VaBuildValue_SizeT(const char *format, va_list va)
     546             : {
     547     4383130 :     return va_build_value(format, va, FLAG_SIZE_T);
     548             : }
     549             : 
     550             : static PyObject *
     551     8621150 : va_build_value(const char *format, va_list va, int flags)
     552             : {
     553     8621150 :     const char *f = format;
     554     8621150 :     Py_ssize_t n = countformat(f, '\0');
     555             :     va_list lva;
     556             :     PyObject *retval;
     557             : 
     558     8621150 :     if (n < 0)
     559           0 :         return NULL;
     560     8621150 :     if (n == 0) {
     561           0 :         Py_RETURN_NONE;
     562             :     }
     563     8621150 :     va_copy(lva, va);
     564     8621150 :     if (n == 1) {
     565     5239200 :         retval = do_mkvalue(&f, &lva, flags);
     566             :     } else {
     567     3381950 :         retval = do_mktuple(&f, &lva, '\0', n, flags);
     568             :     }
     569     8621150 :     va_end(lva);
     570     8621150 :     return retval;
     571             : }
     572             : 
     573             : PyObject **
     574      888627 : _Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len,
     575             :                 const char *format, va_list va, Py_ssize_t *p_nargs)
     576             : {
     577      888627 :     return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
     578             : }
     579             : 
     580             : PyObject **
     581     1310360 : _Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len,
     582             :                        const char *format, va_list va, Py_ssize_t *p_nargs)
     583             : {
     584     1310360 :     return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
     585             : }
     586             : 
     587             : static PyObject **
     588     2198990 : va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
     589             :                const char *format, va_list va, int flags, Py_ssize_t *p_nargs)
     590             : {
     591             :     const char *f;
     592             :     Py_ssize_t n;
     593             :     va_list lva;
     594             :     PyObject **stack;
     595             :     int res;
     596             : 
     597     2198990 :     n = countformat(format, '\0');
     598     2198990 :     if (n < 0) {
     599           0 :         *p_nargs = 0;
     600           0 :         return NULL;
     601             :     }
     602             : 
     603     2198990 :     if (n == 0) {
     604           0 :         *p_nargs = 0;
     605           0 :         return small_stack;
     606             :     }
     607             : 
     608     2198990 :     if (n <= small_stack_len) {
     609     2177720 :         stack = small_stack;
     610             :     }
     611             :     else {
     612       21275 :         stack = PyMem_Malloc(n * sizeof(stack[0]));
     613       21275 :         if (stack == NULL) {
     614           0 :             PyErr_NoMemory();
     615           0 :             return NULL;
     616             :         }
     617             :     }
     618             : 
     619     2198990 :     va_copy(lva, va);
     620     2198990 :     f = format;
     621     2198990 :     res = do_mkstack(stack, &f, &lva, '\0', n, flags);
     622     2198990 :     va_end(lva);
     623             : 
     624     2198990 :     if (res < 0) {
     625           0 :         if (stack != small_stack) {
     626           0 :             PyMem_Free(stack);
     627             :         }
     628           0 :         return NULL;
     629             :     }
     630             : 
     631     2198990 :     *p_nargs = n;
     632     2198990 :     return stack;
     633             : }
     634             : 
     635             : 
     636             : int
     637     2170450 : PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value)
     638             : {
     639     2170450 :     if (!PyModule_Check(mod)) {
     640           0 :         PyErr_SetString(PyExc_TypeError,
     641             :                         "PyModule_AddObjectRef() first argument "
     642             :                         "must be a module");
     643           0 :         return -1;
     644             :     }
     645     2170450 :     if (!value) {
     646           0 :         if (!PyErr_Occurred()) {
     647           0 :             PyErr_SetString(PyExc_SystemError,
     648             :                             "PyModule_AddObjectRef() must be called "
     649             :                             "with an exception raised if value is NULL");
     650             :         }
     651           0 :         return -1;
     652             :     }
     653             : 
     654     2170450 :     PyObject *dict = PyModule_GetDict(mod);
     655     2170450 :     if (dict == NULL) {
     656             :         /* Internal error -- modules must have a dict! */
     657           0 :         PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
     658             :                      PyModule_GetName(mod));
     659           0 :         return -1;
     660             :     }
     661             : 
     662     2170450 :     if (PyDict_SetItemString(dict, name, value)) {
     663           0 :         return -1;
     664             :     }
     665     2170450 :     return 0;
     666             : }
     667             : 
     668             : 
     669             : int
     670      208257 : PyModule_AddObject(PyObject *mod, const char *name, PyObject *value)
     671             : {
     672      208257 :     int res = PyModule_AddObjectRef(mod, name, value);
     673      208257 :     if (res == 0) {
     674      208257 :         Py_DECREF(value);
     675             :     }
     676      208257 :     return res;
     677             : }
     678             : 
     679             : int
     680     1612110 : PyModule_AddIntConstant(PyObject *m, const char *name, long value)
     681             : {
     682     1612110 :     PyObject *obj = PyLong_FromLong(value);
     683     1612110 :     if (!obj) {
     684           0 :         return -1;
     685             :     }
     686     1612110 :     int res = PyModule_AddObjectRef(m, name, obj);
     687     1612110 :     Py_DECREF(obj);
     688     1612110 :     return res;
     689             : }
     690             : 
     691             : int
     692        5906 : PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
     693             : {
     694        5906 :     PyObject *obj = PyUnicode_FromString(value);
     695        5906 :     if (!obj) {
     696           0 :         return -1;
     697             :     }
     698        5906 :     int res = PyModule_AddObjectRef(m, name, obj);
     699        5906 :     Py_DECREF(obj);
     700        5906 :     return res;
     701             : }
     702             : 
     703             : int
     704      148263 : PyModule_AddType(PyObject *module, PyTypeObject *type)
     705             : {
     706      148263 :     if (PyType_Ready(type) < 0) {
     707           0 :         return -1;
     708             :     }
     709             : 
     710      148263 :     const char *name = _PyType_Name(type);
     711      148263 :     assert(name != NULL);
     712             : 
     713      148263 :     return PyModule_AddObjectRef(module, name, (PyObject *)type);
     714             : }

Generated by: LCOV version 1.14