blob: 61e50be003c2419d236b083e6de7f9dcc4c85045 [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 Rossuma63eff61998-05-29 21:37:21 +000042static PyObject *getattrstr, *setattrstr, *delattrstr;
43
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044PyObject *
45PyClass_New(bases, dict, name)
46 PyObject *bases; /* NULL or tuple of classobjects! */
47 PyObject *dict;
Guido van Rossum04d73c41997-10-07 14:54:11 +000048 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000051 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000052 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000053 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000054 if (docstr == NULL)
55 return NULL;
56 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000057 if (modstr == NULL) {
58 modstr= PyString_InternFromString("__module__");
59 if (modstr == NULL)
60 return NULL;
61 }
62 if (namestr == NULL) {
63 namestr= PyString_InternFromString("__name__");
64 if (namestr == NULL)
65 return NULL;
66 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000067 if (name == NULL || !PyString_Check(name)) {
68 PyErr_SetString(PyExc_SystemError,
69 "PyClass_New: name must be a string");
70 return NULL;
71 }
72 if (dict == NULL || !PyDict_Check(dict)) {
73 PyErr_SetString(PyExc_SystemError,
74 "PyClass_New: dict must be a dictionary");
75 return NULL;
76 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 if (PyDict_GetItem(dict, docstr) == NULL) {
78 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000079 return NULL;
80 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000081 if (PyDict_GetItem(dict, modstr) == NULL) {
82 PyObject *globals = PyEval_GetGlobals();
83 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000084 PyObject *modname = PyDict_GetItem(globals, namestr);
85 if (modname != NULL) {
86 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000087 return NULL;
88 }
89 }
90 }
Guido van Rossume2966a61991-12-10 13:53:23 +000091 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000093 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000094 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000095 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000096 else {
97 int i;
98 if (!PyTuple_Check(bases)) {
99 PyErr_SetString(PyExc_SystemError,
100 "PyClass_New: bases must be a tuple");
101 return NULL;
102 }
103 i = PyTuple_Size(bases);
104 while (--i >= 0) {
105 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
106 PyErr_SetString(PyExc_SystemError,
107 "PyClass_New: base must be a class");
108 return NULL;
109 }
110 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +0000112 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000114 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000117 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000120 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000122 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000123 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000124 getattrstr = PyString_InternFromString("__getattr__");
125 setattrstr = PyString_InternFromString("__setattr__");
126 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000127 }
128 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
129 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
130 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 Py_XINCREF(op->cl_getattr);
132 Py_XINCREF(op->cl_setattr);
133 Py_XINCREF(op->cl_delattr);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
136
137/* Class methods */
138
139static void
140class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 Py_DECREF(op->cl_bases);
144 Py_DECREF(op->cl_dict);
145 Py_XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 free((ANY *)op);
147}
148
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000150class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 PyClassObject *cp;
152 PyObject *name;
153 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000154{
155 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000157 if (value != NULL) {
158 *pclass = cp;
159 return value;
160 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000162 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000163 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 PyObject *v = class_lookup(
165 (PyClassObject *)
166 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000167 if (v != NULL)
168 return v;
169 }
170 return NULL;
171}
172
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 register PyClassObject *op;
176 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 register PyObject *v;
179 register char *sname = PyString_AsString(name);
180 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000181 if (sname[0] == '_' && sname[1] == '_') {
182 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (PyEval_GetRestricted()) {
184 PyErr_SetString(PyExc_RuntimeError,
185 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000186 return NULL;
187 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000189 return op->cl_dict;
190 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000191 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000193 return op->cl_bases;
194 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000195 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000196 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000198 else
199 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000201 return v;
202 }
Guido van Rossum94308391991-10-20 20:11:48 +0000203 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000204 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000205 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000207 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000209 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 if (PyFunction_Check(v)) {
211 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
212 (PyObject *)class);
213 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000214 v = w;
215 }
216 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217}
218
Guido van Rossuma63eff61998-05-29 21:37:21 +0000219static void
220set_slot(slot, v)
221 PyObject **slot;
222 PyObject *v;
223{
224 PyObject *temp = *slot;
225 Py_XINCREF(v);
226 *slot = v;
227 Py_XDECREF(temp);
228}
229
230static char *
231set_dict(c, v)
232 PyClassObject *c;
233 PyObject *v;
234{
235 PyClassObject *dummy;
236
237 if (v == NULL || !PyDict_Check(v))
238 return "__dict__ must be a dictionary object";
239 set_slot(&c->cl_dict, v);
240
241 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
242 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
243 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
244
245 return "";
246}
247
248static char *
249set_bases(c, v)
250 PyClassObject *c;
251 PyObject *v;
252{
253 PyObject *temp;
254 int i, n;
255
256 if (v == NULL || !PyTuple_Check(v))
257 return "__bases__ must be a tuple object";
258 n = PyTuple_Size(v);
259 for (i = 0; i < n; i++) {
260 PyObject *x = PyTuple_GET_ITEM(v, i);
261 if (!PyClass_Check(x))
262 return "__bases__ items must be classes";
263 if (PyClass_IsSubclass(x, (PyObject *)c))
264 return "a __bases__ item causes an inheritance cycle";
265 }
266 set_slot(&c->cl_bases, v);
267 return "";
268}
269
270static char *
271set_name(c, v)
272 PyClassObject *c;
273 PyObject *v;
274{
275 PyObject *temp;
276
277 if (v == NULL || !PyString_Check(v))
278 return "__name__ must be a string object";
279 if (strlen(PyString_AS_STRING(v)) != PyString_GET_SIZE(v))
280 return "__name__ must not contain null bytes";
281 set_slot(&c->cl_name, v);
282 return "";
283}
284
Guido van Rossum94308391991-10-20 20:11:48 +0000285static int
286class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000287 PyClassObject *op;
288 PyObject *name;
289 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000290{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000291 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 if (PyEval_GetRestricted()) {
293 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000294 "classes are read-only in restricted mode");
295 return -1;
296 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000297 sname = PyString_AsString(name);
298 if (sname[0] == '_' && sname[1] == '_') {
299 int n = PyString_Size(name);
300 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000301 char *err = NULL;
302 if (strcmp(sname, "__dict__") == 0)
303 err = set_dict(op, v);
304 else if (strcmp(sname, "__bases__") == 0)
305 err = set_bases(op, v);
306 else if (strcmp(sname, "__name__") == 0)
307 err = set_name(op, v);
308 else if (strcmp(sname, "__getattr__") == 0)
309 set_slot(&op->cl_getattr, v);
310 else if (strcmp(sname, "__setattr__") == 0)
311 set_slot(&op->cl_setattr, v);
312 else if (strcmp(sname, "__delattr__") == 0)
313 set_slot(&op->cl_delattr, v);
314 /* For the last three, we fall through to update the
315 dictionary as well. */
316 if (err != NULL) {
317 if (*err == '\0')
318 return 0;
319 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000320 return -1;
321 }
322 }
323 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000324 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000326 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000328 "delete non-existing class attribute");
329 return rv;
330 }
Guido van Rossum94308391991-10-20 20:11:48 +0000331 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000333}
334
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000336class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000338{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000339 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000340 char buf[140];
341 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000343 name = "?";
344 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000346 if (mod == NULL || !PyString_Check(mod))
347 sprintf(buf, "<class ?.%.100s at %lx>", name, (long)op);
348 else
349 sprintf(buf, "<class %.50s.%.50s at %lx>",
350 PyString_AsString(mod),
351 name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000353}
354
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000355static PyObject *
356class_str(op)
357 PyClassObject *op;
358{
359 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
360 PyObject *name = op->cl_name;
361 PyObject *res;
362 int m, n;
363
364 if (name == NULL || !PyString_Check(name))
365 return class_repr(op);
366 if (mod == NULL || !PyString_Check(mod)) {
367 Py_INCREF(name);
368 return name;
369 }
370 m = PyString_Size(mod);
371 n = PyString_Size(name);
372 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
373 if (res != NULL) {
374 char *s = PyString_AsString(res);
375 memcpy(s, PyString_AsString(mod), m);
376 s += m;
377 *s++ = '.';
378 memcpy(s, PyString_AsString(name), n);
379 }
380 return res;
381}
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383PyTypeObject PyClass_Type = {
384 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 0,
386 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000389 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000391 0, /*tp_getattr*/
392 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000394 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 0, /*tp_as_number*/
396 0, /*tp_as_sequence*/
397 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000398 0, /*tp_hash*/
399 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000400 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000401 (getattrofunc)class_getattr, /*tp_getattro*/
402 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403};
404
Guido van Rossum81daa321993-05-20 14:24:46 +0000405int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406PyClass_IsSubclass(class, base)
407 PyObject *class;
408 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000409{
410 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000412 if (class == base)
413 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000415 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 cp = (PyClassObject *)class;
417 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000418 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000420 return 1;
421 }
422 return 0;
423}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424
Guido van Rossum81daa321993-05-20 14:24:46 +0000425
426/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428PyObject *
429PyInstance_New(class, arg, kw)
430 PyObject *class;
431 PyObject *arg;
432 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 register PyInstanceObject *inst;
435 PyObject *init;
436 static PyObject *initstr;
437 if (!PyClass_Check(class)) {
438 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439 return NULL;
440 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000442 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 Py_INCREF(class);
445 inst->in_class = (PyClassObject *)class;
446 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000447 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 return NULL;
450 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000451 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000452 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000453 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000454 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 PyErr_Clear();
456 if ((arg != NULL && (!PyTuple_Check(arg) ||
457 PyTuple_Size(arg) != 0))
458 || (kw != NULL && (!PyDict_Check(kw) ||
459 PyDict_Size(kw) != 0))) {
460 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000461 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000463 inst = NULL;
464 }
465 }
466 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
468 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000469 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000471 inst = NULL;
472 }
473 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 if (res != Py_None) {
475 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000476 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000478 inst = NULL;
479 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000481 }
482 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}
485
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000486/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487
488static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000489instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 PyObject *error_type, *error_value, *error_traceback;
493 PyObject *del;
494 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000495 /* Call the __del__ method if it exists. First temporarily
496 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000497#ifdef Py_TRACE_REFS
498 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 extern long _Py_RefTotal;
500 inst->ob_type = &PyInstance_Type;
501 _Py_NewReference(inst);
502 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000503#ifdef COUNT_ALLOCS
504 inst->ob_type->tp_alloc--; /* ditto */
505#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000506#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000508#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000510 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000511 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000512 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000514 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyObject *f, *t, *v, *tb;
516 PyErr_Fetch(&t, &v, &tb);
517 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000518 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000520 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyFile_WriteObject(t, f, Py_PRINT_RAW);
522 if (v && v != Py_None) {
523 PyFile_WriteString(": ", f);
524 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000525 }
526 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 PyFile_WriteString(" in ", f);
528 PyFile_WriteObject(del, f, 0);
529 PyFile_WriteString(" ignored\n", f);
530 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000531 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000532 Py_XDECREF(t);
533 Py_XDECREF(v);
534 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000535 }
536 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 Py_DECREF(res);
538 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000539 }
540 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000542 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000543 if (--inst->ob_refcnt > 0) {
544#ifdef COUNT_ALLOCS
545 inst->ob_type->tp_free--;
546#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000547 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000548 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000549#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000550#ifdef COUNT_ALLOCS
551 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
552#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000554 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000555#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 Py_DECREF(inst->in_class);
557 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000558 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559}
560
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000562instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 register PyInstanceObject *inst;
564 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 register PyObject *v;
567 register char *sname = PyString_AsString(name);
568 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000569 if (sname[0] == '_' && sname[1] == '_') {
570 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 if (PyEval_GetRestricted()) {
572 PyErr_SetString(PyExc_RuntimeError,
573 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000574 return NULL;
575 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000577 return inst->in_dict;
578 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000579 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 Py_INCREF(inst->in_class);
581 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000582 }
Guido van Rossum94308391991-10-20 20:11:48 +0000583 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000584 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000586 if (v == NULL) {
587 v = class_lookup(inst->in_class, name, &class);
588 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000590 return NULL;
591 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000593 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000594 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 if (PyFunction_Check(v)) {
596 PyObject *w = PyMethod_New(v, (PyObject *)inst,
597 (PyObject *)class);
598 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000599 v = w;
600 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 else if (PyMethod_Check(v)) {
602 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000603 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
605 PyObject *im_func = PyMethod_Function(v);
606 PyObject *w = PyMethod_New(im_func,
607 (PyObject *)inst, im_class);
608 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000609 v = w;
610 }
611 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000612 }
613 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614}
615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000617instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 register PyInstanceObject *inst;
619 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000620{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000622 res = instance_getattr1(inst, name);
623 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 PyObject *args;
625 PyErr_Clear();
626 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000627 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000628 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 res = PyEval_CallObject(func, args);
630 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000631 }
632 return res;
633}
634
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635static int
Guido van Rossume7737541994-09-05 07:31:41 +0000636instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 PyInstanceObject *inst;
638 PyObject *name;
639 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640{
Guido van Rossum94472a01992-09-04 09:45:18 +0000641 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000643 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000645 "delete non-existing instance attribute");
646 return rv;
647 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000650}
651
Guido van Rossume7737541994-09-05 07:31:41 +0000652static int
653instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 PyInstanceObject *inst;
655 PyObject *name;
656 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000657{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000658 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000660 if (sname[0] == '_' && sname[1] == '_') {
661 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000662 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000663 if (strcmp(sname, "__dict__") == 0) {
664 if (PyEval_GetRestricted()) {
665 PyErr_SetString(PyExc_RuntimeError,
666 "__dict__ not accessible in restricted mode");
667 return -1;
668 }
669 if (v == NULL || !PyDict_Check(v)) {
670 PyErr_SetString(PyExc_TypeError,
671 "__dict__ must be set to a dictionary");
672 return -1;
673 }
674 tmp = inst->in_dict;
675 Py_INCREF(v);
676 inst->in_dict = v;
677 Py_DECREF(tmp);
678 return 0;
679 }
680 if (strcmp(sname, "__class__") == 0) {
681 if (PyEval_GetRestricted()) {
682 PyErr_SetString(PyExc_RuntimeError,
683 "__class__ not accessible in restricted mode");
684 return -1;
685 }
686 if (v == NULL || !PyClass_Check(v)) {
687 PyErr_SetString(PyExc_TypeError,
688 "__class__ must be set to a class");
689 return -1;
690 }
691 tmp = (PyObject *)(inst->in_class);
692 Py_INCREF(v);
693 inst->in_class = (PyClassObject *)v;
694 Py_DECREF(tmp);
695 return 0;
696 }
Guido van Rossume7737541994-09-05 07:31:41 +0000697 }
Guido van Rossume7737541994-09-05 07:31:41 +0000698 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000699 if (v == NULL)
700 func = inst->in_class->cl_delattr;
701 else
702 func = inst->in_class->cl_setattr;
703 if (func == NULL)
704 return instance_setattr1(inst, name, v);
705 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000707 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000709 if (args == NULL)
710 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 res = PyEval_CallObject(func, args);
712 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000713 if (res == NULL)
714 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000716 return 0;
717}
718
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000722{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 PyObject *func;
724 PyObject *res;
725 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000726
Guido van Rossum2878a691996-08-09 20:53:24 +0000727 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000728 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000729 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000730 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000731 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000733 PyObject *mod = PyDict_GetItemString(
734 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000735 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 if (classname != NULL && PyString_Check(classname))
737 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000738 else
739 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000741 if (mod == NULL || !PyString_Check(mod))
742 sprintf(buf, "<?.%.100s instance at %lx>",
743 cname, (long)inst);
744 else
745 sprintf(buf, "<%.50s.%.50s instance at %lx>",
746 PyString_AsString(mod),
747 cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000749 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 res = PyEval_CallObject(func, (PyObject *)NULL);
751 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000752 return res;
753}
754
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000756instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000758{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000760 instance_compare1);
761}
762
Guido van Rossum9bfef441993-03-29 10:43:31 +0000763static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000764instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000768 long outcome;
769 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000770 if (result == NULL)
771 return -1;
772 if (!PyInt_Check(result)) {
773 Py_DECREF(result);
774 PyErr_SetString(PyExc_TypeError,
775 "comparison did not return an int");
776 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000777 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 outcome = PyInt_AsLong(result);
779 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000780 if (outcome < 0)
781 return -1;
782 else if (outcome > 0)
783 return 1;
784 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785}
786
Guido van Rossum9bfef441993-03-29 10:43:31 +0000787static long
788instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000790{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 PyObject *func;
792 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000793 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000795
Guido van Rossum2878a691996-08-09 20:53:24 +0000796 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000797 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000798 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799 if (func == NULL) {
800 /* If there is no __cmp__ method, we hash on the address.
801 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000803 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000804 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000805 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000806 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000808 outcome = (long)inst;
809 if (outcome == -1)
810 outcome = -2;
811 return outcome;
812 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000814 return -1;
815 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 res = PyEval_CallObject(func, (PyObject *)NULL);
817 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000818 if (res == NULL)
819 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 if (PyInt_Check(res)) {
821 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000822 if (outcome == -1)
823 outcome = -2;
824 }
825 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 PyErr_SetString(PyExc_TypeError,
827 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828 outcome = -1;
829 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000831 return outcome;
832}
833
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000835
Guido van Rossum9bfef441993-03-29 10:43:31 +0000836static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000837instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000839{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 PyObject *func;
841 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842 int outcome;
843
Guido van Rossum2878a691996-08-09 20:53:24 +0000844 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000845 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000846 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000847 if (func == NULL)
848 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 res = PyEval_CallObject(func, (PyObject *)NULL);
850 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000851 if (res == NULL)
852 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 if (PyInt_Check(res)) {
854 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 PyErr_SetString(PyExc_ValueError,
857 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858 }
859 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 PyErr_SetString(PyExc_TypeError,
861 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000862 outcome = -1;
863 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 return outcome;
866}
867
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000869instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 PyInstanceObject *inst;
871 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000872{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 PyObject *func;
874 PyObject *arg;
875 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000876
Guido van Rossum2878a691996-08-09 20:53:24 +0000877 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000878 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000879 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000880 if (func == NULL)
881 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000883 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885 return NULL;
886 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 res = PyEval_CallObject(func, arg);
888 Py_DECREF(func);
889 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890 return res;
891}
892
Guido van Rossum9bfef441993-03-29 10:43:31 +0000893static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 PyInstanceObject*inst;
896 PyObject *key;
897 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 PyObject *func;
900 PyObject *arg;
901 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000902
Guido van Rossum2878a691996-08-09 20:53:24 +0000903 if (value == NULL) {
904 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000905 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000906 func = instance_getattr(inst, delitemstr);
907 }
908 else {
909 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000910 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000911 func = instance_getattr(inst, setitemstr);
912 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913 if (func == NULL)
914 return -1;
915 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000921 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 res = PyEval_CallObject(func, arg);
924 Py_DECREF(func);
925 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 if (res == NULL)
927 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929 return 0;
930}
931
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000933 (inquiry)instance_length, /*mp_length*/
934 (binaryfunc)instance_subscript, /*mp_subscript*/
935 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000936};
937
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000939instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000941 int i;
942{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944
Guido van Rossum2878a691996-08-09 20:53:24 +0000945 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000946 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000947 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948 if (func == NULL)
949 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000951 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000953 return NULL;
954 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 res = PyEval_CallObject(func, arg);
956 Py_DECREF(func);
957 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000958 return res;
959}
960
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000962instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964 int i, j;
965{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 PyObject *func, *arg, *res;
967 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000968
Guido van Rossum2878a691996-08-09 20:53:24 +0000969 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000970 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000971 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000972 if (func == NULL)
973 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000975 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000977 return NULL;
978 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 res = PyEval_CallObject(func, arg);
980 Py_DECREF(func);
981 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000982 return res;
983}
984
985static int
986instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000992
Guido van Rossum2878a691996-08-09 20:53:24 +0000993 if (item == NULL) {
994 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000995 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000996 func = instance_getattr(inst, delitemstr);
997 }
998 else {
999 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001000 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001001 func = instance_getattr(inst, setitemstr);
1002 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001004 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001005 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001007 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001011 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 res = PyEval_CallObject(func, arg);
1014 Py_DECREF(func);
1015 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016 if (res == NULL)
1017 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 return 0;
1020}
1021
1022static int
1023instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001025 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 PyObject *func, *arg, *res;
1029 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030
Guido van Rossum2878a691996-08-09 20:53:24 +00001031 if (value == NULL) {
1032 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 delslicestr =
1034 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001035 func = instance_getattr(inst, delslicestr);
1036 }
1037 else {
1038 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 setslicestr =
1040 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001041 func = instance_getattr(inst, setslicestr);
1042 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001043 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001044 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001045 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001047 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001049 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001051 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 res = PyEval_CallObject(func, arg);
1054 Py_DECREF(func);
1055 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056 if (res == NULL)
1057 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 return 0;
1060}
1061
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001064 0, /*sq_concat*/
1065 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001066 (intargfunc)instance_item, /*sq_item*/
1067 (intintargfunc)instance_slice, /*sq_slice*/
1068 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1069 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070};
1071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 PyInstanceObject *self;
1075 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078
1079 if ((func = instance_getattr(self, methodname)) == NULL)
1080 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 res = PyEval_CallObject(func, (PyObject *)NULL);
1082 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083 return res;
1084}
1085
Guido van Rossum03093a21994-09-28 15:51:32 +00001086
1087/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1089 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001090
1091
1092/* Implement a binary operator involving at least one class instance. */
1093
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094PyObject *
1095PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1096 PyObject *v;
1097 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001098 char *opname;
1099 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001101{
1102 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001104 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001105 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001106 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001107 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001108 /* Sigh -- special case for comnparisons */
1109 if (strcmp(opname, "__cmp__") == 0) {
1110 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1111 return PyInt_FromLong(c);
1112 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001113 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001115 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001116}
1117
Guido van Rossum03093a21994-09-28 15:51:32 +00001118
1119/* Try one half of a binary operator involving a class instance.
1120 Return value:
1121 -1 if an exception is to be reported right away
1122 0 if we have a valid result
1123 1 if we could try another operation
1124*/
1125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001127
Guido van Rossum03093a21994-09-28 15:51:32 +00001128static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001129halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 PyObject *v;
1131 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001132 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyObject **r_result;
1134 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001135 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001136{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 PyObject *func;
1138 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001139 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 PyObject *coerced = NULL;
1141 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001142
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001144 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001145 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001146 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001147 if (coerce_obj == NULL)
1148 return -1;
1149 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001150 coercefunc = PyObject_GetAttr(v, coerce_obj);
1151 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001153 }
1154 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001156 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001157 return -1;
1158 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001159 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001161 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001162 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001163 return -1;
1164 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001165 if (coerced == Py_None) {
1166 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001167 return 1;
1168 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1170 Py_DECREF(coerced);
1171 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001172 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001173 return -1;
1174 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 v1 = PyTuple_GetItem(coerced, 0);
1176 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001177 if (v1 != v) {
1178 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001180 if (swapped)
1181 *r_result = (*thisfunc)(w, v);
1182 else
1183 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001185 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001186 }
1187 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001188 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001190 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001192 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001193 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001195 return 1;
1196 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001198 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001199 Py_DECREF(func);
1200 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001201 return -1;
1202 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 *r_result = PyEval_CallObject(func, args);
1204 Py_DECREF(args);
1205 Py_DECREF(func);
1206 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 return *r_result == NULL ? -1 : 0;
1208}
1209
Guido van Rossum879c5811995-01-10 15:24:06 +00001210static int
1211instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 PyObject **pv;
1213 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001214{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 PyObject *v = *pv;
1216 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001217 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 PyObject *args;
1219 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001220
Guido van Rossum2878a691996-08-09 20:53:24 +00001221 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001222 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001223 if (coerce_obj == NULL)
1224 return -1;
1225 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001226 coercefunc = PyObject_GetAttr(v, coerce_obj);
1227 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001228 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 PyErr_Clear();
1230 Py_INCREF(v);
1231 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001232 return 0;
1233 }
1234 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001236 if (args == NULL) {
1237 return -1;
1238 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001239 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001240 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001241 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001242 if (coerced == NULL) {
1243 /* __coerce__ call raised an exception */
1244 return -1;
1245 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001247 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001249 return 1;
1250 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001252 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 Py_DECREF(coerced);
1254 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001255 "coercion should return None or 2-tuple");
1256 return -1;
1257 }
1258 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 *pv = PyTuple_GetItem(coerced, 0);
1260 *pw = PyTuple_GetItem(coerced, 1);
1261 Py_INCREF(*pv);
1262 Py_INCREF(*pw);
1263 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001264 return 0;
1265}
1266
Guido van Rossum03093a21994-09-28 15:51:32 +00001267
Guido van Rossum04691fc1992-08-12 15:35:34 +00001268#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001269static PyObject *funcname(self) PyInstanceObject *self; { \
1270 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001271 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001272 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001273}
1274
Guido van Rossum04691fc1992-08-12 15:35:34 +00001275UNARY(instance_neg, "__neg__")
1276UNARY(instance_pos, "__pos__")
1277UNARY(instance_abs, "__abs__")
1278
Guido van Rossum9bfef441993-03-29 10:43:31 +00001279static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001280instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001282{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001284 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001286
Guido van Rossum2878a691996-08-09 20:53:24 +00001287 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001288 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001289 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001291 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001292 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001293 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001295 /* Fall back to the default behavior:
1296 all instances are nonzero */
1297 return 1;
1298 }
1299 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 res = PyEval_CallObject(func, (PyObject *)NULL);
1301 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001302 if (res == NULL)
1303 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 if (!PyInt_Check(res)) {
1305 Py_DECREF(res);
1306 PyErr_SetString(PyExc_TypeError,
1307 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001308 return -1;
1309 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 outcome = PyInt_AsLong(res);
1311 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001312 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 PyErr_SetString(PyExc_ValueError,
1314 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001315 return -1;
1316 }
1317 return outcome > 0;
1318}
1319
1320UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001321UNARY(instance_int, "__int__")
1322UNARY(instance_long, "__long__")
1323UNARY(instance_float, "__float__")
1324UNARY(instance_oct, "__oct__")
1325UNARY(instance_hex, "__hex__")
1326
Guido van Rossum03093a21994-09-28 15:51:32 +00001327/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001329instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 PyObject *v;
1331 PyObject *w;
1332 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001333{
1334 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 PyObject *func;
1336 PyObject *args;
1337 PyObject *result;
1338 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001339
1340 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001341 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001343 if (func == NULL)
1344 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001346 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001348 return NULL;
1349 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 result = PyEval_CallObject(func, args);
1351 Py_DECREF(func);
1352 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001353 return result;
1354}
1355
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001357 0, /*nb_add*/
1358 0, /*nb_subtract*/
1359 0, /*nb_multiply*/
1360 0, /*nb_divide*/
1361 0, /*nb_remainder*/
1362 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001363 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001364 (unaryfunc)instance_neg, /*nb_negative*/
1365 (unaryfunc)instance_pos, /*nb_positive*/
1366 (unaryfunc)instance_abs, /*nb_absolute*/
1367 (inquiry)instance_nonzero, /*nb_nonzero*/
1368 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001369 0, /*nb_lshift*/
1370 0, /*nb_rshift*/
1371 0, /*nb_and*/
1372 0, /*nb_xor*/
1373 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001374 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001375 (unaryfunc)instance_int, /*nb_int*/
1376 (unaryfunc)instance_long, /*nb_long*/
1377 (unaryfunc)instance_float, /*nb_float*/
1378 (unaryfunc)instance_oct, /*nb_oct*/
1379 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001380};
1381
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382PyTypeObject PyInstance_Type = {
1383 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001384 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001385 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001387 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001388 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001389 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001390 0, /*tp_getattr*/
1391 0, /*tp_setattr*/
1392 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001393 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001394 &instance_as_number, /*tp_as_number*/
1395 &instance_as_sequence, /*tp_as_sequence*/
1396 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001397 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001398 0, /*tp_call*/
1399 0, /*tp_str*/
1400 (getattrofunc)instance_getattr, /*tp_getattro*/
1401 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001402};
1403
1404
Guido van Rossum81daa321993-05-20 14:24:46 +00001405/* Instance method objects are used for two purposes:
1406 (a) as bound instance methods (returned by instancename.methodname)
1407 (b) as unbound methods (returned by ClassName.methodname)
1408 In case (b), im_self is NULL
1409*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001410
1411typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 PyObject_HEAD
1413 PyObject *im_func; /* The function implementing the method */
1414 PyObject *im_self; /* The instance it is bound to, or NULL */
1415 PyObject *im_class; /* The class that defined the method */
1416} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001417
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001418
1419static PyMethodObject *free_list;
1420
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421PyObject *
1422PyMethod_New(func, self, class)
1423 PyObject *func;
1424 PyObject *self;
1425 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001426{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 register PyMethodObject *im;
1428 if (!PyFunction_Check(func)) {
1429 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001430 return NULL;
1431 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001432 im = free_list;
1433 if (im != NULL) {
1434 free_list = (PyMethodObject *)(im->im_self);
1435 im->ob_type = &PyMethod_Type;
1436 _Py_NewReference(im);
1437 }
1438 else {
1439 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1440 if (im == NULL)
1441 return NULL;
1442 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001444 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001446 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001447 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001448 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001450}
1451
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452PyObject *
1453PyMethod_Function(im)
1454 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001455{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456 if (!PyMethod_Check(im)) {
1457 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001458 return NULL;
1459 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001461}
1462
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463PyObject *
1464PyMethod_Self(im)
1465 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001466{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 if (!PyMethod_Check(im)) {
1468 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001469 return NULL;
1470 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001472}
1473
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474PyObject *
1475PyMethod_Class(im)
1476 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001477{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 if (!PyMethod_Check(im)) {
1479 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001480 return NULL;
1481 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001483}
1484
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001485/* Class method methods */
1486
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001488
Guido van Rossume8122f11991-05-05 20:03:07 +00001489static struct memberlist instancemethod_memberlist[] = {
1490 {"im_func", T_OBJECT, OFF(im_func)},
1491 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001492 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001493 /* Dummies that are not handled by getattr() except for __members__ */
1494 {"__doc__", T_INT, 0},
1495 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001496 {NULL} /* Sentinel */
1497};
1498
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001500instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 register PyMethodObject *im;
1502 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001503{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001505 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001507 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001509 return func->func_name;
1510 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001511 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001513 return func->func_doc;
1514 }
1515 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516 if (PyEval_GetRestricted()) {
1517 PyErr_SetString(PyExc_RuntimeError,
1518 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001519 return NULL;
1520 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001522}
1523
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001524static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001525instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001527{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528 Py_DECREF(im->im_func);
1529 Py_XDECREF(im->im_self);
1530 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001531 im->im_self = (PyObject *)free_list;
1532 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001533}
1534
Guido van Rossumebc8c511992-09-03 20:39:51 +00001535static int
1536instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001538{
Guido van Rossume9df7271995-04-06 14:46:51 +00001539 if (a->im_self != b->im_self)
1540 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001542}
1543
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001544static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001545instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001547{
1548 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1550 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1551 PyClassObject *class = (PyClassObject *)(a->im_class);
1552 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001553 char *fcname, *icname, *fname;
1554 fclassname = class->cl_name;
1555 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 if (fclassname != NULL && PyString_Check(fclassname))
1557 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001558 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001559 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 if (funcname != NULL && PyString_Check(funcname))
1561 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001562 else
1563 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001564 if (self == NULL)
1565 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1566 else {
1567 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 if (iclassname != NULL && PyString_Check(iclassname))
1569 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001570 else
1571 icname = "?";
1572 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1573 fcname, fname, icname, (long)self);
1574 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001576}
1577
Guido van Rossum9bfef441993-03-29 10:43:31 +00001578static long
1579instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001580 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001581{
1582 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001583 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001584 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001585 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001587 if (x == -1)
1588 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001590 if (y == -1)
1591 return -1;
1592 return x ^ y;
1593}
1594
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595PyTypeObject PyMethod_Type = {
1596 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001597 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001598 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001600 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001601 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001602 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001603 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001604 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001605 (cmpfunc)instancemethod_compare, /*tp_compare*/
1606 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001607 0, /*tp_as_number*/
1608 0, /*tp_as_sequence*/
1609 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001610 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001611 0, /*tp_call*/
1612 0, /*tp_str*/
1613 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1614 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001615};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001616
1617/* Clear out the free list */
1618
1619void
1620PyMethod_Fini()
1621{
1622 while (free_list) {
1623 PyMethodObject *v = free_list;
1624 free_list = (PyMethodObject *)(v->im_self);
1625 PyMem_DEL(v);
1626 }
1627}