annotate Objects/funcobject.c @ 36392:2012c548ce69 2.4

Correct misspellings.
author Georg Brandl <georg@python.org>
date Mon, 23 Jan 2006 22:00:32 +0000
parents 67937a3852fe
children f019e4f86287 1c4d192f1568
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"
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
5 #include "compile.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 */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
27 op->func_closure = NULL;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
28 consts = ((PyCodeObject *)code)->co_consts;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
29 if (PyTuple_Size(consts) >= 1) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
30 doc = PyTuple_GetItem(consts, 0);
12512
a61157328b12 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 8407
diff changeset
31 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
32 doc = Py_None;
2082
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
33 }
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
34 else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
35 doc = Py_None;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
36 Py_INCREF(doc);
2082
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
37 op->func_doc = doc;
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
38 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
39 op->func_module = NULL;
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
40
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
41 /* __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
42 Otherwise, use None.
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
43 */
31780
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
44 if (!__name__) {
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
45 __name__ = PyString_InternFromString("__name__");
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 Py_DECREF(op);
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
48 return NULL;
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
49 }
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
50 }
d448cc261f69 Intern __name__.
Martin v. Löwis <martin@v.loewis.de>
parents: 29526
diff changeset
51 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
52 if (module) {
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
53 Py_INCREF(module);
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
54 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
55 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 }
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
57 else
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
58 return NULL;
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
59 _PyObject_GC_TRACK(op);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
60 return (PyObject *)op;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
63 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
64 PyFunction_GetCode(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
66 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
67 PyErr_BadInternalCall();
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
70 return ((PyFunctionObject *) op) -> func_code;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
73 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
74 PyFunction_GetGlobals(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
76 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
77 PyErr_BadInternalCall();
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
80 return ((PyFunctionObject *) op) -> func_globals;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
83 PyObject *
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
84 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
85 {
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
86 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
87 PyErr_BadInternalCall();
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
88 return NULL;
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
89 }
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
90 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
91 }
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
92
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
93 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
94 PyFunction_GetDefaults(PyObject *op)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
95 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
96 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
97 PyErr_BadInternalCall();
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
98 return NULL;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
99 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
100 return ((PyFunctionObject *) op) -> func_defaults;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
101 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
102
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
103 int
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
104 PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
105 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
106 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
107 PyErr_BadInternalCall();
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
108 return -1;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
109 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
110 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
111 defaults = NULL;
7981
09963a2a24db Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5945
diff changeset
112 else if (PyTuple_Check(defaults)) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
113 Py_XINCREF(defaults);
7981
09963a2a24db Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5945
diff changeset
114 }
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
115 else {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
116 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
117 return -1;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
118 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
119 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
120 ((PyFunctionObject *) op) -> func_defaults = defaults;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
121 return 0;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
122 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
123
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
124 PyObject *
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
125 PyFunction_GetClosure(PyObject *op)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
126 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
127 if (!PyFunction_Check(op)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
128 PyErr_BadInternalCall();
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
129 return NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
130 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
131 return ((PyFunctionObject *) op) -> func_closure;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
132 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
133
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
134 int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
135 PyFunction_SetClosure(PyObject *op, PyObject *closure)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
136 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
137 if (!PyFunction_Check(op)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
138 PyErr_BadInternalCall();
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
139 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
140 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
141 if (closure == Py_None)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
142 closure = NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
143 else if (PyTuple_Check(closure)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
144 Py_XINCREF(closure);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
145 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
146 else {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
147 PyErr_SetString(PyExc_SystemError, "non-tuple closure");
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
148 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
149 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
150 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
151 ((PyFunctionObject *) op) -> func_closure = closure;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
152 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
153 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
154
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
157 #define OFF(x) offsetof(PyFunctionObject, x)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
158
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19948
diff changeset
159 static PyMemberDef func_memberlist[] = {
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
160 {"func_closure", T_OBJECT, OFF(func_closure),
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
161 RESTRICTED|READONLY},
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
162 {"func_doc", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
163 {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
164 {"func_globals", T_OBJECT, OFF(func_globals),
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
165 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
166 {"__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
167 {NULL} /* Sentinel */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
168 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
169
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
170 static int
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
171 restricted(void)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
172 {
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
173 if (!PyEval_GetRestricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
174 return 0;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
175 PyErr_SetString(PyExc_RuntimeError,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
176 "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
177 return 1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
178 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
179
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
180 static PyObject *
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
181 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
182 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
183 if (restricted())
2105
ea7b2bf0b521 add restrictions in restricted mode
Guido van Rossum <guido@python.org>
parents: 2082
diff changeset
184 return NULL;
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
185 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
186 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
187 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
188 return NULL;
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
189 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
190 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
191 return op->func_dict;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
192 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
193
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
194 static int
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
195 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
196 {
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
197 PyObject *tmp;
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
198
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
199 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
200 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
201 /* 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
202 if (value == NULL) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
203 PyErr_SetString(PyExc_TypeError,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
204 "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
205 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
206 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
207 /* 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
208 if (!PyDict_Check(value)) {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
209 PyErr_SetString(PyExc_TypeError,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
210 "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
211 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
212 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
213 tmp = op->func_dict;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
214 Py_INCREF(value);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
215 op->func_dict = value;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
216 Py_XDECREF(tmp);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
217 return 0;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
218 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
219
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
220 static PyObject *
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
221 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
222 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
223 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
224 return NULL;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
225 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
226 return op->func_code;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
227 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
228
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
229 static int
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
230 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
231 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
232 PyObject *tmp;
33856
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
233 int nfree, nclosure;
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
234
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
235 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
236 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
237 /* 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
238 * 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
239 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
240 PyErr_SetString(PyExc_TypeError,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
241 "func_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
242 return -1;
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
243 }
33856
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
244 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
245 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
246 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
247 if (nclosure != nfree) {
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
248 PyErr_Format(PyExc_ValueError,
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
249 "%s() requires a code object with %d free vars,"
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
250 " not %d",
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
251 PyString_AsString(op->func_name),
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
252 nclosure, nfree);
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
253 return -1;
60c60dc75c77 Wrote down the invariants of some common objects whose structure is
Armin Rigo <arigo@tunes.org>
parents: 33102
diff changeset
254 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
255 tmp = op->func_code;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
256 Py_INCREF(value);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
257 op->func_code = value;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
258 Py_DECREF(tmp);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
259 return 0;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
260 }
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
261
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
262 static PyObject *
33102
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
263 func_get_name(PyFunctionObject *op)
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
264 {
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
265 Py_INCREF(op->func_name);
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
266 return op->func_name;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
267 }
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
268
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
269 static int
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
270 func_set_name(PyFunctionObject *op, PyObject *value)
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
271 {
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
272 PyObject *tmp;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
273
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
274 if (restricted())
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
275 return -1;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
276 /* 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
277 * other than a string object. */
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
278 if (value == NULL || !PyString_Check(value)) {
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
279 PyErr_SetString(PyExc_TypeError,
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
280 "func_name must be set to a string object");
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
281 return -1;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
282 }
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
283 tmp = op->func_name;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
284 Py_INCREF(value);
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
285 op->func_name = value;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
286 Py_DECREF(tmp);
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
287 return 0;
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
288 }
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
289
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
290 static PyObject *
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
291 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
292 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
293 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
294 return NULL;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
295 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
296 Py_INCREF(Py_None);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
297 return Py_None;
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
298 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
299 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
300 return op->func_defaults;
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
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
303 static int
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
304 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
305 {
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
306 PyObject *tmp;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
307
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
308 if (restricted())
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
309 return -1;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
310 /* 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
311 * 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
312 if (value == Py_None)
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
313 value = NULL;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
314 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
315 PyErr_SetString(PyExc_TypeError,
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
316 "func_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
317 return -1;
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
318 }
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
319 tmp = op->func_defaults;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
320 Py_XINCREF(value);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
321 op->func_defaults = value;
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
322 Py_XDECREF(tmp);
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
323 return 0;
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
324 }
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
325
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
326 static PyGetSetDef func_getsetlist[] = {
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
327 {"func_code", (getter)func_get_code, (setter)func_set_code},
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
328 {"func_defaults", (getter)func_get_defaults,
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
329 (setter)func_set_defaults},
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
330 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
331 {"__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
332 {"func_name", (getter)func_get_name, (setter)func_set_name},
f27935b46985 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 32531
diff changeset
333 {"__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
334 {NULL} /* Sentinel */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
335 };
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
336
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
337 PyDoc_STRVAR(func_doc,
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
338 "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
339 \n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
340 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
341 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
342 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
343 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
344
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
345 /* 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
346 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
347
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
348 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
349 closure = NULL
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
350 else:
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
351 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
352 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
353 */
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
354
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
355 static PyObject *
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
356 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
357 {
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
358 PyCodeObject *code;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
359 PyObject *globals;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
360 PyObject *name = Py_None;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
361 PyObject *defaults = Py_None;
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
362 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
363 PyFunctionObject *newfunc;
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
364 int nfree, nclosure;
28986
41388e84261b SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents: 28537
diff changeset
365 static char *kwlist[] = {"code", "globals", "name",
41388e84261b SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents: 28537
diff changeset
366 "argdefs", "closure", 0};
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
367
28986
41388e84261b SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents: 28537
diff changeset
368 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
369 kwlist,
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
370 &PyCode_Type, &code,
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
371 &PyDict_Type, &globals,
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
372 &name, &defaults, &closure))
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
373 return NULL;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
374 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
375 PyErr_SetString(PyExc_TypeError,
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
376 "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
377 return NULL;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
378 }
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
379 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
380 PyErr_SetString(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
381 "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
382 return NULL;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
383 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
384 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
385 if (!PyTuple_Check(closure)) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
386 if (nfree && closure == Py_None) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
387 PyErr_SetString(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
388 "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
389 return NULL;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
390 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
391 else if (closure != Py_None) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
392 PyErr_SetString(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
393 "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
394 return NULL;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
395 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
396 }
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
397
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
398 /* 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
399 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
400 if (nfree != nclosure)
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
401 return PyErr_Format(PyExc_ValueError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
402 "%s requires closure of length %d, not %d",
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
403 PyString_AS_STRING(code->co_name),
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
404 nfree, nclosure);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
405 if (nclosure) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
406 int i;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
407 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
408 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
409 if (!PyCell_Check(o)) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
410 return PyErr_Format(PyExc_TypeError,
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
411 "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
412 o->ob_type->tp_name);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
413 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
414 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
415 }
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
416
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
417 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
418 globals);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
419 if (newfunc == NULL)
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
420 return NULL;
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
421
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
422 if (name != Py_None) {
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
423 Py_INCREF(name);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
424 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
425 newfunc->func_name = name;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
426 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
427 if (defaults != Py_None) {
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
428 Py_INCREF(defaults);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
429 newfunc->func_defaults = defaults;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
430 }
24193
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
431 if (closure != Py_None) {
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
432 Py_INCREF(closure);
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
433 newfunc->func_closure = closure;
6eb74e83a6f1 Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23868
diff changeset
434 }
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
435
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
436 return (PyObject *)newfunc;
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
437 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
438
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 static void
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
440 func_dealloc(PyFunctionObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 {
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
442 _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
443 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
444 PyObject_ClearWeakRefs((PyObject *) op);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
445 Py_DECREF(op->func_code);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
446 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
447 Py_XDECREF(op->func_module);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
448 Py_DECREF(op->func_name);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
449 Py_XDECREF(op->func_defaults);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
450 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
451 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
452 Py_XDECREF(op->func_closure);
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
453 PyObject_GC_Del(op);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
456 static PyObject*
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
457 func_repr(PyFunctionObject *op)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
458 {
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19244
diff changeset
459 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
460 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
461 op);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
462 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
463
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1288
diff changeset
464 static int
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
465 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
466 {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
467 int err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
468 if (f->func_code) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
469 err = visit(f->func_code, arg);
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
470 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
471 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
472 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
473 if (f->func_globals) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
474 err = visit(f->func_globals, arg);
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
475 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
476 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
477 }
27559
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
478 if (f->func_module) {
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
479 err = visit(f->func_module, arg);
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
480 if (err)
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
481 return err;
faabd9867fb8 Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26818
diff changeset
482 }
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
483 if (f->func_defaults) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
484 err = visit(f->func_defaults, arg);
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
485 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
486 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
487 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
488 if (f->func_doc) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
489 err = visit(f->func_doc, arg);
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
490 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
491 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
492 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
493 if (f->func_name) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
494 err = visit(f->func_name, arg);
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
495 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
496 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
497 }
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
498 if (f->func_dict) {
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
499 err = visit(f->func_dict, arg);
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
500 if (err)
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
501 return err;
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
502 }
16891
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
503 if (f->func_closure) {
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
504 err = visit(f->func_closure, arg);
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
505 if (err)
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
506 return err;
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
507 }
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
508 return 0;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
509 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
510
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
511 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
512 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
513 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
514 PyObject *result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
515 PyObject *argdefs;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
516 PyObject **d, **k;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
517 int nk, nd;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
518
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
519 argdefs = PyFunction_GET_DEFAULTS(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
520 if (argdefs != NULL && PyTuple_Check(argdefs)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
521 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
522 nd = PyTuple_Size(argdefs);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
523 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
524 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
525 d = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
526 nd = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
527 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
528
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
529 if (kw != NULL && PyDict_Check(kw)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
530 int pos, i;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
531 nk = PyDict_Size(kw);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
532 k = PyMem_NEW(PyObject *, 2*nk);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
533 if (k == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
534 PyErr_NoMemory();
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
535 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
536 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
537 pos = i = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
538 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
539 i += 2;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
540 nk = i/2;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
541 /* 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
542 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
543 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
544 k = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
545 nk = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
546 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
547
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
548 result = PyEval_EvalCodeEx(
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
549 (PyCodeObject *)PyFunction_GET_CODE(func),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
550 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
551 &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
552 k, nk, d, nd,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
553 PyFunction_GET_CLOSURE(func));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
554
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
555 if (k != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
556 PyMem_DEL(k);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
557
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
558 return result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
559 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
560
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
561 /* Bind a function to an object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
562 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
563 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
564 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
565 if (obj == Py_None)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
566 obj = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
567 return PyMethod_New(func, obj, type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
568 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
569
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
570 PyTypeObject PyFunction_Type = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
571 PyObject_HEAD_INIT(&PyType_Type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
572 0,
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
573 "function",
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
574 sizeof(PyFunctionObject),
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 0,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
576 (destructor)func_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
577 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
578 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
579 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
580 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
581 (reprfunc)func_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
582 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
583 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
584 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
585 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
586 function_call, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
587 0, /* tp_str */
19948
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
588 PyObject_GenericGetAttr, /* tp_getattro */
eaf1203b85cf Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
589 PyObject_GenericSetAttr, /* tp_setattro */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
590 0, /* tp_as_buffer */
19581
fd48a55ac364 Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19476
diff changeset
591 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
592 func_doc, /* tp_doc */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
593 (traverseproc)func_traverse, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
594 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
595 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
596 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
597 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
598 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
599 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
600 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
601 func_getsetlist, /* tp_getset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
602 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
603 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
604 func_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
605 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
606 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
607 0, /* tp_init */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
608 0, /* tp_alloc */
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
609 func_new, /* tp_new */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 };
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
611
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
612
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
613 /* Class method object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
614
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
615 /* 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
616 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
617 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
618
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
619 class C:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
620 def f(cls, arg1, arg2, ...): ...
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
621 f = classmethod(f)
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 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
624 (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
625 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
626 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
627
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
628 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
629 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
630 */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
631
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
632 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
633 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
634 PyObject *cm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
635 } classmethod;
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 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
638 cm_dealloc(classmethod *cm)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
639 {
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
640 _PyObject_GC_UNTRACK((PyObject *)cm);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
641 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
642 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
643 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
644
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
645 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
646 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
647 {
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
648 if (!cm->cm_callable)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
649 return 0;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
650 return visit(cm->cm_callable, arg);
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
651 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
652
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
653 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
654 cm_clear(classmethod *cm)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
655 {
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
656 Py_XDECREF(cm->cm_callable);
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
657 cm->cm_callable = NULL;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
658
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
659 return 0;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
660 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
661
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
662
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
663 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
664 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
665 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
666 classmethod *cm = (classmethod *)self;
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 if (cm->cm_callable == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
669 PyErr_SetString(PyExc_RuntimeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
670 "uninitialized classmethod object");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
671 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
672 }
22367
f2b6ccc00808 Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault
Guido van Rossum <guido@python.org>
parents: 21446
diff changeset
673 if (type == NULL)
f2b6ccc00808 Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault
Guido van Rossum <guido@python.org>
parents: 21446
diff changeset
674 type = (PyObject *)(obj->ob_type);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
675 return PyMethod_New(cm->cm_callable,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
676 type, (PyObject *)(type->ob_type));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
677 }
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 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
680 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
681 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
682 classmethod *cm = (classmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
683 PyObject *callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
684
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24193
diff changeset
685 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
686 return -1;
29526
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
687 if (!PyCallable_Check(callable)) {
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
688 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
689 callable->ob_type->tp_name);
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
690 return -1;
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
691 }
f6d503de45bd SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents: 28986
diff changeset
692
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
693 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
694 cm->cm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
695 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
696 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
697
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22974
diff changeset
698 PyDoc_STRVAR(classmethod_doc,
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
699 "classmethod(function) -> method\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
700 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
701 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
702 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
703 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
704 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
705 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
706 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
707 class C:\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
708 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
709 f = classmethod(f)\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
710 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
711 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
712 (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
713 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
714 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
715 \n\
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
716 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
717 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
718
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
719 PyTypeObject PyClassMethod_Type = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
720 PyObject_HEAD_INIT(&PyType_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
721 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
722 "classmethod",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
723 sizeof(classmethod),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
724 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
725 (destructor)cm_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
726 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
727 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
728 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
729 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
730 0, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
731 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
732 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
733 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
734 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
735 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
736 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
737 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
738 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
739 0, /* tp_as_buffer */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
740 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
741 classmethod_doc, /* tp_doc */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
742 (traverseproc)cm_traverse, /* tp_traverse */
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
743 (inquiry)cm_clear, /* tp_clear */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
744 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
745 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
746 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
747 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
748 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
749 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
750 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
751 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
752 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
753 cm_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
754 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
755 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
756 cm_init, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
757 PyType_GenericAlloc, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
758 PyType_GenericNew, /* tp_new */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
759 PyObject_GC_Del, /* tp_free */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
760 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
761
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
762 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
763 PyClassMethod_New(PyObject *callable)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
764 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
765 classmethod *cm = (classmethod *)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
766 PyType_GenericAlloc(&PyClassMethod_Type, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
767 if (cm != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
768 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
769 cm->cm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
770 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
771 return (PyObject *)cm;
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
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 /* Static method object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
776
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
777 /* 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
778 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
779
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
780 class C:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
781 def f(arg1, arg2, ...): ...
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
782 f = staticmethod(f)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
783
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
784 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
785 (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
786
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
787 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
788 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
789 */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
790
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
791 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
792 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
793 PyObject *sm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
794 } staticmethod;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
795
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
796 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
797 sm_dealloc(staticmethod *sm)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
798 {
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
799 _PyObject_GC_UNTRACK((PyObject *)sm);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
800 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
801 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
802 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
803
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
804 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
805 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
806 {
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
807 if (!sm->sm_callable)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
808 return 0;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
809 return visit(sm->sm_callable, arg);
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
810 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
811
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
812 static int
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
813 sm_clear(staticmethod *sm)
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
814 {
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
815 Py_XDECREF(sm->sm_callable);
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
816 sm->sm_callable = NULL;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
817
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
818 return 0;
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
819 }
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
820
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
821 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
822 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
823 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
824 staticmethod *sm = (staticmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
825
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
826 if (sm->sm_callable == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
827 PyErr_SetString(PyExc_RuntimeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
828 "uninitialized staticmethod object");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
829 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
830 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
831 Py_INCREF(sm->sm_callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
832 return sm->sm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
833 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
834
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
835 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
836 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
837 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
838 staticmethod *sm = (staticmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
839 PyObject *callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
840
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24193
diff changeset
841 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
842 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
843 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
844 sm->sm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
845 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
846 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
847
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22974
diff changeset
848 PyDoc_STRVAR(staticmethod_doc,
21444
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
849 "staticmethod(function) -> method\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
850 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
851 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
852 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
853 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
854 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
855 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
856 class C:\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
857 def f(arg1, arg2, ...): ...\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
858 f = staticmethod(f)\n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
859 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
860 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
861 (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
862 \n\
5193290aef0a SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents: 21167
diff changeset
863 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
864 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
865
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
866 PyTypeObject PyStaticMethod_Type = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
867 PyObject_HEAD_INIT(&PyType_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
868 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
869 "staticmethod",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
870 sizeof(staticmethod),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
871 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
872 (destructor)sm_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
873 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
874 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
875 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
876 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
877 0, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
878 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
879 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
880 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
881 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
882 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
883 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
884 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
885 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
886 0, /* tp_as_buffer */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
887 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
888 staticmethod_doc, /* tp_doc */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
889 (traverseproc)sm_traverse, /* tp_traverse */
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
890 (inquiry)sm_clear, /* tp_clear */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
891 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
892 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
893 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
894 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
895 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
896 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
897 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
898 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
899 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
900 sm_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
901 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
902 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
903 sm_init, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
904 PyType_GenericAlloc, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
905 PyType_GenericNew, /* tp_new */
28537
c7bb254ab890 Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 27941
diff changeset
906 PyObject_GC_Del, /* tp_free */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
907 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
908
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
909 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
910 PyStaticMethod_New(PyObject *callable)
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 staticmethod *sm = (staticmethod *)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
913 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
914 if (sm != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
915 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
916 sm->sm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
917 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
918 return (PyObject *)sm;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
919 }