annotate Objects/funcobject.c @ 40910:eaaee785eb86

Change all the function attributes from func_* -> __*__. This gets rid of func_name, func_dict and func_doc as they already exist as __name__, __dict__ and __doc__.
author Neal Norwitz <nnorwitz@gmail.com>
date Sun, 25 Feb 2007 20:55:47 +0000
parents 54cd47788811
children 25a84900e205
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Function object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
4 #include "Python.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34598
diff changeset
5 #include "code.h"
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
6 #include "eval.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
7 #include "structmember.h"
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
9 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
10 PyFunction_New(PyObject *code, PyObject *globals)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 {
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
12 PyFunctionObject *op = PyObject_GC_New(PyFunctionObject,
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
13 &PyFunction_Type);
31780
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
14 static PyObject *__name__ = 0;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 if (op != NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
16 PyObject *doc;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
17 PyObject *consts;
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
18 PyObject *module;
17170
962196ce7231 Add support for weak references to the function and method types.
Fred Drake <fdrake@acm.org>
parents: 16891
diff changeset
19 op->func_weakreflist = NULL;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
20 Py_INCREF(code);
84
a79cbb2655ba Function objects no longer contain a parse tree node, but intermediate
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
21 op->func_code = code;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
22 Py_INCREF(globals);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 op->func_globals = globals;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
24 op->func_name = ((PyCodeObject *)code)->co_name;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
25 Py_INCREF(op->func_name);
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2205
diff changeset
26 op->func_defaults = NULL; /* No default arguments */
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
27 op->func_kwdefaults = NULL; /* No keyword only defaults */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
28 op->func_closure = NULL;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
29 consts = ((PyCodeObject *)code)->co_consts;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
30 if (PyTuple_Size(consts) >= 1) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
31 doc = PyTuple_GetItem(consts, 0);
12512
a61157328b12 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 8407
diff changeset
32 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
33 doc = Py_None;
2082
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
34 }
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
35 else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
36 doc = Py_None;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
37 Py_INCREF(doc);
2082
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
38 op->func_doc = doc;
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
39 op->func_dict = NULL;
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
40 op->func_module = NULL;
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
41 op->func_annotations = NULL;
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
42
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
43 /* __module__: If module name is in globals, use it.
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
44 Otherwise, use None.
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
45 */
31780
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
46 if (!__name__) {
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
47 __name__ = PyString_InternFromString("__name__");
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
48 if (!__name__) {
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
49 Py_DECREF(op);
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
50 return NULL;
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
51 }
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
52 }
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
53 module = PyDict_GetItem(globals, __name__);
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
54 if (module) {
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
55 Py_INCREF(module);
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
56 op->func_module = module;
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
57 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 }
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
59 else
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
60 return NULL;
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
61 _PyObject_GC_TRACK(op);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
62 return (PyObject *)op;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
65 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
66 PyFunction_GetCode(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
68 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
69 PyErr_BadInternalCall();
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
72 return ((PyFunctionObject *) op) -> func_code;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
75 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
76 PyFunction_GetGlobals(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
78 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
79 PyErr_BadInternalCall();
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
82 return ((PyFunctionObject *) op) -> func_globals;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
85 PyObject *
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
86 PyFunction_GetModule(PyObject *op)
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
87 {
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
88 if (!PyFunction_Check(op)) {
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
89 PyErr_BadInternalCall();
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
90 return NULL;
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
91 }
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
92 return ((PyFunctionObject *) op) -> func_module;
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
93 }
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
94
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
95 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
96 PyFunction_GetDefaults(PyObject *op)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
97 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
98 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
99 PyErr_BadInternalCall();
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
100 return NULL;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
101 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
102 return ((PyFunctionObject *) op) -> func_defaults;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
103 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
104
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
105 int
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
106 PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
107 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
108 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
109 PyErr_BadInternalCall();
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
110 return -1;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
111 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
112 if (defaults == Py_None)
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2205
diff changeset
113 defaults = NULL;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
114 else if (defaults && PyTuple_Check(defaults)) {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
115 Py_INCREF(defaults);
7981
09963a2a24db Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5945
diff changeset
116 }
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
117 else {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
118 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
119 return -1;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
120 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
121 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
122 ((PyFunctionObject *) op) -> func_defaults = defaults;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
123 return 0;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
124 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
125
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
126 PyObject *
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
127 PyFunction_GetKwDefaults(PyObject *op)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
128 {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
129 if (!PyFunction_Check(op)) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
130 PyErr_BadInternalCall();
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
131 return NULL;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
132 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
133 return ((PyFunctionObject *) op) -> func_kwdefaults;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
134 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
135
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
136 int
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
137 PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
138 {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
139 if (!PyFunction_Check(op)) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
140 PyErr_BadInternalCall();
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
141 return -1;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
142 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
143 if (defaults == Py_None)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
144 defaults = NULL;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
145 else if (defaults && PyDict_Check(defaults)) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
146 Py_INCREF(defaults);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
147 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
148 else {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
149 PyErr_SetString(PyExc_SystemError,
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
150 "non-dict keyword only default args");
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
151 return -1;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
152 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
153 Py_XDECREF(((PyFunctionObject *)op) -> func_kwdefaults);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
154 ((PyFunctionObject *) op) -> func_kwdefaults = defaults;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
155 return 0;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
156 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
157
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
158 PyObject *
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
159 PyFunction_GetClosure(PyObject *op)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
160 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
161 if (!PyFunction_Check(op)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
162 PyErr_BadInternalCall();
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
163 return NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
164 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
165 return ((PyFunctionObject *) op) -> func_closure;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
166 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
167
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
168 int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
169 PyFunction_SetClosure(PyObject *op, PyObject *closure)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
170 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
171 if (!PyFunction_Check(op)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
172 PyErr_BadInternalCall();
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
173 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
174 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
175 if (closure == Py_None)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
176 closure = NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
177 else if (PyTuple_Check(closure)) {
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
178 Py_INCREF(closure);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
179 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
180 else {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34598
diff changeset
181 PyErr_Format(PyExc_SystemError,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34598
diff changeset
182 "expected tuple for closure, got '%.100s'",
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34598
diff changeset
183 closure->ob_type->tp_name);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
184 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
185 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
186 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
187 ((PyFunctionObject *) op) -> func_closure = closure;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
188 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
189 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
190
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
191 PyObject *
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
192 PyFunction_GetAnnotations(PyObject *op)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
193 {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
194 if (!PyFunction_Check(op)) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
195 PyErr_BadInternalCall();
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
196 return NULL;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
197 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
198 return ((PyFunctionObject *) op) -> func_annotations;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
199 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
200
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
201 int
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
202 PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
203 {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
204 if (!PyFunction_Check(op)) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
205 PyErr_BadInternalCall();
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
206 return -1;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
207 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
208 if (annotations == Py_None)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
209 annotations = NULL;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
210 else if (annotations && PyDict_Check(annotations)) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
211 Py_INCREF(annotations);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
212 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
213 else {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
214 PyErr_SetString(PyExc_SystemError,
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
215 "non-dict annotations");
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
216 return -1;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
217 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
218 Py_XDECREF(((PyFunctionObject *)op) -> func_annotations);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
219 ((PyFunctionObject *) op) -> func_annotations = annotations;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
220 return 0;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
221 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
222
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
225 #define OFF(x) offsetof(PyFunctionObject, x)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
226
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19948
diff changeset
227 static PyMemberDef func_memberlist[] = {
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
228 {"__closure__", T_OBJECT, OFF(func_closure),
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
229 RESTRICTED|READONLY},
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
230 {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
231 {"__globals__", T_OBJECT, OFF(func_globals),
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
232 RESTRICTED|READONLY},
27941
14451dd3acb0 Make __module__ writable except in restricted mode (like for classic classes).
Guido van Rossum <guido@python.org>
parents: 27940
diff changeset
233 {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED},
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
234 {NULL} /* Sentinel */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
235 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
236
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
237 static int
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
238 restricted(void)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
239 {
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
240 if (!PyEval_GetRestricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
241 return 0;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
242 PyErr_SetString(PyExc_RuntimeError,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
243 "function attributes not accessible in restricted mode");
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
244 return 1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
245 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
246
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
247 static PyObject *
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
248 func_get_dict(PyFunctionObject *op)
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
249 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
250 if (restricted())
2105
ea7b2bf0b521 add restrictions in restricted mode
Guido van Rossum <guido@python.org>
parents: 2082
diff changeset
251 return NULL;
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
252 if (op->func_dict == NULL) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
253 op->func_dict = PyDict_New();
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
254 if (op->func_dict == NULL)
19244
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
255 return NULL;
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
256 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
257 Py_INCREF(op->func_dict);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
258 return op->func_dict;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
259 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
260
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
261 static int
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
262 func_set_dict(PyFunctionObject *op, PyObject *value)
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
263 {
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
264 PyObject *tmp;
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
265
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
266 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
267 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
268 /* It is illegal to del f.func_dict */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
269 if (value == NULL) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
270 PyErr_SetString(PyExc_TypeError,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
271 "function's dictionary may not be deleted");
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
272 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
273 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
274 /* Can only set func_dict to a dictionary */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
275 if (!PyDict_Check(value)) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
276 PyErr_SetString(PyExc_TypeError,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
277 "setting function's dictionary to a non-dict");
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
278 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
279 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
280 tmp = op->func_dict;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
281 Py_INCREF(value);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
282 op->func_dict = value;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
283 Py_XDECREF(tmp);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
284 return 0;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
285 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
286
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
287 static PyObject *
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
288 func_get_code(PyFunctionObject *op)
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
289 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
290 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
291 return NULL;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
292 Py_INCREF(op->func_code);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
293 return op->func_code;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
294 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
295
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
296 static int
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
297 func_set_code(PyFunctionObject *op, PyObject *value)
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
298 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
299 PyObject *tmp;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
300 Py_ssize_t nfree, nclosure;
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
301
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
302 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
303 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
304 /* Not legal to del f.func_code or to set it to anything
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
305 * other than a code object. */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
306 if (value == NULL || !PyCode_Check(value)) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
307 PyErr_SetString(PyExc_TypeError,
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
308 "__code__ must be set to a code object");
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
309 return -1;
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
310 }
33856
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
311 nfree = PyCode_GetNumFree((PyCodeObject *)value);
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
312 nclosure = (op->func_closure == NULL ? 0 :
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
313 PyTuple_GET_SIZE(op->func_closure));
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
314 if (nclosure != nfree) {
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
315 PyErr_Format(PyExc_ValueError,
36510
0f3894bb2ada Support %zd in PyErr_Format and PyString_FromFormat.
Martin v. Löwis <martin@v.loewis.de>
parents: 36509
diff changeset
316 "%s() requires a code object with %zd free vars,"
0f3894bb2ada Support %zd in PyErr_Format and PyString_FromFormat.
Martin v. Löwis <martin@v.loewis.de>
parents: 36509
diff changeset
317 " not %zd",
33856
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
318 PyString_AsString(op->func_name),
36511
1596ff5c79b5 Revert 42400.
Martin v. Löwis <martin@v.loewis.de>
parents: 36510
diff changeset
319 nclosure, nfree);
33856
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
320 return -1;
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
321 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
322 tmp = op->func_code;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
323 Py_INCREF(value);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
324 op->func_code = value;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
325 Py_DECREF(tmp);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
326 return 0;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
327 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
328
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
329 static PyObject *
33102
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
330 func_get_name(PyFunctionObject *op)
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
331 {
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
332 Py_INCREF(op->func_name);
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
333 return op->func_name;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
334 }
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
335
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
336 static int
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
337 func_set_name(PyFunctionObject *op, PyObject *value)
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
338 {
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
339 PyObject *tmp;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
340
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
341 if (restricted())
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
342 return -1;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
343 /* Not legal to del f.func_name or to set it to anything
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
344 * other than a string object. */
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
345 if (value == NULL || !PyString_Check(value)) {
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
346 PyErr_SetString(PyExc_TypeError,
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
347 "__name__ must be set to a string object");
33102
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
348 return -1;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
349 }
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
350 tmp = op->func_name;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
351 Py_INCREF(value);
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
352 op->func_name = value;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
353 Py_DECREF(tmp);
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
354 return 0;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
355 }
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
356
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
357 static PyObject *
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
358 func_get_defaults(PyFunctionObject *op)
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
359 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
360 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
361 return NULL;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
362 if (op->func_defaults == NULL) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
363 Py_INCREF(Py_None);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
364 return Py_None;
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
365 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
366 Py_INCREF(op->func_defaults);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
367 return op->func_defaults;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
368 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
369
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
370 static int
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
371 func_set_defaults(PyFunctionObject *op, PyObject *value)
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
372 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
373 PyObject *tmp;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
374
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
375 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
376 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
377 /* Legal to del f.func_defaults.
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
378 * Can only set func_defaults to NULL or a tuple. */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
379 if (value == Py_None)
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
380 value = NULL;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
381 if (value != NULL && !PyTuple_Check(value)) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
382 PyErr_SetString(PyExc_TypeError,
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
383 "__defaults__ must be set to a tuple object");
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
384 return -1;
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
385 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
386 tmp = op->func_defaults;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
387 Py_XINCREF(value);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
388 op->func_defaults = value;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
389 Py_XDECREF(tmp);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
390 return 0;
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
391 }
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
392
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
393 static PyObject *
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
394 func_get_kwdefaults(PyFunctionObject *op)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
395 {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
396 if (restricted())
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
397 return NULL;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
398 if (op->func_kwdefaults == NULL) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
399 Py_INCREF(Py_None);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
400 return Py_None;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
401 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
402 Py_INCREF(op->func_kwdefaults);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
403 return op->func_kwdefaults;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
404 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
405
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
406 static int
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
407 func_set_kwdefaults(PyFunctionObject *op, PyObject *value)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
408 {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
409 PyObject *tmp;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
410
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
411 if (restricted())
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
412 return -1;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
413
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
414 if (value == Py_None)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
415 value = NULL;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
416 /* Legal to del f.func_defaults.
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
417 * Can only set func_kwdefaults to NULL or a dict. */
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
418 if (value != NULL && !PyDict_Check(value)) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
419 PyErr_SetString(PyExc_TypeError,
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
420 "__kwdefaults__ must be set to a dict object");
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
421 return -1;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
422 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
423 tmp = op->func_kwdefaults;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
424 Py_XINCREF(value);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
425 op->func_kwdefaults = value;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
426 Py_XDECREF(tmp);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
427 return 0;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
428 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
429
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
430 static PyObject *
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
431 func_get_annotations(PyFunctionObject *op)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
432 {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
433 if (op->func_annotations == NULL) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
434 op->func_annotations = PyDict_New();
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
435 if (op->func_annotations == NULL)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
436 return NULL;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
437 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
438 Py_INCREF(op->func_annotations);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
439 return op->func_annotations;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
440 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
441
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
442 static int
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
443 func_set_annotations(PyFunctionObject *op, PyObject *value)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
444 {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
445 PyObject *tmp;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
446
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
447 if (value == Py_None)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
448 value = NULL;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
449 /* Legal to del f.func_annotations.
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
450 * Can only set func_annotations to NULL (through C api)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
451 * or a dict. */
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
452 if (value != NULL && !PyDict_Check(value)) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
453 PyErr_SetString(PyExc_TypeError,
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
454 "__annotations__ must be set to a dict object");
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
455 return -1;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
456 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
457 tmp = op->func_annotations;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
458 Py_XINCREF(value);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
459 op->func_annotations = value;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
460 Py_XDECREF(tmp);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
461 return 0;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
462 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
463
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
464 static PyGetSetDef func_getsetlist[] = {
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
465 {"__code__", (getter)func_get_code, (setter)func_set_code},
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
466 {"__defaults__", (getter)func_get_defaults,
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
467 (setter)func_set_defaults},
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
468 {"__kwdefaults__", (getter)func_get_kwdefaults,
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
469 (setter)func_set_kwdefaults},
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40529
diff changeset
470 {"__annotations__", (getter)func_get_annotations,
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
471 (setter)func_set_annotations},
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
472 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
33102
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
473 {"__name__", (getter)func_get_name, (setter)func_set_name},
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
474 {NULL} /* Sentinel */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
475 };
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
476
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
477 PyDoc_STRVAR(func_doc,
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
478 "function(code, globals[, name[, argdefs[, closure]]])\n\
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
479 \n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
480 Create a function object from a code object and a dictionary.\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
481 The optional name string overrides the name from the code object.\n\
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
482 The optional argdefs tuple specifies the default argument values.\n\
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
483 The optional closure tuple supplies the bindings for free variables.");
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
484
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
485 /* func_new() maintains the following invariants for closures. The
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
486 closure must correspond to the free variables of the code object.
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
487
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
488 if len(code.co_freevars) == 0:
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
489 closure = NULL
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
490 else:
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
491 len(closure) == len(code.co_freevars)
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
492 for every elt in closure, type(elt) == cell
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
493 */
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
494
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
495 static PyObject *
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
496 func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
497 {
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
498 PyCodeObject *code;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
499 PyObject *globals;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
500 PyObject *name = Py_None;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
501 PyObject *defaults = Py_None;
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
502 PyObject *closure = Py_None;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
503 PyFunctionObject *newfunc;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
504 Py_ssize_t nfree, nclosure;
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36641
diff changeset
505 static char *kwlist[] = {"code", "globals", "name",
28986
41388e84261b SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents: 28537
diff changeset
506 "argdefs", "closure", 0};
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
507
28986
41388e84261b SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents: 28537
diff changeset
508 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
41388e84261b SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents: 28537
diff changeset
509 kwlist,
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
510 &PyCode_Type, &code,
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
511 &PyDict_Type, &globals,
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
512 &name, &defaults, &closure))
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
513 return NULL;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
514 if (name != Py_None && !PyString_Check(name)) {
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
515 PyErr_SetString(PyExc_TypeError,
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
516 "arg 3 (name) must be None or string");
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
517 return NULL;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
518 }
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
519 if (defaults != Py_None && !PyTuple_Check(defaults)) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
520 PyErr_SetString(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
521 "arg 4 (defaults) must be None or tuple");
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
522 return NULL;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
523 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
524 nfree = PyTuple_GET_SIZE(code->co_freevars);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
525 if (!PyTuple_Check(closure)) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
526 if (nfree && closure == Py_None) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
527 PyErr_SetString(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
528 "arg 5 (closure) must be tuple");
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
529 return NULL;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
530 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
531 else if (closure != Py_None) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
532 PyErr_SetString(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
533 "arg 5 (closure) must be None or tuple");
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
534 return NULL;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
535 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
536 }
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
537
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
538 /* check that the closure is well-formed */
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
539 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
540 if (nfree != nclosure)
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
541 return PyErr_Format(PyExc_ValueError,
36510
0f3894bb2ada Support %zd in PyErr_Format and PyString_FromFormat.
Martin v. Löwis <martin@v.loewis.de>
parents: 36509
diff changeset
542 "%s requires closure of length %zd, not %zd",
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
543 PyString_AS_STRING(code->co_name),
36511
1596ff5c79b5 Revert 42400.
Martin v. Löwis <martin@v.loewis.de>
parents: 36510
diff changeset
544 nfree, nclosure);
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
545 if (nclosure) {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
546 Py_ssize_t i;
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
547 for (i = 0; i < nclosure; i++) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
548 PyObject *o = PyTuple_GET_ITEM(closure, i);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
549 if (!PyCell_Check(o)) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
550 return PyErr_Format(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
551 "arg 5 (closure) expected cell, found %s",
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
552 o->ob_type->tp_name);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
553 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
554 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
555 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
556
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
557 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
558 globals);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
559 if (newfunc == NULL)
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
560 return NULL;
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
561
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
562 if (name != Py_None) {
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
563 Py_INCREF(name);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
564 Py_DECREF(newfunc->func_name);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
565 newfunc->func_name = name;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
566 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
567 if (defaults != Py_None) {
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
568 Py_INCREF(defaults);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
569 newfunc->func_defaults = defaults;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
570 }
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
571 if (closure != Py_None) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
572 Py_INCREF(closure);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
573 newfunc->func_closure = closure;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
574 }
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
575
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
576 return (PyObject *)newfunc;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
577 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
578
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 static void
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
580 func_dealloc(PyFunctionObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
581 {
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
582 _PyObject_GC_UNTRACK(op);
20698
b229208a2a72 Be smarter about clearing the weakref lists for instances, instance methods,
Fred Drake <fdrake@acm.org>
parents: 20277
diff changeset
583 if (op->func_weakreflist != NULL)
b229208a2a72 Be smarter about clearing the weakref lists for instances, instance methods,
Fred Drake <fdrake@acm.org>
parents: 20277
diff changeset
584 PyObject_ClearWeakRefs((PyObject *) op);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
585 Py_DECREF(op->func_code);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
586 Py_DECREF(op->func_globals);
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
587 Py_XDECREF(op->func_module);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
588 Py_DECREF(op->func_name);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
589 Py_XDECREF(op->func_defaults);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
590 Py_XDECREF(op->func_doc);
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
591 Py_XDECREF(op->func_dict);
16891
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
592 Py_XDECREF(op->func_closure);
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
593 Py_XDECREF(op->func_annotations);
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
594 PyObject_GC_Del(op);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
596
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
597 static PyObject*
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
598 func_repr(PyFunctionObject *op)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
599 {
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19244
diff changeset
600 return PyString_FromFormat("<function %s at %p>",
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19244
diff changeset
601 PyString_AsString(op->func_name),
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19244
diff changeset
602 op);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
603 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
604
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1288
diff changeset
605 static int
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
606 func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
607 {
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
608 Py_VISIT(f->func_code);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
609 Py_VISIT(f->func_globals);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
610 Py_VISIT(f->func_module);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
611 Py_VISIT(f->func_defaults);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
612 Py_VISIT(f->func_doc);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
613 Py_VISIT(f->func_name);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
614 Py_VISIT(f->func_dict);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
615 Py_VISIT(f->func_closure);
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40215
diff changeset
616 Py_VISIT(f->func_annotations);
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
617 return 0;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
618 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
619
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
620 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
621 function_call(PyObject *func, PyObject *arg, PyObject *kw)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
622 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
623 PyObject *result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
624 PyObject *argdefs;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
625 PyObject **d, **k;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
626 Py_ssize_t nk, nd;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
627
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
628 argdefs = PyFunction_GET_DEFAULTS(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
629 if (argdefs != NULL && PyTuple_Check(argdefs)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
630 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
631 nd = PyTuple_Size(argdefs);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
632 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
633 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
634 d = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
635 nd = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
636 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
637
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
638 if (kw != NULL && PyDict_Check(kw)) {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
639 Py_ssize_t pos, i;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
640 nk = PyDict_Size(kw);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
641 k = PyMem_NEW(PyObject *, 2*nk);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
642 if (k == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
643 PyErr_NoMemory();
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
644 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
645 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
646 pos = i = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
647 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
648 i += 2;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
649 nk = i/2;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
650 /* XXX This is broken if the caller deletes dict items! */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
651 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
652 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
653 k = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
654 nk = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
655 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
656
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
657 result = PyEval_EvalCodeEx(
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
658 (PyCodeObject *)PyFunction_GET_CODE(func),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
659 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
660 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
661 k, nk, d, nd,
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
662 PyFunction_GET_KW_DEFAULTS(func),
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
663 PyFunction_GET_CLOSURE(func));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
664
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
665 if (k != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
666 PyMem_DEL(k);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
667
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
668 return result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
669 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
670
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
671 /* Bind a function to an object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
672 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
673 func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
674 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
675 if (obj == Py_None)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
676 obj = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
677 return PyMethod_New(func, obj, type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
678 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
679
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
680 PyTypeObject PyFunction_Type = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
681 PyObject_HEAD_INIT(&PyType_Type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 0,
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
683 "function",
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
684 sizeof(PyFunctionObject),
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685 0,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
686 (destructor)func_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
687 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
688 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
689 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
690 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
691 (reprfunc)func_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
692 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
693 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
694 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
695 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
696 function_call, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
697 0, /* tp_str */
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
698 PyObject_GenericGetAttr, /* tp_getattro */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
699 PyObject_GenericSetAttr, /* tp_setattro */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
700 0, /* tp_as_buffer */
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
701 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
702 func_doc, /* tp_doc */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
703 (traverseproc)func_traverse, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
704 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
705 0, /* tp_richcompare */
17170
962196ce7231 Add support for weak references to the function and method types.
Fred Drake <fdrake@acm.org>
parents: 16891
diff changeset
706 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
707 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
708 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
709 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
710 func_memberlist, /* tp_members */
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
711 func_getsetlist, /* tp_getset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
712 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
713 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
714 func_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
715 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
716 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
717 0, /* tp_init */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
718 0, /* tp_alloc */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
719 func_new, /* tp_new */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
720 };
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
721
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
722
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
723 /* Class method object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
724
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
725 /* A class method receives the class as implicit first argument,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
726 just like an instance method receives the instance.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
727 To declare a class method, use this idiom:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
728
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
729 class C:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
730 def f(cls, arg1, arg2, ...): ...
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
731 f = classmethod(f)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
732
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
733 It can be called either on the class (e.g. C.f()) or on an instance
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
734 (e.g. C().f()); the instance is ignored except for its class.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
735 If a class method is called for a derived class, the derived class
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
736 object is passed as the implied first argument.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
737
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
738 Class methods are different than C++ or Java static methods.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
739 If you want those, see static methods below.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
740 */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
741
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
742 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
743 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
744 PyObject *cm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
745 } classmethod;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
746
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
747 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
748 cm_dealloc(classmethod *cm)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
749 {
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
750 _PyObject_GC_UNTRACK((PyObject *)cm);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
751 Py_XDECREF(cm->cm_callable);
20277
2983b54256c7 Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents: 20015
diff changeset
752 cm->ob_type->tp_free((PyObject *)cm);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
753 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
754
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
755 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
756 cm_traverse(classmethod *cm, visitproc visit, void *arg)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
757 {
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
758 Py_VISIT(cm->cm_callable);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
759 return 0;
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
760 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
761
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
762 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
763 cm_clear(classmethod *cm)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
764 {
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
765 Py_CLEAR(cm->cm_callable);
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
766 return 0;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
767 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
768
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
769
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
770 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
771 cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
772 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
773 classmethod *cm = (classmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
774
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
775 if (cm->cm_callable == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
776 PyErr_SetString(PyExc_RuntimeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
777 "uninitialized classmethod object");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
778 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
779 }
22367
f2b6ccc00808 Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault
Guido van Rossum <guido@python.org>
parents: 21446
diff changeset
780 if (type == NULL)
f2b6ccc00808 Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault
Guido van Rossum <guido@python.org>
parents: 21446
diff changeset
781 type = (PyObject *)(obj->ob_type);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
782 return PyMethod_New(cm->cm_callable,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
783 type, (PyObject *)(type->ob_type));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
784 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
785
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
786 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
787 cm_init(PyObject *self, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
788 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
789 classmethod *cm = (classmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
790 PyObject *callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
791
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24193
diff changeset
792 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
793 return -1;
36641
36ae3d929832 Make staticmethod and classmethod complain about keyword args.
Georg Brandl <georg@python.org>
parents: 36511
diff changeset
794 if (!_PyArg_NoKeywords("classmethod", kwds))
36ae3d929832 Make staticmethod and classmethod complain about keyword args.
Georg Brandl <georg@python.org>
parents: 36511
diff changeset
795 return -1;
29526
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
796 if (!PyCallable_Check(callable)) {
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
797 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
798 callable->ob_type->tp_name);
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
799 return -1;
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
800 }
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
801
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
802 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
803 cm->cm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
804 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
805 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
806
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22974
diff changeset
807 PyDoc_STRVAR(classmethod_doc,
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
808 "classmethod(function) -> method\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
809 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
810 Convert a function to be a class method.\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
811 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
812 A class method receives the class as implicit first argument,\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
813 just like an instance method receives the instance.\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
814 To declare a class method, use this idiom:\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
815 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
816 class C:\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
817 def f(cls, arg1, arg2, ...): ...\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
818 f = classmethod(f)\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
819 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
820 It can be called either on the class (e.g. C.f()) or on an instance\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
821 (e.g. C().f()). The instance is ignored except for its class.\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
822 If a class method is called for a derived class, the derived class\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
823 object is passed as the implied first argument.\n\
21446
77c7476f41bd Portability fix: Not every compiler implements the extension of
Sjoerd Mullender <sjoerd@acm.org>
parents: 21444
diff changeset
824 \n\
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
825 Class methods are different than C++ or Java static methods.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22974
diff changeset
826 If you want those, see the staticmethod builtin.");
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
827
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
828 PyTypeObject PyClassMethod_Type = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
829 PyObject_HEAD_INIT(&PyType_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
830 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
831 "classmethod",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
832 sizeof(classmethod),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
833 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
834 (destructor)cm_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
835 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
836 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
837 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
838 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
839 0, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
840 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
841 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
842 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
843 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
844 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
845 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
846 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
847 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
848 0, /* tp_as_buffer */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
849 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
850 classmethod_doc, /* tp_doc */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
851 (traverseproc)cm_traverse, /* tp_traverse */
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
852 (inquiry)cm_clear, /* tp_clear */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
853 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
854 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
855 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
856 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
857 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
858 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
859 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
860 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
861 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
862 cm_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
863 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
864 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
865 cm_init, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
866 PyType_GenericAlloc, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
867 PyType_GenericNew, /* tp_new */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
868 PyObject_GC_Del, /* tp_free */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
869 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
870
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
871 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
872 PyClassMethod_New(PyObject *callable)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
873 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
874 classmethod *cm = (classmethod *)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
875 PyType_GenericAlloc(&PyClassMethod_Type, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
876 if (cm != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
877 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
878 cm->cm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
879 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
880 return (PyObject *)cm;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
881 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
882
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
883
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
884 /* Static method object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
885
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
886 /* A static method does not receive an implicit first argument.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
887 To declare a static method, use this idiom:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
888
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
889 class C:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
890 def f(arg1, arg2, ...): ...
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
891 f = staticmethod(f)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
892
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
893 It can be called either on the class (e.g. C.f()) or on an instance
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
894 (e.g. C().f()); the instance is ignored except for its class.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
895
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
896 Static methods in Python are similar to those found in Java or C++.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
897 For a more advanced concept, see class methods above.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
898 */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
899
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
900 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
901 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
902 PyObject *sm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
903 } staticmethod;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
904
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
905 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
906 sm_dealloc(staticmethod *sm)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
907 {
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
908 _PyObject_GC_UNTRACK((PyObject *)sm);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
909 Py_XDECREF(sm->sm_callable);
20277
2983b54256c7 Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents: 20015
diff changeset
910 sm->ob_type->tp_free((PyObject *)sm);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
911 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
912
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
913 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
914 sm_traverse(staticmethod *sm, visitproc visit, void *arg)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
915 {
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
916 Py_VISIT(sm->sm_callable);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
917 return 0;
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
918 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
919
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
920 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
921 sm_clear(staticmethod *sm)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
922 {
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
923 Py_XDECREF(sm->sm_callable);
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
924 sm->sm_callable = NULL;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
925
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
926 return 0;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
927 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
928
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
929 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
930 sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
931 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
932 staticmethod *sm = (staticmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
934 if (sm->sm_callable == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
935 PyErr_SetString(PyExc_RuntimeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
936 "uninitialized staticmethod object");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
937 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
938 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
939 Py_INCREF(sm->sm_callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
940 return sm->sm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
941 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
942
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
943 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
944 sm_init(PyObject *self, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
945 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
946 staticmethod *sm = (staticmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
947 PyObject *callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
948
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24193
diff changeset
949 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
950 return -1;
36641
36ae3d929832 Make staticmethod and classmethod complain about keyword args.
Georg Brandl <georg@python.org>
parents: 36511
diff changeset
951 if (!_PyArg_NoKeywords("staticmethod", kwds))
36ae3d929832 Make staticmethod and classmethod complain about keyword args.
Georg Brandl <georg@python.org>
parents: 36511
diff changeset
952 return -1;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
953 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
954 sm->sm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
955 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
956 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
957
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22974
diff changeset
958 PyDoc_STRVAR(staticmethod_doc,
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
959 "staticmethod(function) -> method\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
960 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
961 Convert a function to be a static method.\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
962 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
963 A static method does not receive an implicit first argument.\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
964 To declare a static method, use this idiom:\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
965 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
966 class C:\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
967 def f(arg1, arg2, ...): ...\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
968 f = staticmethod(f)\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
969 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
970 It can be called either on the class (e.g. C.f()) or on an instance\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
971 (e.g. C().f()). The instance is ignored except for its class.\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
972 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
973 Static methods in Python are similar to those found in Java or C++.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22974
diff changeset
974 For a more advanced concept, see the classmethod builtin.");
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
975
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
976 PyTypeObject PyStaticMethod_Type = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
977 PyObject_HEAD_INIT(&PyType_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
978 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
979 "staticmethod",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
980 sizeof(staticmethod),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
981 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
982 (destructor)sm_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
983 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
984 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
985 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
986 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
987 0, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
988 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
989 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
990 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
991 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
992 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
993 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
994 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
995 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
996 0, /* tp_as_buffer */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
997 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
998 staticmethod_doc, /* tp_doc */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
999 (traverseproc)sm_traverse, /* tp_traverse */
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
1000 (inquiry)sm_clear, /* tp_clear */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1001 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1002 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1003 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1004 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1005 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1006 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1007 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1008 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1009 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1010 sm_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1011 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1012 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1013 sm_init, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1014 PyType_GenericAlloc, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1015 PyType_GenericNew, /* tp_new */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
1016 PyObject_GC_Del, /* tp_free */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1017 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1018
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1019 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1020 PyStaticMethod_New(PyObject *callable)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1021 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1022 staticmethod *sm = (staticmethod *)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1023 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1024 if (sm != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1025 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1026 sm->sm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1027 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1028 return (PyObject *)sm;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
1029 }