blob: f1dabfef5bf28587065ce85a83e0c36b0ed9b060 [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 Rossumad89bbc2000-06-28 21:57:18 +0000286 if (strlen(PyString_AS_STRING(v)) != (size_t)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 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000493 if (inst->in_dict == NULL) {
Guido van Rossumd7823f22000-06-28 23:46:07 +0000494 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495 return NULL;
496 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000497 Py_INCREF(class);
498 inst->in_class = (PyClassObject *)class;
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();
Fred Drake13634cf2000-06-29 19:17:04 +0000867 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000868 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000870 return -1;
871 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 res = PyEval_CallObject(func, (PyObject *)NULL);
873 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000874 if (res == NULL)
875 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 if (PyInt_Check(res)) {
877 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000878 if (outcome == -1)
879 outcome = -2;
880 }
881 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 PyErr_SetString(PyExc_TypeError,
883 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000884 outcome = -1;
885 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000887 return outcome;
888}
889
Jeremy Hylton8caad492000-06-23 14:18:11 +0000890static int
891instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
892{
893 int err;
894 if (o->in_class) {
895 err = visit((PyObject *)(o->in_class), arg);
896 if (err)
897 return err;
898 }
899 if (o->in_dict) {
900 err = visit(o->in_dict, arg);
901 if (err)
902 return err;
903 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000904 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000905}
906
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000908
Guido van Rossum9bfef441993-03-29 10:43:31 +0000909static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000912{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 PyObject *func;
914 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915 int outcome;
916
Guido van Rossum2878a691996-08-09 20:53:24 +0000917 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000918 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000919 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 if (func == NULL)
921 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 res = PyEval_CallObject(func, (PyObject *)NULL);
923 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000924 if (res == NULL)
925 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 if (PyInt_Check(res)) {
927 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 PyErr_SetString(PyExc_ValueError,
930 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931 }
932 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 PyErr_SetString(PyExc_TypeError,
934 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 outcome = -1;
936 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938 return outcome;
939}
940
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 PyInstanceObject *inst;
944 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyObject *func;
947 PyObject *arg;
948 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000949
Guido van Rossum2878a691996-08-09 20:53:24 +0000950 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000951 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000952 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000953 if (func == NULL)
954 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000956 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000958 return NULL;
959 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 res = PyEval_CallObject(func, arg);
961 Py_DECREF(func);
962 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000963 return res;
964}
965
Guido van Rossum9bfef441993-03-29 10:43:31 +0000966static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 PyInstanceObject*inst;
969 PyObject *key;
970 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 PyObject *func;
973 PyObject *arg;
974 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000975
Guido van Rossum2878a691996-08-09 20:53:24 +0000976 if (value == NULL) {
977 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000978 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000979 func = instance_getattr(inst, delitemstr);
980 }
981 else {
982 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000983 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000984 func = instance_getattr(inst, setitemstr);
985 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986 if (func == NULL)
987 return -1;
988 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000992 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000994 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 res = PyEval_CallObject(func, arg);
997 Py_DECREF(func);
998 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000999 if (res == NULL)
1000 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001002 return 0;
1003}
1004
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001006 (inquiry)instance_length, /*mp_length*/
1007 (binaryfunc)instance_subscript, /*mp_subscript*/
1008 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009};
1010
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001014 int i;
1015{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017
Guido van Rossum2878a691996-08-09 20:53:24 +00001018 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001019 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001020 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021 if (func == NULL)
1022 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026 return NULL;
1027 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 res = PyEval_CallObject(func, arg);
1029 Py_DECREF(func);
1030 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031 return res;
1032}
1033
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001037 int i, j;
1038{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 PyObject *func, *arg, *res;
1040 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001041
Guido van Rossum2878a691996-08-09 20:53:24 +00001042 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001043 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001044 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001045 if (func == NULL)
1046 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 return NULL;
1051 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 res = PyEval_CallObject(func, arg);
1053 Py_DECREF(func);
1054 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 return res;
1056}
1057
1058static int
1059instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001061 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001065
Guido van Rossum2878a691996-08-09 20:53:24 +00001066 if (item == NULL) {
1067 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001068 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001069 func = instance_getattr(inst, delitemstr);
1070 }
1071 else {
1072 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001073 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001074 func = instance_getattr(inst, setitemstr);
1075 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001077 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001082 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001084 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001085 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 res = PyEval_CallObject(func, arg);
1087 Py_DECREF(func);
1088 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 if (res == NULL)
1090 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092 return 0;
1093}
1094
1095static int
1096instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001100{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 PyObject *func, *arg, *res;
1102 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001103
Guido van Rossum2878a691996-08-09 20:53:24 +00001104 if (value == NULL) {
1105 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 delslicestr =
1107 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001108 func = instance_getattr(inst, delslicestr);
1109 }
1110 else {
1111 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 setslicestr =
1113 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001114 func = instance_getattr(inst, setslicestr);
1115 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001116 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001117 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001119 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001124 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126 res = PyEval_CallObject(func, arg);
1127 Py_DECREF(func);
1128 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001129 if (res == NULL)
1130 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001132 return 0;
1133}
1134
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001135static int instance_contains(PyInstanceObject *inst, PyObject *member)
1136{
1137 static PyObject *__contains__;
1138 PyObject *func, *arg, *res;
1139 int ret;
1140
1141 if(__contains__ == NULL) {
1142 __contains__ = PyString_InternFromString("__contains__");
1143 if(__contains__ == NULL)
1144 return -1;
1145 }
1146 func = instance_getattr(inst, __contains__);
1147 if(func == NULL) {
1148 /* fall back to previous behaviour */
1149 int i, cmp_res;
1150
1151 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1152 return -1;
1153 PyErr_Clear();
1154 for(i=0;;i++) {
1155 PyObject *obj = instance_item(inst, i);
1156 int ret = 0;
1157
1158 if(obj == NULL) {
1159 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1160 return -1;
1161 PyErr_Clear();
1162 return 0;
1163 }
1164 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1165 ret = -1;
1166 if(cmp_res == 0)
1167 ret = 1;
1168 Py_DECREF(obj);
1169 if(ret)
1170 return ret;
1171 }
1172 }
1173 arg = Py_BuildValue("(O)", member);
1174 if(arg == NULL) {
1175 Py_DECREF(func);
1176 return -1;
1177 }
1178 res = PyEval_CallObject(func, arg);
1179 Py_DECREF(func);
1180 Py_DECREF(arg);
1181 if(res == NULL)
1182 return -1;
1183 ret = PyObject_IsTrue(res);
1184 Py_DECREF(res);
1185 return ret;
1186}
1187
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001189 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001190 0, /*sq_concat*/
1191 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001192 (intargfunc)instance_item, /*sq_item*/
1193 (intintargfunc)instance_slice, /*sq_slice*/
1194 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1195 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001196 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001197};
1198
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001199static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001200generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 PyInstanceObject *self;
1202 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001203{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001205
1206 if ((func = instance_getattr(self, methodname)) == NULL)
1207 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 res = PyEval_CallObject(func, (PyObject *)NULL);
1209 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001210 return res;
1211}
1212
Guido van Rossum03093a21994-09-28 15:51:32 +00001213
1214/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1216 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001217
1218
1219/* Implement a binary operator involving at least one class instance. */
1220
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221PyObject *
1222PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1223 PyObject *v;
1224 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001225 char *opname;
1226 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001228{
1229 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001231 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001232 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001233 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001234 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001235 /* Sigh -- special case for comnparisons */
1236 if (strcmp(opname, "__cmp__") == 0) {
1237 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1238 return PyInt_FromLong(c);
1239 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001240 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001242 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001243}
1244
Guido van Rossum03093a21994-09-28 15:51:32 +00001245
1246/* Try one half of a binary operator involving a class instance.
1247 Return value:
1248 -1 if an exception is to be reported right away
1249 0 if we have a valid result
1250 1 if we could try another operation
1251*/
1252
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001254
Guido van Rossum03093a21994-09-28 15:51:32 +00001255static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001256halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 PyObject *v;
1258 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001259 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 PyObject **r_result;
1261 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001262 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001263{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001264 PyObject *func;
1265 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001266 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 PyObject *coerced = NULL;
1268 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001269
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001271 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001272 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001273 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001274 if (coerce_obj == NULL)
1275 return -1;
1276 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001277 coercefunc = PyObject_GetAttr(v, coerce_obj);
1278 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001279 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001280 }
1281 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001283 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001284 return -1;
1285 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001286 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001288 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001289 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001290 return -1;
1291 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 if (coerced == Py_None) {
1293 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001294 return 1;
1295 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1297 Py_DECREF(coerced);
1298 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001299 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001300 return -1;
1301 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 v1 = PyTuple_GetItem(coerced, 0);
1303 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001304 if (v1 != v) {
1305 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001307 if (swapped)
1308 *r_result = (*thisfunc)(w, v);
1309 else
1310 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001312 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001313 }
1314 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001315 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001317 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001319 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001320 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001322 return 1;
1323 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001325 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 Py_DECREF(func);
1327 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001328 return -1;
1329 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 *r_result = PyEval_CallObject(func, args);
1331 Py_DECREF(args);
1332 Py_DECREF(func);
1333 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001334 return *r_result == NULL ? -1 : 0;
1335}
1336
Guido van Rossum879c5811995-01-10 15:24:06 +00001337static int
1338instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 PyObject **pv;
1340 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001341{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 PyObject *v = *pv;
1343 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001344 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 PyObject *args;
1346 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001347
Guido van Rossum2878a691996-08-09 20:53:24 +00001348 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001349 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001350 if (coerce_obj == NULL)
1351 return -1;
1352 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001353 coercefunc = PyObject_GetAttr(v, coerce_obj);
1354 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001355 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 PyErr_Clear();
1357 Py_INCREF(v);
1358 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001359 return 0;
1360 }
1361 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001363 if (args == NULL) {
1364 return -1;
1365 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001366 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001368 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001369 if (coerced == NULL) {
1370 /* __coerce__ call raised an exception */
1371 return -1;
1372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001374 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001376 return 1;
1377 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001379 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 Py_DECREF(coerced);
1381 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001382 "coercion should return None or 2-tuple");
1383 return -1;
1384 }
1385 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 *pv = PyTuple_GetItem(coerced, 0);
1387 *pw = PyTuple_GetItem(coerced, 1);
1388 Py_INCREF(*pv);
1389 Py_INCREF(*pw);
1390 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001391 return 0;
1392}
1393
Guido van Rossum03093a21994-09-28 15:51:32 +00001394
Guido van Rossum04691fc1992-08-12 15:35:34 +00001395#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396static PyObject *funcname(self) PyInstanceObject *self; { \
1397 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001398 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001399 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001400}
1401
Guido van Rossum04691fc1992-08-12 15:35:34 +00001402UNARY(instance_neg, "__neg__")
1403UNARY(instance_pos, "__pos__")
1404UNARY(instance_abs, "__abs__")
1405
Guido van Rossum9bfef441993-03-29 10:43:31 +00001406static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001407instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001409{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001411 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001413
Guido van Rossum2878a691996-08-09 20:53:24 +00001414 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001415 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001416 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001418 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001419 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001420 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001422 /* Fall back to the default behavior:
1423 all instances are nonzero */
1424 return 1;
1425 }
1426 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 res = PyEval_CallObject(func, (PyObject *)NULL);
1428 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001429 if (res == NULL)
1430 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 if (!PyInt_Check(res)) {
1432 Py_DECREF(res);
1433 PyErr_SetString(PyExc_TypeError,
1434 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001435 return -1;
1436 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 outcome = PyInt_AsLong(res);
1438 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001439 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 PyErr_SetString(PyExc_ValueError,
1441 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001442 return -1;
1443 }
1444 return outcome > 0;
1445}
1446
1447UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001448UNARY(instance_int, "__int__")
1449UNARY(instance_long, "__long__")
1450UNARY(instance_float, "__float__")
1451UNARY(instance_oct, "__oct__")
1452UNARY(instance_hex, "__hex__")
1453
Guido van Rossum03093a21994-09-28 15:51:32 +00001454/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001456instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457 PyObject *v;
1458 PyObject *w;
1459 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001460{
1461 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462 PyObject *func;
1463 PyObject *args;
1464 PyObject *result;
1465 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001466
1467 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001468 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001470 if (func == NULL)
1471 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001473 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001475 return NULL;
1476 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477 result = PyEval_CallObject(func, args);
1478 Py_DECREF(func);
1479 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001480 return result;
1481}
1482
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001484 0, /*nb_add*/
1485 0, /*nb_subtract*/
1486 0, /*nb_multiply*/
1487 0, /*nb_divide*/
1488 0, /*nb_remainder*/
1489 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001490 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001491 (unaryfunc)instance_neg, /*nb_negative*/
1492 (unaryfunc)instance_pos, /*nb_positive*/
1493 (unaryfunc)instance_abs, /*nb_absolute*/
1494 (inquiry)instance_nonzero, /*nb_nonzero*/
1495 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001496 0, /*nb_lshift*/
1497 0, /*nb_rshift*/
1498 0, /*nb_and*/
1499 0, /*nb_xor*/
1500 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001501 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001502 (unaryfunc)instance_int, /*nb_int*/
1503 (unaryfunc)instance_long, /*nb_long*/
1504 (unaryfunc)instance_float, /*nb_float*/
1505 (unaryfunc)instance_oct, /*nb_oct*/
1506 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001507};
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509PyTypeObject PyInstance_Type = {
1510 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001511 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001512 "instance",
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001513 sizeof(PyInstanceObject) + PyGC_INFO_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001514 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001515 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001516 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001517 0, /*tp_getattr*/
1518 0, /*tp_setattr*/
1519 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001520 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001521 &instance_as_number, /*tp_as_number*/
1522 &instance_as_sequence, /*tp_as_sequence*/
1523 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001524 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001525 0, /*tp_call*/
1526 0, /*tp_str*/
1527 (getattrofunc)instance_getattr, /*tp_getattro*/
1528 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001529 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001530 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001531 0, /* tp_doc */
1532 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001533};
1534
1535
Guido van Rossum81daa321993-05-20 14:24:46 +00001536/* Instance method objects are used for two purposes:
1537 (a) as bound instance methods (returned by instancename.methodname)
1538 (b) as unbound methods (returned by ClassName.methodname)
1539 In case (b), im_self is NULL
1540*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001541
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001542static PyMethodObject *free_list;
1543
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001544PyObject *
1545PyMethod_New(func, self, class)
1546 PyObject *func;
1547 PyObject *self;
1548 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001549{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001550 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001551 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001553 return NULL;
1554 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001555 im = free_list;
1556 if (im != NULL) {
1557 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001558 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001559 }
1560 else {
1561 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1562 if (im == NULL)
1563 return NULL;
1564 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001566 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001567 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001568 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001570 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001572}
1573
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574PyObject *
1575PyMethod_Function(im)
1576 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001577{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 if (!PyMethod_Check(im)) {
1579 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001580 return NULL;
1581 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001583}
1584
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001585PyObject *
1586PyMethod_Self(im)
1587 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001588{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 if (!PyMethod_Check(im)) {
1590 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001591 return NULL;
1592 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001593 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001594}
1595
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596PyObject *
1597PyMethod_Class(im)
1598 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001599{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001600 if (!PyMethod_Check(im)) {
1601 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001602 return NULL;
1603 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001605}
1606
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001607/* Class method methods */
1608
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610
Guido van Rossume8122f11991-05-05 20:03:07 +00001611static struct memberlist instancemethod_memberlist[] = {
1612 {"im_func", T_OBJECT, OFF(im_func)},
1613 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001614 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001615 /* Dummies that are not handled by getattr() except for __members__ */
1616 {"__doc__", T_INT, 0},
1617 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001618 {NULL} /* Sentinel */
1619};
1620
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001622instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623 register PyMethodObject *im;
1624 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001627 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001628 /* Inherit __name__ and __doc__ from the callable object
1629 implementing the method */
1630 if (strcmp(sname, "__name__") == 0 ||
1631 strcmp(sname, "__doc__") == 0)
1632 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001633 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 if (PyEval_GetRestricted()) {
1635 PyErr_SetString(PyExc_RuntimeError,
1636 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001637 return NULL;
1638 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001640}
1641
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001642static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001643instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001645{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646 Py_DECREF(im->im_func);
1647 Py_XDECREF(im->im_self);
1648 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001649 im->im_self = (PyObject *)free_list;
1650 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001651}
1652
Guido van Rossumebc8c511992-09-03 20:39:51 +00001653static int
1654instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001656{
Guido van Rossume9df7271995-04-06 14:46:51 +00001657 if (a->im_self != b->im_self)
1658 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001660}
1661
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001663instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001664 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001665{
1666 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001667 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001668 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669 PyClassObject *class = (PyClassObject *)(a->im_class);
1670 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001671 char *fcname, *icname, *fname;
1672 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001673 if (PyFunction_Check(func)) {
1674 funcname = ((PyFunctionObject *)func)->func_name;
1675 Py_INCREF(funcname);
1676 }
1677 else {
1678 funcname = PyObject_GetAttrString(func,"__name__");
1679 if (funcname == NULL)
1680 PyErr_Clear();
1681 }
1682 if (funcname != NULL && PyString_Check(funcname))
1683 fname = PyString_AS_STRING(funcname);
1684 else
1685 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686 if (fclassname != NULL && PyString_Check(fclassname))
1687 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001688 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001689 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001690 if (self == NULL)
1691 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1692 else {
1693 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001694 if (iclassname != NULL && PyString_Check(iclassname))
1695 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001696 else
1697 icname = "?";
1698 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1699 fcname, fname, icname, (long)self);
1700 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001701 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001703}
1704
Guido van Rossum9bfef441993-03-29 10:43:31 +00001705static long
1706instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001707 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001708{
1709 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001710 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001711 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001712 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001713 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001714 if (x == -1)
1715 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001716 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001717 if (y == -1)
1718 return -1;
1719 return x ^ y;
1720}
1721
Jeremy Hylton8caad492000-06-23 14:18:11 +00001722static int
1723instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1724{
1725 int err;
1726 if (im->im_func) {
1727 err = visit(im->im_func, arg);
1728 if (err)
1729 return err;
1730 }
1731 if (im->im_self) {
1732 err = visit(im->im_self, arg);
1733 if (err)
1734 return err;
1735 }
1736 if (im->im_class) {
1737 err = visit(im->im_class, arg);
1738 if (err)
1739 return err;
1740 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001741 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001742}
1743
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001744PyTypeObject PyMethod_Type = {
1745 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001746 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001747 "instance method",
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001748 sizeof(PyMethodObject) + PyGC_INFO_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001749 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001750 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001751 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001752 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001753 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001754 (cmpfunc)instancemethod_compare, /*tp_compare*/
1755 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001756 0, /*tp_as_number*/
1757 0, /*tp_as_sequence*/
1758 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001759 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001760 0, /*tp_call*/
1761 0, /*tp_str*/
1762 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1763 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001764 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001765 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001766 0, /* tp_doc */
1767 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001768};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001769
1770/* Clear out the free list */
1771
1772void
1773PyMethod_Fini()
1774{
1775 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001776 PyMethodObject *im = free_list;
1777 free_list = (PyMethodObject *)(im->im_self);
1778 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001779 }
1780}