blob: 4a7de7b46cbee00ad5abe773eba2067c08e2f514 [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 Rossumb18618d2000-05-03 23:44:39 +0000131 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000135class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136 PyClassObject *cp;
137 PyObject *name;
138 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000139{
140 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000142 if (value != NULL) {
143 *pclass = cp;
144 return value;
145 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000147 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000148 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 PyObject *v = class_lookup(
150 (PyClassObject *)
151 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000152 if (v != NULL)
153 return v;
154 }
155 return NULL;
156}
157
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 register PyClassObject *op;
161 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 register PyObject *v;
164 register char *sname = PyString_AsString(name);
165 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000166 if (sname[0] == '_' && sname[1] == '_') {
167 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 if (PyEval_GetRestricted()) {
169 PyErr_SetString(PyExc_RuntimeError,
170 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000171 return NULL;
172 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000174 return op->cl_dict;
175 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000176 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000178 return op->cl_bases;
179 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000180 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000181 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000183 else
184 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000186 return v;
187 }
Guido van Rossum94308391991-10-20 20:11:48 +0000188 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000189 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000190 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000192 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000194 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 if (PyFunction_Check(v)) {
196 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
197 (PyObject *)class);
198 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000199 v = w;
200 }
201 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202}
203
Guido van Rossuma63eff61998-05-29 21:37:21 +0000204static void
205set_slot(slot, v)
206 PyObject **slot;
207 PyObject *v;
208{
209 PyObject *temp = *slot;
210 Py_XINCREF(v);
211 *slot = v;
212 Py_XDECREF(temp);
213}
214
Guido van Rossum7ba30431998-07-08 13:34:48 +0000215static void
216set_attr_slots(c)
217 PyClassObject *c;
218{
219 PyClassObject *dummy;
220
221 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
222 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
223 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
224}
225
Guido van Rossuma63eff61998-05-29 21:37:21 +0000226static char *
227set_dict(c, v)
228 PyClassObject *c;
229 PyObject *v;
230{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000231 if (v == NULL || !PyDict_Check(v))
232 return "__dict__ must be a dictionary object";
233 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000234 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000235 return "";
236}
237
238static char *
239set_bases(c, v)
240 PyClassObject *c;
241 PyObject *v;
242{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000243 int i, n;
244
245 if (v == NULL || !PyTuple_Check(v))
246 return "__bases__ must be a tuple object";
247 n = PyTuple_Size(v);
248 for (i = 0; i < n; i++) {
249 PyObject *x = PyTuple_GET_ITEM(v, i);
250 if (!PyClass_Check(x))
251 return "__bases__ items must be classes";
252 if (PyClass_IsSubclass(x, (PyObject *)c))
253 return "a __bases__ item causes an inheritance cycle";
254 }
255 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000256 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000257 return "";
258}
259
260static char *
261set_name(c, v)
262 PyClassObject *c;
263 PyObject *v;
264{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000265 if (v == NULL || !PyString_Check(v))
266 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000267 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000268 return "__name__ must not contain null bytes";
269 set_slot(&c->cl_name, v);
270 return "";
271}
272
Guido van Rossum94308391991-10-20 20:11:48 +0000273static int
274class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 PyClassObject *op;
276 PyObject *name;
277 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000278{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000279 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000280 if (PyEval_GetRestricted()) {
281 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000282 "classes are read-only in restricted mode");
283 return -1;
284 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000285 sname = PyString_AsString(name);
286 if (sname[0] == '_' && sname[1] == '_') {
287 int n = PyString_Size(name);
288 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000289 char *err = NULL;
290 if (strcmp(sname, "__dict__") == 0)
291 err = set_dict(op, v);
292 else if (strcmp(sname, "__bases__") == 0)
293 err = set_bases(op, v);
294 else if (strcmp(sname, "__name__") == 0)
295 err = set_name(op, v);
296 else if (strcmp(sname, "__getattr__") == 0)
297 set_slot(&op->cl_getattr, v);
298 else if (strcmp(sname, "__setattr__") == 0)
299 set_slot(&op->cl_setattr, v);
300 else if (strcmp(sname, "__delattr__") == 0)
301 set_slot(&op->cl_delattr, v);
302 /* For the last three, we fall through to update the
303 dictionary as well. */
304 if (err != NULL) {
305 if (*err == '\0')
306 return 0;
307 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000308 return -1;
309 }
310 }
311 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000312 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000314 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000316 "delete non-existing class attribute");
317 return rv;
318 }
Guido van Rossum94308391991-10-20 20:11:48 +0000319 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000321}
322
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000324class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000326{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000327 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000328 char buf[140];
329 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000331 name = "?";
332 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000334 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000335 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000336 else
Fred Drakea44d3532000-06-30 15:01:00 +0000337 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000338 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000339 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000341}
342
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000343static PyObject *
344class_str(op)
345 PyClassObject *op;
346{
347 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
348 PyObject *name = op->cl_name;
349 PyObject *res;
350 int m, n;
351
352 if (name == NULL || !PyString_Check(name))
353 return class_repr(op);
354 if (mod == NULL || !PyString_Check(mod)) {
355 Py_INCREF(name);
356 return name;
357 }
358 m = PyString_Size(mod);
359 n = PyString_Size(name);
360 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
361 if (res != NULL) {
362 char *s = PyString_AsString(res);
363 memcpy(s, PyString_AsString(mod), m);
364 s += m;
365 *s++ = '.';
366 memcpy(s, PyString_AsString(name), n);
367 }
368 return res;
369}
370
Jeremy Hylton8caad492000-06-23 14:18:11 +0000371static int
372class_traverse(PyClassObject *o, visitproc visit, void *arg)
373{
374 int err;
375 if (o->cl_bases) {
376 err = visit(o->cl_bases, arg);
377 if (err)
378 return err;
379 }
380 if (o->cl_dict) {
381 err = visit(o->cl_dict, arg);
382 if (err)
383 return err;
384 }
385 if (o->cl_name) {
386 err = visit(o->cl_name, arg);
387 if (err)
388 return err;
389 }
390 if (o->cl_getattr) {
391 err = visit(o->cl_getattr, arg);
392 if (err)
393 return err;
394 }
395 if (o->cl_setattr) {
396 err = visit(o->cl_setattr, arg);
397 if (err)
398 return err;
399 }
400 if (o->cl_delattr) {
401 err = visit(o->cl_delattr, arg);
402 if (err)
403 return err;
404 }
405 return 0;
406}
407
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408PyTypeObject PyClass_Type = {
409 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410 0,
411 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000412 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000414 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000416 0, /*tp_getattr*/
417 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 0, /*tp_as_number*/
421 0, /*tp_as_sequence*/
422 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000423 0, /*tp_hash*/
424 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000425 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000426 (getattrofunc)class_getattr, /*tp_getattro*/
427 (setattrofunc)class_setattr, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000428 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000429 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000430 0, /* tp_doc */
431 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432};
433
Guido van Rossum81daa321993-05-20 14:24:46 +0000434int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435PyClass_IsSubclass(class, base)
436 PyObject *class;
437 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000438{
439 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000441 if (class == base)
442 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000444 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 cp = (PyClassObject *)class;
446 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000447 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000449 return 1;
450 }
451 return 0;
452}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453
Guido van Rossum81daa321993-05-20 14:24:46 +0000454
455/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457PyObject *
458PyInstance_New(class, arg, kw)
459 PyObject *class;
460 PyObject *arg;
461 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 register PyInstanceObject *inst;
464 PyObject *init;
465 static PyObject *initstr;
466 if (!PyClass_Check(class)) {
467 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468 return NULL;
469 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000471 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 inst->in_dict = PyDict_New();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000474 PyObject_GC_Init(inst);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000475 if (inst->in_dict == NULL) {
Guido van Rossumd7823f22000-06-28 23:46:07 +0000476 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477 return NULL;
478 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000479 Py_INCREF(class);
480 inst->in_class = (PyClassObject *)class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000481 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000482 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000483 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000484 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000485 if ((arg != NULL && (!PyTuple_Check(arg) ||
486 PyTuple_Size(arg) != 0))
487 || (kw != NULL && (!PyDict_Check(kw) ||
488 PyDict_Size(kw) != 0))) {
489 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000490 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000492 inst = NULL;
493 }
494 }
495 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
497 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000498 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000500 inst = NULL;
501 }
502 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 if (res != Py_None) {
504 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000505 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000507 inst = NULL;
508 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000510 }
511 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513}
514
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000515/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000516
517static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000518instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyObject *error_type, *error_value, *error_traceback;
522 PyObject *del;
523 static PyObject *delstr;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000524 extern long _Py_RefTotal;
525 PyObject_GC_Fini(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000526 /* Call the __del__ method if it exists. First temporarily
527 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000528#ifdef Py_TRACE_REFS
529 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000531 _Py_NewReference((PyObject *)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000533#ifdef COUNT_ALLOCS
534 inst->ob_type->tp_alloc--; /* ditto */
535#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000536#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000538#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000540 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000541 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000542 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000544 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 PyObject *f, *t, *v, *tb;
546 PyErr_Fetch(&t, &v, &tb);
547 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000548 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000550 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 PyFile_WriteObject(t, f, Py_PRINT_RAW);
552 if (v && v != Py_None) {
553 PyFile_WriteString(": ", f);
554 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000555 }
556 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 PyFile_WriteString(" in ", f);
558 PyFile_WriteObject(del, f, 0);
559 PyFile_WriteString(" ignored\n", f);
560 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000561 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000562 Py_XDECREF(t);
563 Py_XDECREF(v);
564 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000565 }
566 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 Py_DECREF(res);
568 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000569 }
570 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000572 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000573 if (--inst->ob_refcnt > 0) {
574#ifdef COUNT_ALLOCS
575 inst->ob_type->tp_free--;
576#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000577 PyObject_GC_Init((PyObject *)inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000578 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000579 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000580#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000581#ifdef COUNT_ALLOCS
582 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
583#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000584 _Py_ForgetReference((PyObject *)inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000585#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000586 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000587#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000588#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 Py_DECREF(inst->in_class);
590 Py_XDECREF(inst->in_dict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000591 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592}
593
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000595instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 register PyInstanceObject *inst;
597 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000598{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 register PyObject *v;
600 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000601 if (sname[0] == '_' && sname[1] == '_') {
602 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 if (PyEval_GetRestricted()) {
604 PyErr_SetString(PyExc_RuntimeError,
605 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000606 return NULL;
607 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000609 return inst->in_dict;
610 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000611 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 Py_INCREF(inst->in_class);
613 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000614 }
Guido van Rossum94308391991-10-20 20:11:48 +0000615 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000616 v = instance_getattr2(inst, name);
617 if (v == NULL) {
618 PyErr_Format(PyExc_AttributeError,"'%.50s' instance has no attribute '%.400s'",
619 PyString_AS_STRING(inst->in_class->cl_name), sname);
620 }
621 return v;
622}
623
624static PyObject *
625instance_getattr2(inst, name)
626 register PyInstanceObject *inst;
627 PyObject *name;
628{
629 register PyObject *v;
630 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000631 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000633 if (v == NULL) {
634 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000635 if (v == NULL)
636 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000638 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000639 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640 if (PyFunction_Check(v)) {
641 PyObject *w = PyMethod_New(v, (PyObject *)inst,
642 (PyObject *)class);
643 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000644 v = w;
645 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 else if (PyMethod_Check(v)) {
647 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000648 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
650 PyObject *im_func = PyMethod_Function(v);
651 PyObject *w = PyMethod_New(im_func,
652 (PyObject *)inst, im_class);
653 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000654 v = w;
655 }
656 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000657 }
658 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659}
660
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000662instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 register PyInstanceObject *inst;
664 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000665{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000667 res = instance_getattr1(inst, name);
668 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 PyObject *args;
670 PyErr_Clear();
671 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000672 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000673 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 res = PyEval_CallObject(func, args);
675 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000676 }
677 return res;
678}
679
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000680static int
Guido van Rossume7737541994-09-05 07:31:41 +0000681instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 PyInstanceObject *inst;
683 PyObject *name;
684 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000685{
Guido van Rossum94472a01992-09-04 09:45:18 +0000686 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000688 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000690 "delete non-existing instance attribute");
691 return rv;
692 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000693 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000695}
696
Guido van Rossume7737541994-09-05 07:31:41 +0000697static int
698instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 PyInstanceObject *inst;
700 PyObject *name;
701 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000702{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000703 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000705 if (sname[0] == '_' && sname[1] == '_') {
706 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000707 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000708 if (strcmp(sname, "__dict__") == 0) {
709 if (PyEval_GetRestricted()) {
710 PyErr_SetString(PyExc_RuntimeError,
711 "__dict__ not accessible in restricted mode");
712 return -1;
713 }
714 if (v == NULL || !PyDict_Check(v)) {
715 PyErr_SetString(PyExc_TypeError,
716 "__dict__ must be set to a dictionary");
717 return -1;
718 }
719 tmp = inst->in_dict;
720 Py_INCREF(v);
721 inst->in_dict = v;
722 Py_DECREF(tmp);
723 return 0;
724 }
725 if (strcmp(sname, "__class__") == 0) {
726 if (PyEval_GetRestricted()) {
727 PyErr_SetString(PyExc_RuntimeError,
728 "__class__ not accessible in restricted mode");
729 return -1;
730 }
731 if (v == NULL || !PyClass_Check(v)) {
732 PyErr_SetString(PyExc_TypeError,
733 "__class__ must be set to a class");
734 return -1;
735 }
736 tmp = (PyObject *)(inst->in_class);
737 Py_INCREF(v);
738 inst->in_class = (PyClassObject *)v;
739 Py_DECREF(tmp);
740 return 0;
741 }
Guido van Rossume7737541994-09-05 07:31:41 +0000742 }
Guido van Rossume7737541994-09-05 07:31:41 +0000743 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000744 if (v == NULL)
745 func = inst->in_class->cl_delattr;
746 else
747 func = inst->in_class->cl_setattr;
748 if (func == NULL)
749 return instance_setattr1(inst, name, v);
750 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000752 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000754 if (args == NULL)
755 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 res = PyEval_CallObject(func, args);
757 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000758 if (res == NULL)
759 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000761 return 0;
762}
763
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000765instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 PyObject *func;
769 PyObject *res;
770 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000771
Guido van Rossum2878a691996-08-09 20:53:24 +0000772 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000773 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000774 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000775 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000776 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000778 PyObject *mod = PyDict_GetItemString(
779 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000780 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 if (classname != NULL && PyString_Check(classname))
782 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000783 else
784 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000786 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000787 sprintf(buf, "<?.%.100s instance at %p>",
788 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000789 else
Fred Drakea44d3532000-06-30 15:01:00 +0000790 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000791 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000792 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000793 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 res = PyEval_CallObject(func, (PyObject *)NULL);
796 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 return res;
798}
799
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000801instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000803{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000805 instance_compare1);
806}
807
Guido van Rossum9bfef441993-03-29 10:43:31 +0000808static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000813 long outcome;
814 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000815 if (result == NULL)
816 return -1;
817 if (!PyInt_Check(result)) {
818 Py_DECREF(result);
819 PyErr_SetString(PyExc_TypeError,
820 "comparison did not return an int");
821 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000822 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 outcome = PyInt_AsLong(result);
824 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000825 if (outcome < 0)
826 return -1;
827 else if (outcome > 0)
828 return 1;
829 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000830}
831
Guido van Rossum9bfef441993-03-29 10:43:31 +0000832static long
833instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000835{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 PyObject *func;
837 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000838 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000840
Guido van Rossum2878a691996-08-09 20:53:24 +0000841 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000842 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000843 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000844 if (func == NULL) {
845 /* If there is no __cmp__ method, we hash on the address.
846 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000848 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000849 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000850 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000851 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 PyErr_Clear();
Fred Drake13634cf2000-06-29 19:17:04 +0000853 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000854 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000856 return -1;
857 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 res = PyEval_CallObject(func, (PyObject *)NULL);
859 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000860 if (res == NULL)
861 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 if (PyInt_Check(res)) {
863 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000864 if (outcome == -1)
865 outcome = -2;
866 }
867 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 PyErr_SetString(PyExc_TypeError,
869 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000870 outcome = -1;
871 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873 return outcome;
874}
875
Jeremy Hylton8caad492000-06-23 14:18:11 +0000876static int
877instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
878{
879 int err;
880 if (o->in_class) {
881 err = visit((PyObject *)(o->in_class), arg);
882 if (err)
883 return err;
884 }
885 if (o->in_dict) {
886 err = visit(o->in_dict, arg);
887 if (err)
888 return err;
889 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000890 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000891}
892
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000894
Guido van Rossum9bfef441993-03-29 10:43:31 +0000895static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000896instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 PyObject *func;
900 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 int outcome;
902
Guido van Rossum2878a691996-08-09 20:53:24 +0000903 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000904 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000905 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000906 if (func == NULL)
907 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 res = PyEval_CallObject(func, (PyObject *)NULL);
909 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000910 if (res == NULL)
911 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000912 if (PyInt_Check(res)) {
913 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 PyErr_SetString(PyExc_ValueError,
916 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917 }
918 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 PyErr_SetString(PyExc_TypeError,
920 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000921 outcome = -1;
922 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924 return outcome;
925}
926
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 PyInstanceObject *inst;
930 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyObject *func;
933 PyObject *arg;
934 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935
Guido van Rossum2878a691996-08-09 20:53:24 +0000936 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000937 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000938 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000939 if (func == NULL)
940 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944 return NULL;
945 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 res = PyEval_CallObject(func, arg);
947 Py_DECREF(func);
948 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000949 return res;
950}
951
Guido van Rossum9bfef441993-03-29 10:43:31 +0000952static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000953instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 PyInstanceObject*inst;
955 PyObject *key;
956 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 PyObject *func;
959 PyObject *arg;
960 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961
Guido van Rossum2878a691996-08-09 20:53:24 +0000962 if (value == NULL) {
963 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000964 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000965 func = instance_getattr(inst, delitemstr);
966 }
967 else {
968 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000969 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000970 func = instance_getattr(inst, setitemstr);
971 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000972 if (func == NULL)
973 return -1;
974 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000976 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000978 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000980 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 res = PyEval_CallObject(func, arg);
983 Py_DECREF(func);
984 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000985 if (res == NULL)
986 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 return 0;
989}
990
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000992 (inquiry)instance_length, /*mp_length*/
993 (binaryfunc)instance_subscript, /*mp_subscript*/
994 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995};
996
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 int i;
1001{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003
Guido van Rossum2878a691996-08-09 20:53:24 +00001004 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001005 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001006 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001007 if (func == NULL)
1008 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012 return NULL;
1013 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 res = PyEval_CallObject(func, arg);
1015 Py_DECREF(func);
1016 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017 return res;
1018}
1019
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001023 int i, j;
1024{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 PyObject *func, *arg, *res;
1026 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027
Guido van Rossum2878a691996-08-09 20:53:24 +00001028 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001029 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001030 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031 if (func == NULL)
1032 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001036 return NULL;
1037 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 res = PyEval_CallObject(func, arg);
1039 Py_DECREF(func);
1040 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001041 return res;
1042}
1043
1044static int
1045instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001047 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001049{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051
Guido van Rossum2878a691996-08-09 20:53:24 +00001052 if (item == NULL) {
1053 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001054 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001055 func = instance_getattr(inst, delitemstr);
1056 }
1057 else {
1058 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001059 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001060 func = instance_getattr(inst, setitemstr);
1061 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001063 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001066 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001070 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001071 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072 res = PyEval_CallObject(func, arg);
1073 Py_DECREF(func);
1074 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075 if (res == NULL)
1076 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078 return 0;
1079}
1080
1081static int
1082instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001084 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 PyObject *func, *arg, *res;
1088 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089
Guido van Rossum2878a691996-08-09 20:53:24 +00001090 if (value == NULL) {
1091 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 delslicestr =
1093 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001094 func = instance_getattr(inst, delslicestr);
1095 }
1096 else {
1097 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 setslicestr =
1099 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001100 func = instance_getattr(inst, setslicestr);
1101 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001102 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001103 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001104 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001106 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001110 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 res = PyEval_CallObject(func, arg);
1113 Py_DECREF(func);
1114 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001115 if (res == NULL)
1116 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118 return 0;
1119}
1120
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001121static int instance_contains(PyInstanceObject *inst, PyObject *member)
1122{
1123 static PyObject *__contains__;
1124 PyObject *func, *arg, *res;
1125 int ret;
1126
1127 if(__contains__ == NULL) {
1128 __contains__ = PyString_InternFromString("__contains__");
1129 if(__contains__ == NULL)
1130 return -1;
1131 }
1132 func = instance_getattr(inst, __contains__);
1133 if(func == NULL) {
1134 /* fall back to previous behaviour */
1135 int i, cmp_res;
1136
1137 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1138 return -1;
1139 PyErr_Clear();
1140 for(i=0;;i++) {
1141 PyObject *obj = instance_item(inst, i);
1142 int ret = 0;
1143
1144 if(obj == NULL) {
1145 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1146 return -1;
1147 PyErr_Clear();
1148 return 0;
1149 }
1150 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1151 ret = -1;
1152 if(cmp_res == 0)
1153 ret = 1;
1154 Py_DECREF(obj);
1155 if(ret)
1156 return ret;
1157 }
1158 }
1159 arg = Py_BuildValue("(O)", member);
1160 if(arg == NULL) {
1161 Py_DECREF(func);
1162 return -1;
1163 }
1164 res = PyEval_CallObject(func, arg);
1165 Py_DECREF(func);
1166 Py_DECREF(arg);
1167 if(res == NULL)
1168 return -1;
1169 ret = PyObject_IsTrue(res);
1170 Py_DECREF(res);
1171 return ret;
1172}
1173
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001175 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001176 0, /*sq_concat*/
1177 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001178 (intargfunc)instance_item, /*sq_item*/
1179 (intintargfunc)instance_slice, /*sq_slice*/
1180 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1181 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001182 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001183};
1184
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 PyInstanceObject *self;
1188 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001189{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001191
1192 if ((func = instance_getattr(self, methodname)) == NULL)
1193 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 res = PyEval_CallObject(func, (PyObject *)NULL);
1195 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001196 return res;
1197}
1198
Guido van Rossum03093a21994-09-28 15:51:32 +00001199
1200/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1202 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001203
1204
1205/* Implement a binary operator involving at least one class instance. */
1206
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207PyObject *
1208PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1209 PyObject *v;
1210 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001211 char *opname;
1212 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001214{
1215 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001217 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001218 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001219 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001220 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001221 /* Sigh -- special case for comnparisons */
1222 if (strcmp(opname, "__cmp__") == 0) {
1223 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1224 return PyInt_FromLong(c);
1225 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001226 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001228 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001229}
1230
Guido van Rossum03093a21994-09-28 15:51:32 +00001231
1232/* Try one half of a binary operator involving a class instance.
1233 Return value:
1234 -1 if an exception is to be reported right away
1235 0 if we have a valid result
1236 1 if we could try another operation
1237*/
1238
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001240
Guido van Rossum03093a21994-09-28 15:51:32 +00001241static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001242halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 PyObject *v;
1244 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001245 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 PyObject **r_result;
1247 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001248 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001249{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 PyObject *func;
1251 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001252 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 PyObject *coerced = NULL;
1254 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001255
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001257 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001258 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001259 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001260 if (coerce_obj == NULL)
1261 return -1;
1262 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001263 coercefunc = PyObject_GetAttr(v, coerce_obj);
1264 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001266 }
1267 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001269 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001270 return -1;
1271 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001272 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001274 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001275 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001276 return -1;
1277 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 if (coerced == Py_None) {
1279 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001280 return 1;
1281 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1283 Py_DECREF(coerced);
1284 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001285 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001286 return -1;
1287 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 v1 = PyTuple_GetItem(coerced, 0);
1289 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001290 if (v1 != v) {
1291 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001293 if (swapped)
1294 *r_result = (*thisfunc)(w, v);
1295 else
1296 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001298 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001299 }
1300 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001301 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001303 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001305 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001306 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001308 return 1;
1309 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001311 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 Py_DECREF(func);
1313 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001314 return -1;
1315 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 *r_result = PyEval_CallObject(func, args);
1317 Py_DECREF(args);
1318 Py_DECREF(func);
1319 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001320 return *r_result == NULL ? -1 : 0;
1321}
1322
Guido van Rossum879c5811995-01-10 15:24:06 +00001323static int
1324instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 PyObject **pv;
1326 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001327{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 PyObject *v = *pv;
1329 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001330 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 PyObject *args;
1332 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001333
Guido van Rossum2878a691996-08-09 20:53:24 +00001334 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001335 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001336 if (coerce_obj == NULL)
1337 return -1;
1338 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001339 coercefunc = PyObject_GetAttr(v, coerce_obj);
1340 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001341 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 PyErr_Clear();
1343 Py_INCREF(v);
1344 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001345 return 0;
1346 }
1347 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001349 if (args == NULL) {
1350 return -1;
1351 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001352 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001354 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001355 if (coerced == NULL) {
1356 /* __coerce__ call raised an exception */
1357 return -1;
1358 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001360 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001362 return 1;
1363 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001365 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 Py_DECREF(coerced);
1367 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001368 "coercion should return None or 2-tuple");
1369 return -1;
1370 }
1371 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372 *pv = PyTuple_GetItem(coerced, 0);
1373 *pw = PyTuple_GetItem(coerced, 1);
1374 Py_INCREF(*pv);
1375 Py_INCREF(*pw);
1376 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001377 return 0;
1378}
1379
Guido van Rossum03093a21994-09-28 15:51:32 +00001380
Guido van Rossum04691fc1992-08-12 15:35:34 +00001381#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382static PyObject *funcname(self) PyInstanceObject *self; { \
1383 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001384 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001385 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001386}
1387
Guido van Rossum04691fc1992-08-12 15:35:34 +00001388UNARY(instance_neg, "__neg__")
1389UNARY(instance_pos, "__pos__")
1390UNARY(instance_abs, "__abs__")
1391
Guido van Rossum9bfef441993-03-29 10:43:31 +00001392static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001393instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001395{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001397 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001399
Guido van Rossum2878a691996-08-09 20:53:24 +00001400 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001401 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001402 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001404 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001405 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001406 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001408 /* Fall back to the default behavior:
1409 all instances are nonzero */
1410 return 1;
1411 }
1412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 res = PyEval_CallObject(func, (PyObject *)NULL);
1414 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001415 if (res == NULL)
1416 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 if (!PyInt_Check(res)) {
1418 Py_DECREF(res);
1419 PyErr_SetString(PyExc_TypeError,
1420 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001421 return -1;
1422 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423 outcome = PyInt_AsLong(res);
1424 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001425 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 PyErr_SetString(PyExc_ValueError,
1427 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001428 return -1;
1429 }
1430 return outcome > 0;
1431}
1432
1433UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001434UNARY(instance_int, "__int__")
1435UNARY(instance_long, "__long__")
1436UNARY(instance_float, "__float__")
1437UNARY(instance_oct, "__oct__")
1438UNARY(instance_hex, "__hex__")
1439
Guido van Rossum03093a21994-09-28 15:51:32 +00001440/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001442instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 PyObject *v;
1444 PyObject *w;
1445 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001446{
1447 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 PyObject *func;
1449 PyObject *args;
1450 PyObject *result;
1451 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001452
1453 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001454 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001456 if (func == NULL)
1457 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001459 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001461 return NULL;
1462 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 result = PyEval_CallObject(func, args);
1464 Py_DECREF(func);
1465 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001466 return result;
1467}
1468
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001470 0, /*nb_add*/
1471 0, /*nb_subtract*/
1472 0, /*nb_multiply*/
1473 0, /*nb_divide*/
1474 0, /*nb_remainder*/
1475 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001476 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001477 (unaryfunc)instance_neg, /*nb_negative*/
1478 (unaryfunc)instance_pos, /*nb_positive*/
1479 (unaryfunc)instance_abs, /*nb_absolute*/
1480 (inquiry)instance_nonzero, /*nb_nonzero*/
1481 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001482 0, /*nb_lshift*/
1483 0, /*nb_rshift*/
1484 0, /*nb_and*/
1485 0, /*nb_xor*/
1486 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001487 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001488 (unaryfunc)instance_int, /*nb_int*/
1489 (unaryfunc)instance_long, /*nb_long*/
1490 (unaryfunc)instance_float, /*nb_float*/
1491 (unaryfunc)instance_oct, /*nb_oct*/
1492 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001493};
1494
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495PyTypeObject PyInstance_Type = {
1496 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001497 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001498 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001499 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001500 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001501 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001502 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001503 0, /*tp_getattr*/
1504 0, /*tp_setattr*/
1505 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001506 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001507 &instance_as_number, /*tp_as_number*/
1508 &instance_as_sequence, /*tp_as_sequence*/
1509 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001510 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001511 0, /*tp_call*/
1512 0, /*tp_str*/
1513 (getattrofunc)instance_getattr, /*tp_getattro*/
1514 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001515 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001516 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001517 0, /* tp_doc */
1518 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001519};
1520
1521
Guido van Rossum81daa321993-05-20 14:24:46 +00001522/* Instance method objects are used for two purposes:
1523 (a) as bound instance methods (returned by instancename.methodname)
1524 (b) as unbound methods (returned by ClassName.methodname)
1525 In case (b), im_self is NULL
1526*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001527
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001528static PyMethodObject *free_list;
1529
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530PyObject *
1531PyMethod_New(func, self, class)
1532 PyObject *func;
1533 PyObject *self;
1534 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001535{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001537 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001538 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001539 return NULL;
1540 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001541 im = free_list;
1542 if (im != NULL) {
1543 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001544 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001545 }
1546 else {
1547 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1548 if (im == NULL)
1549 return NULL;
1550 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001551 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001552 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001554 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001556 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001557 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001559}
1560
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001561PyObject *
1562PyMethod_Function(im)
1563 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001564{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 if (!PyMethod_Check(im)) {
1566 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001567 return NULL;
1568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001570}
1571
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572PyObject *
1573PyMethod_Self(im)
1574 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001575{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 if (!PyMethod_Check(im)) {
1577 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001578 return NULL;
1579 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001580 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001581}
1582
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583PyObject *
1584PyMethod_Class(im)
1585 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001586{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587 if (!PyMethod_Check(im)) {
1588 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001589 return NULL;
1590 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001592}
1593
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001594/* Class method methods */
1595
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001597
Guido van Rossume8122f11991-05-05 20:03:07 +00001598static struct memberlist instancemethod_memberlist[] = {
1599 {"im_func", T_OBJECT, OFF(im_func)},
1600 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001601 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001602 /* Dummies that are not handled by getattr() except for __members__ */
1603 {"__doc__", T_INT, 0},
1604 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605 {NULL} /* Sentinel */
1606};
1607
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001608static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001609instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610 register PyMethodObject *im;
1611 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001612{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001613 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001614 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001615 /* Inherit __name__ and __doc__ from the callable object
1616 implementing the method */
1617 if (strcmp(sname, "__name__") == 0 ||
1618 strcmp(sname, "__doc__") == 0)
1619 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001620 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621 if (PyEval_GetRestricted()) {
1622 PyErr_SetString(PyExc_RuntimeError,
1623 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001624 return NULL;
1625 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001627}
1628
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001629static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001630instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001632{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001633 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 Py_DECREF(im->im_func);
1635 Py_XDECREF(im->im_self);
1636 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001637 im->im_self = (PyObject *)free_list;
1638 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001639}
1640
Guido van Rossumebc8c511992-09-03 20:39:51 +00001641static int
1642instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001644{
Guido van Rossume9df7271995-04-06 14:46:51 +00001645 if (a->im_self != b->im_self)
1646 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001648}
1649
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001651instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001653{
1654 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001656 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657 PyClassObject *class = (PyClassObject *)(a->im_class);
1658 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001659 char *fcname, *icname, *fname;
1660 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001661 if (PyFunction_Check(func)) {
1662 funcname = ((PyFunctionObject *)func)->func_name;
1663 Py_INCREF(funcname);
1664 }
1665 else {
1666 funcname = PyObject_GetAttrString(func,"__name__");
1667 if (funcname == NULL)
1668 PyErr_Clear();
1669 }
1670 if (funcname != NULL && PyString_Check(funcname))
1671 fname = PyString_AS_STRING(funcname);
1672 else
1673 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001674 if (fclassname != NULL && PyString_Check(fclassname))
1675 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001676 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001677 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001678 if (self == NULL)
1679 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1680 else {
1681 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001682 if (iclassname != NULL && PyString_Check(iclassname))
1683 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001684 else
1685 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001686 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1687 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001688 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001689 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001691}
1692
Guido van Rossum9bfef441993-03-29 10:43:31 +00001693static long
1694instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001696{
1697 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001698 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001699 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001700 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001701 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001702 if (x == -1)
1703 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001705 if (y == -1)
1706 return -1;
1707 return x ^ y;
1708}
1709
Jeremy Hylton8caad492000-06-23 14:18:11 +00001710static int
1711instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1712{
1713 int err;
1714 if (im->im_func) {
1715 err = visit(im->im_func, arg);
1716 if (err)
1717 return err;
1718 }
1719 if (im->im_self) {
1720 err = visit(im->im_self, arg);
1721 if (err)
1722 return err;
1723 }
1724 if (im->im_class) {
1725 err = visit(im->im_class, arg);
1726 if (err)
1727 return err;
1728 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001729 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001730}
1731
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732PyTypeObject PyMethod_Type = {
1733 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001734 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001735 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001736 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001737 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001738 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001739 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001740 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001741 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001742 (cmpfunc)instancemethod_compare, /*tp_compare*/
1743 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001744 0, /*tp_as_number*/
1745 0, /*tp_as_sequence*/
1746 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001747 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001748 0, /*tp_call*/
1749 0, /*tp_str*/
1750 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1751 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001752 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001753 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001754 0, /* tp_doc */
1755 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001756};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001757
1758/* Clear out the free list */
1759
1760void
1761PyMethod_Fini()
1762{
1763 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001764 PyMethodObject *im = free_list;
1765 free_list = (PyMethodObject *)(im->im_self);
1766 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001767 }
1768}