blob: 40ff9839b9368a8d67422ea92ba2b3c18d2fc3b2 [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 Drake79912472000-07-09 04:06:11 +0000431PyInstance_New(PyObject *class, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 register PyInstanceObject *inst;
434 PyObject *init;
435 static PyObject *initstr;
436 if (!PyClass_Check(class)) {
437 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438 return NULL;
439 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000441 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000444 if (inst->in_dict == NULL) {
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000445 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumd7823f22000-06-28 23:46:07 +0000446 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447 return NULL;
448 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000449 Py_INCREF(class);
450 inst->in_class = (PyClassObject *)class;
Neil Schemenauere3550a62000-10-04 16:20:41 +0000451 PyObject_GC_Init(inst);
Guido van Rossum2878a691996-08-09 20:53:24 +0000452 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000453 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000454 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000455 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 if ((arg != NULL && (!PyTuple_Check(arg) ||
457 PyTuple_Size(arg) != 0))
458 || (kw != NULL && (!PyDict_Check(kw) ||
459 PyDict_Size(kw) != 0))) {
460 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000461 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000463 inst = NULL;
464 }
465 }
466 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
468 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000469 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000471 inst = NULL;
472 }
473 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 if (res != Py_None) {
475 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000476 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000478 inst = NULL;
479 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000481 }
482 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}
485
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000486/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487
488static void
Fred Drake79912472000-07-09 04:06:11 +0000489instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 PyObject *error_type, *error_value, *error_traceback;
492 PyObject *del;
493 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000494#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000495 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000496#endif
Tim Peters6b184912000-09-17 14:40:17 +0000497 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000498#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000499#ifndef Py_REF_DEBUG
500# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
501#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000502 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000504 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000505#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000506 /* compensate for boost in _Py_NewReference; note that
507 * _Py_RefTotal was also boosted; we'll knock that down later.
508 */
509 inst->ob_type->tp_alloc--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000510#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000511#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000512 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000514#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000515
516 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000518 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000519 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000520 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000521 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000523 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000524 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000525 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 Py_DECREF(res);
527 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 }
Tim Peters6b184912000-09-17 14:40:17 +0000529 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000531 /* Undo the temporary resurrection; can't use DECREF here, it would
532 * cause a recursive call.
533 */
534#ifdef Py_REF_DEBUG
535 /* _Py_RefTotal was boosted either by _Py_NewReference or
536 * Py_INCREF above.
537 */
538 _Py_RefTotal--;
539#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000540 if (--inst->ob_refcnt > 0) {
541#ifdef COUNT_ALLOCS
542 inst->ob_type->tp_free--;
543#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000544 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000545 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000546#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000547 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000548#ifdef COUNT_ALLOCS
549 /* compensate for increment in _Py_ForgetReference */
550 inst->ob_type->tp_free--;
551#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000552#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000553 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000554#endif
Tim Peters6b184912000-09-17 14:40:17 +0000555#endif
Neil Schemenauerce209672000-09-15 18:57:21 +0000556 PyObject_GC_Fini(inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 Py_DECREF(inst->in_class);
558 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000559 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000560 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561}
562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000564instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 register PyObject *v;
567 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000568 if (sname[0] == '_' && sname[1] == '_') {
569 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 if (PyEval_GetRestricted()) {
571 PyErr_SetString(PyExc_RuntimeError,
572 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000573 return NULL;
574 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000576 return inst->in_dict;
577 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000578 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 Py_INCREF(inst->in_class);
580 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000581 }
Guido van Rossum94308391991-10-20 20:11:48 +0000582 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000583 v = instance_getattr2(inst, name);
584 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000585 PyErr_Format(PyExc_AttributeError,
586 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000587 PyString_AS_STRING(inst->in_class->cl_name), sname);
588 }
589 return v;
590}
591
592static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000593instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000594{
595 register PyObject *v;
596 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000597 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000599 if (v == NULL) {
600 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000601 if (v == NULL)
602 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000603 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000604 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000605 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 if (PyFunction_Check(v)) {
607 PyObject *w = PyMethod_New(v, (PyObject *)inst,
608 (PyObject *)class);
609 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000610 v = w;
611 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 else if (PyMethod_Check(v)) {
613 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000614 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
616 PyObject *im_func = PyMethod_Function(v);
617 PyObject *w = PyMethod_New(im_func,
618 (PyObject *)inst, im_class);
619 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000620 v = w;
621 }
622 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000623 }
624 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625}
626
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000628instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000631 res = instance_getattr1(inst, name);
632 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 PyObject *args;
634 PyErr_Clear();
635 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000636 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000637 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 res = PyEval_CallObject(func, args);
639 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000640 }
641 return res;
642}
643
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644static int
Fred Drake79912472000-07-09 04:06:11 +0000645instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000646{
Guido van Rossum94472a01992-09-04 09:45:18 +0000647 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000649 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000650 PyErr_Format(PyExc_AttributeError,
651 "%.50s instance has no attribute '%.400s'",
652 PyString_AS_STRING(inst->in_class->cl_name),
653 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000654 return rv;
655 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658}
659
Guido van Rossume7737541994-09-05 07:31:41 +0000660static int
Fred Drake79912472000-07-09 04:06:11 +0000661instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000662{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000663 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000665 if (sname[0] == '_' && sname[1] == '_') {
666 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000667 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000668 if (strcmp(sname, "__dict__") == 0) {
669 if (PyEval_GetRestricted()) {
670 PyErr_SetString(PyExc_RuntimeError,
671 "__dict__ not accessible in restricted mode");
672 return -1;
673 }
674 if (v == NULL || !PyDict_Check(v)) {
675 PyErr_SetString(PyExc_TypeError,
676 "__dict__ must be set to a dictionary");
677 return -1;
678 }
679 tmp = inst->in_dict;
680 Py_INCREF(v);
681 inst->in_dict = v;
682 Py_DECREF(tmp);
683 return 0;
684 }
685 if (strcmp(sname, "__class__") == 0) {
686 if (PyEval_GetRestricted()) {
687 PyErr_SetString(PyExc_RuntimeError,
688 "__class__ not accessible in restricted mode");
689 return -1;
690 }
691 if (v == NULL || !PyClass_Check(v)) {
692 PyErr_SetString(PyExc_TypeError,
693 "__class__ must be set to a class");
694 return -1;
695 }
696 tmp = (PyObject *)(inst->in_class);
697 Py_INCREF(v);
698 inst->in_class = (PyClassObject *)v;
699 Py_DECREF(tmp);
700 return 0;
701 }
Guido van Rossume7737541994-09-05 07:31:41 +0000702 }
Guido van Rossume7737541994-09-05 07:31:41 +0000703 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000704 if (v == NULL)
705 func = inst->in_class->cl_delattr;
706 else
707 func = inst->in_class->cl_setattr;
708 if (func == NULL)
709 return instance_setattr1(inst, name, v);
710 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000712 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000714 if (args == NULL)
715 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 res = PyEval_CallObject(func, args);
717 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000718 if (res == NULL)
719 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000721 return 0;
722}
723
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000725instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000726{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 PyObject *func;
728 PyObject *res;
729 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000730
Guido van Rossum2878a691996-08-09 20:53:24 +0000731 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000732 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000733 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000734 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000735 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000737 PyObject *mod = PyDict_GetItemString(
738 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000739 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 if (classname != NULL && PyString_Check(classname))
741 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000742 else
743 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000745 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000746 sprintf(buf, "<?.%.100s instance at %p>",
747 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000748 else
Fred Drakea44d3532000-06-30 15:01:00 +0000749 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000750 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000751 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000752 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000753 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 res = PyEval_CallObject(func, (PyObject *)NULL);
755 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756 return res;
757}
758
Guido van Rossum9bfef441993-03-29 10:43:31 +0000759static long
Fred Drake79912472000-07-09 04:06:11 +0000760instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000761{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 PyObject *func;
763 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000764 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000765 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000766
Guido van Rossum2878a691996-08-09 20:53:24 +0000767 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000768 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000769 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000770 if (func == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000771 /* If there is no __eq__ and no __cmp__ method, we hash on the
772 address. If an __eq__ or __cmp__ method exists, there must
773 be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000775 if (eqstr == NULL)
776 eqstr = PyString_InternFromString("__eq__");
777 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000778 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000780 if (cmpstr == NULL)
781 cmpstr = PyString_InternFromString("__cmp__");
782 func = instance_getattr(inst, cmpstr);
783 if (func == NULL) {
784 PyErr_Clear();
785 return _Py_HashPointer(inst);
786 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000787 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000789 return -1;
790 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 res = PyEval_CallObject(func, (PyObject *)NULL);
792 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000793 if (res == NULL)
794 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 if (PyInt_Check(res)) {
796 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000797 if (outcome == -1)
798 outcome = -2;
799 }
800 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 PyErr_SetString(PyExc_TypeError,
802 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000803 outcome = -1;
804 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000806 return outcome;
807}
808
Jeremy Hylton8caad492000-06-23 14:18:11 +0000809static int
810instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
811{
812 int err;
813 if (o->in_class) {
814 err = visit((PyObject *)(o->in_class), arg);
815 if (err)
816 return err;
817 }
818 if (o->in_dict) {
819 err = visit(o->in_dict, arg);
820 if (err)
821 return err;
822 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000823 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000824}
825
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000827
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828static int
Fred Drake79912472000-07-09 04:06:11 +0000829instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000830{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyObject *func;
832 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000833 int outcome;
834
Guido van Rossum2878a691996-08-09 20:53:24 +0000835 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000836 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000837 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000838 if (func == NULL)
839 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 res = PyEval_CallObject(func, (PyObject *)NULL);
841 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000842 if (res == NULL)
843 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 if (PyInt_Check(res)) {
845 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 PyErr_SetString(PyExc_ValueError,
848 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000849 }
850 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 PyErr_SetString(PyExc_TypeError,
852 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000853 outcome = -1;
854 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856 return outcome;
857}
858
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000860instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 PyObject *func;
863 PyObject *arg;
864 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865
Guido van Rossum2878a691996-08-09 20:53:24 +0000866 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000867 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000868 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000869 if (func == NULL)
870 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000872 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000874 return NULL;
875 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 res = PyEval_CallObject(func, arg);
877 Py_DECREF(func);
878 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000879 return res;
880}
881
Guido van Rossum9bfef441993-03-29 10:43:31 +0000882static int
Fred Drake79912472000-07-09 04:06:11 +0000883instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000884{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 PyObject *func;
886 PyObject *arg;
887 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888
Guido van Rossum2878a691996-08-09 20:53:24 +0000889 if (value == NULL) {
890 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000891 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000892 func = instance_getattr(inst, delitemstr);
893 }
894 else {
895 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000896 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000897 func = instance_getattr(inst, setitemstr);
898 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000899 if (func == NULL)
900 return -1;
901 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000903 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000907 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 res = PyEval_CallObject(func, arg);
910 Py_DECREF(func);
911 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000912 if (res == NULL)
913 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915 return 0;
916}
917
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000919 (inquiry)instance_length, /* mp_length */
920 (binaryfunc)instance_subscript, /* mp_subscript */
921 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922};
923
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000925instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928
Guido van Rossum2878a691996-08-09 20:53:24 +0000929 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000930 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000931 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932 if (func == NULL)
933 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000937 return NULL;
938 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939 res = PyEval_CallObject(func, arg);
940 Py_DECREF(func);
941 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942 return res;
943}
944
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +0000946sliceobj_from_intint(int i, int j)
947{
948 PyObject *start, *end, *res;
949
950 start = PyInt_FromLong((long)i);
951 if (!start)
952 return NULL;
953
954 end = PyInt_FromLong((long)j);
955 if (!end) {
956 Py_DECREF(start);
957 return NULL;
958 }
959 res = PySlice_New(start, end, NULL);
960 Py_DECREF(start);
961 Py_DECREF(end);
962 return res;
963}
964
965
966static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000967instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000968{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 PyObject *func, *arg, *res;
970 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971
Guido van Rossum2878a691996-08-09 20:53:24 +0000972 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000973 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000974 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +0000975
976 if (func == NULL) {
977 PyErr_Clear();
978
979 if (getitemstr == NULL)
980 getitemstr = PyString_InternFromString("__getitem__");
981 func = instance_getattr(inst, getitemstr);
982 if (func == NULL)
983 return NULL;
984 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
985 } else
986 arg = Py_BuildValue("(ii)", i, j);
987
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990 return NULL;
991 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 res = PyEval_CallObject(func, arg);
993 Py_DECREF(func);
994 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995 return res;
996}
997
998static int
Fred Drake79912472000-07-09 04:06:11 +0000999instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001002
Guido van Rossum2878a691996-08-09 20:53:24 +00001003 if (item == NULL) {
1004 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001005 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001006 func = instance_getattr(inst, delitemstr);
1007 }
1008 else {
1009 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001010 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001011 func = instance_getattr(inst, setitemstr);
1012 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001014 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001021 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 res = PyEval_CallObject(func, arg);
1024 Py_DECREF(func);
1025 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026 if (res == NULL)
1027 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001029 return 0;
1030}
1031
1032static int
Fred Drake79912472000-07-09 04:06:11 +00001033instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 PyObject *func, *arg, *res;
1036 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001037
Guido van Rossum2878a691996-08-09 20:53:24 +00001038 if (value == NULL) {
1039 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040 delslicestr =
1041 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001042 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001043 if (func == NULL) {
1044 PyErr_Clear();
1045 if (delitemstr == NULL)
1046 delitemstr =
1047 PyString_InternFromString("__delitem__");
1048 func = instance_getattr(inst, delitemstr);
1049 if (func == NULL)
1050 return -1;
1051
1052 arg = Py_BuildValue("(N)",
1053 sliceobj_from_intint(i, j));
1054 } else
1055 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001056 }
1057 else {
1058 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 setslicestr =
1060 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001061 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001062 if (func == NULL) {
1063 PyErr_Clear();
1064 if (setitemstr == NULL)
1065 setitemstr =
1066 PyString_InternFromString("__setitem__");
1067 func = instance_getattr(inst, setitemstr);
1068 if (func == NULL)
1069 return -1;
1070
1071 arg = Py_BuildValue("(NO)",
1072 sliceobj_from_intint(i, j), value);
1073 } else
1074 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001075 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001078 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 res = PyEval_CallObject(func, arg);
1081 Py_DECREF(func);
1082 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083 if (res == NULL)
1084 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086 return 0;
1087}
1088
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001089static int instance_contains(PyInstanceObject *inst, PyObject *member)
1090{
1091 static PyObject *__contains__;
1092 PyObject *func, *arg, *res;
1093 int ret;
1094
1095 if(__contains__ == NULL) {
1096 __contains__ = PyString_InternFromString("__contains__");
1097 if(__contains__ == NULL)
1098 return -1;
1099 }
1100 func = instance_getattr(inst, __contains__);
1101 if(func == NULL) {
Thomas Wouters7e474022000-07-16 12:04:32 +00001102 /* fall back to previous behavior */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001103 int i, cmp_res;
1104
1105 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1106 return -1;
1107 PyErr_Clear();
1108 for(i=0;;i++) {
1109 PyObject *obj = instance_item(inst, i);
1110 int ret = 0;
1111
1112 if(obj == NULL) {
1113 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1114 return -1;
1115 PyErr_Clear();
1116 return 0;
1117 }
1118 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1119 ret = -1;
1120 if(cmp_res == 0)
1121 ret = 1;
1122 Py_DECREF(obj);
1123 if(ret)
1124 return ret;
1125 }
1126 }
1127 arg = Py_BuildValue("(O)", member);
1128 if(arg == NULL) {
1129 Py_DECREF(func);
1130 return -1;
1131 }
1132 res = PyEval_CallObject(func, arg);
1133 Py_DECREF(func);
1134 Py_DECREF(arg);
1135 if(res == NULL)
1136 return -1;
1137 ret = PyObject_IsTrue(res);
1138 Py_DECREF(res);
1139 return ret;
1140}
1141
Fred Drake79912472000-07-09 04:06:11 +00001142static PySequenceMethods
1143instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001144 (inquiry)instance_length, /* sq_length */
1145 0, /* sq_concat */
1146 0, /* sq_repeat */
1147 (intargfunc)instance_item, /* sq_item */
1148 (intintargfunc)instance_slice, /* sq_slice */
1149 (intobjargproc)instance_ass_item, /* sq_ass_item */
1150 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1151 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001152};
1153
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001154static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001155generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001158
1159 if ((func = instance_getattr(self, methodname)) == NULL)
1160 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001161 res = PyEval_CallObject(func, (PyObject *)NULL);
1162 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001163 return res;
1164}
1165
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001166static PyObject *
1167generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001168{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001169 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001170 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001171 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001172 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001173 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001174 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001176 Py_INCREF(Py_NotImplemented);
1177 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001178 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001180 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001182 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001183 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001184 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185 Py_DECREF(args);
1186 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001187 return result;
1188}
1189
1190
1191static PyObject *coerce_obj;
1192
1193/* Try one half of a binary operator involving a class instance. */
1194static PyObject *
1195half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1196 int swapped)
1197{
1198 PyObject *args;
1199 PyObject *coercefunc;
1200 PyObject *coerced = NULL;
1201 PyObject *v1;
1202 PyObject *result;
1203
1204 if (!PyInstance_Check(v)) {
1205 Py_INCREF(Py_NotImplemented);
1206 return Py_NotImplemented;
1207 }
1208
1209 if (coerce_obj == NULL) {
1210 coerce_obj = PyString_InternFromString("__coerce__");
1211 if (coerce_obj == NULL)
1212 return NULL;
1213 }
1214 coercefunc = PyObject_GetAttr(v, coerce_obj);
1215 if (coercefunc == NULL) {
1216 PyErr_Clear();
1217 return generic_binary_op(v, w, opname);
1218 }
1219
1220 args = Py_BuildValue("(O)", w);
1221 if (args == NULL) {
1222 return NULL;
1223 }
1224 coerced = PyEval_CallObject(coercefunc, args);
1225 Py_DECREF(args);
1226 Py_DECREF(coercefunc);
1227 if (coerced == NULL) {
1228 return NULL;
1229 }
1230 if (coerced == Py_None || coerced == Py_NotImplemented) {
1231 Py_DECREF(coerced);
1232 return generic_binary_op(v, w, opname);
1233 }
1234 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1235 Py_DECREF(coerced);
1236 PyErr_SetString(PyExc_TypeError,
1237 "coercion should return None or 2-tuple");
1238 return NULL;
1239 }
1240 v1 = PyTuple_GetItem(coerced, 0);
1241 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001242 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001243 /* prevent recursion if __coerce__ returns self as the first
1244 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001245 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001246 } else {
1247 if (swapped)
1248 result = (thisfunc)(w, v1);
1249 else
1250 result = (thisfunc)(v1, w);
1251 }
1252 Py_DECREF(coerced);
1253 return result;
1254}
1255
1256/* Implement a binary operator involving at least one class instance. */
1257static PyObject *
1258do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1259 binaryfunc thisfunc)
1260{
1261 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1262 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001263 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001264 result = half_binop(w, v, ropname, thisfunc, 1);
1265 }
1266 return result;
1267}
1268
1269static PyObject *
1270do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1271 char *ropname, binaryfunc thisfunc)
1272{
1273 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1274 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001275 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001276 result = do_binop(v, w, opname, ropname, thisfunc);
1277 }
1278 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001279}
1280
Guido van Rossum879c5811995-01-10 15:24:06 +00001281static int
Fred Drake79912472000-07-09 04:06:11 +00001282instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001283{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 PyObject *v = *pv;
1285 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001286 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 PyObject *args;
1288 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001289
Guido van Rossum2878a691996-08-09 20:53:24 +00001290 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001291 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001292 if (coerce_obj == NULL)
1293 return -1;
1294 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001295 coercefunc = PyObject_GetAttr(v, coerce_obj);
1296 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001297 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001299 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001300 }
1301 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001303 if (args == NULL) {
1304 return -1;
1305 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001306 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001308 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001309 if (coerced == NULL) {
1310 /* __coerce__ call raised an exception */
1311 return -1;
1312 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001313 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001314 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001316 return 1;
1317 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001319 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 Py_DECREF(coerced);
1321 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001322 "coercion should return None or 2-tuple");
1323 return -1;
1324 }
1325 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 *pv = PyTuple_GetItem(coerced, 0);
1327 *pw = PyTuple_GetItem(coerced, 1);
1328 Py_INCREF(*pv);
1329 Py_INCREF(*pw);
1330 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001331 return 0;
1332}
1333
Guido van Rossum04691fc1992-08-12 15:35:34 +00001334#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001335static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001337 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001338 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001339}
1340
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001341#define BINARY(f, m, n) \
1342static PyObject *f(PyObject *v, PyObject *w) { \
1343 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1344}
1345
1346#define BINARY_INPLACE(f, m, n) \
1347static PyObject *f(PyObject *v, PyObject *w) { \
1348 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1349 "__r" m "__", n); \
1350}
1351
Guido van Rossum04691fc1992-08-12 15:35:34 +00001352UNARY(instance_neg, "__neg__")
1353UNARY(instance_pos, "__pos__")
1354UNARY(instance_abs, "__abs__")
1355
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001356BINARY(instance_or, "or", PyNumber_Or)
1357BINARY(instance_and, "and", PyNumber_And)
1358BINARY(instance_xor, "xor", PyNumber_Xor)
1359BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1360BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1361BINARY(instance_add, "add", PyNumber_Add)
1362BINARY(instance_sub, "sub", PyNumber_Subtract)
1363BINARY(instance_mul, "mul", PyNumber_Multiply)
1364BINARY(instance_div, "div", PyNumber_Divide)
1365BINARY(instance_mod, "mod", PyNumber_Remainder)
1366BINARY(instance_divmod, "divmod", PyNumber_Divmod)
1367
1368BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1369BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1370BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1371BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1372BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1373BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1374BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1375BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1376BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1377BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
1378
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001379/* Try a 3-way comparison, returning an int; v is an instance. Return:
1380 -2 for an exception;
1381 -1 if v < w;
1382 0 if v == w;
1383 1 if v > w;
1384 2 if this particular 3-way comparison is not implemented or undefined.
1385*/
1386static int
1387half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001388{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001389 static PyObject *cmp_obj;
1390 PyObject *args;
1391 PyObject *cmpfunc;
1392 PyObject *result;
1393 long l;
1394
1395 assert(PyInstance_Check(v));
1396
1397 if (cmp_obj == NULL) {
1398 cmp_obj = PyString_InternFromString("__cmp__");
1399 if (cmp_obj == NULL)
1400 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001401 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001402
1403 cmpfunc = PyObject_GetAttr(v, cmp_obj);
1404 if (cmpfunc == NULL) {
1405 PyErr_Clear();
1406 return 2;
1407 }
1408
1409 args = Py_BuildValue("(O)", w);
1410 if (args == NULL)
1411 return -2;
1412
1413 result = PyEval_CallObject(cmpfunc, args);
1414 Py_DECREF(args);
1415 Py_DECREF(cmpfunc);
1416
1417 if (result == NULL)
1418 return -2;
1419
1420 if (result == Py_NotImplemented) {
1421 Py_DECREF(result);
1422 return 2;
1423 }
1424
1425 l = PyInt_AsLong(result);
1426 Py_DECREF(result);
1427 if (l == -1 && PyErr_Occurred()) {
1428 PyErr_SetString(PyExc_TypeError,
1429 "comparison did not return an int");
1430 return -2;
1431 }
1432
1433 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001434}
1435
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001436/* Try a 3-way comparison, returning an int; either v or w is an instance.
1437 We first try a coercion. Return:
1438 -2 for an exception;
1439 -1 if v < w;
1440 0 if v == w;
1441 1 if v > w;
1442 2 if this particular 3-way comparison is not implemented or undefined.
1443 THIS IS ONLY CALLED FROM object.c!
1444*/
1445static int
1446instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001447{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001448 int c;
1449
1450 c = PyNumber_CoerceEx(&v, &w);
1451 if (c < 0)
1452 return -2;
1453 if (c == 0) {
1454 /* If neither is now an instance, use regular comparison */
1455 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1456 c = PyObject_Compare(v, w);
1457 Py_DECREF(v);
1458 Py_DECREF(w);
1459 if (PyErr_Occurred())
1460 return -2;
1461 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001462 }
1463 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001464 else {
1465 /* The coercion didn't do anything.
1466 Treat this the same as returning v and w unchanged. */
1467 Py_INCREF(v);
1468 Py_INCREF(w);
1469 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001470
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001471 if (PyInstance_Check(v)) {
1472 c = half_cmp(v, w);
1473 if (c <= 1) {
1474 Py_DECREF(v);
1475 Py_DECREF(w);
1476 return c;
1477 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001478 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001479 if (PyInstance_Check(w)) {
1480 c = half_cmp(w, v);
1481 if (c <= 1) {
1482 Py_DECREF(v);
1483 Py_DECREF(w);
1484 if (c >= -1)
1485 c = -c;
1486 return c;
1487 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001488 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001489 Py_DECREF(v);
1490 Py_DECREF(w);
1491 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001492}
1493
Guido van Rossum9bfef441993-03-29 10:43:31 +00001494static int
Fred Drake79912472000-07-09 04:06:11 +00001495instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001496{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001498 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001500
Guido van Rossum2878a691996-08-09 20:53:24 +00001501 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001502 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001503 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001505 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001506 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001507 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001509 /* Fall back to the default behavior:
1510 all instances are nonzero */
1511 return 1;
1512 }
1513 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 res = PyEval_CallObject(func, (PyObject *)NULL);
1515 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001516 if (res == NULL)
1517 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 if (!PyInt_Check(res)) {
1519 Py_DECREF(res);
1520 PyErr_SetString(PyExc_TypeError,
1521 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001522 return -1;
1523 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 outcome = PyInt_AsLong(res);
1525 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001526 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527 PyErr_SetString(PyExc_ValueError,
1528 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001529 return -1;
1530 }
1531 return outcome > 0;
1532}
1533
1534UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001535UNARY(instance_int, "__int__")
1536UNARY(instance_long, "__long__")
1537UNARY(instance_float, "__float__")
1538UNARY(instance_oct, "__oct__")
1539UNARY(instance_hex, "__hex__")
1540
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001541static PyObject *
1542bin_power(PyObject *v, PyObject *w)
1543{
1544 return PyNumber_Power(v, w, Py_None);
1545}
1546
Guido van Rossum03093a21994-09-28 15:51:32 +00001547/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001548static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001549instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001550{
1551 if (z == Py_None) {
1552 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001553 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001554 else {
1555 PyObject *func;
1556 PyObject *args;
1557 PyObject *result;
1558
1559 /* XXX Doesn't do coercions... */
1560 func = PyObject_GetAttrString(v, "__pow__");
1561 if (func == NULL)
1562 return NULL;
1563 args = Py_BuildValue("(OO)", w, z);
1564 if (args == NULL) {
1565 Py_DECREF(func);
1566 return NULL;
1567 }
1568 result = PyEval_CallObject(func, args);
1569 Py_DECREF(func);
1570 Py_DECREF(args);
1571 return result;
1572 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001573}
1574
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001575static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001576bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001577{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001578 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001579}
1580
1581
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001582static PyObject *
1583instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1584{
1585 if (z == Py_None) {
1586 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1587 "__rpow__", bin_inplace_power);
1588 }
1589 else {
1590 /* XXX Doesn't do coercions... */
1591 PyObject *func;
1592 PyObject *args;
1593 PyObject *result;
1594
1595 func = PyObject_GetAttrString(v, "__ipow__");
1596 if (func == NULL) {
1597 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1598 return NULL;
1599 PyErr_Clear();
1600 return instance_pow(v, w, z);
1601 }
1602 args = Py_BuildValue("(OO)", w, z);
1603 if (args == NULL) {
1604 Py_DECREF(func);
1605 return NULL;
1606 }
1607 result = PyEval_CallObject(func, args);
1608 Py_DECREF(func);
1609 Py_DECREF(args);
1610 return result;
1611 }
1612}
1613
1614
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001615/* Map rich comparison operators to their __xx__ namesakes */
1616static char *name_op[] = {
1617 "__lt__",
1618 "__le__",
1619 "__eq__",
1620 "__ne__",
1621 "__gt__",
1622 "__ge__",
1623};
1624
1625static PyObject *
1626half_richcompare(PyObject *v, PyObject *w, int op)
1627{
1628 PyObject *name;
1629 PyObject *method;
1630 PyObject *args;
1631 PyObject *res;
1632
1633 assert(PyInstance_Check(v));
1634
1635 name = PyString_InternFromString(name_op[op]);
1636 if (name == NULL)
1637 return NULL;
1638
1639 method = PyObject_GetAttr(v, name);
1640 Py_DECREF(name);
1641 if (method == NULL) {
1642 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1643 return NULL;
1644 PyErr_Clear();
1645 res = Py_NotImplemented;
1646 Py_INCREF(res);
1647 return res;
1648 }
1649
1650 args = Py_BuildValue("(O)", w);
1651 if (args == NULL) {
1652 Py_DECREF(method);
1653 return NULL;
1654 }
1655
1656 res = PyEval_CallObject(method, args);
1657 Py_DECREF(args);
1658 Py_DECREF(method);
1659
1660 return res;
1661}
1662
1663/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1664static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1665
1666static PyObject *
1667instance_richcompare(PyObject *v, PyObject *w, int op)
1668{
1669 PyObject *res;
1670
1671 if (PyInstance_Check(v)) {
1672 res = half_richcompare(v, w, op);
1673 if (res != Py_NotImplemented)
1674 return res;
1675 Py_DECREF(res);
1676 }
1677
1678 if (PyInstance_Check(w)) {
1679 res = half_richcompare(w, v, swapped_op[op]);
1680 if (res != Py_NotImplemented)
1681 return res;
1682 Py_DECREF(res);
1683 }
1684
1685 Py_INCREF(Py_NotImplemented);
1686 return Py_NotImplemented;
1687}
1688
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001689
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001691 (binaryfunc)instance_add, /* nb_add */
1692 (binaryfunc)instance_sub, /* nb_subtract */
1693 (binaryfunc)instance_mul, /* nb_multiply */
1694 (binaryfunc)instance_div, /* nb_divide */
1695 (binaryfunc)instance_mod, /* nb_remainder */
1696 (binaryfunc)instance_divmod, /* nb_divmod */
1697 (ternaryfunc)instance_pow, /* nb_power */
1698 (unaryfunc)instance_neg, /* nb_negative */
1699 (unaryfunc)instance_pos, /* nb_positive */
1700 (unaryfunc)instance_abs, /* nb_absolute */
1701 (inquiry)instance_nonzero, /* nb_nonzero */
1702 (unaryfunc)instance_invert, /* nb_invert */
1703 (binaryfunc)instance_lshift, /* nb_lshift */
1704 (binaryfunc)instance_rshift, /* nb_rshift */
1705 (binaryfunc)instance_and, /* nb_and */
1706 (binaryfunc)instance_xor, /* nb_xor */
1707 (binaryfunc)instance_or, /* nb_or */
1708 (coercion)instance_coerce, /* nb_coerce */
1709 (unaryfunc)instance_int, /* nb_int */
1710 (unaryfunc)instance_long, /* nb_long */
1711 (unaryfunc)instance_float, /* nb_float */
1712 (unaryfunc)instance_oct, /* nb_oct */
1713 (unaryfunc)instance_hex, /* nb_hex */
1714 (binaryfunc)instance_iadd, /* nb_inplace_add */
1715 (binaryfunc)instance_isub, /* nb_inplace_subtract */
1716 (binaryfunc)instance_imul, /* nb_inplace_multiply */
1717 (binaryfunc)instance_idiv, /* nb_inplace_divide */
1718 (binaryfunc)instance_imod, /* nb_inplace_remainder */
1719 (ternaryfunc)instance_ipow, /* nb_inplace_power */
1720 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
1721 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
1722 (binaryfunc)instance_iand, /* nb_inplace_and */
1723 (binaryfunc)instance_ixor, /* nb_inplace_xor */
1724 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001725};
1726
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727PyTypeObject PyInstance_Type = {
1728 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001729 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001730 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001731 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001732 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001733 (destructor)instance_dealloc, /* tp_dealloc */
1734 0, /* tp_print */
1735 0, /* tp_getattr */
1736 0, /* tp_setattr */
1737 instance_compare, /* tp_compare */
1738 (reprfunc)instance_repr, /* tp_repr */
1739 &instance_as_number, /* tp_as_number */
1740 &instance_as_sequence, /* tp_as_sequence */
1741 &instance_as_mapping, /* tp_as_mapping */
1742 (hashfunc)instance_hash, /* tp_hash */
1743 0, /* tp_call */
1744 0, /* tp_str */
1745 (getattrofunc)instance_getattr, /* tp_getattro */
1746 (setattrofunc)instance_setattr, /* tp_setattro */
1747 0, /* tp_as_buffer */
1748 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
1749 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00001750 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001751 0, /* tp_clear */
1752 instance_richcompare, /* tp_richcompare */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001753};
1754
1755
Guido van Rossum81daa321993-05-20 14:24:46 +00001756/* Instance method objects are used for two purposes:
1757 (a) as bound instance methods (returned by instancename.methodname)
1758 (b) as unbound methods (returned by ClassName.methodname)
1759 In case (b), im_self is NULL
1760*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001761
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001762static PyMethodObject *free_list;
1763
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001764PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001765PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001766{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001767 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001768 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001770 return NULL;
1771 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001772 im = free_list;
1773 if (im != NULL) {
1774 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001775 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001776 }
1777 else {
1778 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1779 if (im == NULL)
1780 return NULL;
1781 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001782 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001783 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001785 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001787 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001788 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001790}
1791
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001792PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001793PyMethod_Function(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001794{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001795 if (!PyMethod_Check(im)) {
1796 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001797 return NULL;
1798 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001800}
1801
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001803PyMethod_Self(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001804{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001805 if (!PyMethod_Check(im)) {
1806 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001807 return NULL;
1808 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001809 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001810}
1811
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001813PyMethod_Class(register PyObject *im)
Guido van Rossum81daa321993-05-20 14:24:46 +00001814{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815 if (!PyMethod_Check(im)) {
1816 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001817 return NULL;
1818 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001820}
1821
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001822/* Class method methods */
1823
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001824#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001825
Guido van Rossume8122f11991-05-05 20:03:07 +00001826static struct memberlist instancemethod_memberlist[] = {
1827 {"im_func", T_OBJECT, OFF(im_func)},
1828 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001829 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001830 /* Dummies that are not handled by getattr() except for __members__ */
1831 {"__doc__", T_INT, 0},
1832 {"__name__", T_INT, 0},
Barry Warsawd6a9e842001-01-15 20:40:19 +00001833 {"__dict__", T_OBJECT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001834 {NULL} /* Sentinel */
1835};
1836
Barry Warsawd6a9e842001-01-15 20:40:19 +00001837static int
1838instancemethod_setattro(register PyMethodObject *im, PyObject *name,
1839 PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001840{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001841 char *sname = PyString_AsString(name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00001842
1843 if (PyEval_GetRestricted() ||
1844 strcmp(sname, "im_func") == 0 ||
1845 strcmp(sname, "im_self") == 0 ||
1846 strcmp(sname, "im_class") == 0)
1847 {
1848 PyErr_Format(PyExc_TypeError, "read-only attribute: %s",
1849 sname);
1850 return -1;
1851 }
1852 if (im->im_self != NULL) {
1853 PyErr_Format(PyExc_TypeError,
1854 "cannot set attributes through bound methods");
1855 return -1;
1856 }
1857 return PyObject_SetAttr(im->im_func, name, v);
1858}
1859
1860
1861static PyObject *
1862instancemethod_getattro(register PyMethodObject *im, PyObject *name)
1863{
1864 PyObject *rtn;
1865 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001866 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001867 /* Inherit __name__ and __doc__ from the callable object
1868 implementing the method */
1869 if (strcmp(sname, "__name__") == 0 ||
1870 strcmp(sname, "__doc__") == 0)
1871 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001872 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001873 if (PyEval_GetRestricted()) {
1874 PyErr_SetString(PyExc_RuntimeError,
1875 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001876 return NULL;
1877 }
Barry Warsawd6a9e842001-01-15 20:40:19 +00001878 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0)
1879 return PyObject_GetAttr(im->im_func, name);
1880
1881 rtn = PyMember_Get((char *)im, instancemethod_memberlist, sname);
1882 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1883 PyErr_Clear();
1884 rtn = PyObject_GetAttr(im->im_func, name);
1885 }
1886 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001887}
1888
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001889static void
Fred Drake79912472000-07-09 04:06:11 +00001890instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001891{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001892 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001893 Py_DECREF(im->im_func);
1894 Py_XDECREF(im->im_self);
1895 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001896 im->im_self = (PyObject *)free_list;
1897 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001898}
1899
Guido van Rossumebc8c511992-09-03 20:39:51 +00001900static int
Fred Drake79912472000-07-09 04:06:11 +00001901instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00001902{
Guido van Rossume9df7271995-04-06 14:46:51 +00001903 if (a->im_self != b->im_self)
1904 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001905 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001906}
1907
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001908static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001909instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00001910{
1911 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001912 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001913 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001914 PyClassObject *class = (PyClassObject *)(a->im_class);
1915 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001916 char *fcname, *icname, *fname;
1917 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001918 if (PyFunction_Check(func)) {
1919 funcname = ((PyFunctionObject *)func)->func_name;
1920 Py_INCREF(funcname);
1921 }
1922 else {
1923 funcname = PyObject_GetAttrString(func,"__name__");
1924 if (funcname == NULL)
1925 PyErr_Clear();
1926 }
1927 if (funcname != NULL && PyString_Check(funcname))
1928 fname = PyString_AS_STRING(funcname);
1929 else
1930 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001931 if (fclassname != NULL && PyString_Check(fclassname))
1932 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001933 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001934 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001935 if (self == NULL)
1936 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1937 else {
1938 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001939 if (iclassname != NULL && PyString_Check(iclassname))
1940 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001941 else
1942 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001943 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1944 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001945 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001946 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001947 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001948}
1949
Guido van Rossum9bfef441993-03-29 10:43:31 +00001950static long
Fred Drake79912472000-07-09 04:06:11 +00001951instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001952{
1953 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001954 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001955 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001956 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001957 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001958 if (x == -1)
1959 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001960 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001961 if (y == -1)
1962 return -1;
1963 return x ^ y;
1964}
1965
Jeremy Hylton8caad492000-06-23 14:18:11 +00001966static int
1967instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1968{
1969 int err;
1970 if (im->im_func) {
1971 err = visit(im->im_func, arg);
1972 if (err)
1973 return err;
1974 }
1975 if (im->im_self) {
1976 err = visit(im->im_self, arg);
1977 if (err)
1978 return err;
1979 }
1980 if (im->im_class) {
1981 err = visit(im->im_class, arg);
1982 if (err)
1983 return err;
1984 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001985 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001986}
1987
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001988PyTypeObject PyMethod_Type = {
1989 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001990 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001991 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001992 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001993 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001994 (destructor)instancemethod_dealloc, /* tp_dealloc */
1995 0, /* tp_print */
1996 0, /* tp_getattr */
1997 0, /* tp_setattr */
1998 (cmpfunc)instancemethod_compare, /* tp_compare */
1999 (reprfunc)instancemethod_repr, /* tp_repr */
2000 0, /* tp_as_number */
2001 0, /* tp_as_sequence */
2002 0, /* tp_as_mapping */
2003 (hashfunc)instancemethod_hash, /* tp_hash */
2004 0, /* tp_call */
2005 0, /* tp_str */
2006 (getattrofunc)instancemethod_getattro, /* tp_getattro */
2007 (setattrofunc)instancemethod_setattro, /* tp_setattro */
2008 0, /* tp_as_buffer */
2009 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
2010 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002011 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002012};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002013
2014/* Clear out the free list */
2015
2016void
Fred Drake79912472000-07-09 04:06:11 +00002017PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002018{
2019 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002020 PyMethodObject *im = free_list;
2021 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00002022 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002023 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002024 }
2025}