Mercurial > cpython-lru_cache-weakref
annotate Objects/funcobject.c @ 19814:dc87d91d0dfd legacy-trunk
Don't call MacOS.SchedParams() in MachO, it doesn't exist.
| author | Jack Jansen <jack.jansen@cwi.nl> |
|---|---|
| date | Sun, 09 Sep 2001 00:36:01 +0000 |
| parents | fd48a55ac364 |
| children | eaf1203b85cf |
| rev | line source |
|---|---|
| 145 | 1 |
| 6 | 2 /* Function object implementation */ |
| 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 | 7 #include "structmember.h" |
| 6 | 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 | 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); |
| 6 | 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 | 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 | 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 | 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; |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
40 _PyObject_GC_TRACK(op); |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
41 return (PyObject *)op; |
| 6 | 42 } |
| 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 | 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 | 49 return NULL; |
| 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 | 52 } |
| 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 | 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 | 59 return NULL; |
| 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 | 62 } |
| 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 | 126 /* Methods */ |
| 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 | 129 |
| 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 | 142 }; |
| 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 | 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 | 167 } |
| 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 | 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 | 225 { |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
226 _PyObject_GC_UNTRACK(op); |
|
17170
962196ce7231
Add support for weak references to the function and method types.
Fred Drake <fdrake@acm.org>
parents:
16891
diff
changeset
|
227 PyObject_ClearWeakRefs((PyObject *) 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); |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
235 PyObject_GC_Del(op); |
| 6 | 236 } |
| 237 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
238 static PyObject* |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
239 func_repr(PyFunctionObject *op) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
240 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
241 if (op->func_name == Py_None) |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19244
diff
changeset
|
242 return PyString_FromFormat("<anonymous function at %p>", op); |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19244
diff
changeset
|
243 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
|
244 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
|
245 op); |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
246 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
247 |
|
1399
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1288
diff
changeset
|
248 static int |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
249 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
|
250 { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
251 int err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
252 if (f->func_code) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
253 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
|
254 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
255 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
256 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
257 if (f->func_globals) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
258 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
|
259 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
260 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
261 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
262 if (f->func_defaults) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
263 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
|
264 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
265 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
266 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
267 if (f->func_doc) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
268 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
|
269 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
270 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
271 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
272 if (f->func_name) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
273 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
|
274 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
275 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
276 } |
|
15894
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
277 if (f->func_dict) { |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
278 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
|
279 if (err) |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
280 return err; |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
281 } |
|
16891
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
282 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
|
283 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
|
284 if (err) |
|
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
285 return err; |
|
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
286 } |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
287 return 0; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
288 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
289 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
290 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
291 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
|
292 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
293 PyObject *result; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
294 PyObject *argdefs; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
295 PyObject **d, **k; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
296 int nk, nd; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
297 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
298 argdefs = PyFunction_GET_DEFAULTS(func); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
299 if (argdefs != NULL && PyTuple_Check(argdefs)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
300 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
|
301 nd = PyTuple_Size(argdefs); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
302 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
303 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
304 d = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
305 nd = 0; |
|
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 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
308 if (kw != NULL && PyDict_Check(kw)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
309 int pos, i; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
310 nk = PyDict_Size(kw); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
311 k = PyMem_NEW(PyObject *, 2*nk); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
312 if (k == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
313 PyErr_NoMemory(); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
314 Py_DECREF(arg); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
315 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
316 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
317 pos = i = 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
318 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
|
319 i += 2; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
320 nk = i/2; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
321 /* 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
|
322 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
323 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
324 k = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
325 nk = 0; |
|
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 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
328 result = PyEval_EvalCodeEx( |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
329 (PyCodeObject *)PyFunction_GET_CODE(func), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
330 PyFunction_GET_GLOBALS(func), (PyObject *)NULL, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
331 &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
|
332 k, nk, d, nd, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
333 PyFunction_GET_CLOSURE(func)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
334 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
335 if (k != NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
336 PyMem_DEL(k); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
337 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
338 return result; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
339 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
340 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
341 /* Bind a function to an object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
342 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
343 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
|
344 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
345 if (obj == Py_None) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
346 obj = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
347 return PyMethod_New(func, obj, 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 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
350 PyTypeObject PyFunction_Type = { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
351 PyObject_HEAD_INIT(&PyType_Type) |
| 6 | 352 0, |
| 353 "function", | |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
354 sizeof(PyFunctionObject), |
| 6 | 355 0, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
356 (destructor)func_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
357 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
358 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
359 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
360 0, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
361 (reprfunc)func_repr, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
362 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
363 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
364 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
365 0, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
366 function_call, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
367 0, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
368 func_getattro, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
369 func_setattro, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
370 0, /* tp_as_buffer */ |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
371 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
372 0, /* tp_doc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
373 (traverseproc)func_traverse, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
374 0, /* tp_clear */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
375 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
|
376 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
|
377 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
378 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
379 0, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
380 func_memberlist, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
381 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
382 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
383 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
384 func_descr_get, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
385 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
386 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */ |
| 6 | 387 }; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
388 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
389 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
390 /* Class method object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
391 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
392 /* 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
|
393 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
|
394 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
|
395 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
396 class C: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
397 def f(cls, arg1, arg2, ...): ... |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
398 f = classmethod(f) |
|
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 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
|
401 (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
|
402 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
|
403 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
|
404 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
405 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
|
406 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
|
407 */ |
|
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 typedef struct { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
410 PyObject_HEAD |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
411 PyObject *cm_callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
412 } classmethod; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
413 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
414 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
415 cm_dealloc(classmethod *cm) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
416 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
417 Py_XDECREF(cm->cm_callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
418 PyObject_DEL(cm); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
419 } |
|
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 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
422 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
|
423 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
424 classmethod *cm = (classmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
425 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
426 if (cm->cm_callable == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
427 PyErr_SetString(PyExc_RuntimeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
428 "uninitialized classmethod object"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
429 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
430 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
431 return PyMethod_New(cm->cm_callable, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
432 type, (PyObject *)(type->ob_type)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
433 } |
|
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 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
436 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
|
437 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
438 classmethod *cm = (classmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
439 PyObject *callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
440 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
441 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
|
442 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
443 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
444 cm->cm_callable = callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
445 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
446 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
447 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
448 PyTypeObject PyClassMethod_Type = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
449 PyObject_HEAD_INIT(&PyType_Type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
450 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
451 "classmethod", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
452 sizeof(classmethod), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
453 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
454 (destructor)cm_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
455 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
456 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
457 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
458 0, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
459 0, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
460 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
461 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
462 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
463 0, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
464 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
465 0, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
466 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
467 0, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
468 0, /* tp_as_buffer */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
469 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
|
470 0, /* tp_doc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
471 0, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
472 0, /* tp_clear */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
473 0, /* tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
474 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
475 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
476 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
477 0, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
478 0, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
479 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
480 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
481 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
482 cm_descr_get, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
483 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
484 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
485 cm_init, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
486 PyType_GenericAlloc, /* tp_alloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
487 PyType_GenericNew, /* tp_new */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
488 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
489 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
490 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
491 PyClassMethod_New(PyObject *callable) |
|
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 classmethod *cm = (classmethod *) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
494 PyType_GenericAlloc(&PyClassMethod_Type, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
495 if (cm != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
496 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
497 cm->cm_callable = callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
498 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
499 return (PyObject *)cm; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
500 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
501 |
|
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 /* Static method object */ |
|
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 /* 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
|
506 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
|
507 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
508 class C: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
509 def f(arg1, arg2, ...): ... |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
510 f = staticmethod(f) |
|
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 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
|
513 (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
|
514 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
515 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
|
516 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
|
517 */ |
|
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 typedef struct { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
520 PyObject_HEAD |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
521 PyObject *sm_callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
522 } staticmethod; |
|
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 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
525 sm_dealloc(staticmethod *sm) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
526 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
527 Py_XDECREF(sm->sm_callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
528 PyObject_DEL(sm); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
529 } |
|
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 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
532 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
|
533 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
534 staticmethod *sm = (staticmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
535 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
536 if (sm->sm_callable == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
537 PyErr_SetString(PyExc_RuntimeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
538 "uninitialized staticmethod object"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
539 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
540 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
541 Py_INCREF(sm->sm_callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
542 return sm->sm_callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
543 } |
|
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 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
546 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
|
547 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
548 staticmethod *sm = (staticmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
549 PyObject *callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
550 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
551 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
|
552 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
553 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
554 sm->sm_callable = callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
555 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
556 } |
|
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 PyTypeObject PyStaticMethod_Type = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
559 PyObject_HEAD_INIT(&PyType_Type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
560 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
561 "staticmethod", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
562 sizeof(staticmethod), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
563 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
564 (destructor)sm_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
565 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
566 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
567 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
568 0, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
569 0, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
570 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
571 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
572 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
573 0, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
574 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
575 0, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
576 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
577 0, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
578 0, /* tp_as_buffer */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
579 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
|
580 0, /* tp_doc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
581 0, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
582 0, /* tp_clear */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
583 0, /* tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
584 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
585 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
586 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
587 0, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
588 0, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
589 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
590 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
591 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
592 sm_descr_get, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
593 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
594 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
595 sm_init, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
596 PyType_GenericAlloc, /* tp_alloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
597 PyType_GenericNew, /* tp_new */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
598 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
599 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
600 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
601 PyStaticMethod_New(PyObject *callable) |
|
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 staticmethod *sm = (staticmethod *) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
604 PyType_GenericAlloc(&PyStaticMethod_Type, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
605 if (sm != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
606 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
607 sm->sm_callable = callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
608 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
609 return (PyObject *)sm; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
610 } |
