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