blob: 4f73ff8b2fed6046931c1a8c1a14c747ae0d81d4 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Class object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000015
Guido van Rossum52ca98a1994-09-05 07:32:29 +000016/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017static PyObject *class_lookup
18 Py_PROTO((PyClassObject *, PyObject *, PyClassObject **));
19static PyObject *instance_getattr1 Py_PROTO((PyInstanceObject *, PyObject *));
Jeremy Hylton9e392e22000-04-26 20:39:20 +000020static PyObject *instance_getattr2 Py_PROTO((PyInstanceObject *, PyObject *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000021
Guido van Rossuma63eff61998-05-29 21:37:21 +000022static PyObject *getattrstr, *setattrstr, *delattrstr;
23
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024PyObject *
25PyClass_New(bases, dict, name)
26 PyObject *bases; /* NULL or tuple of classobjects! */
27 PyObject *dict;
Guido van Rossum04d73c41997-10-07 14:54:11 +000028 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000030 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000031 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000032 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000033 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000034 if (docstr == NULL)
35 return NULL;
36 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000037 if (modstr == NULL) {
38 modstr= PyString_InternFromString("__module__");
39 if (modstr == NULL)
40 return NULL;
41 }
42 if (namestr == NULL) {
43 namestr= PyString_InternFromString("__name__");
44 if (namestr == NULL)
45 return NULL;
46 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000047 if (name == NULL || !PyString_Check(name)) {
48 PyErr_SetString(PyExc_SystemError,
49 "PyClass_New: name must be a string");
50 return NULL;
51 }
52 if (dict == NULL || !PyDict_Check(dict)) {
53 PyErr_SetString(PyExc_SystemError,
54 "PyClass_New: dict must be a dictionary");
55 return NULL;
56 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (PyDict_GetItem(dict, docstr) == NULL) {
58 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000059 return NULL;
60 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000061 if (PyDict_GetItem(dict, modstr) == NULL) {
62 PyObject *globals = PyEval_GetGlobals();
63 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000064 PyObject *modname = PyDict_GetItem(globals, namestr);
65 if (modname != NULL) {
66 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000067 return NULL;
68 }
69 }
70 }
Guido van Rossume2966a61991-12-10 13:53:23 +000071 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000072 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000073 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000074 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000075 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000076 else {
77 int i;
78 if (!PyTuple_Check(bases)) {
79 PyErr_SetString(PyExc_SystemError,
80 "PyClass_New: bases must be a tuple");
81 return NULL;
82 }
83 i = PyTuple_Size(bases);
84 while (--i >= 0) {
85 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
86 PyErr_SetString(PyExc_SystemError,
87 "PyClass_New: base must be a class");
88 return NULL;
89 }
90 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000092 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000094 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000097 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000100 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000102 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000103 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000104 getattrstr = PyString_InternFromString("__getattr__");
105 setattrstr = PyString_InternFromString("__setattr__");
106 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000107 }
108 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
109 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
110 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 Py_XINCREF(op->cl_getattr);
112 Py_XINCREF(op->cl_setattr);
113 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000114 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116}
117
118/* Class methods */
119
120static void
121class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000124 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 Py_DECREF(op->cl_bases);
126 Py_DECREF(op->cl_dict);
127 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000128 Py_XDECREF(op->cl_getattr);
129 Py_XDECREF(op->cl_setattr);
130 Py_XDECREF(op->cl_delattr);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000131 op = (PyClassObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000132 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133}
134
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000136class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 PyClassObject *cp;
138 PyObject *name;
139 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000140{
141 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000143 if (value != NULL) {
144 *pclass = cp;
145 return value;
146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000148 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000149 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 PyObject *v = class_lookup(
151 (PyClassObject *)
152 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000153 if (v != NULL)
154 return v;
155 }
156 return NULL;
157}
158
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 register PyClassObject *op;
162 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 register PyObject *v;
165 register char *sname = PyString_AsString(name);
166 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000167 if (sname[0] == '_' && sname[1] == '_') {
168 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 if (PyEval_GetRestricted()) {
170 PyErr_SetString(PyExc_RuntimeError,
171 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000172 return NULL;
173 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000175 return op->cl_dict;
176 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000177 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000179 return op->cl_bases;
180 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000181 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000182 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000184 else
185 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000187 return v;
188 }
Guido van Rossum94308391991-10-20 20:11:48 +0000189 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000190 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000191 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000193 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000195 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 if (PyFunction_Check(v)) {
197 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
198 (PyObject *)class);
199 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000200 v = w;
201 }
202 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203}
204
Guido van Rossuma63eff61998-05-29 21:37:21 +0000205static void
206set_slot(slot, v)
207 PyObject **slot;
208 PyObject *v;
209{
210 PyObject *temp = *slot;
211 Py_XINCREF(v);
212 *slot = v;
213 Py_XDECREF(temp);
214}
215
Guido van Rossum7ba30431998-07-08 13:34:48 +0000216static void
217set_attr_slots(c)
218 PyClassObject *c;
219{
220 PyClassObject *dummy;
221
222 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
223 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
224 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
225}
226
Guido van Rossuma63eff61998-05-29 21:37:21 +0000227static char *
228set_dict(c, v)
229 PyClassObject *c;
230 PyObject *v;
231{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000232 if (v == NULL || !PyDict_Check(v))
233 return "__dict__ must be a dictionary object";
234 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000235 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000236 return "";
237}
238
239static char *
240set_bases(c, v)
241 PyClassObject *c;
242 PyObject *v;
243{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000244 int i, n;
245
246 if (v == NULL || !PyTuple_Check(v))
247 return "__bases__ must be a tuple object";
248 n = PyTuple_Size(v);
249 for (i = 0; i < n; i++) {
250 PyObject *x = PyTuple_GET_ITEM(v, i);
251 if (!PyClass_Check(x))
252 return "__bases__ items must be classes";
253 if (PyClass_IsSubclass(x, (PyObject *)c))
254 return "a __bases__ item causes an inheritance cycle";
255 }
256 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000257 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000258 return "";
259}
260
261static char *
262set_name(c, v)
263 PyClassObject *c;
264 PyObject *v;
265{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000266 if (v == NULL || !PyString_Check(v))
267 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000268 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000269 return "__name__ must not contain null bytes";
270 set_slot(&c->cl_name, v);
271 return "";
272}
273
Guido van Rossum94308391991-10-20 20:11:48 +0000274static int
275class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 PyClassObject *op;
277 PyObject *name;
278 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000279{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000280 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 if (PyEval_GetRestricted()) {
282 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000283 "classes are read-only in restricted mode");
284 return -1;
285 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000286 sname = PyString_AsString(name);
287 if (sname[0] == '_' && sname[1] == '_') {
288 int n = PyString_Size(name);
289 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000290 char *err = NULL;
291 if (strcmp(sname, "__dict__") == 0)
292 err = set_dict(op, v);
293 else if (strcmp(sname, "__bases__") == 0)
294 err = set_bases(op, v);
295 else if (strcmp(sname, "__name__") == 0)
296 err = set_name(op, v);
297 else if (strcmp(sname, "__getattr__") == 0)
298 set_slot(&op->cl_getattr, v);
299 else if (strcmp(sname, "__setattr__") == 0)
300 set_slot(&op->cl_setattr, v);
301 else if (strcmp(sname, "__delattr__") == 0)
302 set_slot(&op->cl_delattr, v);
303 /* For the last three, we fall through to update the
304 dictionary as well. */
305 if (err != NULL) {
306 if (*err == '\0')
307 return 0;
308 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000309 return -1;
310 }
311 }
312 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000313 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000315 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000317 "delete non-existing class attribute");
318 return rv;
319 }
Guido van Rossum94308391991-10-20 20:11:48 +0000320 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000322}
323
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000325class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000327{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000328 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000329 char buf[140];
330 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000332 name = "?";
333 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000335 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000336 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000337 else
Fred Drakea44d3532000-06-30 15:01:00 +0000338 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000339 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000340 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000342}
343
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000344static PyObject *
345class_str(op)
346 PyClassObject *op;
347{
348 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
349 PyObject *name = op->cl_name;
350 PyObject *res;
351 int m, n;
352
353 if (name == NULL || !PyString_Check(name))
354 return class_repr(op);
355 if (mod == NULL || !PyString_Check(mod)) {
356 Py_INCREF(name);
357 return name;
358 }
359 m = PyString_Size(mod);
360 n = PyString_Size(name);
361 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
362 if (res != NULL) {
363 char *s = PyString_AsString(res);
364 memcpy(s, PyString_AsString(mod), m);
365 s += m;
366 *s++ = '.';
367 memcpy(s, PyString_AsString(name), n);
368 }
369 return res;
370}
371
Jeremy Hylton8caad492000-06-23 14:18:11 +0000372static int
373class_traverse(PyClassObject *o, visitproc visit, void *arg)
374{
375 int err;
376 if (o->cl_bases) {
377 err = visit(o->cl_bases, arg);
378 if (err)
379 return err;
380 }
381 if (o->cl_dict) {
382 err = visit(o->cl_dict, arg);
383 if (err)
384 return err;
385 }
386 if (o->cl_name) {
387 err = visit(o->cl_name, arg);
388 if (err)
389 return err;
390 }
391 if (o->cl_getattr) {
392 err = visit(o->cl_getattr, arg);
393 if (err)
394 return err;
395 }
396 if (o->cl_setattr) {
397 err = visit(o->cl_setattr, arg);
398 if (err)
399 return err;
400 }
401 if (o->cl_delattr) {
402 err = visit(o->cl_delattr, arg);
403 if (err)
404 return err;
405 }
406 return 0;
407}
408
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409PyTypeObject PyClass_Type = {
410 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411 0,
412 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000413 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000415 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000417 0, /*tp_getattr*/
418 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000420 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421 0, /*tp_as_number*/
422 0, /*tp_as_sequence*/
423 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000424 0, /*tp_hash*/
425 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000426 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000427 (getattrofunc)class_getattr, /*tp_getattro*/
428 (setattrofunc)class_setattr, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000429 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000430 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000431 0, /* tp_doc */
432 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433};
434
Guido van Rossum81daa321993-05-20 14:24:46 +0000435int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436PyClass_IsSubclass(class, base)
437 PyObject *class;
438 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000439{
440 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000442 if (class == base)
443 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000445 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 cp = (PyClassObject *)class;
447 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000448 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000450 return 1;
451 }
452 return 0;
453}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454
Guido van Rossum81daa321993-05-20 14:24:46 +0000455
456/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458PyObject *
459PyInstance_New(class, arg, kw)
460 PyObject *class;
461 PyObject *arg;
462 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 register PyInstanceObject *inst;
465 PyObject *init;
466 static PyObject *initstr;
467 if (!PyClass_Check(class)) {
468 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469 return NULL;
470 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000472 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 inst->in_dict = PyDict_New();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000475 PyObject_GC_Init(inst);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000476 if (inst->in_dict == NULL) {
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000477 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumd7823f22000-06-28 23:46:07 +0000478 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479 return NULL;
480 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000481 Py_INCREF(class);
482 inst->in_class = (PyClassObject *)class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000483 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000484 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000485 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000486 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 if ((arg != NULL && (!PyTuple_Check(arg) ||
488 PyTuple_Size(arg) != 0))
489 || (kw != NULL && (!PyDict_Check(kw) ||
490 PyDict_Size(kw) != 0))) {
491 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000492 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000494 inst = NULL;
495 }
496 }
497 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
499 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000500 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000502 inst = NULL;
503 }
504 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 if (res != Py_None) {
506 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000507 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000509 inst = NULL;
510 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000512 }
513 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515}
516
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000517/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518
519static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000520instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 PyObject *error_type, *error_value, *error_traceback;
524 PyObject *del;
525 static PyObject *delstr;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000526 extern long _Py_RefTotal;
527 PyObject_GC_Fini(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 /* Call the __del__ method if it exists. First temporarily
529 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000530#ifdef Py_TRACE_REFS
531 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000533 _Py_NewReference((PyObject *)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000535#ifdef COUNT_ALLOCS
536 inst->ob_type->tp_alloc--; /* ditto */
537#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000538#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000540#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000542 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000543 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000544 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000546 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyObject *f, *t, *v, *tb;
548 PyErr_Fetch(&t, &v, &tb);
549 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000550 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000552 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 PyFile_WriteObject(t, f, Py_PRINT_RAW);
554 if (v && v != Py_None) {
555 PyFile_WriteString(": ", f);
556 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000557 }
558 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 PyFile_WriteString(" in ", f);
560 PyFile_WriteObject(del, f, 0);
561 PyFile_WriteString(" ignored\n", f);
562 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000563 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000564 Py_XDECREF(t);
565 Py_XDECREF(v);
566 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000567 }
568 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 Py_DECREF(res);
570 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000571 }
572 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000574 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000575 if (--inst->ob_refcnt > 0) {
576#ifdef COUNT_ALLOCS
577 inst->ob_type->tp_free--;
578#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000579 PyObject_GC_Init((PyObject *)inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000580 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000581 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000582#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000583#ifdef COUNT_ALLOCS
584 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
585#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000586 _Py_ForgetReference((PyObject *)inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000587#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000588 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000589#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000590#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 Py_DECREF(inst->in_class);
592 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000593 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000594 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595}
596
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000598instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 register PyInstanceObject *inst;
600 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 register PyObject *v;
603 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000604 if (sname[0] == '_' && sname[1] == '_') {
605 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 if (PyEval_GetRestricted()) {
607 PyErr_SetString(PyExc_RuntimeError,
608 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000609 return NULL;
610 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000612 return inst->in_dict;
613 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000614 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 Py_INCREF(inst->in_class);
616 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000617 }
Guido van Rossum94308391991-10-20 20:11:48 +0000618 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000619 v = instance_getattr2(inst, name);
620 if (v == NULL) {
621 PyErr_Format(PyExc_AttributeError,"'%.50s' instance has no attribute '%.400s'",
622 PyString_AS_STRING(inst->in_class->cl_name), sname);
623 }
624 return v;
625}
626
627static PyObject *
628instance_getattr2(inst, name)
629 register PyInstanceObject *inst;
630 PyObject *name;
631{
632 register PyObject *v;
633 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000634 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000636 if (v == NULL) {
637 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000638 if (v == NULL)
639 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000641 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000642 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 if (PyFunction_Check(v)) {
644 PyObject *w = PyMethod_New(v, (PyObject *)inst,
645 (PyObject *)class);
646 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000647 v = w;
648 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 else if (PyMethod_Check(v)) {
650 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000651 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
653 PyObject *im_func = PyMethod_Function(v);
654 PyObject *w = PyMethod_New(im_func,
655 (PyObject *)inst, im_class);
656 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000657 v = w;
658 }
659 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000660 }
661 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662}
663
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000665instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 register PyInstanceObject *inst;
667 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000668{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000670 res = instance_getattr1(inst, name);
671 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 PyObject *args;
673 PyErr_Clear();
674 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000675 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000676 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 res = PyEval_CallObject(func, args);
678 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000679 }
680 return res;
681}
682
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683static int
Guido van Rossume7737541994-09-05 07:31:41 +0000684instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 PyInstanceObject *inst;
686 PyObject *name;
687 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688{
Guido van Rossum94472a01992-09-04 09:45:18 +0000689 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000691 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000693 "delete non-existing instance attribute");
694 return rv;
695 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000696 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698}
699
Guido van Rossume7737541994-09-05 07:31:41 +0000700static int
701instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702 PyInstanceObject *inst;
703 PyObject *name;
704 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000705{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000706 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000708 if (sname[0] == '_' && sname[1] == '_') {
709 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000710 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000711 if (strcmp(sname, "__dict__") == 0) {
712 if (PyEval_GetRestricted()) {
713 PyErr_SetString(PyExc_RuntimeError,
714 "__dict__ not accessible in restricted mode");
715 return -1;
716 }
717 if (v == NULL || !PyDict_Check(v)) {
718 PyErr_SetString(PyExc_TypeError,
719 "__dict__ must be set to a dictionary");
720 return -1;
721 }
722 tmp = inst->in_dict;
723 Py_INCREF(v);
724 inst->in_dict = v;
725 Py_DECREF(tmp);
726 return 0;
727 }
728 if (strcmp(sname, "__class__") == 0) {
729 if (PyEval_GetRestricted()) {
730 PyErr_SetString(PyExc_RuntimeError,
731 "__class__ not accessible in restricted mode");
732 return -1;
733 }
734 if (v == NULL || !PyClass_Check(v)) {
735 PyErr_SetString(PyExc_TypeError,
736 "__class__ must be set to a class");
737 return -1;
738 }
739 tmp = (PyObject *)(inst->in_class);
740 Py_INCREF(v);
741 inst->in_class = (PyClassObject *)v;
742 Py_DECREF(tmp);
743 return 0;
744 }
Guido van Rossume7737541994-09-05 07:31:41 +0000745 }
Guido van Rossume7737541994-09-05 07:31:41 +0000746 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000747 if (v == NULL)
748 func = inst->in_class->cl_delattr;
749 else
750 func = inst->in_class->cl_setattr;
751 if (func == NULL)
752 return instance_setattr1(inst, name, v);
753 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000755 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000757 if (args == NULL)
758 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 res = PyEval_CallObject(func, args);
760 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000761 if (res == NULL)
762 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000764 return 0;
765}
766
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000770{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 PyObject *func;
772 PyObject *res;
773 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000774
Guido van Rossum2878a691996-08-09 20:53:24 +0000775 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000776 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000777 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000778 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000779 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000781 PyObject *mod = PyDict_GetItemString(
782 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000783 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 if (classname != NULL && PyString_Check(classname))
785 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000786 else
787 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000789 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000790 sprintf(buf, "<?.%.100s instance at %p>",
791 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000792 else
Fred Drakea44d3532000-06-30 15:01:00 +0000793 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000794 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000795 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 res = PyEval_CallObject(func, (PyObject *)NULL);
799 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 return res;
801}
802
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000804instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000806{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000808 instance_compare1);
809}
810
Guido van Rossum9bfef441993-03-29 10:43:31 +0000811static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000812instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000814{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000816 long outcome;
817 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000818 if (result == NULL)
819 return -1;
820 if (!PyInt_Check(result)) {
821 Py_DECREF(result);
822 PyErr_SetString(PyExc_TypeError,
823 "comparison did not return an int");
824 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000825 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 outcome = PyInt_AsLong(result);
827 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000828 if (outcome < 0)
829 return -1;
830 else if (outcome > 0)
831 return 1;
832 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000833}
834
Guido van Rossum9bfef441993-03-29 10:43:31 +0000835static long
836instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000838{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 PyObject *func;
840 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000841 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000843
Guido van Rossum2878a691996-08-09 20:53:24 +0000844 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000845 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000846 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000847 if (func == NULL) {
848 /* If there is no __cmp__ method, we hash on the address.
849 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000851 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000852 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000853 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000854 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 PyErr_Clear();
Fred Drake13634cf2000-06-29 19:17:04 +0000856 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000857 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000859 return -1;
860 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 res = PyEval_CallObject(func, (PyObject *)NULL);
862 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000863 if (res == NULL)
864 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 if (PyInt_Check(res)) {
866 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000867 if (outcome == -1)
868 outcome = -2;
869 }
870 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 PyErr_SetString(PyExc_TypeError,
872 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873 outcome = -1;
874 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000876 return outcome;
877}
878
Jeremy Hylton8caad492000-06-23 14:18:11 +0000879static int
880instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
881{
882 int err;
883 if (o->in_class) {
884 err = visit((PyObject *)(o->in_class), arg);
885 if (err)
886 return err;
887 }
888 if (o->in_dict) {
889 err = visit(o->in_dict, arg);
890 if (err)
891 return err;
892 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000893 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000894}
895
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000897
Guido van Rossum9bfef441993-03-29 10:43:31 +0000898static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000899instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 PyObject *func;
903 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000904 int outcome;
905
Guido van Rossum2878a691996-08-09 20:53:24 +0000906 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000907 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000908 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000909 if (func == NULL)
910 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 res = PyEval_CallObject(func, (PyObject *)NULL);
912 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000913 if (res == NULL)
914 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 if (PyInt_Check(res)) {
916 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 PyErr_SetString(PyExc_ValueError,
919 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 }
921 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 PyErr_SetString(PyExc_TypeError,
923 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924 outcome = -1;
925 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927 return outcome;
928}
929
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyInstanceObject *inst;
933 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 PyObject *func;
936 PyObject *arg;
937 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938
Guido van Rossum2878a691996-08-09 20:53:24 +0000939 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000940 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000941 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942 if (func == NULL)
943 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000947 return NULL;
948 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 res = PyEval_CallObject(func, arg);
950 Py_DECREF(func);
951 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952 return res;
953}
954
Guido van Rossum9bfef441993-03-29 10:43:31 +0000955static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000956instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 PyInstanceObject*inst;
958 PyObject *key;
959 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000960{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyObject *func;
962 PyObject *arg;
963 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964
Guido van Rossum2878a691996-08-09 20:53:24 +0000965 if (value == NULL) {
966 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000967 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000968 func = instance_getattr(inst, delitemstr);
969 }
970 else {
971 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000972 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000973 func = instance_getattr(inst, setitemstr);
974 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000975 if (func == NULL)
976 return -1;
977 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000979 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000983 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000984 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 res = PyEval_CallObject(func, arg);
986 Py_DECREF(func);
987 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 if (res == NULL)
989 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000991 return 0;
992}
993
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000995 (inquiry)instance_length, /*mp_length*/
996 (binaryfunc)instance_subscript, /*mp_subscript*/
997 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998};
999
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001001instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003 int i;
1004{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006
Guido van Rossum2878a691996-08-09 20:53:24 +00001007 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001008 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001009 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010 if (func == NULL)
1011 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015 return NULL;
1016 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 res = PyEval_CallObject(func, arg);
1018 Py_DECREF(func);
1019 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 return res;
1021}
1022
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026 int i, j;
1027{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 PyObject *func, *arg, *res;
1029 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030
Guido van Rossum2878a691996-08-09 20:53:24 +00001031 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001032 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001033 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 if (func == NULL)
1035 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001037 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001039 return NULL;
1040 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 res = PyEval_CallObject(func, arg);
1042 Py_DECREF(func);
1043 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044 return res;
1045}
1046
1047static int
1048instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054
Guido van Rossum2878a691996-08-09 20:53:24 +00001055 if (item == NULL) {
1056 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001057 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001058 func = instance_getattr(inst, delitemstr);
1059 }
1060 else {
1061 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001062 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001063 func = instance_getattr(inst, setitemstr);
1064 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001065 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001066 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001067 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001068 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001069 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001071 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001073 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 res = PyEval_CallObject(func, arg);
1076 Py_DECREF(func);
1077 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078 if (res == NULL)
1079 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001081 return 0;
1082}
1083
1084static int
1085instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001087 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 PyObject *func, *arg, *res;
1091 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092
Guido van Rossum2878a691996-08-09 20:53:24 +00001093 if (value == NULL) {
1094 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095 delslicestr =
1096 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001097 func = instance_getattr(inst, delslicestr);
1098 }
1099 else {
1100 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 setslicestr =
1102 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001103 func = instance_getattr(inst, setslicestr);
1104 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001106 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001107 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001109 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001113 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 res = PyEval_CallObject(func, arg);
1116 Py_DECREF(func);
1117 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118 if (res == NULL)
1119 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001121 return 0;
1122}
1123
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001124static int instance_contains(PyInstanceObject *inst, PyObject *member)
1125{
1126 static PyObject *__contains__;
1127 PyObject *func, *arg, *res;
1128 int ret;
1129
1130 if(__contains__ == NULL) {
1131 __contains__ = PyString_InternFromString("__contains__");
1132 if(__contains__ == NULL)
1133 return -1;
1134 }
1135 func = instance_getattr(inst, __contains__);
1136 if(func == NULL) {
1137 /* fall back to previous behaviour */
1138 int i, cmp_res;
1139
1140 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1141 return -1;
1142 PyErr_Clear();
1143 for(i=0;;i++) {
1144 PyObject *obj = instance_item(inst, i);
1145 int ret = 0;
1146
1147 if(obj == NULL) {
1148 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1149 return -1;
1150 PyErr_Clear();
1151 return 0;
1152 }
1153 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1154 ret = -1;
1155 if(cmp_res == 0)
1156 ret = 1;
1157 Py_DECREF(obj);
1158 if(ret)
1159 return ret;
1160 }
1161 }
1162 arg = Py_BuildValue("(O)", member);
1163 if(arg == NULL) {
1164 Py_DECREF(func);
1165 return -1;
1166 }
1167 res = PyEval_CallObject(func, arg);
1168 Py_DECREF(func);
1169 Py_DECREF(arg);
1170 if(res == NULL)
1171 return -1;
1172 ret = PyObject_IsTrue(res);
1173 Py_DECREF(res);
1174 return ret;
1175}
1176
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001178 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001179 0, /*sq_concat*/
1180 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001181 (intargfunc)instance_item, /*sq_item*/
1182 (intintargfunc)instance_slice, /*sq_slice*/
1183 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1184 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001185 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186};
1187
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001189generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 PyInstanceObject *self;
1191 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001192{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001194
1195 if ((func = instance_getattr(self, methodname)) == NULL)
1196 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 res = PyEval_CallObject(func, (PyObject *)NULL);
1198 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001199 return res;
1200}
1201
Guido van Rossum03093a21994-09-28 15:51:32 +00001202
1203/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1205 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001206
1207
1208/* Implement a binary operator involving at least one class instance. */
1209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210PyObject *
1211PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1212 PyObject *v;
1213 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001214 char *opname;
1215 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001217{
1218 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001220 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001221 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001222 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001223 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001224 /* Sigh -- special case for comnparisons */
1225 if (strcmp(opname, "__cmp__") == 0) {
1226 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1227 return PyInt_FromLong(c);
1228 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001229 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001231 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001232}
1233
Guido van Rossum03093a21994-09-28 15:51:32 +00001234
1235/* Try one half of a binary operator involving a class instance.
1236 Return value:
1237 -1 if an exception is to be reported right away
1238 0 if we have a valid result
1239 1 if we could try another operation
1240*/
1241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001243
Guido van Rossum03093a21994-09-28 15:51:32 +00001244static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001245halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 PyObject *v;
1247 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001248 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 PyObject **r_result;
1250 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001251 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001252{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 PyObject *func;
1254 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001255 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 PyObject *coerced = NULL;
1257 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001258
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001260 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001261 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001262 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001263 if (coerce_obj == NULL)
1264 return -1;
1265 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001266 coercefunc = PyObject_GetAttr(v, coerce_obj);
1267 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001269 }
1270 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001272 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001273 return -1;
1274 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001275 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001276 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001277 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001278 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001279 return -1;
1280 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 if (coerced == Py_None) {
1282 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001283 return 1;
1284 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1286 Py_DECREF(coerced);
1287 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001288 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001289 return -1;
1290 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 v1 = PyTuple_GetItem(coerced, 0);
1292 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001293 if (v1 != v) {
1294 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001296 if (swapped)
1297 *r_result = (*thisfunc)(w, v);
1298 else
1299 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001301 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001302 }
1303 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001304 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001306 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001308 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001309 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001311 return 1;
1312 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001314 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 Py_DECREF(func);
1316 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001317 return -1;
1318 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 *r_result = PyEval_CallObject(func, args);
1320 Py_DECREF(args);
1321 Py_DECREF(func);
1322 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001323 return *r_result == NULL ? -1 : 0;
1324}
1325
Guido van Rossum879c5811995-01-10 15:24:06 +00001326static int
1327instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 PyObject **pv;
1329 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001330{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 PyObject *v = *pv;
1332 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001333 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 PyObject *args;
1335 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001336
Guido van Rossum2878a691996-08-09 20:53:24 +00001337 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001338 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001339 if (coerce_obj == NULL)
1340 return -1;
1341 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001342 coercefunc = PyObject_GetAttr(v, coerce_obj);
1343 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001344 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 PyErr_Clear();
1346 Py_INCREF(v);
1347 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001348 return 0;
1349 }
1350 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001352 if (args == NULL) {
1353 return -1;
1354 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001355 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001357 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001358 if (coerced == NULL) {
1359 /* __coerce__ call raised an exception */
1360 return -1;
1361 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001363 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001365 return 1;
1366 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001368 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 Py_DECREF(coerced);
1370 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001371 "coercion should return None or 2-tuple");
1372 return -1;
1373 }
1374 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 *pv = PyTuple_GetItem(coerced, 0);
1376 *pw = PyTuple_GetItem(coerced, 1);
1377 Py_INCREF(*pv);
1378 Py_INCREF(*pw);
1379 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001380 return 0;
1381}
1382
Guido van Rossum03093a21994-09-28 15:51:32 +00001383
Guido van Rossum04691fc1992-08-12 15:35:34 +00001384#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385static PyObject *funcname(self) PyInstanceObject *self; { \
1386 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001387 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001388 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001389}
1390
Guido van Rossum04691fc1992-08-12 15:35:34 +00001391UNARY(instance_neg, "__neg__")
1392UNARY(instance_pos, "__pos__")
1393UNARY(instance_abs, "__abs__")
1394
Guido van Rossum9bfef441993-03-29 10:43:31 +00001395static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001396instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001398{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001400 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001402
Guido van Rossum2878a691996-08-09 20:53:24 +00001403 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001404 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001405 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001407 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001408 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001409 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001411 /* Fall back to the default behavior:
1412 all instances are nonzero */
1413 return 1;
1414 }
1415 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001416 res = PyEval_CallObject(func, (PyObject *)NULL);
1417 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001418 if (res == NULL)
1419 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 if (!PyInt_Check(res)) {
1421 Py_DECREF(res);
1422 PyErr_SetString(PyExc_TypeError,
1423 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001424 return -1;
1425 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 outcome = PyInt_AsLong(res);
1427 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001428 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001429 PyErr_SetString(PyExc_ValueError,
1430 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001431 return -1;
1432 }
1433 return outcome > 0;
1434}
1435
1436UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001437UNARY(instance_int, "__int__")
1438UNARY(instance_long, "__long__")
1439UNARY(instance_float, "__float__")
1440UNARY(instance_oct, "__oct__")
1441UNARY(instance_hex, "__hex__")
1442
Guido van Rossum03093a21994-09-28 15:51:32 +00001443/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001445instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 PyObject *v;
1447 PyObject *w;
1448 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001449{
1450 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 PyObject *func;
1452 PyObject *args;
1453 PyObject *result;
1454 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001455
1456 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001457 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001459 if (func == NULL)
1460 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001462 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001464 return NULL;
1465 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 result = PyEval_CallObject(func, args);
1467 Py_DECREF(func);
1468 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001469 return result;
1470}
1471
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001473 0, /*nb_add*/
1474 0, /*nb_subtract*/
1475 0, /*nb_multiply*/
1476 0, /*nb_divide*/
1477 0, /*nb_remainder*/
1478 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001479 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001480 (unaryfunc)instance_neg, /*nb_negative*/
1481 (unaryfunc)instance_pos, /*nb_positive*/
1482 (unaryfunc)instance_abs, /*nb_absolute*/
1483 (inquiry)instance_nonzero, /*nb_nonzero*/
1484 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001485 0, /*nb_lshift*/
1486 0, /*nb_rshift*/
1487 0, /*nb_and*/
1488 0, /*nb_xor*/
1489 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001490 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001491 (unaryfunc)instance_int, /*nb_int*/
1492 (unaryfunc)instance_long, /*nb_long*/
1493 (unaryfunc)instance_float, /*nb_float*/
1494 (unaryfunc)instance_oct, /*nb_oct*/
1495 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001496};
1497
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498PyTypeObject PyInstance_Type = {
1499 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001500 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001501 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001502 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001503 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001504 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001505 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001506 0, /*tp_getattr*/
1507 0, /*tp_setattr*/
1508 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001509 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001510 &instance_as_number, /*tp_as_number*/
1511 &instance_as_sequence, /*tp_as_sequence*/
1512 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001513 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001514 0, /*tp_call*/
1515 0, /*tp_str*/
1516 (getattrofunc)instance_getattr, /*tp_getattro*/
1517 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001518 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001519 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001520 0, /* tp_doc */
1521 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001522};
1523
1524
Guido van Rossum81daa321993-05-20 14:24:46 +00001525/* Instance method objects are used for two purposes:
1526 (a) as bound instance methods (returned by instancename.methodname)
1527 (b) as unbound methods (returned by ClassName.methodname)
1528 In case (b), im_self is NULL
1529*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001530
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001531static PyMethodObject *free_list;
1532
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001533PyObject *
1534PyMethod_New(func, self, class)
1535 PyObject *func;
1536 PyObject *self;
1537 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001538{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001539 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001540 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001542 return NULL;
1543 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001544 im = free_list;
1545 if (im != NULL) {
1546 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001547 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001548 }
1549 else {
1550 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1551 if (im == NULL)
1552 return NULL;
1553 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001555 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001557 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001559 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001560 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001561 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001562}
1563
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001564PyObject *
1565PyMethod_Function(im)
1566 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001567{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 if (!PyMethod_Check(im)) {
1569 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001570 return NULL;
1571 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001573}
1574
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575PyObject *
1576PyMethod_Self(im)
1577 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001578{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 if (!PyMethod_Check(im)) {
1580 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001581 return NULL;
1582 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001584}
1585
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586PyObject *
1587PyMethod_Class(im)
1588 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001589{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 if (!PyMethod_Check(im)) {
1591 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001592 return NULL;
1593 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001595}
1596
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001597/* Class method methods */
1598
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600
Guido van Rossume8122f11991-05-05 20:03:07 +00001601static struct memberlist instancemethod_memberlist[] = {
1602 {"im_func", T_OBJECT, OFF(im_func)},
1603 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001604 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001605 /* Dummies that are not handled by getattr() except for __members__ */
1606 {"__doc__", T_INT, 0},
1607 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001608 {NULL} /* Sentinel */
1609};
1610
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001611static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001612instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001613 register PyMethodObject *im;
1614 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001615{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001616 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001617 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001618 /* Inherit __name__ and __doc__ from the callable object
1619 implementing the method */
1620 if (strcmp(sname, "__name__") == 0 ||
1621 strcmp(sname, "__doc__") == 0)
1622 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001623 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624 if (PyEval_GetRestricted()) {
1625 PyErr_SetString(PyExc_RuntimeError,
1626 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001627 return NULL;
1628 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630}
1631
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001632static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001633instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001635{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001636 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 Py_DECREF(im->im_func);
1638 Py_XDECREF(im->im_self);
1639 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001640 im->im_self = (PyObject *)free_list;
1641 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001642}
1643
Guido van Rossumebc8c511992-09-03 20:39:51 +00001644static int
1645instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001647{
Guido van Rossume9df7271995-04-06 14:46:51 +00001648 if (a->im_self != b->im_self)
1649 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001651}
1652
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001653static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001654instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001656{
1657 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001659 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001660 PyClassObject *class = (PyClassObject *)(a->im_class);
1661 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001662 char *fcname, *icname, *fname;
1663 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001664 if (PyFunction_Check(func)) {
1665 funcname = ((PyFunctionObject *)func)->func_name;
1666 Py_INCREF(funcname);
1667 }
1668 else {
1669 funcname = PyObject_GetAttrString(func,"__name__");
1670 if (funcname == NULL)
1671 PyErr_Clear();
1672 }
1673 if (funcname != NULL && PyString_Check(funcname))
1674 fname = PyString_AS_STRING(funcname);
1675 else
1676 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677 if (fclassname != NULL && PyString_Check(fclassname))
1678 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001679 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001680 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001681 if (self == NULL)
1682 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1683 else {
1684 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685 if (iclassname != NULL && PyString_Check(iclassname))
1686 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001687 else
1688 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001689 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1690 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001691 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001692 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001693 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001694}
1695
Guido van Rossum9bfef441993-03-29 10:43:31 +00001696static long
1697instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001698 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001699{
1700 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001701 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001703 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001705 if (x == -1)
1706 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001707 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001708 if (y == -1)
1709 return -1;
1710 return x ^ y;
1711}
1712
Jeremy Hylton8caad492000-06-23 14:18:11 +00001713static int
1714instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1715{
1716 int err;
1717 if (im->im_func) {
1718 err = visit(im->im_func, arg);
1719 if (err)
1720 return err;
1721 }
1722 if (im->im_self) {
1723 err = visit(im->im_self, arg);
1724 if (err)
1725 return err;
1726 }
1727 if (im->im_class) {
1728 err = visit(im->im_class, arg);
1729 if (err)
1730 return err;
1731 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001732 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001733}
1734
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001735PyTypeObject PyMethod_Type = {
1736 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001737 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001738 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001739 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001740 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001741 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001742 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001743 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001744 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001745 (cmpfunc)instancemethod_compare, /*tp_compare*/
1746 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001747 0, /*tp_as_number*/
1748 0, /*tp_as_sequence*/
1749 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001750 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001751 0, /*tp_call*/
1752 0, /*tp_str*/
1753 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1754 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001755 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001756 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001757 0, /* tp_doc */
1758 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001759};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001760
1761/* Clear out the free list */
1762
1763void
1764PyMethod_Fini()
1765{
1766 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001767 PyMethodObject *im = free_list;
1768 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00001769 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001770 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001771 }
1772}