blob: 1cbbcf75c2a64170b7ab77b5e6e68b8fcdc3a533 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Class object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000036
Guido van Rossum52ca98a1994-09-05 07:32:29 +000037/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038static PyObject *class_lookup
39 Py_PROTO((PyClassObject *, PyObject *, PyClassObject **));
40static PyObject *instance_getattr1 Py_PROTO((PyInstanceObject *, PyObject *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000041
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042PyObject *
43PyClass_New(bases, dict, name)
44 PyObject *bases; /* NULL or tuple of classobjects! */
45 PyObject *dict;
46 PyObject *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 PyClassObject *op, *dummy;
49 static PyObject *getattrstr, *setattrstr, *delattrstr;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000050 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000051 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000052 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000053 if (docstr == NULL)
54 return NULL;
55 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000056 if (modstr == NULL) {
57 modstr= PyString_InternFromString("__module__");
58 if (modstr == NULL)
59 return NULL;
60 }
61 if (namestr == NULL) {
62 namestr= PyString_InternFromString("__name__");
63 if (namestr == NULL)
64 return NULL;
65 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 if (PyDict_GetItem(dict, docstr) == NULL) {
67 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000068 return NULL;
69 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000070 if (PyDict_GetItem(dict, modstr) == NULL) {
71 PyObject *globals = PyEval_GetGlobals();
72 if (globals != NULL) {
73 PyObject *name = PyDict_GetItem(globals, namestr);
74 if (name != NULL) {
75 if (PyDict_SetItem(dict, modstr, name) < 0)
76 return NULL;
77 }
78 }
79 }
Guido van Rossume2966a61991-12-10 13:53:23 +000080 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000082 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000083 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000084 }
85 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 Py_INCREF(bases);
87 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000088 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000091 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000094 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000096 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000097 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000098 getattrstr = PyString_InternFromString("__getattr__");
99 setattrstr = PyString_InternFromString("__setattr__");
100 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000101 }
102 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
103 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
104 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 Py_XINCREF(op->cl_getattr);
106 Py_XINCREF(op->cl_setattr);
107 Py_XINCREF(op->cl_delattr);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
111/* Class methods */
112
113static void
114class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 Py_DECREF(op->cl_bases);
118 Py_DECREF(op->cl_dict);
119 Py_XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 free((ANY *)op);
121}
122
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000124class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 PyClassObject *cp;
126 PyObject *name;
127 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000128{
129 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000131 if (value != NULL) {
132 *pclass = cp;
133 return value;
134 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000136 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000137 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 PyObject *v = class_lookup(
139 (PyClassObject *)
140 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000141 if (v != NULL)
142 return v;
143 }
144 return NULL;
145}
146
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 register PyClassObject *op;
150 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 register PyObject *v;
153 register char *sname = PyString_AsString(name);
154 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000155 if (sname[0] == '_' && sname[1] == '_') {
156 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 if (PyEval_GetRestricted()) {
158 PyErr_SetString(PyExc_RuntimeError,
159 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000160 return NULL;
161 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000163 return op->cl_dict;
164 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000165 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000167 return op->cl_bases;
168 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000169 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000170 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000172 else
173 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000175 return v;
176 }
Guido van Rossum94308391991-10-20 20:11:48 +0000177 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000178 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000179 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000181 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000183 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 if (PyFunction_Check(v)) {
185 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
186 (PyObject *)class);
187 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000188 v = w;
189 }
190 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191}
192
Guido van Rossum94308391991-10-20 20:11:48 +0000193static int
194class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 PyClassObject *op;
196 PyObject *name;
197 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000198{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000199 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 if (PyEval_GetRestricted()) {
201 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000202 "classes are read-only in restricted mode");
203 return -1;
204 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000205 sname = PyString_AsString(name);
206 if (sname[0] == '_' && sname[1] == '_') {
207 int n = PyString_Size(name);
208 if (sname[n-1] == '_' && sname[n-2] == '_') {
209 if (strcmp(sname, "__dict__") == 0 ||
210 strcmp(sname, "__bases__") == 0 ||
211 strcmp(sname, "__name__") == 0 ||
212 strcmp(sname, "__getattr__") == 0 ||
213 strcmp(sname, "__setattr__") == 0 ||
214 strcmp(sname, "__delattr__") == 0)
215 {
216 /* XXX In unrestricted mode, we should
217 XXX allow this -- with a type check */
218 PyErr_SetString(PyExc_TypeError,
219 "read-only special attribute");
220 return -1;
221 }
222 }
223 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000224 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000226 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000228 "delete non-existing class attribute");
229 return rv;
230 }
Guido van Rossum94308391991-10-20 20:11:48 +0000231 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000233}
234
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000236class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000238{
239 char buf[140];
240 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000242 name = "?";
243 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 name = PyString_AsString(op->cl_name);
Guido van Rossum25831651993-05-19 14:50:45 +0000245 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000247}
248
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249PyTypeObject PyClass_Type = {
250 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 0,
252 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000253 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000257 0, /*tp_getattr*/
258 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261 0, /*tp_as_number*/
262 0, /*tp_as_sequence*/
263 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000264 0, /*tp_hash*/
265 0, /*tp_call*/
266 0, /*tp_str*/
267 (getattrofunc)class_getattr, /*tp_getattro*/
268 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269};
270
Guido van Rossum81daa321993-05-20 14:24:46 +0000271int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272PyClass_IsSubclass(class, base)
273 PyObject *class;
274 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000275{
276 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000277 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000278 if (class == base)
279 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000280 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000281 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 cp = (PyClassObject *)class;
283 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000284 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000286 return 1;
287 }
288 return 0;
289}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290
Guido van Rossum81daa321993-05-20 14:24:46 +0000291
292/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294PyObject *
295PyInstance_New(class, arg, kw)
296 PyObject *class;
297 PyObject *arg;
298 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 register PyInstanceObject *inst;
301 PyObject *init;
302 static PyObject *initstr;
303 if (!PyClass_Check(class)) {
304 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 return NULL;
306 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000308 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 Py_INCREF(class);
311 inst->in_class = (PyClassObject *)class;
312 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000313 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 return NULL;
316 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000317 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000318 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000319 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000320 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 PyErr_Clear();
322 if ((arg != NULL && (!PyTuple_Check(arg) ||
323 PyTuple_Size(arg) != 0))
324 || (kw != NULL && (!PyDict_Check(kw) ||
325 PyDict_Size(kw) != 0))) {
326 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000327 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000329 inst = NULL;
330 }
331 }
332 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
334 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000335 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000337 inst = NULL;
338 }
339 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 if (res != Py_None) {
341 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000342 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000344 inst = NULL;
345 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000347 }
348 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350}
351
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000352/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353
354static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000355instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyObject *error_type, *error_value, *error_traceback;
359 PyObject *del;
360 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000361 /* Call the __del__ method if it exists. First temporarily
362 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000363#ifdef Py_TRACE_REFS
364 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 extern long _Py_RefTotal;
366 inst->ob_type = &PyInstance_Type;
367 _Py_NewReference(inst);
368 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000369#ifdef COUNT_ALLOCS
370 inst->ob_type->tp_alloc--; /* ditto */
371#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000372#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000374#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000376 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000377 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000378 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000380 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 PyObject *f, *t, *v, *tb;
382 PyErr_Fetch(&t, &v, &tb);
383 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000384 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000386 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 PyFile_WriteObject(t, f, Py_PRINT_RAW);
388 if (v && v != Py_None) {
389 PyFile_WriteString(": ", f);
390 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000391 }
392 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 PyFile_WriteString(" in ", f);
394 PyFile_WriteObject(del, f, 0);
395 PyFile_WriteString(" ignored\n", f);
396 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000397 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000398 Py_XDECREF(t);
399 Py_XDECREF(v);
400 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000401 }
402 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 Py_DECREF(res);
404 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000405 }
406 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000408 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000409 if (--inst->ob_refcnt > 0) {
410#ifdef COUNT_ALLOCS
411 inst->ob_type->tp_free--;
412#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000413 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000414 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000415#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000416#ifdef COUNT_ALLOCS
417 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
418#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000420 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000421#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 Py_DECREF(inst->in_class);
423 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000424 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425}
426
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000428instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 register PyInstanceObject *inst;
430 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 register PyObject *v;
433 register char *sname = PyString_AsString(name);
434 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000435 if (sname[0] == '_' && sname[1] == '_') {
436 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 if (PyEval_GetRestricted()) {
438 PyErr_SetString(PyExc_RuntimeError,
439 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000440 return NULL;
441 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000443 return inst->in_dict;
444 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000445 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 Py_INCREF(inst->in_class);
447 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000448 }
Guido van Rossum94308391991-10-20 20:11:48 +0000449 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000450 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000452 if (v == NULL) {
453 v = class_lookup(inst->in_class, name, &class);
454 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000456 return NULL;
457 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000459 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000460 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 if (PyFunction_Check(v)) {
462 PyObject *w = PyMethod_New(v, (PyObject *)inst,
463 (PyObject *)class);
464 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000465 v = w;
466 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 else if (PyMethod_Check(v)) {
468 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000469 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
471 PyObject *im_func = PyMethod_Function(v);
472 PyObject *w = PyMethod_New(im_func,
473 (PyObject *)inst, im_class);
474 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000475 v = w;
476 }
477 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000478 }
479 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480}
481
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000483instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 register PyInstanceObject *inst;
485 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000486{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000488 res = instance_getattr1(inst, name);
489 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 PyObject *args;
491 PyErr_Clear();
492 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000493 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000494 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 res = PyEval_CallObject(func, args);
496 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000497 }
498 return res;
499}
500
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501static int
Guido van Rossume7737541994-09-05 07:31:41 +0000502instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 PyInstanceObject *inst;
504 PyObject *name;
505 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000506{
Guido van Rossum94472a01992-09-04 09:45:18 +0000507 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000509 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000511 "delete non-existing instance attribute");
512 return rv;
513 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000514 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000516}
517
Guido van Rossume7737541994-09-05 07:31:41 +0000518static int
519instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 PyInstanceObject *inst;
521 PyObject *name;
522 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000523{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000524 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000526 if (sname[0] == '_' && sname[1] == '_') {
527 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000528 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000529 if (strcmp(sname, "__dict__") == 0) {
530 if (PyEval_GetRestricted()) {
531 PyErr_SetString(PyExc_RuntimeError,
532 "__dict__ not accessible in restricted mode");
533 return -1;
534 }
535 if (v == NULL || !PyDict_Check(v)) {
536 PyErr_SetString(PyExc_TypeError,
537 "__dict__ must be set to a dictionary");
538 return -1;
539 }
540 tmp = inst->in_dict;
541 Py_INCREF(v);
542 inst->in_dict = v;
543 Py_DECREF(tmp);
544 return 0;
545 }
546 if (strcmp(sname, "__class__") == 0) {
547 if (PyEval_GetRestricted()) {
548 PyErr_SetString(PyExc_RuntimeError,
549 "__class__ not accessible in restricted mode");
550 return -1;
551 }
552 if (v == NULL || !PyClass_Check(v)) {
553 PyErr_SetString(PyExc_TypeError,
554 "__class__ must be set to a class");
555 return -1;
556 }
557 tmp = (PyObject *)(inst->in_class);
558 Py_INCREF(v);
559 inst->in_class = (PyClassObject *)v;
560 Py_DECREF(tmp);
561 return 0;
562 }
Guido van Rossume7737541994-09-05 07:31:41 +0000563 }
Guido van Rossume7737541994-09-05 07:31:41 +0000564 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000565 if (v == NULL)
566 func = inst->in_class->cl_delattr;
567 else
568 func = inst->in_class->cl_setattr;
569 if (func == NULL)
570 return instance_setattr1(inst, name, v);
571 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000573 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000575 if (args == NULL)
576 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 res = PyEval_CallObject(func, args);
578 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000579 if (res == NULL)
580 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000582 return 0;
583}
584
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000586instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000588{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 PyObject *func;
590 PyObject *res;
591 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000592
Guido van Rossum2878a691996-08-09 20:53:24 +0000593 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000594 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000595 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000596 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000597 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 PyObject *classname = inst->in_class->cl_name;
Guido van Rossum25831651993-05-19 14:50:45 +0000599 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 if (classname != NULL && PyString_Check(classname))
601 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000602 else
603 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 PyErr_Clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000605 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000607 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 res = PyEval_CallObject(func, (PyObject *)NULL);
609 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000610 return res;
611}
612
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000614instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000616{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000618 instance_compare1);
619}
620
Guido van Rossum9bfef441993-03-29 10:43:31 +0000621static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000622instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000624{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000626 long outcome;
627 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000628 if (result == NULL)
629 return -1;
630 if (!PyInt_Check(result)) {
631 Py_DECREF(result);
632 PyErr_SetString(PyExc_TypeError,
633 "comparison did not return an int");
634 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000635 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 outcome = PyInt_AsLong(result);
637 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000638 if (outcome < 0)
639 return -1;
640 else if (outcome > 0)
641 return 1;
642 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000643}
644
Guido van Rossum9bfef441993-03-29 10:43:31 +0000645static long
646instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000648{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 PyObject *func;
650 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000651 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000653
Guido van Rossum2878a691996-08-09 20:53:24 +0000654 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000655 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000656 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000657 if (func == NULL) {
658 /* If there is no __cmp__ method, we hash on the address.
659 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000661 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000662 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000663 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000664 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000666 outcome = (long)inst;
667 if (outcome == -1)
668 outcome = -2;
669 return outcome;
670 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000672 return -1;
673 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 res = PyEval_CallObject(func, (PyObject *)NULL);
675 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000676 if (res == NULL)
677 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 if (PyInt_Check(res)) {
679 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000680 if (outcome == -1)
681 outcome = -2;
682 }
683 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 PyErr_SetString(PyExc_TypeError,
685 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000686 outcome = -1;
687 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000689 return outcome;
690}
691
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000693
Guido van Rossum9bfef441993-03-29 10:43:31 +0000694static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000695instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000697{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698 PyObject *func;
699 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000700 int outcome;
701
Guido van Rossum2878a691996-08-09 20:53:24 +0000702 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000703 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000704 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000705 if (func == NULL)
706 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 res = PyEval_CallObject(func, (PyObject *)NULL);
708 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000709 if (res == NULL)
710 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 if (PyInt_Check(res)) {
712 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000713 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 PyErr_SetString(PyExc_ValueError,
715 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000716 }
717 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyErr_SetString(PyExc_TypeError,
719 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720 outcome = -1;
721 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000723 return outcome;
724}
725
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000727instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 PyInstanceObject *inst;
729 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000730{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 PyObject *func;
732 PyObject *arg;
733 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000734
Guido van Rossum2878a691996-08-09 20:53:24 +0000735 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000736 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000737 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000738 if (func == NULL)
739 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000741 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000743 return NULL;
744 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 res = PyEval_CallObject(func, arg);
746 Py_DECREF(func);
747 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000748 return res;
749}
750
Guido van Rossum9bfef441993-03-29 10:43:31 +0000751static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000752instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 PyInstanceObject*inst;
754 PyObject *key;
755 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 PyObject *func;
758 PyObject *arg;
759 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000760
Guido van Rossum2878a691996-08-09 20:53:24 +0000761 if (value == NULL) {
762 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000763 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000764 func = instance_getattr(inst, delitemstr);
765 }
766 else {
767 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000768 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000769 func = instance_getattr(inst, setitemstr);
770 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000771 if (func == NULL)
772 return -1;
773 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000775 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000777 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000779 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000780 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 res = PyEval_CallObject(func, arg);
782 Py_DECREF(func);
783 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000784 if (res == NULL)
785 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000787 return 0;
788}
789
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000791 (inquiry)instance_length, /*mp_length*/
792 (binaryfunc)instance_subscript, /*mp_subscript*/
793 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794};
795
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799 int i;
800{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000802
Guido van Rossum2878a691996-08-09 20:53:24 +0000803 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000804 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000805 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000806 if (func == NULL)
807 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811 return NULL;
812 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 res = PyEval_CallObject(func, arg);
814 Py_DECREF(func);
815 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000816 return res;
817}
818
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000820instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000822 int i, j;
823{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyObject *func, *arg, *res;
825 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826
Guido van Rossum2878a691996-08-09 20:53:24 +0000827 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000828 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000829 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000830 if (func == NULL)
831 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000833 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000835 return NULL;
836 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 res = PyEval_CallObject(func, arg);
838 Py_DECREF(func);
839 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840 return res;
841}
842
843static int
844instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000848{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000850
Guido van Rossum2878a691996-08-09 20:53:24 +0000851 if (item == NULL) {
852 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000853 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000854 func = instance_getattr(inst, delitemstr);
855 }
856 else {
857 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000858 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000859 func = instance_getattr(inst, setitemstr);
860 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000862 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000863 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000867 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000869 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000870 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 res = PyEval_CallObject(func, arg);
872 Py_DECREF(func);
873 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000874 if (res == NULL)
875 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000877 return 0;
878}
879
880static int
881instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000883 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 PyObject *func, *arg, *res;
887 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888
Guido van Rossum2878a691996-08-09 20:53:24 +0000889 if (value == NULL) {
890 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 delslicestr =
892 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000893 func = instance_getattr(inst, delslicestr);
894 }
895 else {
896 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 setslicestr =
898 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000899 func = instance_getattr(inst, setslicestr);
900 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000902 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000903 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000907 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000909 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 res = PyEval_CallObject(func, arg);
912 Py_DECREF(func);
913 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914 if (res == NULL)
915 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917 return 0;
918}
919
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000922 0, /*sq_concat*/
923 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000924 (intargfunc)instance_item, /*sq_item*/
925 (intintargfunc)instance_slice, /*sq_slice*/
926 (intobjargproc)instance_ass_item, /*sq_ass_item*/
927 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928};
929
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyInstanceObject *self;
933 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000936
937 if ((func = instance_getattr(self, methodname)) == NULL)
938 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939 res = PyEval_CallObject(func, (PyObject *)NULL);
940 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000941 return res;
942}
943
Guido van Rossum03093a21994-09-28 15:51:32 +0000944
945/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
947 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000948
949
950/* Implement a binary operator involving at least one class instance. */
951
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952PyObject *
953PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
954 PyObject *v;
955 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000956 char *opname;
957 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000959{
960 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000962 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000963 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000964 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000965 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000966 /* Sigh -- special case for comnparisons */
967 if (strcmp(opname, "__cmp__") == 0) {
968 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
969 return PyInt_FromLong(c);
970 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000971 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +0000973 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000974}
975
Guido van Rossum03093a21994-09-28 15:51:32 +0000976
977/* Try one half of a binary operator involving a class instance.
978 Return value:
979 -1 if an exception is to be reported right away
980 0 if we have a valid result
981 1 if we could try another operation
982*/
983
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +0000985
Guido van Rossum03093a21994-09-28 15:51:32 +0000986static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000987halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988 PyObject *v;
989 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000990 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyObject **r_result;
992 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +0000993 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000994{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995 PyObject *func;
996 PyObject *args;
997 PyObject *PyNumber_Coerce;
998 PyObject *coerced = NULL;
999 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001002 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001003 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001004 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001005 if (coerce_obj == NULL)
1006 return -1;
1007 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1009 if (PyNumber_Coerce == NULL) {
1010 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001011 }
1012 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001014 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001015 return -1;
1016 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1018 Py_DECREF(args);
1019 Py_DECREF(PyNumber_Coerce);
Guido van Rossum03093a21994-09-28 15:51:32 +00001020 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001021 return -1;
1022 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 if (coerced == Py_None) {
1024 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001025 return 1;
1026 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1028 Py_DECREF(coerced);
1029 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001030 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001031 return -1;
1032 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 v1 = PyTuple_GetItem(coerced, 0);
1034 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001035 if (v1 != v) {
1036 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001038 if (swapped)
1039 *r_result = (*thisfunc)(w, v);
1040 else
1041 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001043 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001044 }
1045 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001047 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001049 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 Py_XDECREF(coerced);
1051 if (PyErr_Occurred() != PyExc_AttributeError)
Guido van Rossume7d444f1995-01-07 12:35:18 +00001052 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001054 return 1;
1055 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001057 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 Py_DECREF(func);
1059 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001060 return -1;
1061 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 *r_result = PyEval_CallObject(func, args);
1063 Py_DECREF(args);
1064 Py_DECREF(func);
1065 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001066 return *r_result == NULL ? -1 : 0;
1067}
1068
Guido van Rossum879c5811995-01-10 15:24:06 +00001069static int
1070instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 PyObject **pv;
1072 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001073{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 PyObject *v = *pv;
1075 PyObject *w = *pw;
1076 PyObject *PyNumber_Coerce;
1077 PyObject *args;
1078 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001079
Guido van Rossum2878a691996-08-09 20:53:24 +00001080 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001081 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001082 if (coerce_obj == NULL)
1083 return -1;
1084 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1086 if (PyNumber_Coerce == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001087 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 PyErr_Clear();
1089 Py_INCREF(v);
1090 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001091 return 0;
1092 }
1093 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001095 if (args == NULL) {
1096 return -1;
1097 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1099 Py_DECREF(args);
1100 Py_DECREF(PyNumber_Coerce);
Guido van Rossum879c5811995-01-10 15:24:06 +00001101 if (coerced == NULL) {
1102 /* __coerce__ call raised an exception */
1103 return -1;
1104 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001106 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001108 return 1;
1109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001111 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 Py_DECREF(coerced);
1113 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001114 "coercion should return None or 2-tuple");
1115 return -1;
1116 }
1117 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118 *pv = PyTuple_GetItem(coerced, 0);
1119 *pw = PyTuple_GetItem(coerced, 1);
1120 Py_INCREF(*pv);
1121 Py_INCREF(*pw);
1122 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001123 return 0;
1124}
1125
Guido van Rossum03093a21994-09-28 15:51:32 +00001126
Guido van Rossum04691fc1992-08-12 15:35:34 +00001127#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128static PyObject *funcname(self) PyInstanceObject *self; { \
1129 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001130 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001131 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001132}
1133
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134UNARY(instance_neg, "__neg__")
1135UNARY(instance_pos, "__pos__")
1136UNARY(instance_abs, "__abs__")
1137
Guido van Rossum9bfef441993-03-29 10:43:31 +00001138static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001141{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001142 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001143 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001145
Guido van Rossum2878a691996-08-09 20:53:24 +00001146 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001147 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001148 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001150 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001151 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001152 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001154 /* Fall back to the default behavior:
1155 all instances are nonzero */
1156 return 1;
1157 }
1158 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001159 res = PyEval_CallObject(func, (PyObject *)NULL);
1160 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001161 if (res == NULL)
1162 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 if (!PyInt_Check(res)) {
1164 Py_DECREF(res);
1165 PyErr_SetString(PyExc_TypeError,
1166 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001167 return -1;
1168 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 outcome = PyInt_AsLong(res);
1170 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001171 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 PyErr_SetString(PyExc_ValueError,
1173 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001174 return -1;
1175 }
1176 return outcome > 0;
1177}
1178
1179UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001180UNARY(instance_int, "__int__")
1181UNARY(instance_long, "__long__")
1182UNARY(instance_float, "__float__")
1183UNARY(instance_oct, "__oct__")
1184UNARY(instance_hex, "__hex__")
1185
Guido van Rossum03093a21994-09-28 15:51:32 +00001186/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001188instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 PyObject *v;
1190 PyObject *w;
1191 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001192{
1193 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 PyObject *func;
1195 PyObject *args;
1196 PyObject *result;
1197 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001198
1199 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001200 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001202 if (func == NULL)
1203 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001205 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 return NULL;
1208 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 result = PyEval_CallObject(func, args);
1210 Py_DECREF(func);
1211 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001212 return result;
1213}
1214
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001216 0, /*nb_add*/
1217 0, /*nb_subtract*/
1218 0, /*nb_multiply*/
1219 0, /*nb_divide*/
1220 0, /*nb_remainder*/
1221 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001222 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001223 (unaryfunc)instance_neg, /*nb_negative*/
1224 (unaryfunc)instance_pos, /*nb_positive*/
1225 (unaryfunc)instance_abs, /*nb_absolute*/
1226 (inquiry)instance_nonzero, /*nb_nonzero*/
1227 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001228 0, /*nb_lshift*/
1229 0, /*nb_rshift*/
1230 0, /*nb_and*/
1231 0, /*nb_xor*/
1232 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001233 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001234 (unaryfunc)instance_int, /*nb_int*/
1235 (unaryfunc)instance_long, /*nb_long*/
1236 (unaryfunc)instance_float, /*nb_float*/
1237 (unaryfunc)instance_oct, /*nb_oct*/
1238 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001239};
1240
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241PyTypeObject PyInstance_Type = {
1242 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001243 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001244 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001246 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001247 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001248 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001249 0, /*tp_getattr*/
1250 0, /*tp_setattr*/
1251 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001252 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001253 &instance_as_number, /*tp_as_number*/
1254 &instance_as_sequence, /*tp_as_sequence*/
1255 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001256 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001257 0, /*tp_call*/
1258 0, /*tp_str*/
1259 (getattrofunc)instance_getattr, /*tp_getattro*/
1260 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001261};
1262
1263
Guido van Rossum81daa321993-05-20 14:24:46 +00001264/* Instance method objects are used for two purposes:
1265 (a) as bound instance methods (returned by instancename.methodname)
1266 (b) as unbound methods (returned by ClassName.methodname)
1267 In case (b), im_self is NULL
1268*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001269
1270typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 PyObject_HEAD
1272 PyObject *im_func; /* The function implementing the method */
1273 PyObject *im_self; /* The instance it is bound to, or NULL */
1274 PyObject *im_class; /* The class that defined the method */
1275} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001276
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001277
1278static PyMethodObject *free_list;
1279
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280PyObject *
1281PyMethod_New(func, self, class)
1282 PyObject *func;
1283 PyObject *self;
1284 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 register PyMethodObject *im;
1287 if (!PyFunction_Check(func)) {
1288 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001289 return NULL;
1290 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001291 im = free_list;
1292 if (im != NULL) {
1293 free_list = (PyMethodObject *)(im->im_self);
1294 im->ob_type = &PyMethod_Type;
1295 _Py_NewReference(im);
1296 }
1297 else {
1298 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1299 if (im == NULL)
1300 return NULL;
1301 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001303 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001305 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001307 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001309}
1310
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311PyObject *
1312PyMethod_Function(im)
1313 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001314{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 if (!PyMethod_Check(im)) {
1316 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001317 return NULL;
1318 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001320}
1321
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322PyObject *
1323PyMethod_Self(im)
1324 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001325{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 if (!PyMethod_Check(im)) {
1327 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001328 return NULL;
1329 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001331}
1332
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333PyObject *
1334PyMethod_Class(im)
1335 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001336{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 if (!PyMethod_Check(im)) {
1338 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001339 return NULL;
1340 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001342}
1343
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001344/* Class method methods */
1345
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347
Guido van Rossume8122f11991-05-05 20:03:07 +00001348static struct memberlist instancemethod_memberlist[] = {
1349 {"im_func", T_OBJECT, OFF(im_func)},
1350 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001351 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001352 /* Dummies that are not handled by getattr() except for __members__ */
1353 {"__doc__", T_INT, 0},
1354 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001355 {NULL} /* Sentinel */
1356};
1357
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001359instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 register PyMethodObject *im;
1361 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001362{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001364 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001366 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001368 return func->func_name;
1369 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001370 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001372 return func->func_doc;
1373 }
1374 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 if (PyEval_GetRestricted()) {
1376 PyErr_SetString(PyExc_RuntimeError,
1377 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001378 return NULL;
1379 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001381}
1382
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001383static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001384instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001386{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 Py_DECREF(im->im_func);
1388 Py_XDECREF(im->im_self);
1389 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001390 im->im_self = (PyObject *)free_list;
1391 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001392}
1393
Guido van Rossumebc8c511992-09-03 20:39:51 +00001394static int
1395instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001397{
Guido van Rossume9df7271995-04-06 14:46:51 +00001398 if (a->im_self != b->im_self)
1399 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001401}
1402
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001404instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001406{
1407 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1409 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1410 PyClassObject *class = (PyClassObject *)(a->im_class);
1411 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001412 char *fcname, *icname, *fname;
1413 fclassname = class->cl_name;
1414 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 if (fclassname != NULL && PyString_Check(fclassname))
1416 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001417 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001418 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 if (funcname != NULL && PyString_Check(funcname))
1420 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001421 else
1422 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001423 if (self == NULL)
1424 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1425 else {
1426 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 if (iclassname != NULL && PyString_Check(iclassname))
1428 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001429 else
1430 icname = "?";
1431 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1432 fcname, fname, icname, (long)self);
1433 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001435}
1436
Guido van Rossum9bfef441993-03-29 10:43:31 +00001437static long
1438instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001440{
1441 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001442 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001444 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001446 if (x == -1)
1447 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001449 if (y == -1)
1450 return -1;
1451 return x ^ y;
1452}
1453
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454PyTypeObject PyMethod_Type = {
1455 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001456 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001457 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001459 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001460 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001461 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001462 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001463 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001464 (cmpfunc)instancemethod_compare, /*tp_compare*/
1465 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001466 0, /*tp_as_number*/
1467 0, /*tp_as_sequence*/
1468 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001469 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001470 0, /*tp_call*/
1471 0, /*tp_str*/
1472 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1473 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001474};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001475
1476/* Clear out the free list */
1477
1478void
1479PyMethod_Fini()
1480{
1481 while (free_list) {
1482 PyMethodObject *v = free_list;
1483 free_list = (PyMethodObject *)(v->im_self);
1484 PyMem_DEL(v);
1485 }
1486}