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