LCOV - code coverage report
Current view: top level - Objects - funcobject.c (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 349 498 70.1 %
Date: 2022-07-20 13:12:14 Functions: 42 53 79.2 %
Branches: 196 318 61.6 %

           Branch data     Line data    Source code
       1                 :            : 
       2                 :            : /* Function object implementation */
       3                 :            : 
       4                 :            : #include "Python.h"
       5                 :            : #include "pycore_ceval.h"         // _PyEval_BuiltinsFromGlobals()
       6                 :            : #include "pycore_object.h"        // _PyObject_GC_UNTRACK()
       7                 :            : #include "pycore_pyerrors.h"      // _PyErr_Occurred()
       8                 :            : #include "structmember.h"         // PyMemberDef
       9                 :            : 
      10                 :            : static uint32_t next_func_version = 1;
      11                 :            : 
      12                 :            : PyFunctionObject *
      13                 :     316431 : _PyFunction_FromConstructor(PyFrameConstructor *constr)
      14                 :            : {
      15                 :            : 
      16                 :     316431 :     PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type);
      17         [ -  + ]:     316431 :     if (op == NULL) {
      18                 :          0 :         return NULL;
      19                 :            :     }
      20                 :     316431 :     Py_INCREF(constr->fc_globals);
      21                 :     316431 :     op->func_globals = constr->fc_globals;
      22                 :     316431 :     Py_INCREF(constr->fc_builtins);
      23                 :     316431 :     op->func_builtins = constr->fc_builtins;
      24                 :     316431 :     Py_INCREF(constr->fc_name);
      25                 :     316431 :     op->func_name = constr->fc_name;
      26                 :     316431 :     Py_INCREF(constr->fc_qualname);
      27                 :     316431 :     op->func_qualname = constr->fc_qualname;
      28                 :     316431 :     Py_INCREF(constr->fc_code);
      29                 :     316431 :     op->func_code = constr->fc_code;
      30                 :     316431 :     op->func_defaults = NULL;
      31                 :     316431 :     op->func_kwdefaults = NULL;
      32                 :     316431 :     Py_XINCREF(constr->fc_closure);
      33                 :     316431 :     op->func_closure = constr->fc_closure;
      34                 :     316431 :     Py_INCREF(Py_None);
      35                 :     316431 :     op->func_doc = Py_None;
      36                 :     316431 :     op->func_dict = NULL;
      37                 :     316431 :     op->func_weakreflist = NULL;
      38                 :     316431 :     op->func_module = NULL;
      39                 :     316431 :     op->func_annotations = NULL;
      40                 :     316431 :     op->vectorcall = _PyFunction_Vectorcall;
      41                 :     316431 :     op->func_version = 0;
      42                 :     316431 :     _PyObject_GC_TRACK(op);
      43                 :     316431 :     return op;
      44                 :            : }
      45                 :            : 
      46                 :            : PyObject *
      47                 :   14551254 : PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
      48                 :            : {
      49                 :            :     assert(globals != NULL);
      50                 :            :     assert(PyDict_Check(globals));
      51                 :   14551254 :     Py_INCREF(globals);
      52                 :            : 
      53                 :   14551254 :     PyThreadState *tstate = _PyThreadState_GET();
      54                 :            : 
      55                 :   14551254 :     PyCodeObject *code_obj = (PyCodeObject *)code;
      56                 :   14551254 :     Py_INCREF(code_obj);
      57                 :            : 
      58                 :   14551254 :     PyObject *name = code_obj->co_name;
      59                 :            :     assert(name != NULL);
      60                 :   14551254 :     Py_INCREF(name);
      61                 :            : 
      62         [ +  - ]:   14551254 :     if (!qualname) {
      63                 :   14551254 :         qualname = code_obj->co_qualname;
      64                 :            :     }
      65                 :            :     assert(qualname != NULL);
      66                 :   14551254 :     Py_INCREF(qualname);
      67                 :            : 
      68                 :   14551254 :     PyObject *consts = code_obj->co_consts;
      69                 :            :     assert(PyTuple_Check(consts));
      70                 :            :     PyObject *doc;
      71         [ +  + ]:   14551254 :     if (PyTuple_Size(consts) >= 1) {
      72                 :   11205490 :         doc = PyTuple_GetItem(consts, 0);
      73         [ +  + ]:   11205490 :         if (!PyUnicode_Check(doc)) {
      74                 :    7114315 :             doc = Py_None;
      75                 :            :         }
      76                 :            :     }
      77                 :            :     else {
      78                 :    3345764 :         doc = Py_None;
      79                 :            :     }
      80                 :   14551254 :     Py_INCREF(doc);
      81                 :            : 
      82                 :            :     // __module__: Use globals['__name__'] if it exists, or NULL.
      83                 :   14551254 :     PyObject *module = PyDict_GetItemWithError(globals, &_Py_ID(__name__));
      84                 :   14551254 :     PyObject *builtins = NULL;
      85   [ +  +  -  + ]:   14551254 :     if (module == NULL && _PyErr_Occurred(tstate)) {
      86                 :          0 :         goto error;
      87                 :            :     }
      88                 :   14551254 :     Py_XINCREF(module);
      89                 :            : 
      90                 :   14551254 :     builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
      91         [ -  + ]:   14551254 :     if (builtins == NULL) {
      92                 :          0 :         goto error;
      93                 :            :     }
      94                 :   14551254 :     Py_INCREF(builtins);
      95                 :            : 
      96                 :   14551254 :     PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type);
      97         [ -  + ]:   14551254 :     if (op == NULL) {
      98                 :          0 :         goto error;
      99                 :            :     }
     100                 :            :     /* Note: No failures from this point on, since func_dealloc() does not
     101                 :            :        expect a partially-created object. */
     102                 :            : 
     103                 :   14551254 :     op->func_globals = globals;
     104                 :   14551254 :     op->func_builtins = builtins;
     105                 :   14551254 :     op->func_name = name;
     106                 :   14551254 :     op->func_qualname = qualname;
     107                 :   14551254 :     op->func_code = (PyObject*)code_obj;
     108                 :   14551254 :     op->func_defaults = NULL;    // No default positional arguments
     109                 :   14551254 :     op->func_kwdefaults = NULL;  // No default keyword arguments
     110                 :   14551254 :     op->func_closure = NULL;
     111                 :   14551254 :     op->func_doc = doc;
     112                 :   14551254 :     op->func_dict = NULL;
     113                 :   14551254 :     op->func_weakreflist = NULL;
     114                 :   14551254 :     op->func_module = module;
     115                 :   14551254 :     op->func_annotations = NULL;
     116                 :   14551254 :     op->vectorcall = _PyFunction_Vectorcall;
     117                 :   14551254 :     op->func_version = 0;
     118                 :   14551254 :     _PyObject_GC_TRACK(op);
     119                 :   14551254 :     return (PyObject *)op;
     120                 :            : 
     121                 :          0 : error:
     122                 :          0 :     Py_DECREF(globals);
     123                 :          0 :     Py_DECREF(code_obj);
     124                 :          0 :     Py_DECREF(name);
     125                 :          0 :     Py_DECREF(qualname);
     126                 :          0 :     Py_DECREF(doc);
     127                 :          0 :     Py_XDECREF(module);
     128                 :          0 :     Py_XDECREF(builtins);
     129                 :          0 :     return NULL;
     130                 :            : }
     131                 :            : 
     132                 :     747345 : uint32_t _PyFunction_GetVersionForCurrentState(PyFunctionObject *func)
     133                 :            : {
     134         [ +  + ]:     747345 :     if (func->func_version != 0) {
     135                 :     352993 :         return func->func_version;
     136                 :            :     }
     137         [ -  + ]:     394352 :     if (next_func_version == 0) {
     138                 :          0 :         return 0;
     139                 :            :     }
     140                 :     394352 :     uint32_t v = next_func_version++;
     141                 :     394352 :     func->func_version = v;
     142                 :     394352 :     return v;
     143                 :            : }
     144                 :            : 
     145                 :            : PyObject *
     146                 :   14551254 : PyFunction_New(PyObject *code, PyObject *globals)
     147                 :            : {
     148                 :   14551254 :     return PyFunction_NewWithQualName(code, globals, NULL);
     149                 :            : }
     150                 :            : 
     151                 :            : PyObject *
     152                 :          0 : PyFunction_GetCode(PyObject *op)
     153                 :            : {
     154         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     155                 :          0 :         PyErr_BadInternalCall();
     156                 :          0 :         return NULL;
     157                 :            :     }
     158                 :          0 :     return ((PyFunctionObject *) op) -> func_code;
     159                 :            : }
     160                 :            : 
     161                 :            : PyObject *
     162                 :          0 : PyFunction_GetGlobals(PyObject *op)
     163                 :            : {
     164         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     165                 :          0 :         PyErr_BadInternalCall();
     166                 :          0 :         return NULL;
     167                 :            :     }
     168                 :          0 :     return ((PyFunctionObject *) op) -> func_globals;
     169                 :            : }
     170                 :            : 
     171                 :            : PyObject *
     172                 :          0 : PyFunction_GetModule(PyObject *op)
     173                 :            : {
     174         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     175                 :          0 :         PyErr_BadInternalCall();
     176                 :          0 :         return NULL;
     177                 :            :     }
     178                 :          0 :     return ((PyFunctionObject *) op) -> func_module;
     179                 :            : }
     180                 :            : 
     181                 :            : PyObject *
     182                 :          0 : PyFunction_GetDefaults(PyObject *op)
     183                 :            : {
     184         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     185                 :          0 :         PyErr_BadInternalCall();
     186                 :          0 :         return NULL;
     187                 :            :     }
     188                 :          0 :     return ((PyFunctionObject *) op) -> func_defaults;
     189                 :            : }
     190                 :            : 
     191                 :            : int
     192                 :          0 : PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
     193                 :            : {
     194         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     195                 :          0 :         PyErr_BadInternalCall();
     196                 :          0 :         return -1;
     197                 :            :     }
     198         [ #  # ]:          0 :     if (defaults == Py_None)
     199                 :          0 :         defaults = NULL;
     200   [ #  #  #  # ]:          0 :     else if (defaults && PyTuple_Check(defaults)) {
     201                 :          0 :         Py_INCREF(defaults);
     202                 :            :     }
     203                 :            :     else {
     204                 :          0 :         PyErr_SetString(PyExc_SystemError, "non-tuple default args");
     205                 :          0 :         return -1;
     206                 :            :     }
     207                 :          0 :     ((PyFunctionObject *)op)->func_version = 0;
     208                 :          0 :     Py_XSETREF(((PyFunctionObject *)op)->func_defaults, defaults);
     209                 :          0 :     return 0;
     210                 :            : }
     211                 :            : 
     212                 :            : PyObject *
     213                 :          0 : PyFunction_GetKwDefaults(PyObject *op)
     214                 :            : {
     215         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     216                 :          0 :         PyErr_BadInternalCall();
     217                 :          0 :         return NULL;
     218                 :            :     }
     219                 :          0 :     return ((PyFunctionObject *) op) -> func_kwdefaults;
     220                 :            : }
     221                 :            : 
     222                 :            : int
     223                 :          0 : PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
     224                 :            : {
     225         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     226                 :          0 :         PyErr_BadInternalCall();
     227                 :          0 :         return -1;
     228                 :            :     }
     229         [ #  # ]:          0 :     if (defaults == Py_None)
     230                 :          0 :         defaults = NULL;
     231   [ #  #  #  # ]:          0 :     else if (defaults && PyDict_Check(defaults)) {
     232                 :          0 :         Py_INCREF(defaults);
     233                 :            :     }
     234                 :            :     else {
     235                 :          0 :         PyErr_SetString(PyExc_SystemError,
     236                 :            :                         "non-dict keyword only default args");
     237                 :          0 :         return -1;
     238                 :            :     }
     239                 :          0 :     ((PyFunctionObject *)op)->func_version = 0;
     240                 :          0 :     Py_XSETREF(((PyFunctionObject *)op)->func_kwdefaults, defaults);
     241                 :          0 :     return 0;
     242                 :            : }
     243                 :            : 
     244                 :            : PyObject *
     245                 :          0 : PyFunction_GetClosure(PyObject *op)
     246                 :            : {
     247         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     248                 :          0 :         PyErr_BadInternalCall();
     249                 :          0 :         return NULL;
     250                 :            :     }
     251                 :          0 :     return ((PyFunctionObject *) op) -> func_closure;
     252                 :            : }
     253                 :            : 
     254                 :            : int
     255                 :          0 : PyFunction_SetClosure(PyObject *op, PyObject *closure)
     256                 :            : {
     257         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     258                 :          0 :         PyErr_BadInternalCall();
     259                 :          0 :         return -1;
     260                 :            :     }
     261         [ #  # ]:          0 :     if (closure == Py_None)
     262                 :          0 :         closure = NULL;
     263         [ #  # ]:          0 :     else if (PyTuple_Check(closure)) {
     264                 :          0 :         Py_INCREF(closure);
     265                 :            :     }
     266                 :            :     else {
     267                 :          0 :         PyErr_Format(PyExc_SystemError,
     268                 :            :                      "expected tuple for closure, got '%.100s'",
     269                 :          0 :                      Py_TYPE(closure)->tp_name);
     270                 :          0 :         return -1;
     271                 :            :     }
     272                 :          0 :     ((PyFunctionObject *)op)->func_version = 0;
     273                 :          0 :     Py_XSETREF(((PyFunctionObject *)op)->func_closure, closure);
     274                 :          0 :     return 0;
     275                 :            : }
     276                 :            : 
     277                 :            : static PyObject *
     278                 :     401995 : func_get_annotation_dict(PyFunctionObject *op)
     279                 :            : {
     280         [ -  + ]:     401995 :     if (op->func_annotations == NULL) {
     281                 :          0 :         return NULL;
     282                 :            :     }
     283         [ +  + ]:     401995 :     if (PyTuple_CheckExact(op->func_annotations)) {
     284                 :       3123 :         PyObject *ann_tuple = op->func_annotations;
     285                 :       3123 :         PyObject *ann_dict = PyDict_New();
     286         [ -  + ]:       3123 :         if (ann_dict == NULL) {
     287                 :          0 :             return NULL;
     288                 :            :         }
     289                 :            : 
     290                 :            :         assert(PyTuple_GET_SIZE(ann_tuple) % 2 == 0);
     291                 :            : 
     292         [ +  + ]:      11273 :         for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(ann_tuple); i += 2) {
     293                 :       8150 :             int err = PyDict_SetItem(ann_dict,
     294                 :            :                                      PyTuple_GET_ITEM(ann_tuple, i),
     295                 :       8150 :                                      PyTuple_GET_ITEM(ann_tuple, i + 1));
     296                 :            : 
     297         [ -  + ]:       8150 :             if (err < 0) {
     298                 :          0 :                 return NULL;
     299                 :            :             }
     300                 :            :         }
     301                 :       3123 :         Py_SETREF(op->func_annotations, ann_dict);
     302                 :            :     }
     303                 :     401995 :     Py_INCREF(op->func_annotations);
     304                 :            :     assert(PyDict_Check(op->func_annotations));
     305                 :     401995 :     return op->func_annotations;
     306                 :            : }
     307                 :            : 
     308                 :            : PyObject *
     309                 :          0 : PyFunction_GetAnnotations(PyObject *op)
     310                 :            : {
     311         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     312                 :          0 :         PyErr_BadInternalCall();
     313                 :          0 :         return NULL;
     314                 :            :     }
     315                 :          0 :     return func_get_annotation_dict((PyFunctionObject *)op);
     316                 :            : }
     317                 :            : 
     318                 :            : int
     319                 :          0 : PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
     320                 :            : {
     321         [ #  # ]:          0 :     if (!PyFunction_Check(op)) {
     322                 :          0 :         PyErr_BadInternalCall();
     323                 :          0 :         return -1;
     324                 :            :     }
     325         [ #  # ]:          0 :     if (annotations == Py_None)
     326                 :          0 :         annotations = NULL;
     327   [ #  #  #  # ]:          0 :     else if (annotations && PyDict_Check(annotations)) {
     328                 :          0 :         Py_INCREF(annotations);
     329                 :            :     }
     330                 :            :     else {
     331                 :          0 :         PyErr_SetString(PyExc_SystemError,
     332                 :            :                         "non-dict annotations");
     333                 :          0 :         return -1;
     334                 :            :     }
     335                 :          0 :     ((PyFunctionObject *)op)->func_version = 0;
     336                 :          0 :     Py_XSETREF(((PyFunctionObject *)op)->func_annotations, annotations);
     337                 :          0 :     return 0;
     338                 :            : }
     339                 :            : 
     340                 :            : /* Methods */
     341                 :            : 
     342                 :            : #define OFF(x) offsetof(PyFunctionObject, x)
     343                 :            : 
     344                 :            : static PyMemberDef func_memberlist[] = {
     345                 :            :     {"__closure__",   T_OBJECT,     OFF(func_closure), READONLY},
     346                 :            :     {"__doc__",       T_OBJECT,     OFF(func_doc), 0},
     347                 :            :     {"__globals__",   T_OBJECT,     OFF(func_globals), READONLY},
     348                 :            :     {"__module__",    T_OBJECT,     OFF(func_module), 0},
     349                 :            :     {"__builtins__",  T_OBJECT,     OFF(func_builtins), READONLY},
     350                 :            :     {NULL}  /* Sentinel */
     351                 :            : };
     352                 :            : 
     353                 :            : static PyObject *
     354                 :      30304 : func_get_code(PyFunctionObject *op, void *Py_UNUSED(ignored))
     355                 :            : {
     356         [ -  + ]:      30304 :     if (PySys_Audit("object.__getattr__", "Os", op, "__code__") < 0) {
     357                 :          0 :         return NULL;
     358                 :            :     }
     359                 :            : 
     360                 :      30304 :     Py_INCREF(op->func_code);
     361                 :      30304 :     return op->func_code;
     362                 :            : }
     363                 :            : 
     364                 :            : static int
     365                 :        832 : func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
     366                 :            : {
     367                 :            :     Py_ssize_t nclosure;
     368                 :            :     int nfree;
     369                 :            : 
     370                 :            :     /* Not legal to del f.func_code or to set it to anything
     371                 :            :      * other than a code object. */
     372   [ +  -  -  + ]:        832 :     if (value == NULL || !PyCode_Check(value)) {
     373                 :          0 :         PyErr_SetString(PyExc_TypeError,
     374                 :            :                         "__code__ must be set to a code object");
     375                 :          0 :         return -1;
     376                 :            :     }
     377                 :            : 
     378         [ -  + ]:        832 :     if (PySys_Audit("object.__setattr__", "OsO",
     379                 :            :                     op, "__code__", value) < 0) {
     380                 :          0 :         return -1;
     381                 :            :     }
     382                 :            : 
     383                 :        832 :     nfree = ((PyCodeObject *)value)->co_nfreevars;
     384         [ +  + ]:        832 :     nclosure = (op->func_closure == NULL ? 0 :
     385                 :          6 :             PyTuple_GET_SIZE(op->func_closure));
     386         [ +  + ]:        832 :     if (nclosure != nfree) {
     387                 :          2 :         PyErr_Format(PyExc_ValueError,
     388                 :            :                      "%U() requires a code object with %zd free vars,"
     389                 :            :                      " not %zd",
     390                 :            :                      op->func_name,
     391                 :            :                      nclosure, nfree);
     392                 :          2 :         return -1;
     393                 :            :     }
     394                 :        830 :     op->func_version = 0;
     395                 :        830 :     Py_INCREF(value);
     396                 :        830 :     Py_XSETREF(op->func_code, value);
     397                 :        830 :     return 0;
     398                 :            : }
     399                 :            : 
     400                 :            : static PyObject *
     401                 :     700182 : func_get_name(PyFunctionObject *op, void *Py_UNUSED(ignored))
     402                 :            : {
     403                 :     700182 :     Py_INCREF(op->func_name);
     404                 :     700182 :     return op->func_name;
     405                 :            : }
     406                 :            : 
     407                 :            : static int
     408                 :     133402 : func_set_name(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
     409                 :            : {
     410                 :            :     /* Not legal to del f.func_name or to set it to anything
     411                 :            :      * other than a string object. */
     412   [ +  +  +  + ]:     133402 :     if (value == NULL || !PyUnicode_Check(value)) {
     413                 :          2 :         PyErr_SetString(PyExc_TypeError,
     414                 :            :                         "__name__ must be set to a string object");
     415                 :          2 :         return -1;
     416                 :            :     }
     417                 :     133400 :     Py_INCREF(value);
     418                 :     133400 :     Py_XSETREF(op->func_name, value);
     419                 :     133400 :     return 0;
     420                 :            : }
     421                 :            : 
     422                 :            : static PyObject *
     423                 :     471255 : func_get_qualname(PyFunctionObject *op, void *Py_UNUSED(ignored))
     424                 :            : {
     425                 :     471255 :     Py_INCREF(op->func_qualname);
     426                 :     471255 :     return op->func_qualname;
     427                 :            : }
     428                 :            : 
     429                 :            : static int
     430                 :     265264 : func_set_qualname(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
     431                 :            : {
     432                 :            :     /* Not legal to del f.__qualname__ or to set it to anything
     433                 :            :      * other than a string object. */
     434   [ +  +  +  + ]:     265264 :     if (value == NULL || !PyUnicode_Check(value)) {
     435                 :          2 :         PyErr_SetString(PyExc_TypeError,
     436                 :            :                         "__qualname__ must be set to a string object");
     437                 :          2 :         return -1;
     438                 :            :     }
     439                 :     265262 :     Py_INCREF(value);
     440                 :     265262 :     Py_XSETREF(op->func_qualname, value);
     441                 :     265262 :     return 0;
     442                 :            : }
     443                 :            : 
     444                 :            : static PyObject *
     445                 :       4063 : func_get_defaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
     446                 :            : {
     447         [ -  + ]:       4063 :     if (PySys_Audit("object.__getattr__", "Os", op, "__defaults__") < 0) {
     448                 :          0 :         return NULL;
     449                 :            :     }
     450         [ +  + ]:       4063 :     if (op->func_defaults == NULL) {
     451                 :       2831 :         Py_RETURN_NONE;
     452                 :            :     }
     453                 :       1232 :     Py_INCREF(op->func_defaults);
     454                 :       1232 :     return op->func_defaults;
     455                 :            : }
     456                 :            : 
     457                 :            : static int
     458                 :       4878 : func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
     459                 :            : {
     460                 :            :     /* Legal to del f.func_defaults.
     461                 :            :      * Can only set func_defaults to NULL or a tuple. */
     462         [ +  + ]:       4878 :     if (value == Py_None)
     463                 :        253 :         value = NULL;
     464   [ +  +  -  + ]:       4878 :     if (value != NULL && !PyTuple_Check(value)) {
     465                 :          0 :         PyErr_SetString(PyExc_TypeError,
     466                 :            :                         "__defaults__ must be set to a tuple object");
     467                 :          0 :         return -1;
     468                 :            :     }
     469         [ +  + ]:       4878 :     if (value) {
     470         [ -  + ]:       4622 :         if (PySys_Audit("object.__setattr__", "OsO",
     471                 :            :                         op, "__defaults__", value) < 0) {
     472                 :          0 :             return -1;
     473                 :            :         }
     474         [ -  + ]:        256 :     } else if (PySys_Audit("object.__delattr__", "Os",
     475                 :            :                            op, "__defaults__") < 0) {
     476                 :          0 :         return -1;
     477                 :            :     }
     478                 :            : 
     479                 :       4878 :     op->func_version = 0;
     480                 :       4878 :     Py_XINCREF(value);
     481                 :       4878 :     Py_XSETREF(op->func_defaults, value);
     482                 :       4878 :     return 0;
     483                 :            : }
     484                 :            : 
     485                 :            : static PyObject *
     486                 :       3830 : func_get_kwdefaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
     487                 :            : {
     488         [ -  + ]:       3830 :     if (PySys_Audit("object.__getattr__", "Os",
     489                 :            :                     op, "__kwdefaults__") < 0) {
     490                 :          0 :         return NULL;
     491                 :            :     }
     492         [ +  + ]:       3830 :     if (op->func_kwdefaults == NULL) {
     493                 :       3706 :         Py_RETURN_NONE;
     494                 :            :     }
     495                 :        124 :     Py_INCREF(op->func_kwdefaults);
     496                 :        124 :     return op->func_kwdefaults;
     497                 :            : }
     498                 :            : 
     499                 :            : static int
     500                 :        299 : func_set_kwdefaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
     501                 :            : {
     502         [ +  + ]:        299 :     if (value == Py_None)
     503                 :        292 :         value = NULL;
     504                 :            :     /* Legal to del f.func_kwdefaults.
     505                 :            :      * Can only set func_kwdefaults to NULL or a dict. */
     506   [ +  +  -  + ]:        299 :     if (value != NULL && !PyDict_Check(value)) {
     507                 :          0 :         PyErr_SetString(PyExc_TypeError,
     508                 :            :             "__kwdefaults__ must be set to a dict object");
     509                 :          0 :         return -1;
     510                 :            :     }
     511         [ +  + ]:        299 :     if (value) {
     512         [ -  + ]:          6 :         if (PySys_Audit("object.__setattr__", "OsO",
     513                 :            :                         op, "__kwdefaults__", value) < 0) {
     514                 :          0 :             return -1;
     515                 :            :         }
     516         [ -  + ]:        293 :     } else if (PySys_Audit("object.__delattr__", "Os",
     517                 :            :                            op, "__kwdefaults__") < 0) {
     518                 :          0 :         return -1;
     519                 :            :     }
     520                 :            : 
     521                 :        299 :     op->func_version = 0;
     522                 :        299 :     Py_XINCREF(value);
     523                 :        299 :     Py_XSETREF(op->func_kwdefaults, value);
     524                 :        299 :     return 0;
     525                 :            : }
     526                 :            : 
     527                 :            : static PyObject *
     528                 :     401995 : func_get_annotations(PyFunctionObject *op, void *Py_UNUSED(ignored))
     529                 :            : {
     530         [ +  + ]:     401995 :     if (op->func_annotations == NULL) {
     531                 :     383994 :         op->func_annotations = PyDict_New();
     532         [ -  + ]:     383994 :         if (op->func_annotations == NULL)
     533                 :          0 :             return NULL;
     534                 :            :     }
     535                 :     401995 :     return func_get_annotation_dict(op);
     536                 :            : }
     537                 :            : 
     538                 :            : static int
     539                 :      53894 : func_set_annotations(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
     540                 :            : {
     541         [ -  + ]:      53894 :     if (value == Py_None)
     542                 :          0 :         value = NULL;
     543                 :            :     /* Legal to del f.func_annotations.
     544                 :            :      * Can only set func_annotations to NULL (through C api)
     545                 :            :      * or a dict. */
     546   [ +  +  -  + ]:      53894 :     if (value != NULL && !PyDict_Check(value)) {
     547                 :          0 :         PyErr_SetString(PyExc_TypeError,
     548                 :            :             "__annotations__ must be set to a dict object");
     549                 :          0 :         return -1;
     550                 :            :     }
     551                 :      53894 :     op->func_version = 0;
     552                 :      53894 :     Py_XINCREF(value);
     553                 :      53894 :     Py_XSETREF(op->func_annotations, value);
     554                 :      53894 :     return 0;
     555                 :            : }
     556                 :            : 
     557                 :            : static PyGetSetDef func_getsetlist[] = {
     558                 :            :     {"__code__", (getter)func_get_code, (setter)func_set_code},
     559                 :            :     {"__defaults__", (getter)func_get_defaults,
     560                 :            :      (setter)func_set_defaults},
     561                 :            :     {"__kwdefaults__", (getter)func_get_kwdefaults,
     562                 :            :      (setter)func_set_kwdefaults},
     563                 :            :     {"__annotations__", (getter)func_get_annotations,
     564                 :            :      (setter)func_set_annotations},
     565                 :            :     {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
     566                 :            :     {"__name__", (getter)func_get_name, (setter)func_set_name},
     567                 :            :     {"__qualname__", (getter)func_get_qualname, (setter)func_set_qualname},
     568                 :            :     {NULL} /* Sentinel */
     569                 :            : };
     570                 :            : 
     571                 :            : /*[clinic input]
     572                 :            : class function "PyFunctionObject *" "&PyFunction_Type"
     573                 :            : [clinic start generated code]*/
     574                 :            : /*[clinic end generated code: output=da39a3ee5e6b4b0d input=70af9c90aa2e71b0]*/
     575                 :            : 
     576                 :            : #include "clinic/funcobject.c.h"
     577                 :            : 
     578                 :            : /* function.__new__() maintains the following invariants for closures.
     579                 :            :    The closure must correspond to the free variables of the code object.
     580                 :            : 
     581                 :            :    if len(code.co_freevars) == 0:
     582                 :            :        closure = NULL
     583                 :            :    else:
     584                 :            :        len(closure) == len(code.co_freevars)
     585                 :            :    for every elt in closure, type(elt) == cell
     586                 :            : */
     587                 :            : 
     588                 :            : /*[clinic input]
     589                 :            : @classmethod
     590                 :            : function.__new__ as func_new
     591                 :            :     code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
     592                 :            :         a code object
     593                 :            :     globals: object(subclass_of="&PyDict_Type")
     594                 :            :         the globals dictionary
     595                 :            :     name: object = None
     596                 :            :         a string that overrides the name from the code object
     597                 :            :     argdefs as defaults: object = None
     598                 :            :         a tuple that specifies the default argument values
     599                 :            :     closure: object = None
     600                 :            :         a tuple that supplies the bindings for free variables
     601                 :            : 
     602                 :            : Create a function object.
     603                 :            : [clinic start generated code]*/
     604                 :            : 
     605                 :            : static PyObject *
     606                 :         86 : func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals,
     607                 :            :               PyObject *name, PyObject *defaults, PyObject *closure)
     608                 :            : /*[clinic end generated code: output=99c6d9da3a24e3be input=93611752fc2daf11]*/
     609                 :            : {
     610                 :            :     PyFunctionObject *newfunc;
     611                 :            :     Py_ssize_t nclosure;
     612                 :            : 
     613   [ +  +  -  + ]:         86 :     if (name != Py_None && !PyUnicode_Check(name)) {
     614                 :          0 :         PyErr_SetString(PyExc_TypeError,
     615                 :            :                         "arg 3 (name) must be None or string");
     616                 :          0 :         return NULL;
     617                 :            :     }
     618   [ -  +  -  - ]:         86 :     if (defaults != Py_None && !PyTuple_Check(defaults)) {
     619                 :          0 :         PyErr_SetString(PyExc_TypeError,
     620                 :            :                         "arg 4 (defaults) must be None or tuple");
     621                 :          0 :         return NULL;
     622                 :            :     }
     623         [ +  + ]:         86 :     if (!PyTuple_Check(closure)) {
     624   [ -  +  -  - ]:         85 :         if (code->co_nfreevars && closure == Py_None) {
     625                 :          0 :             PyErr_SetString(PyExc_TypeError,
     626                 :            :                             "arg 5 (closure) must be tuple");
     627                 :          0 :             return NULL;
     628                 :            :         }
     629         [ -  + ]:         85 :         else if (closure != Py_None) {
     630                 :          0 :             PyErr_SetString(PyExc_TypeError,
     631                 :            :                 "arg 5 (closure) must be None or tuple");
     632                 :          0 :             return NULL;
     633                 :            :         }
     634                 :            :     }
     635                 :            : 
     636                 :            :     /* check that the closure is well-formed */
     637         [ +  + ]:         86 :     nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
     638         [ -  + ]:         86 :     if (code->co_nfreevars != nclosure)
     639                 :          0 :         return PyErr_Format(PyExc_ValueError,
     640                 :            :                             "%U requires closure of length %zd, not %zd",
     641                 :            :                             code->co_name, code->co_nfreevars, nclosure);
     642         [ +  + ]:         86 :     if (nclosure) {
     643                 :            :         Py_ssize_t i;
     644         [ +  + ]:          2 :         for (i = 0; i < nclosure; i++) {
     645                 :          1 :             PyObject *o = PyTuple_GET_ITEM(closure, i);
     646         [ -  + ]:          1 :             if (!PyCell_Check(o)) {
     647                 :          0 :                 return PyErr_Format(PyExc_TypeError,
     648                 :            :                     "arg 5 (closure) expected cell, found %s",
     649                 :          0 :                                     Py_TYPE(o)->tp_name);
     650                 :            :             }
     651                 :            :         }
     652                 :            :     }
     653         [ -  + ]:         86 :     if (PySys_Audit("function.__new__", "O", code) < 0) {
     654                 :          0 :         return NULL;
     655                 :            :     }
     656                 :            : 
     657                 :         86 :     newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
     658                 :            :                                                  globals);
     659         [ -  + ]:         86 :     if (newfunc == NULL) {
     660                 :          0 :         return NULL;
     661                 :            :     }
     662         [ +  + ]:         86 :     if (name != Py_None) {
     663                 :          1 :         Py_INCREF(name);
     664                 :          1 :         Py_SETREF(newfunc->func_name, name);
     665                 :            :     }
     666         [ -  + ]:         86 :     if (defaults != Py_None) {
     667                 :          0 :         Py_INCREF(defaults);
     668                 :          0 :         newfunc->func_defaults  = defaults;
     669                 :            :     }
     670         [ +  + ]:         86 :     if (closure != Py_None) {
     671                 :          1 :         Py_INCREF(closure);
     672                 :          1 :         newfunc->func_closure = closure;
     673                 :            :     }
     674                 :            : 
     675                 :         86 :     return (PyObject *)newfunc;
     676                 :            : }
     677                 :            : 
     678                 :            : static int
     679                 :   15078659 : func_clear(PyFunctionObject *op)
     680                 :            : {
     681                 :   15078659 :     op->func_version = 0;
     682         [ +  + ]:   15078659 :     Py_CLEAR(op->func_globals);
     683         [ +  + ]:   15078659 :     Py_CLEAR(op->func_builtins);
     684         [ +  + ]:   15078659 :     Py_CLEAR(op->func_module);
     685         [ +  + ]:   15078659 :     Py_CLEAR(op->func_defaults);
     686         [ +  + ]:   15078659 :     Py_CLEAR(op->func_kwdefaults);
     687         [ +  + ]:   15078659 :     Py_CLEAR(op->func_doc);
     688         [ +  + ]:   15078659 :     Py_CLEAR(op->func_dict);
     689         [ +  + ]:   15078659 :     Py_CLEAR(op->func_closure);
     690         [ +  + ]:   15078659 :     Py_CLEAR(op->func_annotations);
     691                 :            :     // Don't Py_CLEAR(op->func_code), since code is always required
     692                 :            :     // to be non-NULL. Similarly, name and qualname shouldn't be NULL.
     693                 :            :     // However, name and qualname could be str subclasses, so they
     694                 :            :     // could have reference cycles. The solution is to replace them
     695                 :            :     // with a genuinely immutable string.
     696                 :   15078659 :     Py_SETREF(op->func_name, Py_NewRef(&_Py_STR(empty)));
     697                 :   15078659 :     Py_SETREF(op->func_qualname, Py_NewRef(&_Py_STR(empty)));
     698                 :   15078659 :     return 0;
     699                 :            : }
     700                 :            : 
     701                 :            : static void
     702                 :   14804818 : func_dealloc(PyFunctionObject *op)
     703                 :            : {
     704                 :   14804818 :     _PyObject_GC_UNTRACK(op);
     705         [ +  + ]:   14804818 :     if (op->func_weakreflist != NULL) {
     706                 :         34 :         PyObject_ClearWeakRefs((PyObject *) op);
     707                 :            :     }
     708                 :   14804818 :     (void)func_clear(op);
     709                 :            :     // These aren't cleared by func_clear().
     710                 :   14804818 :     Py_DECREF(op->func_code);
     711                 :   14804818 :     Py_DECREF(op->func_name);
     712                 :   14804818 :     Py_DECREF(op->func_qualname);
     713                 :   14804818 :     PyObject_GC_Del(op);
     714                 :   14804818 : }
     715                 :            : 
     716                 :            : static PyObject*
     717                 :      23088 : func_repr(PyFunctionObject *op)
     718                 :            : {
     719                 :      23088 :     return PyUnicode_FromFormat("<function %U at %p>",
     720                 :            :                                 op->func_qualname, op);
     721                 :            : }
     722                 :            : 
     723                 :            : static int
     724                 :  203430390 : func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
     725                 :            : {
     726   [ +  -  +  + ]:  203430390 :     Py_VISIT(f->func_code);
     727   [ +  +  +  + ]:  203430292 :     Py_VISIT(f->func_globals);
     728   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_builtins);
     729   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_module);
     730   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_defaults);
     731   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_kwdefaults);
     732   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_doc);
     733   [ +  -  -  + ]:  203427689 :     Py_VISIT(f->func_name);
     734   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_dict);
     735   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_closure);
     736   [ +  +  -  + ]:  203427689 :     Py_VISIT(f->func_annotations);
     737   [ +  -  -  + ]:  203427689 :     Py_VISIT(f->func_qualname);
     738                 :  203427689 :     return 0;
     739                 :            : }
     740                 :            : 
     741                 :            : /* Bind a function to an object */
     742                 :            : static PyObject *
     743                 :   28793270 : func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
     744                 :            : {
     745   [ +  -  +  + ]:   28793270 :     if (obj == Py_None || obj == NULL) {
     746                 :    1326583 :         Py_INCREF(func);
     747                 :    1326583 :         return func;
     748                 :            :     }
     749                 :   27466687 :     return PyMethod_New(func, obj);
     750                 :            : }
     751                 :            : 
     752                 :            : PyTypeObject PyFunction_Type = {
     753                 :            :     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     754                 :            :     "function",
     755                 :            :     sizeof(PyFunctionObject),
     756                 :            :     0,
     757                 :            :     (destructor)func_dealloc,                   /* tp_dealloc */
     758                 :            :     offsetof(PyFunctionObject, vectorcall),     /* tp_vectorcall_offset */
     759                 :            :     0,                                          /* tp_getattr */
     760                 :            :     0,                                          /* tp_setattr */
     761                 :            :     0,                                          /* tp_as_async */
     762                 :            :     (reprfunc)func_repr,                        /* tp_repr */
     763                 :            :     0,                                          /* tp_as_number */
     764                 :            :     0,                                          /* tp_as_sequence */
     765                 :            :     0,                                          /* tp_as_mapping */
     766                 :            :     0,                                          /* tp_hash */
     767                 :            :     PyVectorcall_Call,                          /* tp_call */
     768                 :            :     0,                                          /* tp_str */
     769                 :            :     0,                                          /* tp_getattro */
     770                 :            :     0,                                          /* tp_setattro */
     771                 :            :     0,                                          /* tp_as_buffer */
     772                 :            :     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
     773                 :            :     Py_TPFLAGS_HAVE_VECTORCALL |
     774                 :            :     Py_TPFLAGS_METHOD_DESCRIPTOR,               /* tp_flags */
     775                 :            :     func_new__doc__,                            /* tp_doc */
     776                 :            :     (traverseproc)func_traverse,                /* tp_traverse */
     777                 :            :     (inquiry)func_clear,                        /* tp_clear */
     778                 :            :     0,                                          /* tp_richcompare */
     779                 :            :     offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
     780                 :            :     0,                                          /* tp_iter */
     781                 :            :     0,                                          /* tp_iternext */
     782                 :            :     0,                                          /* tp_methods */
     783                 :            :     func_memberlist,                            /* tp_members */
     784                 :            :     func_getsetlist,                            /* tp_getset */
     785                 :            :     0,                                          /* tp_base */
     786                 :            :     0,                                          /* tp_dict */
     787                 :            :     func_descr_get,                             /* tp_descr_get */
     788                 :            :     0,                                          /* tp_descr_set */
     789                 :            :     offsetof(PyFunctionObject, func_dict),      /* tp_dictoffset */
     790                 :            :     0,                                          /* tp_init */
     791                 :            :     0,                                          /* tp_alloc */
     792                 :            :     func_new,                                   /* tp_new */
     793                 :            : };
     794                 :            : 
     795                 :            : 
     796                 :            : static int
     797                 :    1896405 : functools_copy_attr(PyObject *wrapper, PyObject *wrapped, PyObject *name)
     798                 :            : {
     799                 :    1896405 :     PyObject *value = PyObject_GetAttr(wrapped, name);
     800         [ +  + ]:    1896405 :     if (value == NULL) {
     801         [ +  - ]:      43878 :         if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
     802                 :      43878 :             PyErr_Clear();
     803                 :      43878 :             return 0;
     804                 :            :         }
     805                 :          0 :         return -1;
     806                 :            :     }
     807                 :            : 
     808                 :    1852527 :     int res = PyObject_SetAttr(wrapper, name, value);
     809                 :    1852527 :     Py_DECREF(value);
     810                 :    1852527 :     return res;
     811                 :            : }
     812                 :            : 
     813                 :            : // Similar to functools.wraps(wrapper, wrapped)
     814                 :            : static int
     815                 :     379281 : functools_wraps(PyObject *wrapper, PyObject *wrapped)
     816                 :            : {
     817                 :            : #define COPY_ATTR(ATTR) \
     818                 :            :     do { \
     819                 :            :         if (functools_copy_attr(wrapper, wrapped, &_Py_ID(ATTR)) < 0) { \
     820                 :            :             return -1; \
     821                 :            :         } \
     822                 :            :     } while (0) \
     823                 :            : 
     824         [ -  + ]:     379281 :     COPY_ATTR(__module__);
     825         [ -  + ]:     379281 :     COPY_ATTR(__name__);
     826         [ -  + ]:     379281 :     COPY_ATTR(__qualname__);
     827         [ -  + ]:     379281 :     COPY_ATTR(__doc__);
     828         [ -  + ]:     379281 :     COPY_ATTR(__annotations__);
     829                 :     379281 :     return 0;
     830                 :            : 
     831                 :            : #undef COPY_ATTR
     832                 :            : }
     833                 :            : 
     834                 :            : 
     835                 :            : /* Class method object */
     836                 :            : 
     837                 :            : /* A class method receives the class as implicit first argument,
     838                 :            :    just like an instance method receives the instance.
     839                 :            :    To declare a class method, use this idiom:
     840                 :            : 
     841                 :            :      class C:
     842                 :            :          @classmethod
     843                 :            :          def f(cls, arg1, arg2, ...):
     844                 :            :              ...
     845                 :            : 
     846                 :            :    It can be called either on the class (e.g. C.f()) or on an instance
     847                 :            :    (e.g. C().f()); the instance is ignored except for its class.
     848                 :            :    If a class method is called for a derived class, the derived class
     849                 :            :    object is passed as the implied first argument.
     850                 :            : 
     851                 :            :    Class methods are different than C++ or Java static methods.
     852                 :            :    If you want those, see static methods below.
     853                 :            : */
     854                 :            : 
     855                 :            : typedef struct {
     856                 :            :     PyObject_HEAD
     857                 :            :     PyObject *cm_callable;
     858                 :            :     PyObject *cm_dict;
     859                 :            : } classmethod;
     860                 :            : 
     861                 :            : static void
     862                 :     310946 : cm_dealloc(classmethod *cm)
     863                 :            : {
     864                 :     310946 :     _PyObject_GC_UNTRACK((PyObject *)cm);
     865                 :     310946 :     Py_XDECREF(cm->cm_callable);
     866                 :     310946 :     Py_XDECREF(cm->cm_dict);
     867                 :     310946 :     Py_TYPE(cm)->tp_free((PyObject *)cm);
     868                 :     310946 : }
     869                 :            : 
     870                 :            : static int
     871                 :    6910210 : cm_traverse(classmethod *cm, visitproc visit, void *arg)
     872                 :            : {
     873   [ +  -  +  + ]:    6910210 :     Py_VISIT(cm->cm_callable);
     874   [ +  +  -  + ]:    6910205 :     Py_VISIT(cm->cm_dict);
     875                 :    6910205 :     return 0;
     876                 :            : }
     877                 :            : 
     878                 :            : static int
     879                 :       4124 : cm_clear(classmethod *cm)
     880                 :            : {
     881         [ +  - ]:       4124 :     Py_CLEAR(cm->cm_callable);
     882         [ +  - ]:       4124 :     Py_CLEAR(cm->cm_dict);
     883                 :       4124 :     return 0;
     884                 :            : }
     885                 :            : 
     886                 :            : 
     887                 :            : static PyObject *
     888                 :    2400129 : cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
     889                 :            : {
     890                 :    2400129 :     classmethod *cm = (classmethod *)self;
     891                 :            : 
     892         [ -  + ]:    2400129 :     if (cm->cm_callable == NULL) {
     893                 :          0 :         PyErr_SetString(PyExc_RuntimeError,
     894                 :            :                         "uninitialized classmethod object");
     895                 :          0 :         return NULL;
     896                 :            :     }
     897         [ +  + ]:    2400129 :     if (type == NULL)
     898                 :          6 :         type = (PyObject *)(Py_TYPE(obj));
     899         [ +  + ]:    2400129 :     if (Py_TYPE(cm->cm_callable)->tp_descr_get != NULL) {
     900                 :    2399832 :         return Py_TYPE(cm->cm_callable)->tp_descr_get(cm->cm_callable, type,
     901                 :            :                                                       type);
     902                 :            :     }
     903                 :        297 :     return PyMethod_New(cm->cm_callable, type);
     904                 :            : }
     905                 :            : 
     906                 :            : static int
     907                 :     305496 : cm_init(PyObject *self, PyObject *args, PyObject *kwds)
     908                 :            : {
     909                 :     305496 :     classmethod *cm = (classmethod *)self;
     910                 :            :     PyObject *callable;
     911                 :            : 
     912   [ +  +  +  - ]:     305496 :     if (!_PyArg_NoKeywords("classmethod", kwds))
     913                 :          2 :         return -1;
     914         [ -  + ]:     305494 :     if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
     915                 :          0 :         return -1;
     916                 :     305494 :     Py_INCREF(callable);
     917                 :     305494 :     Py_XSETREF(cm->cm_callable, callable);
     918                 :            : 
     919         [ -  + ]:     305494 :     if (functools_wraps((PyObject *)cm, cm->cm_callable) < 0) {
     920                 :          0 :         return -1;
     921                 :            :     }
     922                 :     305494 :     return 0;
     923                 :            : }
     924                 :            : 
     925                 :            : static PyMemberDef cm_memberlist[] = {
     926                 :            :     {"__func__", T_OBJECT, offsetof(classmethod, cm_callable), READONLY},
     927                 :            :     {"__wrapped__", T_OBJECT, offsetof(classmethod, cm_callable), READONLY},
     928                 :            :     {NULL}  /* Sentinel */
     929                 :            : };
     930                 :            : 
     931                 :            : static PyObject *
     932                 :      92698 : cm_get___isabstractmethod__(classmethod *cm, void *closure)
     933                 :            : {
     934                 :      92698 :     int res = _PyObject_IsAbstract(cm->cm_callable);
     935         [ -  + ]:      92698 :     if (res == -1) {
     936                 :          0 :         return NULL;
     937                 :            :     }
     938         [ +  + ]:      92698 :     else if (res) {
     939                 :          6 :         Py_RETURN_TRUE;
     940                 :            :     }
     941                 :      92692 :     Py_RETURN_FALSE;
     942                 :            : }
     943                 :            : 
     944                 :            : static PyGetSetDef cm_getsetlist[] = {
     945                 :            :     {"__isabstractmethod__",
     946                 :            :      (getter)cm_get___isabstractmethod__, NULL, NULL, NULL},
     947                 :            :     {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL},
     948                 :            :     {NULL} /* Sentinel */
     949                 :            : };
     950                 :            : 
     951                 :            : static PyObject*
     952                 :          4 : cm_repr(classmethod *cm)
     953                 :            : {
     954                 :          4 :     return PyUnicode_FromFormat("<classmethod(%R)>", cm->cm_callable);
     955                 :            : }
     956                 :            : 
     957                 :            : PyDoc_STRVAR(classmethod_doc,
     958                 :            : "classmethod(function) -> method\n\
     959                 :            : \n\
     960                 :            : Convert a function to be a class method.\n\
     961                 :            : \n\
     962                 :            : A class method receives the class as implicit first argument,\n\
     963                 :            : just like an instance method receives the instance.\n\
     964                 :            : To declare a class method, use this idiom:\n\
     965                 :            : \n\
     966                 :            :   class C:\n\
     967                 :            :       @classmethod\n\
     968                 :            :       def f(cls, arg1, arg2, ...):\n\
     969                 :            :           ...\n\
     970                 :            : \n\
     971                 :            : It can be called either on the class (e.g. C.f()) or on an instance\n\
     972                 :            : (e.g. C().f()).  The instance is ignored except for its class.\n\
     973                 :            : If a class method is called for a derived class, the derived class\n\
     974                 :            : object is passed as the implied first argument.\n\
     975                 :            : \n\
     976                 :            : Class methods are different than C++ or Java static methods.\n\
     977                 :            : If you want those, see the staticmethod builtin.");
     978                 :            : 
     979                 :            : PyTypeObject PyClassMethod_Type = {
     980                 :            :     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     981                 :            :     "classmethod",
     982                 :            :     sizeof(classmethod),
     983                 :            :     0,
     984                 :            :     (destructor)cm_dealloc,                     /* tp_dealloc */
     985                 :            :     0,                                          /* tp_vectorcall_offset */
     986                 :            :     0,                                          /* tp_getattr */
     987                 :            :     0,                                          /* tp_setattr */
     988                 :            :     0,                                          /* tp_as_async */
     989                 :            :     (reprfunc)cm_repr,                          /* tp_repr */
     990                 :            :     0,                                          /* tp_as_number */
     991                 :            :     0,                                          /* tp_as_sequence */
     992                 :            :     0,                                          /* tp_as_mapping */
     993                 :            :     0,                                          /* tp_hash */
     994                 :            :     0,                                          /* tp_call */
     995                 :            :     0,                                          /* tp_str */
     996                 :            :     0,                                          /* tp_getattro */
     997                 :            :     0,                                          /* tp_setattro */
     998                 :            :     0,                                          /* tp_as_buffer */
     999                 :            :     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
    1000                 :            :     classmethod_doc,                            /* tp_doc */
    1001                 :            :     (traverseproc)cm_traverse,                  /* tp_traverse */
    1002                 :            :     (inquiry)cm_clear,                          /* tp_clear */
    1003                 :            :     0,                                          /* tp_richcompare */
    1004                 :            :     0,                                          /* tp_weaklistoffset */
    1005                 :            :     0,                                          /* tp_iter */
    1006                 :            :     0,                                          /* tp_iternext */
    1007                 :            :     0,                                          /* tp_methods */
    1008                 :            :     cm_memberlist,              /* tp_members */
    1009                 :            :     cm_getsetlist,                              /* tp_getset */
    1010                 :            :     0,                                          /* tp_base */
    1011                 :            :     0,                                          /* tp_dict */
    1012                 :            :     cm_descr_get,                               /* tp_descr_get */
    1013                 :            :     0,                                          /* tp_descr_set */
    1014                 :            :     offsetof(classmethod, cm_dict),             /* tp_dictoffset */
    1015                 :            :     cm_init,                                    /* tp_init */
    1016                 :            :     PyType_GenericAlloc,                        /* tp_alloc */
    1017                 :            :     PyType_GenericNew,                          /* tp_new */
    1018                 :            :     PyObject_GC_Del,                            /* tp_free */
    1019                 :            : };
    1020                 :            : 
    1021                 :            : PyObject *
    1022                 :       8485 : PyClassMethod_New(PyObject *callable)
    1023                 :            : {
    1024                 :            :     classmethod *cm = (classmethod *)
    1025                 :       8485 :         PyType_GenericAlloc(&PyClassMethod_Type, 0);
    1026         [ +  - ]:       8485 :     if (cm != NULL) {
    1027                 :       8485 :         Py_INCREF(callable);
    1028                 :       8485 :         cm->cm_callable = callable;
    1029                 :            :     }
    1030                 :       8485 :     return (PyObject *)cm;
    1031                 :            : }
    1032                 :            : 
    1033                 :            : 
    1034                 :            : /* Static method object */
    1035                 :            : 
    1036                 :            : /* A static method does not receive an implicit first argument.
    1037                 :            :    To declare a static method, use this idiom:
    1038                 :            : 
    1039                 :            :      class C:
    1040                 :            :          @staticmethod
    1041                 :            :          def f(arg1, arg2, ...):
    1042                 :            :              ...
    1043                 :            : 
    1044                 :            :    It can be called either on the class (e.g. C.f()) or on an instance
    1045                 :            :    (e.g. C().f()). Both the class and the instance are ignored, and
    1046                 :            :    neither is passed implicitly as the first argument to the method.
    1047                 :            : 
    1048                 :            :    Static methods in Python are similar to those found in Java or C++.
    1049                 :            :    For a more advanced concept, see class methods above.
    1050                 :            : */
    1051                 :            : 
    1052                 :            : typedef struct {
    1053                 :            :     PyObject_HEAD
    1054                 :            :     PyObject *sm_callable;
    1055                 :            :     PyObject *sm_dict;
    1056                 :            : } staticmethod;
    1057                 :            : 
    1058                 :            : static void
    1059                 :     152655 : sm_dealloc(staticmethod *sm)
    1060                 :            : {
    1061                 :     152655 :     _PyObject_GC_UNTRACK((PyObject *)sm);
    1062                 :     152655 :     Py_XDECREF(sm->sm_callable);
    1063                 :     152655 :     Py_XDECREF(sm->sm_dict);
    1064                 :     152655 :     Py_TYPE(sm)->tp_free((PyObject *)sm);
    1065                 :     152655 : }
    1066                 :            : 
    1067                 :            : static int
    1068                 :    3817234 : sm_traverse(staticmethod *sm, visitproc visit, void *arg)
    1069                 :            : {
    1070   [ +  -  -  + ]:    3817234 :     Py_VISIT(sm->sm_callable);
    1071   [ +  +  -  + ]:    3817234 :     Py_VISIT(sm->sm_dict);
    1072                 :    3817234 :     return 0;
    1073                 :            : }
    1074                 :            : 
    1075                 :            : static int
    1076                 :        262 : sm_clear(staticmethod *sm)
    1077                 :            : {
    1078         [ +  - ]:        262 :     Py_CLEAR(sm->sm_callable);
    1079         [ +  - ]:        262 :     Py_CLEAR(sm->sm_dict);
    1080                 :        262 :     return 0;
    1081                 :            : }
    1082                 :            : 
    1083                 :            : static PyObject *
    1084                 :   11499831 : sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
    1085                 :            : {
    1086                 :   11499831 :     staticmethod *sm = (staticmethod *)self;
    1087                 :            : 
    1088         [ -  + ]:   11499831 :     if (sm->sm_callable == NULL) {
    1089                 :          0 :         PyErr_SetString(PyExc_RuntimeError,
    1090                 :            :                         "uninitialized staticmethod object");
    1091                 :          0 :         return NULL;
    1092                 :            :     }
    1093                 :   11499831 :     Py_INCREF(sm->sm_callable);
    1094                 :   11499831 :     return sm->sm_callable;
    1095                 :            : }
    1096                 :            : 
    1097                 :            : static int
    1098                 :      73788 : sm_init(PyObject *self, PyObject *args, PyObject *kwds)
    1099                 :            : {
    1100                 :      73788 :     staticmethod *sm = (staticmethod *)self;
    1101                 :            :     PyObject *callable;
    1102                 :            : 
    1103   [ +  +  +  - ]:      73788 :     if (!_PyArg_NoKeywords("staticmethod", kwds))
    1104                 :          1 :         return -1;
    1105         [ -  + ]:      73787 :     if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
    1106                 :          0 :         return -1;
    1107                 :      73787 :     Py_INCREF(callable);
    1108                 :      73787 :     Py_XSETREF(sm->sm_callable, callable);
    1109                 :            : 
    1110         [ -  + ]:      73787 :     if (functools_wraps((PyObject *)sm, sm->sm_callable) < 0) {
    1111                 :          0 :         return -1;
    1112                 :            :     }
    1113                 :      73787 :     return 0;
    1114                 :            : }
    1115                 :            : 
    1116                 :            : static PyObject*
    1117                 :       1710 : sm_call(PyObject *callable, PyObject *args, PyObject *kwargs)
    1118                 :            : {
    1119                 :       1710 :     staticmethod *sm = (staticmethod *)callable;
    1120                 :       1710 :     return PyObject_Call(sm->sm_callable, args, kwargs);
    1121                 :            : }
    1122                 :            : 
    1123                 :            : static PyMemberDef sm_memberlist[] = {
    1124                 :            :     {"__func__", T_OBJECT, offsetof(staticmethod, sm_callable), READONLY},
    1125                 :            :     {"__wrapped__", T_OBJECT, offsetof(staticmethod, sm_callable), READONLY},
    1126                 :            :     {NULL}  /* Sentinel */
    1127                 :            : };
    1128                 :            : 
    1129                 :            : static PyObject *
    1130                 :       5299 : sm_get___isabstractmethod__(staticmethod *sm, void *closure)
    1131                 :            : {
    1132                 :       5299 :     int res = _PyObject_IsAbstract(sm->sm_callable);
    1133         [ -  + ]:       5299 :     if (res == -1) {
    1134                 :          0 :         return NULL;
    1135                 :            :     }
    1136         [ +  + ]:       5299 :     else if (res) {
    1137                 :          4 :         Py_RETURN_TRUE;
    1138                 :            :     }
    1139                 :       5295 :     Py_RETURN_FALSE;
    1140                 :            : }
    1141                 :            : 
    1142                 :            : static PyGetSetDef sm_getsetlist[] = {
    1143                 :            :     {"__isabstractmethod__",
    1144                 :            :      (getter)sm_get___isabstractmethod__, NULL, NULL, NULL},
    1145                 :            :     {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL},
    1146                 :            :     {NULL} /* Sentinel */
    1147                 :            : };
    1148                 :            : 
    1149                 :            : static PyObject*
    1150                 :          3 : sm_repr(staticmethod *sm)
    1151                 :            : {
    1152                 :          3 :     return PyUnicode_FromFormat("<staticmethod(%R)>", sm->sm_callable);
    1153                 :            : }
    1154                 :            : 
    1155                 :            : PyDoc_STRVAR(staticmethod_doc,
    1156                 :            : "staticmethod(function) -> method\n\
    1157                 :            : \n\
    1158                 :            : Convert a function to be a static method.\n\
    1159                 :            : \n\
    1160                 :            : A static method does not receive an implicit first argument.\n\
    1161                 :            : To declare a static method, use this idiom:\n\
    1162                 :            : \n\
    1163                 :            :      class C:\n\
    1164                 :            :          @staticmethod\n\
    1165                 :            :          def f(arg1, arg2, ...):\n\
    1166                 :            :              ...\n\
    1167                 :            : \n\
    1168                 :            : It can be called either on the class (e.g. C.f()) or on an instance\n\
    1169                 :            : (e.g. C().f()). Both the class and the instance are ignored, and\n\
    1170                 :            : neither is passed implicitly as the first argument to the method.\n\
    1171                 :            : \n\
    1172                 :            : Static methods in Python are similar to those found in Java or C++.\n\
    1173                 :            : For a more advanced concept, see the classmethod builtin.");
    1174                 :            : 
    1175                 :            : PyTypeObject PyStaticMethod_Type = {
    1176                 :            :     PyVarObject_HEAD_INIT(&PyType_Type, 0)
    1177                 :            :     "staticmethod",
    1178                 :            :     sizeof(staticmethod),
    1179                 :            :     0,
    1180                 :            :     (destructor)sm_dealloc,                     /* tp_dealloc */
    1181                 :            :     0,                                          /* tp_vectorcall_offset */
    1182                 :            :     0,                                          /* tp_getattr */
    1183                 :            :     0,                                          /* tp_setattr */
    1184                 :            :     0,                                          /* tp_as_async */
    1185                 :            :     (reprfunc)sm_repr,                          /* tp_repr */
    1186                 :            :     0,                                          /* tp_as_number */
    1187                 :            :     0,                                          /* tp_as_sequence */
    1188                 :            :     0,                                          /* tp_as_mapping */
    1189                 :            :     0,                                          /* tp_hash */
    1190                 :            :     sm_call,                                    /* tp_call */
    1191                 :            :     0,                                          /* tp_str */
    1192                 :            :     0,                                          /* tp_getattro */
    1193                 :            :     0,                                          /* tp_setattro */
    1194                 :            :     0,                                          /* tp_as_buffer */
    1195                 :            :     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
    1196                 :            :     staticmethod_doc,                           /* tp_doc */
    1197                 :            :     (traverseproc)sm_traverse,                  /* tp_traverse */
    1198                 :            :     (inquiry)sm_clear,                          /* tp_clear */
    1199                 :            :     0,                                          /* tp_richcompare */
    1200                 :            :     0,                                          /* tp_weaklistoffset */
    1201                 :            :     0,                                          /* tp_iter */
    1202                 :            :     0,                                          /* tp_iternext */
    1203                 :            :     0,                                          /* tp_methods */
    1204                 :            :     sm_memberlist,              /* tp_members */
    1205                 :            :     sm_getsetlist,                              /* tp_getset */
    1206                 :            :     0,                                          /* tp_base */
    1207                 :            :     0,                                          /* tp_dict */
    1208                 :            :     sm_descr_get,                               /* tp_descr_get */
    1209                 :            :     0,                                          /* tp_descr_set */
    1210                 :            :     offsetof(staticmethod, sm_dict),            /* tp_dictoffset */
    1211                 :            :     sm_init,                                    /* tp_init */
    1212                 :            :     PyType_GenericAlloc,                        /* tp_alloc */
    1213                 :            :     PyType_GenericNew,                          /* tp_new */
    1214                 :            :     PyObject_GC_Del,                            /* tp_free */
    1215                 :            : };
    1216                 :            : 
    1217                 :            : PyObject *
    1218                 :      87640 : PyStaticMethod_New(PyObject *callable)
    1219                 :            : {
    1220                 :            :     staticmethod *sm = (staticmethod *)
    1221                 :      87640 :         PyType_GenericAlloc(&PyStaticMethod_Type, 0);
    1222         [ +  - ]:      87640 :     if (sm != NULL) {
    1223                 :      87640 :         Py_INCREF(callable);
    1224                 :      87640 :         sm->sm_callable = callable;
    1225                 :            :     }
    1226                 :      87640 :     return (PyObject *)sm;
    1227                 :            : }

Generated by: LCOV version 1.14