blob: 67732ca228913eafd9a09fbf9c8c6beab0f2fbff [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Class object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +00006
Neil Schemenauer29bfc072001-01-04 01:43:46 +00007
Guido van Rossum52ca98a1994-09-05 07:32:29 +00008/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +00009static PyObject *class_lookup(PyClassObject *, PyObject *,
10 PyClassObject **);
11static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
12static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000013
Guido van Rossuma63eff61998-05-29 21:37:21 +000014static PyObject *getattrstr, *setattrstr, *delattrstr;
15
Fred Drake79912472000-07-09 04:06:11 +000016
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017PyObject *
Fred Drake79912472000-07-09 04:06:11 +000018PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
19 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000022 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000023 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000024 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000025 if (docstr == NULL)
26 return NULL;
27 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000028 if (modstr == NULL) {
29 modstr= PyString_InternFromString("__module__");
30 if (modstr == NULL)
31 return NULL;
32 }
33 if (namestr == NULL) {
34 namestr= PyString_InternFromString("__name__");
35 if (namestr == NULL)
36 return NULL;
37 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000038 if (name == NULL || !PyString_Check(name)) {
39 PyErr_SetString(PyExc_SystemError,
40 "PyClass_New: name must be a string");
41 return NULL;
42 }
43 if (dict == NULL || !PyDict_Check(dict)) {
44 PyErr_SetString(PyExc_SystemError,
45 "PyClass_New: dict must be a dictionary");
46 return NULL;
47 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 if (PyDict_GetItem(dict, docstr) == NULL) {
49 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000050 return NULL;
51 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000052 if (PyDict_GetItem(dict, modstr) == NULL) {
53 PyObject *globals = PyEval_GetGlobals();
54 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000055 PyObject *modname = PyDict_GetItem(globals, namestr);
56 if (modname != NULL) {
57 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000058 return NULL;
59 }
60 }
61 }
Guido van Rossume2966a61991-12-10 13:53:23 +000062 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000064 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000065 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000066 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000067 else {
68 int i;
69 if (!PyTuple_Check(bases)) {
70 PyErr_SetString(PyExc_SystemError,
71 "PyClass_New: bases must be a tuple");
72 return NULL;
73 }
74 i = PyTuple_Size(bases);
75 while (--i >= 0) {
76 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
77 PyErr_SetString(PyExc_SystemError,
78 "PyClass_New: base must be a class");
79 return NULL;
80 }
81 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000083 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000085 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000088 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000091 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000093 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000094 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000095 getattrstr = PyString_InternFromString("__getattr__");
96 setattrstr = PyString_InternFromString("__setattr__");
97 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +000098 }
99 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
100 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
101 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 Py_XINCREF(op->cl_getattr);
103 Py_XINCREF(op->cl_setattr);
104 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000105 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
109/* Class methods */
110
111static void
Fred Drake79912472000-07-09 04:06:11 +0000112class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000114 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_DECREF(op->cl_bases);
116 Py_DECREF(op->cl_dict);
117 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000118 Py_XDECREF(op->cl_getattr);
119 Py_XDECREF(op->cl_setattr);
120 Py_XDECREF(op->cl_delattr);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000121 op = (PyClassObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000122 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000126class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000127{
128 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000130 if (value != NULL) {
131 *pclass = cp;
132 return value;
133 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000135 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000136 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 PyObject *v = class_lookup(
138 (PyClassObject *)
139 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000140 if (v != NULL)
141 return v;
142 }
143 return NULL;
144}
145
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000147class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 register PyObject *v;
150 register char *sname = PyString_AsString(name);
151 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000152 if (sname[0] == '_' && sname[1] == '_') {
153 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 if (PyEval_GetRestricted()) {
155 PyErr_SetString(PyExc_RuntimeError,
156 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000157 return NULL;
158 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000160 return op->cl_dict;
161 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000162 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000164 return op->cl_bases;
165 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000166 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000167 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000169 else
170 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000172 return v;
173 }
Guido van Rossum94308391991-10-20 20:11:48 +0000174 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000175 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000176 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000177 PyErr_Format(PyExc_AttributeError,
178 "class %.50s has no attribute '%.400s'",
179 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000180 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000182 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (PyFunction_Check(v)) {
184 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
185 (PyObject *)class);
186 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000187 v = w;
188 }
189 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190}
191
Guido van Rossuma63eff61998-05-29 21:37:21 +0000192static void
Fred Drake79912472000-07-09 04:06:11 +0000193set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000194{
195 PyObject *temp = *slot;
196 Py_XINCREF(v);
197 *slot = v;
198 Py_XDECREF(temp);
199}
200
Guido van Rossum7ba30431998-07-08 13:34:48 +0000201static void
Fred Drake79912472000-07-09 04:06:11 +0000202set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000203{
204 PyClassObject *dummy;
205
206 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
207 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
208 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
209}
210
Guido van Rossuma63eff61998-05-29 21:37:21 +0000211static char *
Fred Drake79912472000-07-09 04:06:11 +0000212set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000213{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000214 if (v == NULL || !PyDict_Check(v))
215 return "__dict__ must be a dictionary object";
216 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000217 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000218 return "";
219}
220
221static char *
Fred Drake79912472000-07-09 04:06:11 +0000222set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000223{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000224 int i, n;
225
226 if (v == NULL || !PyTuple_Check(v))
227 return "__bases__ must be a tuple object";
228 n = PyTuple_Size(v);
229 for (i = 0; i < n; i++) {
230 PyObject *x = PyTuple_GET_ITEM(v, i);
231 if (!PyClass_Check(x))
232 return "__bases__ items must be classes";
233 if (PyClass_IsSubclass(x, (PyObject *)c))
234 return "a __bases__ item causes an inheritance cycle";
235 }
236 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000237 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000238 return "";
239}
240
241static char *
Fred Drake79912472000-07-09 04:06:11 +0000242set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000243{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000244 if (v == NULL || !PyString_Check(v))
245 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000246 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000247 return "__name__ must not contain null bytes";
248 set_slot(&c->cl_name, v);
249 return "";
250}
251
Guido van Rossum94308391991-10-20 20:11:48 +0000252static int
Fred Drake79912472000-07-09 04:06:11 +0000253class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000254{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000255 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 if (PyEval_GetRestricted()) {
257 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000258 "classes are read-only in restricted mode");
259 return -1;
260 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000261 sname = PyString_AsString(name);
262 if (sname[0] == '_' && sname[1] == '_') {
263 int n = PyString_Size(name);
264 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000265 char *err = NULL;
266 if (strcmp(sname, "__dict__") == 0)
267 err = set_dict(op, v);
268 else if (strcmp(sname, "__bases__") == 0)
269 err = set_bases(op, v);
270 else if (strcmp(sname, "__name__") == 0)
271 err = set_name(op, v);
272 else if (strcmp(sname, "__getattr__") == 0)
273 set_slot(&op->cl_getattr, v);
274 else if (strcmp(sname, "__setattr__") == 0)
275 set_slot(&op->cl_setattr, v);
276 else if (strcmp(sname, "__delattr__") == 0)
277 set_slot(&op->cl_delattr, v);
278 /* For the last three, we fall through to update the
279 dictionary as well. */
280 if (err != NULL) {
281 if (*err == '\0')
282 return 0;
283 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000284 return -1;
285 }
286 }
287 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000288 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000290 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000291 PyErr_Format(PyExc_AttributeError,
292 "class %.50s has no attribute '%.400s'",
293 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000294 return rv;
295 }
Guido van Rossum94308391991-10-20 20:11:48 +0000296 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000298}
299
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000301class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000302{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000303 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000304 char buf[140];
305 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000307 name = "?";
308 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000310 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000311 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000312 else
Fred Drakea44d3532000-06-30 15:01:00 +0000313 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000314 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000315 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000317}
318
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000319static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000320class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000321{
322 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
323 PyObject *name = op->cl_name;
324 PyObject *res;
325 int m, n;
326
327 if (name == NULL || !PyString_Check(name))
328 return class_repr(op);
329 if (mod == NULL || !PyString_Check(mod)) {
330 Py_INCREF(name);
331 return name;
332 }
333 m = PyString_Size(mod);
334 n = PyString_Size(name);
335 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
336 if (res != NULL) {
337 char *s = PyString_AsString(res);
338 memcpy(s, PyString_AsString(mod), m);
339 s += m;
340 *s++ = '.';
341 memcpy(s, PyString_AsString(name), n);
342 }
343 return res;
344}
345
Jeremy Hylton8caad492000-06-23 14:18:11 +0000346static int
347class_traverse(PyClassObject *o, visitproc visit, void *arg)
348{
349 int err;
350 if (o->cl_bases) {
351 err = visit(o->cl_bases, arg);
352 if (err)
353 return err;
354 }
355 if (o->cl_dict) {
356 err = visit(o->cl_dict, arg);
357 if (err)
358 return err;
359 }
360 if (o->cl_name) {
361 err = visit(o->cl_name, arg);
362 if (err)
363 return err;
364 }
365 if (o->cl_getattr) {
366 err = visit(o->cl_getattr, arg);
367 if (err)
368 return err;
369 }
370 if (o->cl_setattr) {
371 err = visit(o->cl_setattr, arg);
372 if (err)
373 return err;
374 }
375 if (o->cl_delattr) {
376 err = visit(o->cl_delattr, arg);
377 if (err)
378 return err;
379 }
380 return 0;
381}
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383PyTypeObject PyClass_Type = {
384 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 0,
386 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000387 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000389 (destructor)class_dealloc, /* tp_dealloc */
390 0, /* tp_print */
391 0, /* tp_getattr */
392 0, /* tp_setattr */
393 0, /* tp_compare */
394 (reprfunc)class_repr, /* tp_repr */
395 0, /* tp_as_number */
396 0, /* tp_as_sequence */
397 0, /* tp_as_mapping */
398 0, /* tp_hash */
399 0, /* tp_call */
400 (reprfunc)class_str, /* tp_str */
401 (getattrofunc)class_getattr, /* tp_getattro */
402 (setattrofunc)class_setattr, /* tp_setattro */
403 0, /* tp_as_buffer */
404 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
405 0, /* tp_doc */
406 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407};
408
Guido van Rossum81daa321993-05-20 14:24:46 +0000409int
Fred Drake79912472000-07-09 04:06:11 +0000410PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000411{
412 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000414 if (class == base)
415 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000417 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 cp = (PyClassObject *)class;
419 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000420 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000422 return 1;
423 }
424 return 0;
425}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426
Guido van Rossum81daa321993-05-20 14:24:46 +0000427
428/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000431PyInstance_NewRaw(PyObject *klass, PyObject *dict)
432{
433 PyInstanceObject *inst;
434
435 if (!PyClass_Check(klass)) {
436 PyErr_BadInternalCall();
437 return NULL;
438 }
439 if (dict == NULL) {
440 dict = PyDict_New();
441 if (dict == NULL)
442 return NULL;
443 }
444 else {
445 if (!PyDict_Check(dict)) {
446 PyErr_BadInternalCall();
447 return NULL;
448 }
449 Py_INCREF(dict);
450 }
451 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
452 if (inst == NULL) {
453 Py_DECREF(dict);
454 return NULL;
455 }
Fred Drake4e262a92001-03-22 18:26:47 +0000456 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000457 Py_INCREF(klass);
458 inst->in_class = (PyClassObject *)klass;
459 inst->in_dict = dict;
460 PyObject_GC_Init(inst);
461 return (PyObject *)inst;
462}
463
464PyObject *
465PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 register PyInstanceObject *inst;
468 PyObject *init;
469 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000470
471 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000472 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000474 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000475 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000476 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000477 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 if ((arg != NULL && (!PyTuple_Check(arg) ||
479 PyTuple_Size(arg) != 0))
480 || (kw != NULL && (!PyDict_Check(kw) ||
481 PyDict_Size(kw) != 0))) {
482 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000483 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000485 inst = NULL;
486 }
487 }
488 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
490 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000491 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000493 inst = NULL;
494 }
495 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 if (res != Py_None) {
497 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000498 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000500 inst = NULL;
501 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000503 }
504 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000506}
507
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000508/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509
510static void
Fred Drake79912472000-07-09 04:06:11 +0000511instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyObject *error_type, *error_value, *error_traceback;
514 PyObject *del;
515 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000516#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000517 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000518#endif
Fred Drake41deb1e2001-02-01 05:27:45 +0000519
Fred Drakeb60654b2001-02-26 18:56:37 +0000520 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000521
Tim Peters6b184912000-09-17 14:40:17 +0000522 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000523#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000524#ifndef Py_REF_DEBUG
525# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
526#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000527 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000529 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000530#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000531 /* compensate for boost in _Py_NewReference; note that
532 * _Py_RefTotal was also boosted; we'll knock that down later.
533 */
534 inst->ob_type->tp_alloc--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000535#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000536#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000537 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000539#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000540
541 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000543 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000544 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000545 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000546 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000548 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000549 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000550 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 Py_DECREF(res);
552 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000553 }
Tim Peters6b184912000-09-17 14:40:17 +0000554 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000556 /* Undo the temporary resurrection; can't use DECREF here, it would
557 * cause a recursive call.
558 */
559#ifdef Py_REF_DEBUG
560 /* _Py_RefTotal was boosted either by _Py_NewReference or
561 * Py_INCREF above.
562 */
563 _Py_RefTotal--;
564#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000565 if (--inst->ob_refcnt > 0) {
566#ifdef COUNT_ALLOCS
567 inst->ob_type->tp_free--;
568#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000569 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000570 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000571#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000572 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000573#ifdef COUNT_ALLOCS
574 /* compensate for increment in _Py_ForgetReference */
575 inst->ob_type->tp_free--;
576#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000577#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000578 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000579#endif
Tim Peters6b184912000-09-17 14:40:17 +0000580#endif
Neil Schemenauerce209672000-09-15 18:57:21 +0000581 PyObject_GC_Fini(inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 Py_DECREF(inst->in_class);
583 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000584 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000585 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000586}
587
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000589instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000590{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 register PyObject *v;
592 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000593 if (sname[0] == '_' && sname[1] == '_') {
594 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 if (PyEval_GetRestricted()) {
596 PyErr_SetString(PyExc_RuntimeError,
597 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000598 return NULL;
599 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000601 return inst->in_dict;
602 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000603 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 Py_INCREF(inst->in_class);
605 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000606 }
Guido van Rossum94308391991-10-20 20:11:48 +0000607 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000608 v = instance_getattr2(inst, name);
609 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000610 PyErr_Format(PyExc_AttributeError,
611 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000612 PyString_AS_STRING(inst->in_class->cl_name), sname);
613 }
614 return v;
615}
616
617static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000618instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000619{
620 register PyObject *v;
621 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000622 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000624 if (v == NULL) {
625 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000626 if (v == NULL)
627 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000628 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000629 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000630 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 if (PyFunction_Check(v)) {
632 PyObject *w = PyMethod_New(v, (PyObject *)inst,
Jeremy Hylton09ac89a2001-01-29 22:38:32 +0000633 (PyObject *)class);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000635 v = w;
636 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 else if (PyMethod_Check(v)) {
638 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000639 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
641 PyObject *im_func = PyMethod_Function(v);
642 PyObject *w = PyMethod_New(im_func,
643 (PyObject *)inst, im_class);
644 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000645 v = w;
646 }
647 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000648 }
649 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000650}
651
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000653instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000654{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000656 res = instance_getattr1(inst, name);
657 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 PyObject *args;
659 PyErr_Clear();
660 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000661 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000662 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 res = PyEval_CallObject(func, args);
664 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000665 }
666 return res;
667}
668
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000669static int
Fred Drake79912472000-07-09 04:06:11 +0000670instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000671{
Guido van Rossum94472a01992-09-04 09:45:18 +0000672 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000674 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000675 PyErr_Format(PyExc_AttributeError,
676 "%.50s instance has no attribute '%.400s'",
677 PyString_AS_STRING(inst->in_class->cl_name),
678 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000679 return rv;
680 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000681 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683}
684
Guido van Rossume7737541994-09-05 07:31:41 +0000685static int
Fred Drake79912472000-07-09 04:06:11 +0000686instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000687{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000688 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000690 if (sname[0] == '_' && sname[1] == '_') {
691 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000692 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000693 if (strcmp(sname, "__dict__") == 0) {
694 if (PyEval_GetRestricted()) {
695 PyErr_SetString(PyExc_RuntimeError,
696 "__dict__ not accessible in restricted mode");
697 return -1;
698 }
699 if (v == NULL || !PyDict_Check(v)) {
700 PyErr_SetString(PyExc_TypeError,
701 "__dict__ must be set to a dictionary");
702 return -1;
703 }
704 tmp = inst->in_dict;
705 Py_INCREF(v);
706 inst->in_dict = v;
707 Py_DECREF(tmp);
708 return 0;
709 }
710 if (strcmp(sname, "__class__") == 0) {
711 if (PyEval_GetRestricted()) {
712 PyErr_SetString(PyExc_RuntimeError,
713 "__class__ not accessible in restricted mode");
714 return -1;
715 }
716 if (v == NULL || !PyClass_Check(v)) {
717 PyErr_SetString(PyExc_TypeError,
718 "__class__ must be set to a class");
719 return -1;
720 }
721 tmp = (PyObject *)(inst->in_class);
722 Py_INCREF(v);
723 inst->in_class = (PyClassObject *)v;
724 Py_DECREF(tmp);
725 return 0;
726 }
Guido van Rossume7737541994-09-05 07:31:41 +0000727 }
Guido van Rossume7737541994-09-05 07:31:41 +0000728 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000729 if (v == NULL)
730 func = inst->in_class->cl_delattr;
731 else
732 func = inst->in_class->cl_setattr;
733 if (func == NULL)
734 return instance_setattr1(inst, name, v);
735 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000737 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000739 if (args == NULL)
740 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 res = PyEval_CallObject(func, args);
742 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000743 if (res == NULL)
744 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000746 return 0;
747}
748
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000750instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000751{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000752 PyObject *func;
753 PyObject *res;
754 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000755
Guido van Rossum2878a691996-08-09 20:53:24 +0000756 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000757 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000758 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000760 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000762 PyObject *mod = PyDict_GetItemString(
763 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000764 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 if (classname != NULL && PyString_Check(classname))
766 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000767 else
768 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000770 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000771 sprintf(buf, "<?.%.100s instance at %p>",
772 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000773 else
Fred Drakea44d3532000-06-30 15:01:00 +0000774 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000775 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000776 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000778 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 res = PyEval_CallObject(func, (PyObject *)NULL);
780 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000781 return res;
782}
783
Guido van Rossum82c690f2001-04-30 14:39:18 +0000784static PyObject *
785instance_str(PyInstanceObject *inst)
786{
787 PyObject *func;
788 PyObject *res;
789 static PyObject *strstr;
790
791 if (strstr == NULL)
792 strstr = PyString_InternFromString("__str__");
793 func = instance_getattr(inst, strstr);
794 if (func == NULL) {
795 PyErr_Clear();
796 return instance_repr(inst);
797 }
798 res = PyEval_CallObject(func, (PyObject *)NULL);
799 Py_DECREF(func);
800 return res;
801}
802
Guido van Rossum9bfef441993-03-29 10:43:31 +0000803static long
Fred Drake79912472000-07-09 04:06:11 +0000804instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000805{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 PyObject *func;
807 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000808 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000809 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000810
Guido van Rossum2878a691996-08-09 20:53:24 +0000811 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000812 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000813 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000814 if (func == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000815 /* If there is no __eq__ and no __cmp__ method, we hash on the
816 address. If an __eq__ or __cmp__ method exists, there must
817 be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000819 if (eqstr == NULL)
820 eqstr = PyString_InternFromString("__eq__");
821 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000822 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000824 if (cmpstr == NULL)
825 cmpstr = PyString_InternFromString("__cmp__");
826 func = instance_getattr(inst, cmpstr);
827 if (func == NULL) {
828 PyErr_Clear();
829 return _Py_HashPointer(inst);
830 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000831 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833 return -1;
834 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 res = PyEval_CallObject(func, (PyObject *)NULL);
836 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000837 if (res == NULL)
838 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 if (PyInt_Check(res)) {
840 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000841 if (outcome == -1)
842 outcome = -2;
843 }
844 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 PyErr_SetString(PyExc_TypeError,
846 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000847 outcome = -1;
848 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000850 return outcome;
851}
852
Jeremy Hylton8caad492000-06-23 14:18:11 +0000853static int
854instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
855{
856 int err;
857 if (o->in_class) {
858 err = visit((PyObject *)(o->in_class), arg);
859 if (err)
860 return err;
861 }
862 if (o->in_dict) {
863 err = visit(o->in_dict, arg);
864 if (err)
865 return err;
866 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000867 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000868}
869
Guido van Rossum213c7a62001-04-23 14:08:49 +0000870static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
871static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000872
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873static int
Fred Drake79912472000-07-09 04:06:11 +0000874instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyObject *func;
877 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000878 int outcome;
879
Guido van Rossum2878a691996-08-09 20:53:24 +0000880 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000881 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000882 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000883 if (func == NULL)
884 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 res = PyEval_CallObject(func, (PyObject *)NULL);
886 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000887 if (res == NULL)
888 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 if (PyInt_Check(res)) {
890 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000891 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000892 PyErr_SetString(PyExc_ValueError,
893 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894 }
895 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 PyErr_SetString(PyExc_TypeError,
897 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898 outcome = -1;
899 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 return outcome;
902}
903
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000905instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000906{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 PyObject *func;
908 PyObject *arg;
909 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910
Guido van Rossum2878a691996-08-09 20:53:24 +0000911 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000912 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000913 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914 if (func == NULL)
915 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919 return NULL;
920 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 res = PyEval_CallObject(func, arg);
922 Py_DECREF(func);
923 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924 return res;
925}
926
Guido van Rossum9bfef441993-03-29 10:43:31 +0000927static int
Fred Drake79912472000-07-09 04:06:11 +0000928instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 PyObject *func;
931 PyObject *arg;
932 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000933
Guido van Rossum2878a691996-08-09 20:53:24 +0000934 if (value == NULL) {
935 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000936 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000937 func = instance_getattr(inst, delitemstr);
938 }
939 else {
940 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000941 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000942 func = instance_getattr(inst, setitemstr);
943 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944 if (func == NULL)
945 return -1;
946 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000950 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000952 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000953 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 res = PyEval_CallObject(func, arg);
955 Py_DECREF(func);
956 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957 if (res == NULL)
958 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000960 return 0;
961}
962
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000964 (inquiry)instance_length, /* mp_length */
965 (binaryfunc)instance_subscript, /* mp_subscript */
966 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967};
968
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000970instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000973
Guido van Rossum2878a691996-08-09 20:53:24 +0000974 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000975 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000976 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000977 if (func == NULL)
978 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000982 return NULL;
983 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 res = PyEval_CallObject(func, arg);
985 Py_DECREF(func);
986 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000987 return res;
988}
989
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +0000991sliceobj_from_intint(int i, int j)
992{
993 PyObject *start, *end, *res;
994
995 start = PyInt_FromLong((long)i);
996 if (!start)
997 return NULL;
998
999 end = PyInt_FromLong((long)j);
1000 if (!end) {
1001 Py_DECREF(start);
1002 return NULL;
1003 }
1004 res = PySlice_New(start, end, NULL);
1005 Py_DECREF(start);
1006 Py_DECREF(end);
1007 return res;
1008}
1009
1010
1011static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001012instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 PyObject *func, *arg, *res;
1015 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016
Guido van Rossum2878a691996-08-09 20:53:24 +00001017 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001018 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001019 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001020
1021 if (func == NULL) {
1022 PyErr_Clear();
1023
1024 if (getitemstr == NULL)
1025 getitemstr = PyString_InternFromString("__getitem__");
1026 func = instance_getattr(inst, getitemstr);
1027 if (func == NULL)
1028 return NULL;
1029 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1030 } else
1031 arg = Py_BuildValue("(ii)", i, j);
1032
Guido van Rossum04691fc1992-08-12 15:35:34 +00001033 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035 return NULL;
1036 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 res = PyEval_CallObject(func, arg);
1038 Py_DECREF(func);
1039 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001040 return res;
1041}
1042
1043static int
Fred Drake79912472000-07-09 04:06:11 +00001044instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001045{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001047
Guido van Rossum2878a691996-08-09 20:53:24 +00001048 if (item == NULL) {
1049 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001050 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001051 func = instance_getattr(inst, delitemstr);
1052 }
1053 else {
1054 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001055 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001056 func = instance_getattr(inst, setitemstr);
1057 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001059 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001060 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001066 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001067 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001068 res = PyEval_CallObject(func, arg);
1069 Py_DECREF(func);
1070 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001071 if (res == NULL)
1072 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074 return 0;
1075}
1076
1077static int
Fred Drake79912472000-07-09 04:06:11 +00001078instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 PyObject *func, *arg, *res;
1081 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001082
Guido van Rossum2878a691996-08-09 20:53:24 +00001083 if (value == NULL) {
1084 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 delslicestr =
1086 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001087 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001088 if (func == NULL) {
1089 PyErr_Clear();
1090 if (delitemstr == NULL)
1091 delitemstr =
1092 PyString_InternFromString("__delitem__");
1093 func = instance_getattr(inst, delitemstr);
1094 if (func == NULL)
1095 return -1;
1096
1097 arg = Py_BuildValue("(N)",
1098 sliceobj_from_intint(i, j));
1099 } else
1100 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001101 }
1102 else {
1103 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 setslicestr =
1105 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001106 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001107 if (func == NULL) {
1108 PyErr_Clear();
1109 if (setitemstr == NULL)
1110 setitemstr =
1111 PyString_InternFromString("__setitem__");
1112 func = instance_getattr(inst, setitemstr);
1113 if (func == NULL)
1114 return -1;
1115
1116 arg = Py_BuildValue("(NO)",
1117 sliceobj_from_intint(i, j), value);
1118 } else
1119 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001120 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001121 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001123 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 res = PyEval_CallObject(func, arg);
1126 Py_DECREF(func);
1127 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001128 if (res == NULL)
1129 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001131 return 0;
1132}
1133
Tim Peterscb8d3682001-05-05 21:05:01 +00001134static int
1135instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001136{
1137 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001138 PyObject *func;
1139
1140 /* Try __contains__ first.
1141 * If that can't be done, try iterator-based searching.
1142 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001143
1144 if(__contains__ == NULL) {
1145 __contains__ = PyString_InternFromString("__contains__");
1146 if(__contains__ == NULL)
1147 return -1;
1148 }
1149 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001150 if (func) {
1151 PyObject *res;
1152 int ret;
1153 PyObject *arg = Py_BuildValue("(O)", member);
1154 if(arg == NULL) {
1155 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001156 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001157 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001158 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001159 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001160 Py_DECREF(arg);
1161 if(res == NULL)
1162 return -1;
1163 ret = PyObject_IsTrue(res);
1164 Py_DECREF(res);
1165 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001166 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001167
1168 /* Couldn't find __contains__. */
1169 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1170 /* Assume the failure was simply due to that there is no
1171 * __contains__ attribute, and try iterating instead.
1172 */
1173 PyErr_Clear();
1174 return _PySequence_IterContains((PyObject *)inst, member);
1175 }
1176 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001177 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001178}
1179
Fred Drake79912472000-07-09 04:06:11 +00001180static PySequenceMethods
1181instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001182 (inquiry)instance_length, /* sq_length */
1183 0, /* sq_concat */
1184 0, /* sq_repeat */
1185 (intargfunc)instance_item, /* sq_item */
1186 (intintargfunc)instance_slice, /* sq_slice */
1187 (intobjargproc)instance_ass_item, /* sq_ass_item */
1188 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1189 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001190};
1191
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001192static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001193generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001194{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001196
1197 if ((func = instance_getattr(self, methodname)) == NULL)
1198 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001199 res = PyEval_CallObject(func, (PyObject *)NULL);
1200 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001201 return res;
1202}
1203
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001204static PyObject *
1205generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001206{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001207 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001209 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001210 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001211 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001212 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001214 Py_INCREF(Py_NotImplemented);
1215 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001218 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001220 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001221 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001222 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223 Py_DECREF(args);
1224 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001225 return result;
1226}
1227
1228
1229static PyObject *coerce_obj;
1230
1231/* Try one half of a binary operator involving a class instance. */
1232static PyObject *
1233half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1234 int swapped)
1235{
1236 PyObject *args;
1237 PyObject *coercefunc;
1238 PyObject *coerced = NULL;
1239 PyObject *v1;
1240 PyObject *result;
1241
1242 if (!PyInstance_Check(v)) {
1243 Py_INCREF(Py_NotImplemented);
1244 return Py_NotImplemented;
1245 }
1246
1247 if (coerce_obj == NULL) {
1248 coerce_obj = PyString_InternFromString("__coerce__");
1249 if (coerce_obj == NULL)
1250 return NULL;
1251 }
1252 coercefunc = PyObject_GetAttr(v, coerce_obj);
1253 if (coercefunc == NULL) {
1254 PyErr_Clear();
1255 return generic_binary_op(v, w, opname);
1256 }
1257
1258 args = Py_BuildValue("(O)", w);
1259 if (args == NULL) {
1260 return NULL;
1261 }
1262 coerced = PyEval_CallObject(coercefunc, args);
1263 Py_DECREF(args);
1264 Py_DECREF(coercefunc);
1265 if (coerced == NULL) {
1266 return NULL;
1267 }
1268 if (coerced == Py_None || coerced == Py_NotImplemented) {
1269 Py_DECREF(coerced);
1270 return generic_binary_op(v, w, opname);
1271 }
1272 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1273 Py_DECREF(coerced);
1274 PyErr_SetString(PyExc_TypeError,
1275 "coercion should return None or 2-tuple");
1276 return NULL;
1277 }
1278 v1 = PyTuple_GetItem(coerced, 0);
1279 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001280 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001281 /* prevent recursion if __coerce__ returns self as the first
1282 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001283 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001284 } else {
1285 if (swapped)
1286 result = (thisfunc)(w, v1);
1287 else
1288 result = (thisfunc)(v1, w);
1289 }
1290 Py_DECREF(coerced);
1291 return result;
1292}
1293
1294/* Implement a binary operator involving at least one class instance. */
1295static PyObject *
1296do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1297 binaryfunc thisfunc)
1298{
1299 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1300 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001301 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001302 result = half_binop(w, v, ropname, thisfunc, 1);
1303 }
1304 return result;
1305}
1306
1307static PyObject *
1308do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1309 char *ropname, binaryfunc thisfunc)
1310{
1311 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1312 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001313 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001314 result = do_binop(v, w, opname, ropname, thisfunc);
1315 }
1316 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001317}
1318
Guido van Rossum879c5811995-01-10 15:24:06 +00001319static int
Fred Drake79912472000-07-09 04:06:11 +00001320instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001321{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 PyObject *v = *pv;
1323 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001324 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 PyObject *args;
1326 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001327
Guido van Rossum2878a691996-08-09 20:53:24 +00001328 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001329 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001330 if (coerce_obj == NULL)
1331 return -1;
1332 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001333 coercefunc = PyObject_GetAttr(v, coerce_obj);
1334 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001335 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001337 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001338 }
1339 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001341 if (args == NULL) {
1342 return -1;
1343 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001344 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001346 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001347 if (coerced == NULL) {
1348 /* __coerce__ call raised an exception */
1349 return -1;
1350 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001351 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001352 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001354 return 1;
1355 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001357 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 Py_DECREF(coerced);
1359 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001360 "coercion should return None or 2-tuple");
1361 return -1;
1362 }
1363 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 *pv = PyTuple_GetItem(coerced, 0);
1365 *pw = PyTuple_GetItem(coerced, 1);
1366 Py_INCREF(*pv);
1367 Py_INCREF(*pw);
1368 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001369 return 0;
1370}
1371
Guido van Rossum04691fc1992-08-12 15:35:34 +00001372#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001373static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001375 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001376 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001377}
1378
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001379#define BINARY(f, m, n) \
1380static PyObject *f(PyObject *v, PyObject *w) { \
1381 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1382}
1383
1384#define BINARY_INPLACE(f, m, n) \
1385static PyObject *f(PyObject *v, PyObject *w) { \
1386 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1387 "__r" m "__", n); \
1388}
1389
Guido van Rossum04691fc1992-08-12 15:35:34 +00001390UNARY(instance_neg, "__neg__")
1391UNARY(instance_pos, "__pos__")
1392UNARY(instance_abs, "__abs__")
1393
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001394BINARY(instance_or, "or", PyNumber_Or)
1395BINARY(instance_and, "and", PyNumber_And)
1396BINARY(instance_xor, "xor", PyNumber_Xor)
1397BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1398BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1399BINARY(instance_add, "add", PyNumber_Add)
1400BINARY(instance_sub, "sub", PyNumber_Subtract)
1401BINARY(instance_mul, "mul", PyNumber_Multiply)
1402BINARY(instance_div, "div", PyNumber_Divide)
1403BINARY(instance_mod, "mod", PyNumber_Remainder)
1404BINARY(instance_divmod, "divmod", PyNumber_Divmod)
1405
1406BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1407BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1408BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1409BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1410BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1411BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1412BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1413BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1414BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1415BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
1416
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001417/* Try a 3-way comparison, returning an int; v is an instance. Return:
1418 -2 for an exception;
1419 -1 if v < w;
1420 0 if v == w;
1421 1 if v > w;
1422 2 if this particular 3-way comparison is not implemented or undefined.
1423*/
1424static int
1425half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001426{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001427 static PyObject *cmp_obj;
1428 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001429 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001430 PyObject *result;
1431 long l;
1432
1433 assert(PyInstance_Check(v));
1434
1435 if (cmp_obj == NULL) {
1436 cmp_obj = PyString_InternFromString("__cmp__");
1437 if (cmp_obj == NULL)
1438 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001439 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001440
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001441 cmp_func = PyObject_GetAttr(v, cmp_obj);
1442 if (cmp_func == NULL) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001443 PyErr_Clear();
1444 return 2;
1445 }
1446
1447 args = Py_BuildValue("(O)", w);
1448 if (args == NULL)
1449 return -2;
1450
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001451 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001452 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001453 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001454
1455 if (result == NULL)
1456 return -2;
1457
1458 if (result == Py_NotImplemented) {
1459 Py_DECREF(result);
1460 return 2;
1461 }
1462
1463 l = PyInt_AsLong(result);
1464 Py_DECREF(result);
1465 if (l == -1 && PyErr_Occurred()) {
1466 PyErr_SetString(PyExc_TypeError,
1467 "comparison did not return an int");
1468 return -2;
1469 }
1470
1471 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001472}
1473
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001474/* Try a 3-way comparison, returning an int; either v or w is an instance.
1475 We first try a coercion. Return:
1476 -2 for an exception;
1477 -1 if v < w;
1478 0 if v == w;
1479 1 if v > w;
1480 2 if this particular 3-way comparison is not implemented or undefined.
1481 THIS IS ONLY CALLED FROM object.c!
1482*/
1483static int
1484instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001485{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001486 int c;
1487
1488 c = PyNumber_CoerceEx(&v, &w);
1489 if (c < 0)
1490 return -2;
1491 if (c == 0) {
1492 /* If neither is now an instance, use regular comparison */
1493 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1494 c = PyObject_Compare(v, w);
1495 Py_DECREF(v);
1496 Py_DECREF(w);
1497 if (PyErr_Occurred())
1498 return -2;
1499 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001500 }
1501 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001502 else {
1503 /* The coercion didn't do anything.
1504 Treat this the same as returning v and w unchanged. */
1505 Py_INCREF(v);
1506 Py_INCREF(w);
1507 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001508
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001509 if (PyInstance_Check(v)) {
1510 c = half_cmp(v, w);
1511 if (c <= 1) {
1512 Py_DECREF(v);
1513 Py_DECREF(w);
1514 return c;
1515 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001516 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001517 if (PyInstance_Check(w)) {
1518 c = half_cmp(w, v);
1519 if (c <= 1) {
1520 Py_DECREF(v);
1521 Py_DECREF(w);
1522 if (c >= -1)
1523 c = -c;
1524 return c;
1525 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001526 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001527 Py_DECREF(v);
1528 Py_DECREF(w);
1529 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001530}
1531
Guido van Rossum9bfef441993-03-29 10:43:31 +00001532static int
Fred Drake79912472000-07-09 04:06:11 +00001533instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001534{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001535 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001536 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001538
Guido van Rossum2878a691996-08-09 20:53:24 +00001539 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001540 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001541 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001542 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001543 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001544 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001545 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001547 /* Fall back to the default behavior:
1548 all instances are nonzero */
1549 return 1;
1550 }
1551 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552 res = PyEval_CallObject(func, (PyObject *)NULL);
1553 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001554 if (res == NULL)
1555 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 if (!PyInt_Check(res)) {
1557 Py_DECREF(res);
1558 PyErr_SetString(PyExc_TypeError,
1559 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001560 return -1;
1561 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001562 outcome = PyInt_AsLong(res);
1563 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001564 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 PyErr_SetString(PyExc_ValueError,
1566 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001567 return -1;
1568 }
1569 return outcome > 0;
1570}
1571
1572UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001573UNARY(instance_int, "__int__")
1574UNARY(instance_long, "__long__")
1575UNARY(instance_float, "__float__")
1576UNARY(instance_oct, "__oct__")
1577UNARY(instance_hex, "__hex__")
1578
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001579static PyObject *
1580bin_power(PyObject *v, PyObject *w)
1581{
1582 return PyNumber_Power(v, w, Py_None);
1583}
1584
Guido van Rossum03093a21994-09-28 15:51:32 +00001585/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001587instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001588{
1589 if (z == Py_None) {
1590 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001591 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001592 else {
1593 PyObject *func;
1594 PyObject *args;
1595 PyObject *result;
1596
1597 /* XXX Doesn't do coercions... */
1598 func = PyObject_GetAttrString(v, "__pow__");
1599 if (func == NULL)
1600 return NULL;
1601 args = Py_BuildValue("(OO)", w, z);
1602 if (args == NULL) {
1603 Py_DECREF(func);
1604 return NULL;
1605 }
1606 result = PyEval_CallObject(func, args);
1607 Py_DECREF(func);
1608 Py_DECREF(args);
1609 return result;
1610 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001611}
1612
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001613static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001614bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001615{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001616 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001617}
1618
1619
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001620static PyObject *
1621instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1622{
1623 if (z == Py_None) {
1624 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1625 "__rpow__", bin_inplace_power);
1626 }
1627 else {
1628 /* XXX Doesn't do coercions... */
1629 PyObject *func;
1630 PyObject *args;
1631 PyObject *result;
1632
1633 func = PyObject_GetAttrString(v, "__ipow__");
1634 if (func == NULL) {
1635 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1636 return NULL;
1637 PyErr_Clear();
1638 return instance_pow(v, w, z);
1639 }
1640 args = Py_BuildValue("(OO)", w, z);
1641 if (args == NULL) {
1642 Py_DECREF(func);
1643 return NULL;
1644 }
1645 result = PyEval_CallObject(func, args);
1646 Py_DECREF(func);
1647 Py_DECREF(args);
1648 return result;
1649 }
1650}
1651
1652
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001653/* Map rich comparison operators to their __xx__ namesakes */
1654static char *name_op[] = {
1655 "__lt__",
1656 "__le__",
1657 "__eq__",
1658 "__ne__",
1659 "__gt__",
1660 "__ge__",
1661};
1662
1663static PyObject *
1664half_richcompare(PyObject *v, PyObject *w, int op)
1665{
1666 PyObject *name;
1667 PyObject *method;
1668 PyObject *args;
1669 PyObject *res;
1670
1671 assert(PyInstance_Check(v));
1672
1673 name = PyString_InternFromString(name_op[op]);
1674 if (name == NULL)
1675 return NULL;
1676
1677 method = PyObject_GetAttr(v, name);
1678 Py_DECREF(name);
1679 if (method == NULL) {
1680 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1681 return NULL;
1682 PyErr_Clear();
1683 res = Py_NotImplemented;
1684 Py_INCREF(res);
1685 return res;
1686 }
1687
1688 args = Py_BuildValue("(O)", w);
1689 if (args == NULL) {
1690 Py_DECREF(method);
1691 return NULL;
1692 }
1693
1694 res = PyEval_CallObject(method, args);
1695 Py_DECREF(args);
1696 Py_DECREF(method);
1697
1698 return res;
1699}
1700
1701/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1702static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1703
1704static PyObject *
1705instance_richcompare(PyObject *v, PyObject *w, int op)
1706{
1707 PyObject *res;
1708
1709 if (PyInstance_Check(v)) {
1710 res = half_richcompare(v, w, op);
1711 if (res != Py_NotImplemented)
1712 return res;
1713 Py_DECREF(res);
1714 }
1715
1716 if (PyInstance_Check(w)) {
1717 res = half_richcompare(w, v, swapped_op[op]);
1718 if (res != Py_NotImplemented)
1719 return res;
1720 Py_DECREF(res);
1721 }
1722
1723 Py_INCREF(Py_NotImplemented);
1724 return Py_NotImplemented;
1725}
1726
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001727
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001728/* Get the iterator */
1729static PyObject *
1730instance_getiter(PyInstanceObject *self)
1731{
1732 PyObject *func;
1733
1734 if (iterstr == NULL)
1735 iterstr = PyString_InternFromString("__iter__");
1736 if (getitemstr == NULL)
1737 getitemstr = PyString_InternFromString("__getitem__");
1738
1739 if ((func = instance_getattr(self, iterstr)) != NULL) {
1740 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1741 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001742 if (res != NULL && !PyIter_Check(res)) {
1743 PyErr_Format(PyExc_TypeError,
1744 "__iter__ returned non-iterator "
1745 "of type '%.100s'",
1746 res->ob_type->tp_name);
1747 Py_DECREF(res);
1748 res = NULL;
1749 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001750 return res;
1751 }
1752 PyErr_Clear();
1753 if ((func = instance_getattr(self, getitemstr)) == NULL) {
1754 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1755 return NULL;
1756 }
1757 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001758 return PySeqIter_New((PyObject *)self);
1759}
1760
1761
1762/* Call the iterator's next */
1763static PyObject *
1764instance_iternext(PyInstanceObject *self)
1765{
1766 PyObject *func;
1767
1768 if (nextstr == NULL)
1769 nextstr = PyString_InternFromString("next");
1770
1771 if ((func = instance_getattr(self, nextstr)) != NULL) {
1772 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1773 Py_DECREF(func);
1774 if (res != NULL) {
1775 return res;
1776 }
1777 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1778 PyErr_Clear();
1779 return NULL;
1780 }
1781 return NULL;
1782 }
1783 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1784 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001785}
1786
1787
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001788static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001789 (binaryfunc)instance_add, /* nb_add */
1790 (binaryfunc)instance_sub, /* nb_subtract */
1791 (binaryfunc)instance_mul, /* nb_multiply */
1792 (binaryfunc)instance_div, /* nb_divide */
1793 (binaryfunc)instance_mod, /* nb_remainder */
1794 (binaryfunc)instance_divmod, /* nb_divmod */
1795 (ternaryfunc)instance_pow, /* nb_power */
1796 (unaryfunc)instance_neg, /* nb_negative */
1797 (unaryfunc)instance_pos, /* nb_positive */
1798 (unaryfunc)instance_abs, /* nb_absolute */
1799 (inquiry)instance_nonzero, /* nb_nonzero */
1800 (unaryfunc)instance_invert, /* nb_invert */
1801 (binaryfunc)instance_lshift, /* nb_lshift */
1802 (binaryfunc)instance_rshift, /* nb_rshift */
1803 (binaryfunc)instance_and, /* nb_and */
1804 (binaryfunc)instance_xor, /* nb_xor */
1805 (binaryfunc)instance_or, /* nb_or */
1806 (coercion)instance_coerce, /* nb_coerce */
1807 (unaryfunc)instance_int, /* nb_int */
1808 (unaryfunc)instance_long, /* nb_long */
1809 (unaryfunc)instance_float, /* nb_float */
1810 (unaryfunc)instance_oct, /* nb_oct */
1811 (unaryfunc)instance_hex, /* nb_hex */
1812 (binaryfunc)instance_iadd, /* nb_inplace_add */
1813 (binaryfunc)instance_isub, /* nb_inplace_subtract */
1814 (binaryfunc)instance_imul, /* nb_inplace_multiply */
1815 (binaryfunc)instance_idiv, /* nb_inplace_divide */
1816 (binaryfunc)instance_imod, /* nb_inplace_remainder */
1817 (ternaryfunc)instance_ipow, /* nb_inplace_power */
1818 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
1819 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
1820 (binaryfunc)instance_iand, /* nb_inplace_and */
1821 (binaryfunc)instance_ixor, /* nb_inplace_xor */
1822 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001823};
1824
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001825PyTypeObject PyInstance_Type = {
1826 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001827 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001828 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001829 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001830 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001831 (destructor)instance_dealloc, /* tp_dealloc */
1832 0, /* tp_print */
1833 0, /* tp_getattr */
1834 0, /* tp_setattr */
1835 instance_compare, /* tp_compare */
1836 (reprfunc)instance_repr, /* tp_repr */
1837 &instance_as_number, /* tp_as_number */
1838 &instance_as_sequence, /* tp_as_sequence */
1839 &instance_as_mapping, /* tp_as_mapping */
1840 (hashfunc)instance_hash, /* tp_hash */
1841 0, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00001842 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001843 (getattrofunc)instance_getattr, /* tp_getattro */
1844 (setattrofunc)instance_setattr, /* tp_setattro */
1845 0, /* tp_as_buffer */
1846 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
1847 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00001848 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001849 0, /* tp_clear */
1850 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001851 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
1852 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001853 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001854};
1855
1856
Guido van Rossum81daa321993-05-20 14:24:46 +00001857/* Instance method objects are used for two purposes:
1858 (a) as bound instance methods (returned by instancename.methodname)
1859 (b) as unbound methods (returned by ClassName.methodname)
1860 In case (b), im_self is NULL
1861*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001862
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001863static PyMethodObject *free_list;
1864
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001865PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001866PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001867{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001868 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001869 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001870 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001871 return NULL;
1872 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001873 im = free_list;
1874 if (im != NULL) {
1875 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001876 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001877 }
1878 else {
1879 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1880 if (im == NULL)
1881 return NULL;
1882 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00001883 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001884 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001885 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001886 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001887 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001888 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001889 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001890 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001891 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001892}
1893
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001894PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001895PyMethod_Function(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001896{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001897 if (!PyMethod_Check(im)) {
1898 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001899 return NULL;
1900 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001901 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001902}
1903
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001904PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001905PyMethod_Self(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001906{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001907 if (!PyMethod_Check(im)) {
1908 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001909 return NULL;
1910 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001911 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001912}
1913
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001914PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001915PyMethod_Class(register PyObject *im)
Guido van Rossum81daa321993-05-20 14:24:46 +00001916{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001917 if (!PyMethod_Check(im)) {
1918 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001919 return NULL;
1920 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001921 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001922}
1923
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001924/* Class method methods */
1925
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001926#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001927
Guido van Rossume8122f11991-05-05 20:03:07 +00001928static struct memberlist instancemethod_memberlist[] = {
1929 {"im_func", T_OBJECT, OFF(im_func)},
1930 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001931 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001932 /* Dummies that are not handled by getattr() except for __members__ */
1933 {"__doc__", T_INT, 0},
1934 {"__name__", T_INT, 0},
Barry Warsawd6a9e842001-01-15 20:40:19 +00001935 {"__dict__", T_OBJECT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936 {NULL} /* Sentinel */
1937};
1938
Barry Warsawd6a9e842001-01-15 20:40:19 +00001939static int
1940instancemethod_setattro(register PyMethodObject *im, PyObject *name,
1941 PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001942{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001943 char *sname = PyString_AsString(name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00001944
Barry Warsaw4f9b13b2001-02-26 18:09:15 +00001945 PyErr_Format(PyExc_TypeError, "read-only attribute: %s", sname);
1946 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +00001947}
1948
1949
1950static PyObject *
1951instancemethod_getattro(register PyMethodObject *im, PyObject *name)
1952{
1953 PyObject *rtn;
1954 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001955 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001956 /* Inherit __name__ and __doc__ from the callable object
1957 implementing the method */
1958 if (strcmp(sname, "__name__") == 0 ||
1959 strcmp(sname, "__doc__") == 0)
1960 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001961 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001962 if (PyEval_GetRestricted()) {
1963 PyErr_SetString(PyExc_RuntimeError,
1964 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001965 return NULL;
1966 }
Barry Warsawd6a9e842001-01-15 20:40:19 +00001967 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0)
1968 return PyObject_GetAttr(im->im_func, name);
1969
1970 rtn = PyMember_Get((char *)im, instancemethod_memberlist, sname);
1971 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1972 PyErr_Clear();
1973 rtn = PyObject_GetAttr(im->im_func, name);
1974 }
1975 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001976}
1977
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001978static void
Fred Drake79912472000-07-09 04:06:11 +00001979instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001980{
Fred Drakedb81e8d2001-03-23 04:19:27 +00001981 PyObject_ClearWeakRefs((PyObject *)im);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001982 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001983 Py_DECREF(im->im_func);
1984 Py_XDECREF(im->im_self);
1985 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001986 im->im_self = (PyObject *)free_list;
1987 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001988}
1989
Guido van Rossumebc8c511992-09-03 20:39:51 +00001990static int
Fred Drake79912472000-07-09 04:06:11 +00001991instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00001992{
Guido van Rossume9df7271995-04-06 14:46:51 +00001993 if (a->im_self != b->im_self)
1994 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001995 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001996}
1997
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001998static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001999instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002000{
2001 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002002 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00002003 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002004 PyClassObject *class = (PyClassObject *)(a->im_class);
2005 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00002006 char *fcname, *icname, *fname;
2007 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00002008 if (PyFunction_Check(func)) {
2009 funcname = ((PyFunctionObject *)func)->func_name;
2010 Py_INCREF(funcname);
2011 }
2012 else {
2013 funcname = PyObject_GetAttrString(func,"__name__");
2014 if (funcname == NULL)
2015 PyErr_Clear();
2016 }
2017 if (funcname != NULL && PyString_Check(funcname))
2018 fname = PyString_AS_STRING(funcname);
2019 else
2020 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002021 if (fclassname != NULL && PyString_Check(fclassname))
2022 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00002023 else
Guido van Rossum81daa321993-05-20 14:24:46 +00002024 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00002025 if (self == NULL)
2026 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
2027 else {
2028 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002029 if (iclassname != NULL && PyString_Check(iclassname))
2030 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002031 else
2032 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00002033 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
2034 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00002035 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00002036 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002037 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00002038}
2039
Guido van Rossum9bfef441993-03-29 10:43:31 +00002040static long
Fred Drake79912472000-07-09 04:06:11 +00002041instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002042{
2043 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002044 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002045 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002046 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002047 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002048 if (x == -1)
2049 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002050 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002051 if (y == -1)
2052 return -1;
2053 return x ^ y;
2054}
2055
Jeremy Hylton8caad492000-06-23 14:18:11 +00002056static int
2057instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2058{
2059 int err;
2060 if (im->im_func) {
2061 err = visit(im->im_func, arg);
2062 if (err)
2063 return err;
2064 }
2065 if (im->im_self) {
2066 err = visit(im->im_self, arg);
2067 if (err)
2068 return err;
2069 }
2070 if (im->im_class) {
2071 err = visit(im->im_class, arg);
2072 if (err)
2073 return err;
2074 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002075 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002076}
2077
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002078PyTypeObject PyMethod_Type = {
2079 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002080 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00002081 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002082 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002083 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002084 (destructor)instancemethod_dealloc, /* tp_dealloc */
2085 0, /* tp_print */
2086 0, /* tp_getattr */
2087 0, /* tp_setattr */
2088 (cmpfunc)instancemethod_compare, /* tp_compare */
2089 (reprfunc)instancemethod_repr, /* tp_repr */
2090 0, /* tp_as_number */
2091 0, /* tp_as_sequence */
2092 0, /* tp_as_mapping */
2093 (hashfunc)instancemethod_hash, /* tp_hash */
2094 0, /* tp_call */
2095 0, /* tp_str */
2096 (getattrofunc)instancemethod_getattro, /* tp_getattro */
2097 (setattrofunc)instancemethod_setattro, /* tp_setattro */
2098 0, /* tp_as_buffer */
Fred Drake4dcb85b2001-05-03 16:04:13 +00002099 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002100 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002101 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002102 0, /* tp_clear */
2103 0, /* tp_richcompare */
2104 offsetof(PyMethodObject, im_weakreflist) /* tp_weaklistoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002105};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002106
2107/* Clear out the free list */
2108
2109void
Fred Drake79912472000-07-09 04:06:11 +00002110PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002111{
2112 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002113 PyMethodObject *im = free_list;
2114 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00002115 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002116 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002117 }
2118}