annotate Objects/funcobject.c @ 19283:b865cd5c1925 legacy-trunk

Added comments before recently added/assigned slots in the type object, so the backward compatibility issues will be easier to understand. I only added comments indicating additions and assignments back to Python 2.0.
author Fred Drake <fdrake@acm.org>
date Wed, 15 Aug 2001 18:32:33 +0000
parents fbe2074c5fa5
children 0e70df98424e
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 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
12 PyFunctionObject *op = PyObject_NEW(PyFunctionObject,
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
13 &PyFunction_Type);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 if (op != NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
15 PyObject *doc;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
16 PyObject *consts;
17170
962196ce7231 Add support for weak references to the function and method types.
Fred Drake <fdrake@acm.org>
parents: 16891
diff changeset
17 op->func_weakreflist = NULL;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
18 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
19 op->func_code = code;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
20 Py_INCREF(globals);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 op->func_globals = globals;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
22 op->func_name = ((PyCodeObject *)code)->co_name;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
23 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
24 op->func_defaults = NULL; /* No default arguments */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
25 op->func_closure = NULL;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
26 consts = ((PyCodeObject *)code)->co_consts;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
27 if (PyTuple_Size(consts) >= 1) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
28 doc = PyTuple_GetItem(consts, 0);
12512
a61157328b12 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 8407
diff changeset
29 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
30 doc = Py_None;
2082
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
31 }
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
32 else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
33 doc = Py_None;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
34 Py_INCREF(doc);
2082
4afa7eb4734b Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
35 op->func_doc = doc;
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
36 op->func_dict = NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 }
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
38 else
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
39 return NULL;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13141
diff changeset
40 PyObject_GC_Init(op);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
41 return (PyObject *)op;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
44 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
45 PyFunction_GetCode(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
47 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
48 PyErr_BadInternalCall();
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
51 return ((PyFunctionObject *) op) -> func_code;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
54 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
55 PyFunction_GetGlobals(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
57 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
58 PyErr_BadInternalCall();
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
61 return ((PyFunctionObject *) op) -> func_globals;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
64 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
65 PyFunction_GetDefaults(PyObject *op)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
66 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
67 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
68 PyErr_BadInternalCall();
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
69 return NULL;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
70 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
71 return ((PyFunctionObject *) op) -> func_defaults;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
72 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
73
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
74 int
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
75 PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
76 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
77 if (!PyFunction_Check(op)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
78 PyErr_BadInternalCall();
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
79 return -1;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
80 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
81 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
82 defaults = NULL;
7981
09963a2a24db Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5945
diff changeset
83 else if (PyTuple_Check(defaults)) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
84 Py_XINCREF(defaults);
7981
09963a2a24db Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5945
diff changeset
85 }
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
86 else {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
87 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
88 return -1;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
89 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
90 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
91 ((PyFunctionObject *) op) -> func_defaults = defaults;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
92 return 0;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
93 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
94
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
95 PyObject *
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
96 PyFunction_GetClosure(PyObject *op)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
97 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
98 if (!PyFunction_Check(op)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
99 PyErr_BadInternalCall();
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
100 return NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
101 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
102 return ((PyFunctionObject *) op) -> func_closure;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
103 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
104
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
105 int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
106 PyFunction_SetClosure(PyObject *op, PyObject *closure)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
107 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
108 if (!PyFunction_Check(op)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
109 PyErr_BadInternalCall();
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
110 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
111 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
112 if (closure == Py_None)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
113 closure = NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
114 else if (PyTuple_Check(closure)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
115 Py_XINCREF(closure);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
116 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
117 else {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
118 PyErr_SetString(PyExc_SystemError, "non-tuple closure");
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
119 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
120 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
121 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
122 ((PyFunctionObject *) op) -> func_closure = closure;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
123 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
124 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16042
diff changeset
125
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
128 #define OFF(x) offsetof(PyFunctionObject, x)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
129
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
130 static struct memberlist func_memberlist[] = {
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
131 {"func_code", T_OBJECT, OFF(func_code)},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
132 {"func_globals", T_OBJECT, OFF(func_globals), READONLY},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
133 {"func_name", T_OBJECT, OFF(func_name), READONLY},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
134 {"__name__", T_OBJECT, OFF(func_name), READONLY},
16825
51cf451faae4 Fix SF buf 404774 submitted by Gregory H. Ball
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16328
diff changeset
135 {"func_closure", T_OBJECT, OFF(func_closure), READONLY},
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
136 {"func_defaults", T_OBJECT, OFF(func_defaults)},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
137 {"func_doc", T_OBJECT, OFF(func_doc)},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
138 {"__doc__", T_OBJECT, OFF(func_doc)},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
139 {"func_dict", T_OBJECT, OFF(func_dict)},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
140 {"__dict__", T_OBJECT, OFF(func_dict)},
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
141 {NULL} /* Sentinel */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
142 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
143
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
144 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
145 func_getattro(PyObject *op, PyObject *name)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
146 {
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
147 char *sname = PyString_AsString(name);
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
148
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
149 if (sname[0] != '_' && PyEval_GetRestricted()) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
150 PyErr_SetString(PyExc_RuntimeError,
2105
ea7b2bf0b521 add restrictions in restricted mode
Guido van Rossum <guido@python.org>
parents: 2082
diff changeset
151 "function attributes not accessible in restricted mode");
ea7b2bf0b521 add restrictions in restricted mode
Guido van Rossum <guido@python.org>
parents: 2082
diff changeset
152 return NULL;
ea7b2bf0b521 add restrictions in restricted mode
Guido van Rossum <guido@python.org>
parents: 2082
diff changeset
153 }
19244
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
154 /* If func_dict is being accessed but no attribute has been set
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
155 * yet, then initialize it to the empty dictionary.
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
156 */
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
157 if ((!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__"))
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
158 && ((PyFunctionObject*)op)->func_dict == NULL)
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
159 {
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
160 PyFunctionObject* funcop = (PyFunctionObject*)op;
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
161
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
162 funcop->func_dict = PyDict_New();
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
163 if (funcop->func_dict == NULL)
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
164 return NULL;
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
165 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
166 return PyObject_GenericGetAttr(op, name);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
167 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 84
diff changeset
168
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
169 static int
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
170 func_setattro(PyObject *op, PyObject *name, PyObject *value)
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
171 {
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
172 char *sname = PyString_AsString(name);
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
173
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
174 if (PyEval_GetRestricted()) {
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
175 PyErr_SetString(PyExc_RuntimeError,
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
176 "function attributes not settable in restricted mode");
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
177 return -1;
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
178 }
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
179 if (strcmp(sname, "func_code") == 0) {
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
180 /* not legal to del f.func_code or to set it to anything
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
181 * other than a code object.
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
182 */
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
183 if (value == NULL || !PyCode_Check(value)) {
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
184 PyErr_SetString(
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
185 PyExc_TypeError,
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
186 "func_code must be set to a code object");
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
187 return -1;
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
188 }
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
189 }
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
190 else if (strcmp(sname, "func_defaults") == 0) {
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
191 /* legal to del f.func_defaults. Can only set
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
192 * func_defaults to NULL or a tuple.
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
193 */
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
194 if (value == Py_None)
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
195 value = NULL;
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
196 if (value != NULL && !PyTuple_Check(value)) {
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
197 PyErr_SetString(
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
198 PyExc_TypeError,
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
199 "func_defaults must be set to a tuple object");
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
200 return -1;
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
201 }
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
202 }
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
203 else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
19244
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
204 /* It is illegal to del f.func_dict. Can only set
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
205 * func_dict to a dictionary.
16042
78bd97d8413c Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents: 15894
diff changeset
206 */
19244
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
207 if (value == NULL) {
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
208 PyErr_SetString(
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
209 PyExc_TypeError,
19244
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
210 "function's dictionary may not be deleted");
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
211 return -1;
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
212 }
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
213 if (!PyDict_Check(value)) {
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
214 PyErr_SetString(
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
215 PyExc_TypeError,
fbe2074c5fa5 func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
216 "setting function's dictionary to a non-dict");
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
217 return -1;
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
218 }
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
219 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
220 return PyObject_GenericSetAttr(op, name, value);
8407
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
221 }
096857b0e4b8 Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
222
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 static void
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
224 func_dealloc(PyFunctionObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 {
17170
962196ce7231 Add support for weak references to the function and method types.
Fred Drake <fdrake@acm.org>
parents: 16891
diff changeset
226 PyObject_ClearWeakRefs((PyObject *) op);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13141
diff changeset
227 PyObject_GC_Fini(op);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
228 Py_DECREF(op->func_code);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
229 Py_DECREF(op->func_globals);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
230 Py_DECREF(op->func_name);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
231 Py_XDECREF(op->func_defaults);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
232 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
233 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
234 Py_XDECREF(op->func_closure);
13265
e8bb0d536633 Neil Schemenauer: small fixes for GC
Guido van Rossum <guido@python.org>
parents: 13256
diff changeset
235 op = (PyFunctionObject *) PyObject_AS_GC(op);
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12512
diff changeset
236 PyObject_DEL(op);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
239 static PyObject*
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
240 func_repr(PyFunctionObject *op)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
241 {
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
242 char buf[140];
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
243 if (op->func_name == Py_None)
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13183
diff changeset
244 sprintf(buf, "<anonymous function at %p>", op);
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1399
diff changeset
245 else
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13183
diff changeset
246 sprintf(buf, "<function %.100s at %p>",
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
247 PyString_AsString(op->func_name),
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13183
diff changeset
248 op);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
249 return PyString_FromString(buf);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
250 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
251
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1288
diff changeset
252 static int
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
253 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
254 {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
255 int err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
256 if (f->func_code) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
257 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
258 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
259 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
260 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
261 if (f->func_globals) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
262 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
263 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
264 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
265 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
266 if (f->func_defaults) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
267 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
268 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
269 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
270 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
271 if (f->func_doc) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
272 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
273 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
274 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
275 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
276 if (f->func_name) {
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
277 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
278 if (err)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
279 return err;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
280 }
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
281 if (f->func_dict) {
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
282 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
283 if (err)
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
284 return err;
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 14375
diff changeset
285 }
16891
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
286 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
287 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
288 if (err)
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
289 return err;
806c6ae23103 Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16825
diff changeset
290 }
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
291 return 0;
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
292 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
293
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
294 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
295 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
296 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
297 PyObject *result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
298 PyObject *argdefs;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
299 PyObject **d, **k;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
300 int nk, nd;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
301
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
302 argdefs = PyFunction_GET_DEFAULTS(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
303 if (argdefs != NULL && PyTuple_Check(argdefs)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
304 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
305 nd = PyTuple_Size(argdefs);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
306 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
307 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
308 d = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
309 nd = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
310 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
311
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
312 if (kw != NULL && PyDict_Check(kw)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
313 int pos, i;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
314 nk = PyDict_Size(kw);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
315 k = PyMem_NEW(PyObject *, 2*nk);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
316 if (k == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
317 PyErr_NoMemory();
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
318 Py_DECREF(arg);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
319 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
320 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
321 pos = i = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
322 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
323 i += 2;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
324 nk = i/2;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
325 /* 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
326 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
327 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
328 k = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
329 nk = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
330 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
331
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
332 result = PyEval_EvalCodeEx(
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
333 (PyCodeObject *)PyFunction_GET_CODE(func),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
334 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
335 &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
336 k, nk, d, nd,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
337 PyFunction_GET_CLOSURE(func));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
338
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
339 if (k != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
340 PyMem_DEL(k);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
341
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
342 return result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
343 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
344
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
345 /* Bind a function to an object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
346 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
347 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
348 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
349 if (obj == Py_None)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
350 obj = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
351 return PyMethod_New(func, obj, type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
352 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
353
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
354 PyTypeObject PyFunction_Type = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
355 PyObject_HEAD_INIT(&PyType_Type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 0,
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 "function",
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13141
diff changeset
358 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 0,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
360 (destructor)func_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
361 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
362 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
363 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
364 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
365 (reprfunc)func_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
366 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
367 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
368 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
369 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
370 function_call, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
371 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
372 func_getattro, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
373 func_setattro, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
374 0, /* tp_as_buffer */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
375 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
376 0, /* tp_doc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
377 (traverseproc)func_traverse, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
378 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
379 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
380 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
381 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
382 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
383 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
384 func_memberlist, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
385 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
386 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
387 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
388 func_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
389 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
390 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 };
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
392
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
393
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
394 /* Class method object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
395
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
396 /* 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
397 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
398 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
399
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
400 class C:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
401 def f(cls, arg1, arg2, ...): ...
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
402 f = classmethod(f)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
403
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
404 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
405 (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
406 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
407 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
408
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
409 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
410 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
411 */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
412
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
413 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
414 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
415 PyObject *cm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
416 } classmethod;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
417
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
418 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
419 cm_dealloc(classmethod *cm)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
420 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
421 Py_XDECREF(cm->cm_callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
422 PyObject_DEL(cm);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
423 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
424
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
425 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
426 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
427 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
428 classmethod *cm = (classmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
429
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
430 if (cm->cm_callable == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
431 PyErr_SetString(PyExc_RuntimeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
432 "uninitialized classmethod object");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
433 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
434 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
435 return PyMethod_New(cm->cm_callable,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
436 type, (PyObject *)(type->ob_type));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
437 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
438
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
439 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
440 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
441 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
442 classmethod *cm = (classmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
443 PyObject *callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
444
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
445 if (!PyArg_ParseTuple(args, "O:callable", &callable))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
446 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
447 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
448 cm->cm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
449 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
450 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
451
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
452 PyTypeObject PyClassMethod_Type = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
453 PyObject_HEAD_INIT(&PyType_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
454 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
455 "classmethod",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
456 sizeof(classmethod),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
457 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
458 (destructor)cm_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
459 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
460 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
461 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
462 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
463 0, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
464 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
465 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
466 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
467 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
468 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
469 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
470 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
471 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
472 0, /* tp_as_buffer */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
473 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
474 0, /* tp_doc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
475 0, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
476 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
477 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
478 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
479 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
480 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
481 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
482 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
483 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
484 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
485 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
486 cm_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
487 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
488 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
489 cm_init, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
490 PyType_GenericAlloc, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
491 PyType_GenericNew, /* tp_new */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
492 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
493
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
494 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
495 PyClassMethod_New(PyObject *callable)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
496 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
497 classmethod *cm = (classmethod *)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
498 PyType_GenericAlloc(&PyClassMethod_Type, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
499 if (cm != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
500 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
501 cm->cm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
502 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
503 return (PyObject *)cm;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
504 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
505
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
506
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
507 /* Static method object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
508
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
509 /* 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
510 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
511
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
512 class C:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
513 def f(arg1, arg2, ...): ...
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
514 f = staticmethod(f)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
515
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
516 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
517 (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
518
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
519 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
520 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
521 */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
522
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
523 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
524 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
525 PyObject *sm_callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
526 } staticmethod;
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 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
529 sm_dealloc(staticmethod *sm)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
530 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
531 Py_XDECREF(sm->sm_callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
532 PyObject_DEL(sm);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
533 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
534
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
535 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
536 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
537 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
538 staticmethod *sm = (staticmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
539
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
540 if (sm->sm_callable == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
541 PyErr_SetString(PyExc_RuntimeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
542 "uninitialized staticmethod object");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
543 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
544 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
545 Py_INCREF(sm->sm_callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
546 return sm->sm_callable;
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
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
549 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
550 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
551 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
552 staticmethod *sm = (staticmethod *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
553 PyObject *callable;
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 (!PyArg_ParseTuple(args, "O:callable", &callable))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
556 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
557 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
558 sm->sm_callable = callable;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
559 return 0;
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
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
562 PyTypeObject PyStaticMethod_Type = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
563 PyObject_HEAD_INIT(&PyType_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
564 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
565 "staticmethod",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
566 sizeof(staticmethod),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
567 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
568 (destructor)sm_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
569 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
570 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
571 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
572 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
573 0, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
574 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
575 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
576 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
577 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
578 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
579 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
580 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
581 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
582 0, /* tp_as_buffer */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
583 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
584 0, /* tp_doc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
585 0, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
586 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
587 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
588 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
589 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
590 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
591 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
592 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
593 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
594 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
595 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
596 sm_descr_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
597 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
598 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
599 sm_init, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
600 PyType_GenericAlloc, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
601 PyType_GenericNew, /* tp_new */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
602 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
603
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
604 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
605 PyStaticMethod_New(PyObject *callable)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
606 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
607 staticmethod *sm = (staticmethod *)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
608 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
609 if (sm != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
610 Py_INCREF(callable);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
611 sm->sm_callable = callable;
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 return (PyObject *)sm;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17669
diff changeset
614 }