blob: 04362a74afdcc48697ef5e0add9e212cca7ff1d5 [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 *));
Jeremy Hylton9e392e22000-04-26 20:39:20 +000041static PyObject *instance_getattr2 Py_PROTO((PyInstanceObject *, PyObject *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000042
Guido van Rossuma63eff61998-05-29 21:37:21 +000043static PyObject *getattrstr, *setattrstr, *delattrstr;
44
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045PyObject *
46PyClass_New(bases, dict, name)
47 PyObject *bases; /* NULL or tuple of classobjects! */
48 PyObject *dict;
Guido van Rossum04d73c41997-10-07 14:54:11 +000049 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000052 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000053 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000054 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000055 if (docstr == NULL)
56 return NULL;
57 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000058 if (modstr == NULL) {
59 modstr= PyString_InternFromString("__module__");
60 if (modstr == NULL)
61 return NULL;
62 }
63 if (namestr == NULL) {
64 namestr= PyString_InternFromString("__name__");
65 if (namestr == NULL)
66 return NULL;
67 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000068 if (name == NULL || !PyString_Check(name)) {
69 PyErr_SetString(PyExc_SystemError,
70 "PyClass_New: name must be a string");
71 return NULL;
72 }
73 if (dict == NULL || !PyDict_Check(dict)) {
74 PyErr_SetString(PyExc_SystemError,
75 "PyClass_New: dict must be a dictionary");
76 return NULL;
77 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 if (PyDict_GetItem(dict, docstr) == NULL) {
79 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000080 return NULL;
81 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000082 if (PyDict_GetItem(dict, modstr) == NULL) {
83 PyObject *globals = PyEval_GetGlobals();
84 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000085 PyObject *modname = PyDict_GetItem(globals, namestr);
86 if (modname != NULL) {
87 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000088 return NULL;
89 }
90 }
91 }
Guido van Rossume2966a61991-12-10 13:53:23 +000092 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000094 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000095 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000096 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000097 else {
98 int i;
99 if (!PyTuple_Check(bases)) {
100 PyErr_SetString(PyExc_SystemError,
101 "PyClass_New: bases must be a tuple");
102 return NULL;
103 }
104 i = PyTuple_Size(bases);
105 while (--i >= 0) {
106 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
107 PyErr_SetString(PyExc_SystemError,
108 "PyClass_New: base must be a class");
109 return NULL;
110 }
111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +0000113 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000115 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000118 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000121 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000123 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000124 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000125 getattrstr = PyString_InternFromString("__getattr__");
126 setattrstr = PyString_InternFromString("__setattr__");
127 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000128 }
129 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
130 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
131 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 Py_XINCREF(op->cl_getattr);
133 Py_XINCREF(op->cl_setattr);
134 Py_XINCREF(op->cl_delattr);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
138/* Class methods */
139
140static void
141class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 Py_DECREF(op->cl_bases);
145 Py_DECREF(op->cl_dict);
146 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000147 Py_XDECREF(op->cl_getattr);
148 Py_XDECREF(op->cl_setattr);
149 Py_XDECREF(op->cl_delattr);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000150 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151}
152
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000154class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 PyClassObject *cp;
156 PyObject *name;
157 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000158{
159 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000161 if (value != NULL) {
162 *pclass = cp;
163 return value;
164 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000166 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000167 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 PyObject *v = class_lookup(
169 (PyClassObject *)
170 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000171 if (v != NULL)
172 return v;
173 }
174 return NULL;
175}
176
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyClassObject *op;
180 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 register PyObject *v;
183 register char *sname = PyString_AsString(name);
184 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000185 if (sname[0] == '_' && sname[1] == '_') {
186 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 if (PyEval_GetRestricted()) {
188 PyErr_SetString(PyExc_RuntimeError,
189 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000190 return NULL;
191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000193 return op->cl_dict;
194 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000195 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000197 return op->cl_bases;
198 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000199 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000200 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000202 else
203 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000205 return v;
206 }
Guido van Rossum94308391991-10-20 20:11:48 +0000207 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000208 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000209 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000211 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000213 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 if (PyFunction_Check(v)) {
215 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
216 (PyObject *)class);
217 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000218 v = w;
219 }
220 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221}
222
Guido van Rossuma63eff61998-05-29 21:37:21 +0000223static void
224set_slot(slot, v)
225 PyObject **slot;
226 PyObject *v;
227{
228 PyObject *temp = *slot;
229 Py_XINCREF(v);
230 *slot = v;
231 Py_XDECREF(temp);
232}
233
Guido van Rossum7ba30431998-07-08 13:34:48 +0000234static void
235set_attr_slots(c)
236 PyClassObject *c;
237{
238 PyClassObject *dummy;
239
240 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
241 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
242 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
243}
244
Guido van Rossuma63eff61998-05-29 21:37:21 +0000245static char *
246set_dict(c, v)
247 PyClassObject *c;
248 PyObject *v;
249{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000250 if (v == NULL || !PyDict_Check(v))
251 return "__dict__ must be a dictionary object";
252 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000253 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000254 return "";
255}
256
257static char *
258set_bases(c, v)
259 PyClassObject *c;
260 PyObject *v;
261{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000262 int i, n;
263
264 if (v == NULL || !PyTuple_Check(v))
265 return "__bases__ must be a tuple object";
266 n = PyTuple_Size(v);
267 for (i = 0; i < n; i++) {
268 PyObject *x = PyTuple_GET_ITEM(v, i);
269 if (!PyClass_Check(x))
270 return "__bases__ items must be classes";
271 if (PyClass_IsSubclass(x, (PyObject *)c))
272 return "a __bases__ item causes an inheritance cycle";
273 }
274 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000275 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000276 return "";
277}
278
279static char *
280set_name(c, v)
281 PyClassObject *c;
282 PyObject *v;
283{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000284 if (v == NULL || !PyString_Check(v))
285 return "__name__ must be a string object";
Guido van Rossume0fdf6f1998-06-12 15:03:58 +0000286 if ((long)strlen(PyString_AS_STRING(v)) != PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000287 return "__name__ must not contain null bytes";
288 set_slot(&c->cl_name, v);
289 return "";
290}
291
Guido van Rossum94308391991-10-20 20:11:48 +0000292static int
293class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 PyClassObject *op;
295 PyObject *name;
296 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000297{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000298 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 if (PyEval_GetRestricted()) {
300 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000301 "classes are read-only in restricted mode");
302 return -1;
303 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000304 sname = PyString_AsString(name);
305 if (sname[0] == '_' && sname[1] == '_') {
306 int n = PyString_Size(name);
307 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000308 char *err = NULL;
309 if (strcmp(sname, "__dict__") == 0)
310 err = set_dict(op, v);
311 else if (strcmp(sname, "__bases__") == 0)
312 err = set_bases(op, v);
313 else if (strcmp(sname, "__name__") == 0)
314 err = set_name(op, v);
315 else if (strcmp(sname, "__getattr__") == 0)
316 set_slot(&op->cl_getattr, v);
317 else if (strcmp(sname, "__setattr__") == 0)
318 set_slot(&op->cl_setattr, v);
319 else if (strcmp(sname, "__delattr__") == 0)
320 set_slot(&op->cl_delattr, v);
321 /* For the last three, we fall through to update the
322 dictionary as well. */
323 if (err != NULL) {
324 if (*err == '\0')
325 return 0;
326 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000327 return -1;
328 }
329 }
330 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000331 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000333 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000335 "delete non-existing class attribute");
336 return rv;
337 }
Guido van Rossum94308391991-10-20 20:11:48 +0000338 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000340}
341
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000343class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000345{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000346 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000347 char buf[140];
348 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000350 name = "?";
351 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000353 if (mod == NULL || !PyString_Check(mod))
354 sprintf(buf, "<class ?.%.100s at %lx>", name, (long)op);
355 else
356 sprintf(buf, "<class %.50s.%.50s at %lx>",
357 PyString_AsString(mod),
358 name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000360}
361
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000362static PyObject *
363class_str(op)
364 PyClassObject *op;
365{
366 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
367 PyObject *name = op->cl_name;
368 PyObject *res;
369 int m, n;
370
371 if (name == NULL || !PyString_Check(name))
372 return class_repr(op);
373 if (mod == NULL || !PyString_Check(mod)) {
374 Py_INCREF(name);
375 return name;
376 }
377 m = PyString_Size(mod);
378 n = PyString_Size(name);
379 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
380 if (res != NULL) {
381 char *s = PyString_AsString(res);
382 memcpy(s, PyString_AsString(mod), m);
383 s += m;
384 *s++ = '.';
385 memcpy(s, PyString_AsString(name), n);
386 }
387 return res;
388}
389
Jeremy Hylton8caad492000-06-23 14:18:11 +0000390static int
391class_traverse(PyClassObject *o, visitproc visit, void *arg)
392{
393 int err;
394 if (o->cl_bases) {
395 err = visit(o->cl_bases, arg);
396 if (err)
397 return err;
398 }
399 if (o->cl_dict) {
400 err = visit(o->cl_dict, arg);
401 if (err)
402 return err;
403 }
404 if (o->cl_name) {
405 err = visit(o->cl_name, arg);
406 if (err)
407 return err;
408 }
409 if (o->cl_getattr) {
410 err = visit(o->cl_getattr, arg);
411 if (err)
412 return err;
413 }
414 if (o->cl_setattr) {
415 err = visit(o->cl_setattr, arg);
416 if (err)
417 return err;
418 }
419 if (o->cl_delattr) {
420 err = visit(o->cl_delattr, arg);
421 if (err)
422 return err;
423 }
424 return 0;
425}
426
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427PyTypeObject PyClass_Type = {
428 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 0,
430 "class",
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000431 sizeof(PyClassObject) + PyGC_INFO_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000433 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000435 0, /*tp_getattr*/
436 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000438 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439 0, /*tp_as_number*/
440 0, /*tp_as_sequence*/
441 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000442 0, /*tp_hash*/
443 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000444 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000445 (getattrofunc)class_getattr, /*tp_getattro*/
446 (setattrofunc)class_setattr, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000447 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000448 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000449 0, /* tp_doc */
450 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451};
452
Guido van Rossum81daa321993-05-20 14:24:46 +0000453int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454PyClass_IsSubclass(class, base)
455 PyObject *class;
456 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000457{
458 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000460 if (class == base)
461 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000463 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 cp = (PyClassObject *)class;
465 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000466 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000468 return 1;
469 }
470 return 0;
471}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472
Guido van Rossum81daa321993-05-20 14:24:46 +0000473
474/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476PyObject *
477PyInstance_New(class, arg, kw)
478 PyObject *class;
479 PyObject *arg;
480 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 register PyInstanceObject *inst;
483 PyObject *init;
484 static PyObject *initstr;
485 if (!PyClass_Check(class)) {
486 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487 return NULL;
488 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000490 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 Py_INCREF(class);
493 inst->in_class = (PyClassObject *)class;
494 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000495 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497 return NULL;
498 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000499 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000500 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000501 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000502 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 if ((arg != NULL && (!PyTuple_Check(arg) ||
504 PyTuple_Size(arg) != 0))
505 || (kw != NULL && (!PyDict_Check(kw) ||
506 PyDict_Size(kw) != 0))) {
507 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000508 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000510 inst = NULL;
511 }
512 }
513 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
515 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000516 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000518 inst = NULL;
519 }
520 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 if (res != Py_None) {
522 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000523 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000525 inst = NULL;
526 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 }
529 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531}
532
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000533/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534
535static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000536instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 PyObject *error_type, *error_value, *error_traceback;
540 PyObject *del;
541 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000542 /* Call the __del__ method if it exists. First temporarily
543 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000544#ifdef Py_TRACE_REFS
545 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 extern long _Py_RefTotal;
547 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000548 _Py_NewReference((PyObject *)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000550#ifdef COUNT_ALLOCS
551 inst->ob_type->tp_alloc--; /* ditto */
552#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000553#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000555#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000557 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000558 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000559 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000561 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyObject *f, *t, *v, *tb;
563 PyErr_Fetch(&t, &v, &tb);
564 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000565 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000567 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyFile_WriteObject(t, f, Py_PRINT_RAW);
569 if (v && v != Py_None) {
570 PyFile_WriteString(": ", f);
571 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000572 }
573 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 PyFile_WriteString(" in ", f);
575 PyFile_WriteObject(del, f, 0);
576 PyFile_WriteString(" ignored\n", f);
577 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000578 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000579 Py_XDECREF(t);
580 Py_XDECREF(v);
581 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000582 }
583 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 Py_DECREF(res);
585 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000586 }
587 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000589 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000590 if (--inst->ob_refcnt > 0) {
591#ifdef COUNT_ALLOCS
592 inst->ob_type->tp_free--;
593#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000594 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000595 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000596#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000597#ifdef COUNT_ALLOCS
598 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
599#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000600 _Py_ForgetReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000601 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000602#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 Py_DECREF(inst->in_class);
604 Py_XDECREF(inst->in_dict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000605 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000606}
607
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000609instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 register PyInstanceObject *inst;
611 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 register PyObject *v;
614 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000615 if (sname[0] == '_' && sname[1] == '_') {
616 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 if (PyEval_GetRestricted()) {
618 PyErr_SetString(PyExc_RuntimeError,
619 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000620 return NULL;
621 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000623 return inst->in_dict;
624 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000625 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 Py_INCREF(inst->in_class);
627 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000628 }
Guido van Rossum94308391991-10-20 20:11:48 +0000629 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000630 v = instance_getattr2(inst, name);
631 if (v == NULL) {
632 PyErr_Format(PyExc_AttributeError,"'%.50s' instance has no attribute '%.400s'",
633 PyString_AS_STRING(inst->in_class->cl_name), sname);
634 }
635 return v;
636}
637
638static PyObject *
639instance_getattr2(inst, name)
640 register PyInstanceObject *inst;
641 PyObject *name;
642{
643 register PyObject *v;
644 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000645 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000647 if (v == NULL) {
648 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000649 if (v == NULL)
650 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000651 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000652 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000653 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 if (PyFunction_Check(v)) {
655 PyObject *w = PyMethod_New(v, (PyObject *)inst,
656 (PyObject *)class);
657 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000658 v = w;
659 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 else if (PyMethod_Check(v)) {
661 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000662 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
664 PyObject *im_func = PyMethod_Function(v);
665 PyObject *w = PyMethod_New(im_func,
666 (PyObject *)inst, im_class);
667 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000668 v = w;
669 }
670 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000671 }
672 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000673}
674
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000676instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 register PyInstanceObject *inst;
678 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000679{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000681 res = instance_getattr1(inst, name);
682 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 PyObject *args;
684 PyErr_Clear();
685 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000686 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000687 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 res = PyEval_CallObject(func, args);
689 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000690 }
691 return res;
692}
693
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694static int
Guido van Rossume7737541994-09-05 07:31:41 +0000695instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyInstanceObject *inst;
697 PyObject *name;
698 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000699{
Guido van Rossum94472a01992-09-04 09:45:18 +0000700 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000702 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000704 "delete non-existing instance attribute");
705 return rv;
706 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000707 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000709}
710
Guido van Rossume7737541994-09-05 07:31:41 +0000711static int
712instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 PyInstanceObject *inst;
714 PyObject *name;
715 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000716{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000717 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000719 if (sname[0] == '_' && sname[1] == '_') {
720 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000721 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000722 if (strcmp(sname, "__dict__") == 0) {
723 if (PyEval_GetRestricted()) {
724 PyErr_SetString(PyExc_RuntimeError,
725 "__dict__ not accessible in restricted mode");
726 return -1;
727 }
728 if (v == NULL || !PyDict_Check(v)) {
729 PyErr_SetString(PyExc_TypeError,
730 "__dict__ must be set to a dictionary");
731 return -1;
732 }
733 tmp = inst->in_dict;
734 Py_INCREF(v);
735 inst->in_dict = v;
736 Py_DECREF(tmp);
737 return 0;
738 }
739 if (strcmp(sname, "__class__") == 0) {
740 if (PyEval_GetRestricted()) {
741 PyErr_SetString(PyExc_RuntimeError,
742 "__class__ not accessible in restricted mode");
743 return -1;
744 }
745 if (v == NULL || !PyClass_Check(v)) {
746 PyErr_SetString(PyExc_TypeError,
747 "__class__ must be set to a class");
748 return -1;
749 }
750 tmp = (PyObject *)(inst->in_class);
751 Py_INCREF(v);
752 inst->in_class = (PyClassObject *)v;
753 Py_DECREF(tmp);
754 return 0;
755 }
Guido van Rossume7737541994-09-05 07:31:41 +0000756 }
Guido van Rossume7737541994-09-05 07:31:41 +0000757 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000758 if (v == NULL)
759 func = inst->in_class->cl_delattr;
760 else
761 func = inst->in_class->cl_setattr;
762 if (func == NULL)
763 return instance_setattr1(inst, name, v);
764 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000766 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000768 if (args == NULL)
769 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 res = PyEval_CallObject(func, args);
771 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000772 if (res == NULL)
773 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000775 return 0;
776}
777
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000779instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000781{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 PyObject *func;
783 PyObject *res;
784 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785
Guido van Rossum2878a691996-08-09 20:53:24 +0000786 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000787 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000788 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000789 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000790 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000792 PyObject *mod = PyDict_GetItemString(
793 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000794 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 if (classname != NULL && PyString_Check(classname))
796 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000797 else
798 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000800 if (mod == NULL || !PyString_Check(mod))
801 sprintf(buf, "<?.%.100s instance at %lx>",
802 cname, (long)inst);
803 else
804 sprintf(buf, "<%.50s.%.50s instance at %lx>",
805 PyString_AsString(mod),
806 cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000808 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 res = PyEval_CallObject(func, (PyObject *)NULL);
810 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811 return res;
812}
813
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000815instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000817{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000819 instance_compare1);
820}
821
Guido van Rossum9bfef441993-03-29 10:43:31 +0000822static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000823instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000825{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000827 long outcome;
828 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000829 if (result == NULL)
830 return -1;
831 if (!PyInt_Check(result)) {
832 Py_DECREF(result);
833 PyErr_SetString(PyExc_TypeError,
834 "comparison did not return an int");
835 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000836 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 outcome = PyInt_AsLong(result);
838 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000839 if (outcome < 0)
840 return -1;
841 else if (outcome > 0)
842 return 1;
843 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000844}
845
Guido van Rossum9bfef441993-03-29 10:43:31 +0000846static long
847instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000849{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 PyObject *func;
851 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000852 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000854
Guido van Rossum2878a691996-08-09 20:53:24 +0000855 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000856 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000857 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000858 if (func == NULL) {
859 /* If there is no __cmp__ method, we hash on the address.
860 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000862 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000863 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000864 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000865 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000867 outcome = (long)inst;
868 if (outcome == -1)
869 outcome = -2;
870 return outcome;
871 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873 return -1;
874 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 res = PyEval_CallObject(func, (PyObject *)NULL);
876 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000877 if (res == NULL)
878 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 if (PyInt_Check(res)) {
880 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000881 if (outcome == -1)
882 outcome = -2;
883 }
884 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 PyErr_SetString(PyExc_TypeError,
886 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000887 outcome = -1;
888 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000890 return outcome;
891}
892
Jeremy Hylton8caad492000-06-23 14:18:11 +0000893static int
894instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
895{
896 int err;
897 if (o->in_class) {
898 err = visit((PyObject *)(o->in_class), arg);
899 if (err)
900 return err;
901 }
902 if (o->in_dict) {
903 err = visit(o->in_dict, arg);
904 if (err)
905 return err;
906 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000907 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000908}
909
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000911
Guido van Rossum9bfef441993-03-29 10:43:31 +0000912static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 PyObject *func;
917 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000918 int outcome;
919
Guido van Rossum2878a691996-08-09 20:53:24 +0000920 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000921 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000922 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923 if (func == NULL)
924 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 res = PyEval_CallObject(func, (PyObject *)NULL);
926 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000927 if (res == NULL)
928 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 if (PyInt_Check(res)) {
930 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyErr_SetString(PyExc_ValueError,
933 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934 }
935 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 PyErr_SetString(PyExc_TypeError,
937 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938 outcome = -1;
939 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000941 return outcome;
942}
943
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyInstanceObject *inst;
947 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 PyObject *func;
950 PyObject *arg;
951 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952
Guido van Rossum2878a691996-08-09 20:53:24 +0000953 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000954 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000955 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000956 if (func == NULL)
957 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000959 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961 return NULL;
962 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 res = PyEval_CallObject(func, arg);
964 Py_DECREF(func);
965 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000966 return res;
967}
968
Guido van Rossum9bfef441993-03-29 10:43:31 +0000969static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000970instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 PyInstanceObject*inst;
972 PyObject *key;
973 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000974{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 PyObject *func;
976 PyObject *arg;
977 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000978
Guido van Rossum2878a691996-08-09 20:53:24 +0000979 if (value == NULL) {
980 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000981 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000982 func = instance_getattr(inst, delitemstr);
983 }
984 else {
985 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000986 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000987 func = instance_getattr(inst, setitemstr);
988 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000989 if (func == NULL)
990 return -1;
991 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000997 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 res = PyEval_CallObject(func, arg);
1000 Py_DECREF(func);
1001 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001002 if (res == NULL)
1003 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001005 return 0;
1006}
1007
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001009 (inquiry)instance_length, /*mp_length*/
1010 (binaryfunc)instance_subscript, /*mp_subscript*/
1011 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012};
1013
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017 int i;
1018{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020
Guido van Rossum2878a691996-08-09 20:53:24 +00001021 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001022 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001023 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024 if (func == NULL)
1025 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001029 return NULL;
1030 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001031 res = PyEval_CallObject(func, arg);
1032 Py_DECREF(func);
1033 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 return res;
1035}
1036
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001038instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001040 int i, j;
1041{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 PyObject *func, *arg, *res;
1043 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044
Guido van Rossum2878a691996-08-09 20:53:24 +00001045 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001046 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001047 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 if (func == NULL)
1049 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053 return NULL;
1054 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 res = PyEval_CallObject(func, arg);
1056 Py_DECREF(func);
1057 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058 return res;
1059}
1060
1061static int
1062instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001066{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068
Guido van Rossum2878a691996-08-09 20:53:24 +00001069 if (item == NULL) {
1070 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001071 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001072 func = instance_getattr(inst, delitemstr);
1073 }
1074 else {
1075 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001076 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001077 func = instance_getattr(inst, setitemstr);
1078 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001080 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001081 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001085 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001087 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001088 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089 res = PyEval_CallObject(func, arg);
1090 Py_DECREF(func);
1091 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092 if (res == NULL)
1093 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001095 return 0;
1096}
1097
1098static int
1099instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001101 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001102 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 PyObject *func, *arg, *res;
1105 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001106
Guido van Rossum2878a691996-08-09 20:53:24 +00001107 if (value == NULL) {
1108 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 delslicestr =
1110 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001111 func = instance_getattr(inst, delslicestr);
1112 }
1113 else {
1114 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 setslicestr =
1116 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001117 func = instance_getattr(inst, setslicestr);
1118 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001119 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001120 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001121 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001123 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001127 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001128 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129 res = PyEval_CallObject(func, arg);
1130 Py_DECREF(func);
1131 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001132 if (res == NULL)
1133 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001135 return 0;
1136}
1137
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001138static int instance_contains(PyInstanceObject *inst, PyObject *member)
1139{
1140 static PyObject *__contains__;
1141 PyObject *func, *arg, *res;
1142 int ret;
1143
1144 if(__contains__ == NULL) {
1145 __contains__ = PyString_InternFromString("__contains__");
1146 if(__contains__ == NULL)
1147 return -1;
1148 }
1149 func = instance_getattr(inst, __contains__);
1150 if(func == NULL) {
1151 /* fall back to previous behaviour */
1152 int i, cmp_res;
1153
1154 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1155 return -1;
1156 PyErr_Clear();
1157 for(i=0;;i++) {
1158 PyObject *obj = instance_item(inst, i);
1159 int ret = 0;
1160
1161 if(obj == NULL) {
1162 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1163 return -1;
1164 PyErr_Clear();
1165 return 0;
1166 }
1167 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1168 ret = -1;
1169 if(cmp_res == 0)
1170 ret = 1;
1171 Py_DECREF(obj);
1172 if(ret)
1173 return ret;
1174 }
1175 }
1176 arg = Py_BuildValue("(O)", member);
1177 if(arg == NULL) {
1178 Py_DECREF(func);
1179 return -1;
1180 }
1181 res = PyEval_CallObject(func, arg);
1182 Py_DECREF(func);
1183 Py_DECREF(arg);
1184 if(res == NULL)
1185 return -1;
1186 ret = PyObject_IsTrue(res);
1187 Py_DECREF(res);
1188 return ret;
1189}
1190
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001192 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001193 0, /*sq_concat*/
1194 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001195 (intargfunc)instance_item, /*sq_item*/
1196 (intintargfunc)instance_slice, /*sq_slice*/
1197 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1198 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001199 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001200};
1201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001203generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 PyInstanceObject *self;
1205 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001206{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001208
1209 if ((func = instance_getattr(self, methodname)) == NULL)
1210 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 res = PyEval_CallObject(func, (PyObject *)NULL);
1212 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001213 return res;
1214}
1215
Guido van Rossum03093a21994-09-28 15:51:32 +00001216
1217/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1219 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001220
1221
1222/* Implement a binary operator involving at least one class instance. */
1223
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224PyObject *
1225PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1226 PyObject *v;
1227 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001228 char *opname;
1229 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001231{
1232 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001234 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001235 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001236 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001237 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001238 /* Sigh -- special case for comnparisons */
1239 if (strcmp(opname, "__cmp__") == 0) {
1240 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1241 return PyInt_FromLong(c);
1242 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001243 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001245 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001246}
1247
Guido van Rossum03093a21994-09-28 15:51:32 +00001248
1249/* Try one half of a binary operator involving a class instance.
1250 Return value:
1251 -1 if an exception is to be reported right away
1252 0 if we have a valid result
1253 1 if we could try another operation
1254*/
1255
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001257
Guido van Rossum03093a21994-09-28 15:51:32 +00001258static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001259halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 PyObject *v;
1261 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001262 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 PyObject **r_result;
1264 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001265 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001266{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 PyObject *func;
1268 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001269 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 PyObject *coerced = NULL;
1271 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001272
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001274 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001275 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001276 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001277 if (coerce_obj == NULL)
1278 return -1;
1279 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001280 coercefunc = PyObject_GetAttr(v, coerce_obj);
1281 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001283 }
1284 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001286 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001287 return -1;
1288 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001289 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001291 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001292 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001293 return -1;
1294 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 if (coerced == Py_None) {
1296 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001297 return 1;
1298 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001299 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1300 Py_DECREF(coerced);
1301 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001302 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001303 return -1;
1304 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 v1 = PyTuple_GetItem(coerced, 0);
1306 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001307 if (v1 != v) {
1308 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001310 if (swapped)
1311 *r_result = (*thisfunc)(w, v);
1312 else
1313 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001315 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001316 }
1317 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001318 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001320 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001322 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001323 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001325 return 1;
1326 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001328 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 Py_DECREF(func);
1330 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001331 return -1;
1332 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 *r_result = PyEval_CallObject(func, args);
1334 Py_DECREF(args);
1335 Py_DECREF(func);
1336 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001337 return *r_result == NULL ? -1 : 0;
1338}
1339
Guido van Rossum879c5811995-01-10 15:24:06 +00001340static int
1341instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 PyObject **pv;
1343 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001344{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 PyObject *v = *pv;
1346 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001347 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 PyObject *args;
1349 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001350
Guido van Rossum2878a691996-08-09 20:53:24 +00001351 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001352 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001353 if (coerce_obj == NULL)
1354 return -1;
1355 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001356 coercefunc = PyObject_GetAttr(v, coerce_obj);
1357 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001358 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 PyErr_Clear();
1360 Py_INCREF(v);
1361 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001362 return 0;
1363 }
1364 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001366 if (args == NULL) {
1367 return -1;
1368 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001369 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001371 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001372 if (coerced == NULL) {
1373 /* __coerce__ call raised an exception */
1374 return -1;
1375 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001377 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001379 return 1;
1380 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001382 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 Py_DECREF(coerced);
1384 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001385 "coercion should return None or 2-tuple");
1386 return -1;
1387 }
1388 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 *pv = PyTuple_GetItem(coerced, 0);
1390 *pw = PyTuple_GetItem(coerced, 1);
1391 Py_INCREF(*pv);
1392 Py_INCREF(*pw);
1393 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001394 return 0;
1395}
1396
Guido van Rossum03093a21994-09-28 15:51:32 +00001397
Guido van Rossum04691fc1992-08-12 15:35:34 +00001398#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399static PyObject *funcname(self) PyInstanceObject *self; { \
1400 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001401 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001402 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001403}
1404
Guido van Rossum04691fc1992-08-12 15:35:34 +00001405UNARY(instance_neg, "__neg__")
1406UNARY(instance_pos, "__pos__")
1407UNARY(instance_abs, "__abs__")
1408
Guido van Rossum9bfef441993-03-29 10:43:31 +00001409static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001410instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001412{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001414 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001416
Guido van Rossum2878a691996-08-09 20:53:24 +00001417 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001418 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001419 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001421 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001422 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001423 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001425 /* Fall back to the default behavior:
1426 all instances are nonzero */
1427 return 1;
1428 }
1429 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 res = PyEval_CallObject(func, (PyObject *)NULL);
1431 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001432 if (res == NULL)
1433 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434 if (!PyInt_Check(res)) {
1435 Py_DECREF(res);
1436 PyErr_SetString(PyExc_TypeError,
1437 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001438 return -1;
1439 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 outcome = PyInt_AsLong(res);
1441 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001442 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 PyErr_SetString(PyExc_ValueError,
1444 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001445 return -1;
1446 }
1447 return outcome > 0;
1448}
1449
1450UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001451UNARY(instance_int, "__int__")
1452UNARY(instance_long, "__long__")
1453UNARY(instance_float, "__float__")
1454UNARY(instance_oct, "__oct__")
1455UNARY(instance_hex, "__hex__")
1456
Guido van Rossum03093a21994-09-28 15:51:32 +00001457/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001459instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460 PyObject *v;
1461 PyObject *w;
1462 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001463{
1464 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 PyObject *func;
1466 PyObject *args;
1467 PyObject *result;
1468 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001469
1470 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001471 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001473 if (func == NULL)
1474 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001476 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001478 return NULL;
1479 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480 result = PyEval_CallObject(func, args);
1481 Py_DECREF(func);
1482 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001483 return result;
1484}
1485
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001487 0, /*nb_add*/
1488 0, /*nb_subtract*/
1489 0, /*nb_multiply*/
1490 0, /*nb_divide*/
1491 0, /*nb_remainder*/
1492 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001493 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001494 (unaryfunc)instance_neg, /*nb_negative*/
1495 (unaryfunc)instance_pos, /*nb_positive*/
1496 (unaryfunc)instance_abs, /*nb_absolute*/
1497 (inquiry)instance_nonzero, /*nb_nonzero*/
1498 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001499 0, /*nb_lshift*/
1500 0, /*nb_rshift*/
1501 0, /*nb_and*/
1502 0, /*nb_xor*/
1503 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001504 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001505 (unaryfunc)instance_int, /*nb_int*/
1506 (unaryfunc)instance_long, /*nb_long*/
1507 (unaryfunc)instance_float, /*nb_float*/
1508 (unaryfunc)instance_oct, /*nb_oct*/
1509 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001510};
1511
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512PyTypeObject PyInstance_Type = {
1513 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001514 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001515 "instance",
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001516 sizeof(PyInstanceObject) + PyGC_INFO_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001517 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001518 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001519 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001520 0, /*tp_getattr*/
1521 0, /*tp_setattr*/
1522 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001523 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001524 &instance_as_number, /*tp_as_number*/
1525 &instance_as_sequence, /*tp_as_sequence*/
1526 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001527 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001528 0, /*tp_call*/
1529 0, /*tp_str*/
1530 (getattrofunc)instance_getattr, /*tp_getattro*/
1531 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001532 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001533 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001534 0, /* tp_doc */
1535 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001536};
1537
1538
Guido van Rossum81daa321993-05-20 14:24:46 +00001539/* Instance method objects are used for two purposes:
1540 (a) as bound instance methods (returned by instancename.methodname)
1541 (b) as unbound methods (returned by ClassName.methodname)
1542 In case (b), im_self is NULL
1543*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001544
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001545static PyMethodObject *free_list;
1546
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001547PyObject *
1548PyMethod_New(func, self, class)
1549 PyObject *func;
1550 PyObject *self;
1551 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001552{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001554 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001556 return NULL;
1557 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001558 im = free_list;
1559 if (im != NULL) {
1560 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001561 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001562 }
1563 else {
1564 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1565 if (im == NULL)
1566 return NULL;
1567 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001569 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001570 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001571 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001573 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001575}
1576
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001577PyObject *
1578PyMethod_Function(im)
1579 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001580{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581 if (!PyMethod_Check(im)) {
1582 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001583 return NULL;
1584 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001585 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001586}
1587
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588PyObject *
1589PyMethod_Self(im)
1590 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001591{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592 if (!PyMethod_Check(im)) {
1593 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001594 return NULL;
1595 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001597}
1598
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599PyObject *
1600PyMethod_Class(im)
1601 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001602{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603 if (!PyMethod_Check(im)) {
1604 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001605 return NULL;
1606 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001608}
1609
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001610/* Class method methods */
1611
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001612#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613
Guido van Rossume8122f11991-05-05 20:03:07 +00001614static struct memberlist instancemethod_memberlist[] = {
1615 {"im_func", T_OBJECT, OFF(im_func)},
1616 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001617 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001618 /* Dummies that are not handled by getattr() except for __members__ */
1619 {"__doc__", T_INT, 0},
1620 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001621 {NULL} /* Sentinel */
1622};
1623
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001625instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 register PyMethodObject *im;
1627 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001628{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001630 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001631 /* Inherit __name__ and __doc__ from the callable object
1632 implementing the method */
1633 if (strcmp(sname, "__name__") == 0 ||
1634 strcmp(sname, "__doc__") == 0)
1635 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001636 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 if (PyEval_GetRestricted()) {
1638 PyErr_SetString(PyExc_RuntimeError,
1639 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001640 return NULL;
1641 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001643}
1644
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001645static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001646instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001648{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 Py_DECREF(im->im_func);
1650 Py_XDECREF(im->im_self);
1651 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001652 im->im_self = (PyObject *)free_list;
1653 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001654}
1655
Guido van Rossumebc8c511992-09-03 20:39:51 +00001656static int
1657instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001659{
Guido van Rossume9df7271995-04-06 14:46:51 +00001660 if (a->im_self != b->im_self)
1661 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001663}
1664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001666instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001667 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001668{
1669 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001670 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001671 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 PyClassObject *class = (PyClassObject *)(a->im_class);
1673 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001674 char *fcname, *icname, *fname;
1675 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001676 if (PyFunction_Check(func)) {
1677 funcname = ((PyFunctionObject *)func)->func_name;
1678 Py_INCREF(funcname);
1679 }
1680 else {
1681 funcname = PyObject_GetAttrString(func,"__name__");
1682 if (funcname == NULL)
1683 PyErr_Clear();
1684 }
1685 if (funcname != NULL && PyString_Check(funcname))
1686 fname = PyString_AS_STRING(funcname);
1687 else
1688 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001689 if (fclassname != NULL && PyString_Check(fclassname))
1690 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001691 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001692 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001693 if (self == NULL)
1694 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1695 else {
1696 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001697 if (iclassname != NULL && PyString_Check(iclassname))
1698 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001699 else
1700 icname = "?";
1701 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1702 fcname, fname, icname, (long)self);
1703 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001704 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001705 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001706}
1707
Guido van Rossum9bfef441993-03-29 10:43:31 +00001708static long
1709instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001711{
1712 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001713 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001714 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001715 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001716 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001717 if (x == -1)
1718 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001719 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001720 if (y == -1)
1721 return -1;
1722 return x ^ y;
1723}
1724
Jeremy Hylton8caad492000-06-23 14:18:11 +00001725static int
1726instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1727{
1728 int err;
1729 if (im->im_func) {
1730 err = visit(im->im_func, arg);
1731 if (err)
1732 return err;
1733 }
1734 if (im->im_self) {
1735 err = visit(im->im_self, arg);
1736 if (err)
1737 return err;
1738 }
1739 if (im->im_class) {
1740 err = visit(im->im_class, arg);
1741 if (err)
1742 return err;
1743 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001744 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001745}
1746
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001747PyTypeObject PyMethod_Type = {
1748 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001749 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001750 "instance method",
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001751 sizeof(PyMethodObject) + PyGC_INFO_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001752 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001753 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001754 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001755 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001756 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001757 (cmpfunc)instancemethod_compare, /*tp_compare*/
1758 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001759 0, /*tp_as_number*/
1760 0, /*tp_as_sequence*/
1761 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001762 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001763 0, /*tp_call*/
1764 0, /*tp_str*/
1765 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1766 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001767 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001768 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001769 0, /* tp_doc */
1770 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001771};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001772
1773/* Clear out the free list */
1774
1775void
1776PyMethod_Fini()
1777{
1778 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001779 PyMethodObject *im = free_list;
1780 free_list = (PyMethodObject *)(im->im_self);
1781 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001782 }
1783}