blob: dd2a40b68f5c55cad49b42b4408903a008e4aabb [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)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000039 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000040 "PyClass_New: name must be a string");
41 return NULL;
42 }
43 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000045 "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)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000070 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000071 "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))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000077 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000078 "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 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000084 op = PyObject_GC_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);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000105 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
Tim Peters6d6c1a32001-08-02 04:15:00 +0000109static PyObject *
110class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
111{
112 PyObject *name, *bases, *dict;
113 static char *kwlist[] = {"name", "bases", "dict", 0};
114
115 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
116 &name, &bases, &dict))
117 return NULL;
118 return PyClass_New(bases, dict, name);
119}
120
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121/* Class methods */
122
123static void
Fred Drake79912472000-07-09 04:06:11 +0000124class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000126 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 Py_DECREF(op->cl_bases);
128 Py_DECREF(op->cl_dict);
129 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000130 Py_XDECREF(op->cl_getattr);
131 Py_XDECREF(op->cl_setattr);
132 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000133 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134}
135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000137class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000138{
139 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000141 if (value != NULL) {
142 *pclass = cp;
143 return value;
144 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000146 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000147 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 PyObject *v = class_lookup(
149 (PyClassObject *)
150 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000151 if (v != NULL)
152 return v;
153 }
154 return NULL;
155}
156
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000158class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 register PyObject *v;
161 register char *sname = PyString_AsString(name);
162 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163 descrgetfunc f;
164
Guido van Rossum2878a691996-08-09 20:53:24 +0000165 if (sname[0] == '_' && sname[1] == '_') {
166 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 if (PyEval_GetRestricted()) {
168 PyErr_SetString(PyExc_RuntimeError,
169 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000170 return NULL;
171 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000172 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000173 return op->cl_dict;
174 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000175 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000177 return op->cl_bases;
178 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000179 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000180 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000182 else
183 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000185 return v;
186 }
Guido van Rossum94308391991-10-20 20:11:48 +0000187 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000188 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000189 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000190 PyErr_Format(PyExc_AttributeError,
191 "class %.50s has no attribute '%.400s'",
192 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000193 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000195 f = v->ob_type->tp_descr_get;
196 if (f == NULL)
197 Py_INCREF(v);
198 else
199 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000200 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201}
202
Guido van Rossuma63eff61998-05-29 21:37:21 +0000203static void
Fred Drake79912472000-07-09 04:06:11 +0000204set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000205{
206 PyObject *temp = *slot;
207 Py_XINCREF(v);
208 *slot = v;
209 Py_XDECREF(temp);
210}
211
Guido van Rossum7ba30431998-07-08 13:34:48 +0000212static void
Fred Drake79912472000-07-09 04:06:11 +0000213set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000214{
215 PyClassObject *dummy;
216
217 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
218 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
219 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
220}
221
Guido van Rossuma63eff61998-05-29 21:37:21 +0000222static char *
Fred Drake79912472000-07-09 04:06:11 +0000223set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000224{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000225 if (v == NULL || !PyDict_Check(v))
226 return "__dict__ must be a dictionary object";
227 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000228 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000229 return "";
230}
231
232static char *
Fred Drake79912472000-07-09 04:06:11 +0000233set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000234{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000235 int i, n;
236
237 if (v == NULL || !PyTuple_Check(v))
238 return "__bases__ must be a tuple object";
239 n = PyTuple_Size(v);
240 for (i = 0; i < n; i++) {
241 PyObject *x = PyTuple_GET_ITEM(v, i);
242 if (!PyClass_Check(x))
243 return "__bases__ items must be classes";
244 if (PyClass_IsSubclass(x, (PyObject *)c))
245 return "a __bases__ item causes an inheritance cycle";
246 }
247 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000248 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000249 return "";
250}
251
252static char *
Fred Drake79912472000-07-09 04:06:11 +0000253set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000254{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000255 if (v == NULL || !PyString_Check(v))
256 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000257 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000258 return "__name__ must not contain null bytes";
259 set_slot(&c->cl_name, v);
260 return "";
261}
262
Guido van Rossum94308391991-10-20 20:11:48 +0000263static int
Fred Drake79912472000-07-09 04:06:11 +0000264class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000265{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000266 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 if (PyEval_GetRestricted()) {
268 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000269 "classes are read-only in restricted mode");
270 return -1;
271 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000272 sname = PyString_AsString(name);
273 if (sname[0] == '_' && sname[1] == '_') {
274 int n = PyString_Size(name);
275 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000276 char *err = NULL;
277 if (strcmp(sname, "__dict__") == 0)
278 err = set_dict(op, v);
279 else if (strcmp(sname, "__bases__") == 0)
280 err = set_bases(op, v);
281 else if (strcmp(sname, "__name__") == 0)
282 err = set_name(op, v);
283 else if (strcmp(sname, "__getattr__") == 0)
284 set_slot(&op->cl_getattr, v);
285 else if (strcmp(sname, "__setattr__") == 0)
286 set_slot(&op->cl_setattr, v);
287 else if (strcmp(sname, "__delattr__") == 0)
288 set_slot(&op->cl_delattr, v);
289 /* For the last three, we fall through to update the
290 dictionary as well. */
291 if (err != NULL) {
292 if (*err == '\0')
293 return 0;
294 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000295 return -1;
296 }
297 }
298 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000299 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000301 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000302 PyErr_Format(PyExc_AttributeError,
303 "class %.50s has no attribute '%.400s'",
304 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000305 return rv;
306 }
Guido van Rossum94308391991-10-20 20:11:48 +0000307 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000309}
310
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000312class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000313{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000314 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000315 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000317 name = "?";
318 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000320 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000321 return PyString_FromFormat("<class ?.s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000322 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000323 return PyString_FromFormat("<class %s.%s at %p>",
324 PyString_AsString(mod),
325 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000326}
327
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000328static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000329class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000330{
331 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
332 PyObject *name = op->cl_name;
333 PyObject *res;
334 int m, n;
335
336 if (name == NULL || !PyString_Check(name))
337 return class_repr(op);
338 if (mod == NULL || !PyString_Check(mod)) {
339 Py_INCREF(name);
340 return name;
341 }
342 m = PyString_Size(mod);
343 n = PyString_Size(name);
344 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
345 if (res != NULL) {
346 char *s = PyString_AsString(res);
347 memcpy(s, PyString_AsString(mod), m);
348 s += m;
349 *s++ = '.';
350 memcpy(s, PyString_AsString(name), n);
351 }
352 return res;
353}
354
Jeremy Hylton8caad492000-06-23 14:18:11 +0000355static int
356class_traverse(PyClassObject *o, visitproc visit, void *arg)
357{
358 int err;
359 if (o->cl_bases) {
360 err = visit(o->cl_bases, arg);
361 if (err)
362 return err;
363 }
364 if (o->cl_dict) {
365 err = visit(o->cl_dict, arg);
366 if (err)
367 return err;
368 }
369 if (o->cl_name) {
370 err = visit(o->cl_name, arg);
371 if (err)
372 return err;
373 }
374 if (o->cl_getattr) {
375 err = visit(o->cl_getattr, arg);
376 if (err)
377 return err;
378 }
379 if (o->cl_setattr) {
380 err = visit(o->cl_setattr, arg);
381 if (err)
382 return err;
383 }
384 if (o->cl_delattr) {
385 err = visit(o->cl_delattr, arg);
386 if (err)
387 return err;
388 }
389 return 0;
390}
391
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392PyTypeObject PyClass_Type = {
393 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394 0,
395 "class",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000396 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000398 (destructor)class_dealloc, /* tp_dealloc */
399 0, /* tp_print */
400 0, /* tp_getattr */
401 0, /* tp_setattr */
402 0, /* tp_compare */
403 (reprfunc)class_repr, /* tp_repr */
404 0, /* tp_as_number */
405 0, /* tp_as_sequence */
406 0, /* tp_as_mapping */
407 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000408 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000409 (reprfunc)class_str, /* tp_str */
410 (getattrofunc)class_getattr, /* tp_getattro */
411 (setattrofunc)class_setattr, /* tp_setattro */
412 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000413 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000414 0, /* tp_doc */
415 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000416 0, /* tp_clear */
417 0, /* tp_richcompare */
418 0, /* tp_weaklistoffset */
419 0, /* tp_iter */
420 0, /* tp_iternext */
421 0, /* tp_methods */
422 0, /* tp_members */
423 0, /* tp_getset */
424 0, /* tp_base */
425 0, /* tp_dict */
426 0, /* tp_descr_get */
427 0, /* tp_descr_set */
428 0, /* tp_dictoffset */
429 0, /* tp_init */
430 0, /* tp_alloc */
431 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432};
433
Guido van Rossum81daa321993-05-20 14:24:46 +0000434int
Fred Drake79912472000-07-09 04:06:11 +0000435PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000436{
437 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000439 if (class == base)
440 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000442 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 cp = (PyClassObject *)class;
444 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000445 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000447 return 1;
448 }
449 return 0;
450}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451
Guido van Rossum81daa321993-05-20 14:24:46 +0000452
453/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000456PyInstance_NewRaw(PyObject *klass, PyObject *dict)
457{
458 PyInstanceObject *inst;
459
460 if (!PyClass_Check(klass)) {
461 PyErr_BadInternalCall();
462 return NULL;
463 }
464 if (dict == NULL) {
465 dict = PyDict_New();
466 if (dict == NULL)
467 return NULL;
468 }
469 else {
470 if (!PyDict_Check(dict)) {
471 PyErr_BadInternalCall();
472 return NULL;
473 }
474 Py_INCREF(dict);
475 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000476 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000477 if (inst == NULL) {
478 Py_DECREF(dict);
479 return NULL;
480 }
Fred Drake4e262a92001-03-22 18:26:47 +0000481 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000482 Py_INCREF(klass);
483 inst->in_class = (PyClassObject *)klass;
484 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000485 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000486 return (PyObject *)inst;
487}
488
489PyObject *
490PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 register PyInstanceObject *inst;
493 PyObject *init;
494 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000495
496 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000497 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000499 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000500 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000501 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000502 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 if ((arg != NULL && (!PyTuple_Check(arg) ||
504 PyTuple_Size(arg) != 0))
505 || (kw != NULL && (!PyDict_Check(kw) ||
506 PyDict_Size(kw) != 0))) {
507 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000508 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000510 inst = NULL;
511 }
512 }
513 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
515 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000516 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000518 inst = NULL;
519 }
520 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 if (res != Py_None) {
522 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000523 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000525 inst = NULL;
526 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 }
529 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531}
532
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000533/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534
535static void
Fred Drake79912472000-07-09 04:06:11 +0000536instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 PyObject *error_type, *error_value, *error_traceback;
539 PyObject *del;
540 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000541#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000542 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000543#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000544 _PyObject_GC_UNTRACK(inst);
Fred Drakeb60654b2001-02-26 18:56:37 +0000545 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000546
Tim Peters6b184912000-09-17 14:40:17 +0000547 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000548#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000549#ifndef Py_REF_DEBUG
550# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
551#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000552 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000554 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000555#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000556 /* compensate for boost in _Py_NewReference; note that
557 * _Py_RefTotal was also boosted; we'll knock that down later.
558 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000559 inst->ob_type->tp_allocs--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000560#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000561#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000562 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000564#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000565
566 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000568 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000569 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000570 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000571 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000573 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000574 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000575 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 Py_DECREF(res);
577 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000578 }
Tim Peters6b184912000-09-17 14:40:17 +0000579 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000581 /* Undo the temporary resurrection; can't use DECREF here, it would
582 * cause a recursive call.
583 */
584#ifdef Py_REF_DEBUG
585 /* _Py_RefTotal was boosted either by _Py_NewReference or
586 * Py_INCREF above.
587 */
588 _Py_RefTotal--;
589#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000590 if (--inst->ob_refcnt > 0) {
591#ifdef COUNT_ALLOCS
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 inst->ob_type->tp_frees--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000593#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000594 _PyObject_GC_TRACK(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000595 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000596 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000597#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000598 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000599#ifdef COUNT_ALLOCS
600 /* compensate for increment in _Py_ForgetReference */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000601 inst->ob_type->tp_frees--;
Tim Peters6b184912000-09-17 14:40:17 +0000602#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000603#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000604 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000605#endif
Tim Peters6b184912000-09-17 14:40:17 +0000606#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 Py_DECREF(inst->in_class);
608 Py_XDECREF(inst->in_dict);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000609 PyObject_GC_Del(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000610}
611
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000613instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 register PyObject *v;
616 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000617 if (sname[0] == '_' && sname[1] == '_') {
618 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 if (PyEval_GetRestricted()) {
620 PyErr_SetString(PyExc_RuntimeError,
621 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000622 return NULL;
623 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000625 return inst->in_dict;
626 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000627 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 Py_INCREF(inst->in_class);
629 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000630 }
Guido van Rossum94308391991-10-20 20:11:48 +0000631 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000632 v = instance_getattr2(inst, name);
633 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000634 PyErr_Format(PyExc_AttributeError,
635 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000636 PyString_AS_STRING(inst->in_class->cl_name), sname);
637 }
638 return v;
639}
640
641static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000642instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000643{
644 register PyObject *v;
645 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000646 descrgetfunc f;
647
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000649 if (v != NULL) {
650 Py_INCREF(v);
651 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652 }
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000653 v = class_lookup(inst->in_class, name, &class);
654 if (v != NULL) {
655 Py_INCREF(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656 f = v->ob_type->tp_descr_get;
657 if (f != NULL) {
658 PyObject *w = f(v, (PyObject *)inst,
659 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000661 v = w;
662 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000663 }
664 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000665}
666
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000668instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000669{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000671 res = instance_getattr1(inst, name);
672 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 PyObject *args;
674 PyErr_Clear();
675 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000676 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000677 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 res = PyEval_CallObject(func, args);
679 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000680 }
681 return res;
682}
683
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000684static int
Fred Drake79912472000-07-09 04:06:11 +0000685instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686{
Guido van Rossum94472a01992-09-04 09:45:18 +0000687 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000689 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000690 PyErr_Format(PyExc_AttributeError,
691 "%.50s instance has no attribute '%.400s'",
692 PyString_AS_STRING(inst->in_class->cl_name),
693 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000694 return rv;
695 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000696 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698}
699
Guido van Rossume7737541994-09-05 07:31:41 +0000700static int
Fred Drake79912472000-07-09 04:06:11 +0000701instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000702{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000703 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000705 if (sname[0] == '_' && sname[1] == '_') {
706 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000707 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000708 if (strcmp(sname, "__dict__") == 0) {
709 if (PyEval_GetRestricted()) {
710 PyErr_SetString(PyExc_RuntimeError,
711 "__dict__ not accessible in restricted mode");
712 return -1;
713 }
714 if (v == NULL || !PyDict_Check(v)) {
715 PyErr_SetString(PyExc_TypeError,
716 "__dict__ must be set to a dictionary");
717 return -1;
718 }
719 tmp = inst->in_dict;
720 Py_INCREF(v);
721 inst->in_dict = v;
722 Py_DECREF(tmp);
723 return 0;
724 }
725 if (strcmp(sname, "__class__") == 0) {
726 if (PyEval_GetRestricted()) {
727 PyErr_SetString(PyExc_RuntimeError,
728 "__class__ not accessible in restricted mode");
729 return -1;
730 }
731 if (v == NULL || !PyClass_Check(v)) {
732 PyErr_SetString(PyExc_TypeError,
733 "__class__ must be set to a class");
734 return -1;
735 }
736 tmp = (PyObject *)(inst->in_class);
737 Py_INCREF(v);
738 inst->in_class = (PyClassObject *)v;
739 Py_DECREF(tmp);
740 return 0;
741 }
Guido van Rossume7737541994-09-05 07:31:41 +0000742 }
Guido van Rossume7737541994-09-05 07:31:41 +0000743 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000744 if (v == NULL)
745 func = inst->in_class->cl_delattr;
746 else
747 func = inst->in_class->cl_setattr;
748 if (func == NULL)
749 return instance_setattr1(inst, name, v);
750 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000752 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000754 if (args == NULL)
755 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 res = PyEval_CallObject(func, args);
757 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000758 if (res == NULL)
759 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000761 return 0;
762}
763
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000765instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 PyObject *func;
768 PyObject *res;
769 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000770
Guido van Rossum2878a691996-08-09 20:53:24 +0000771 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000772 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000773 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000774 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000776 PyObject *mod = PyDict_GetItemString(
777 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000778 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 if (classname != NULL && PyString_Check(classname))
780 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000781 else
782 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000784 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000785 return PyString_FromFormat("<?.%s instance at %p>",
786 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000787 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000788 return PyString_FromFormat("<%s.%s instance at %p>",
789 PyString_AsString(mod),
790 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000791 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 res = PyEval_CallObject(func, (PyObject *)NULL);
793 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794 return res;
795}
796
Guido van Rossum82c690f2001-04-30 14:39:18 +0000797static PyObject *
798instance_str(PyInstanceObject *inst)
799{
800 PyObject *func;
801 PyObject *res;
802 static PyObject *strstr;
803
804 if (strstr == NULL)
805 strstr = PyString_InternFromString("__str__");
806 func = instance_getattr(inst, strstr);
807 if (func == NULL) {
808 PyErr_Clear();
809 return instance_repr(inst);
810 }
811 res = PyEval_CallObject(func, (PyObject *)NULL);
812 Py_DECREF(func);
813 return res;
814}
815
Guido van Rossum9bfef441993-03-29 10:43:31 +0000816static long
Fred Drake79912472000-07-09 04:06:11 +0000817instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000818{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 PyObject *func;
820 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000821 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000822 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000823
Guido van Rossum2878a691996-08-09 20:53:24 +0000824 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000825 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000826 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000827 if (func == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000828 /* If there is no __eq__ and no __cmp__ method, we hash on the
829 address. If an __eq__ or __cmp__ method exists, there must
830 be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000832 if (eqstr == NULL)
833 eqstr = PyString_InternFromString("__eq__");
834 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000835 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000837 if (cmpstr == NULL)
838 cmpstr = PyString_InternFromString("__cmp__");
839 func = instance_getattr(inst, cmpstr);
840 if (func == NULL) {
841 PyErr_Clear();
842 return _Py_HashPointer(inst);
843 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000844 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000846 return -1;
847 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 res = PyEval_CallObject(func, (PyObject *)NULL);
849 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000850 if (res == NULL)
851 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 if (PyInt_Check(res)) {
853 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000854 if (outcome == -1)
855 outcome = -2;
856 }
857 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 PyErr_SetString(PyExc_TypeError,
859 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000860 outcome = -1;
861 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000863 return outcome;
864}
865
Jeremy Hylton8caad492000-06-23 14:18:11 +0000866static int
867instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
868{
869 int err;
870 if (o->in_class) {
871 err = visit((PyObject *)(o->in_class), arg);
872 if (err)
873 return err;
874 }
875 if (o->in_dict) {
876 err = visit(o->in_dict, arg);
877 if (err)
878 return err;
879 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000880 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000881}
882
Guido van Rossum213c7a62001-04-23 14:08:49 +0000883static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
884static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000885
Guido van Rossum9bfef441993-03-29 10:43:31 +0000886static int
Fred Drake79912472000-07-09 04:06:11 +0000887instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 PyObject *func;
890 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000891 int outcome;
892
Guido van Rossum2878a691996-08-09 20:53:24 +0000893 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000894 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000895 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000896 if (func == NULL)
897 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 res = PyEval_CallObject(func, (PyObject *)NULL);
899 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000900 if (res == NULL)
901 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 if (PyInt_Check(res)) {
903 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000904 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 PyErr_SetString(PyExc_ValueError,
906 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000907 }
908 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyErr_SetString(PyExc_TypeError,
910 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000911 outcome = -1;
912 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914 return outcome;
915}
916
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000918instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920 PyObject *func;
921 PyObject *arg;
922 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000925 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000926 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927 if (func == NULL)
928 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000930 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932 return NULL;
933 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 res = PyEval_CallObject(func, arg);
935 Py_DECREF(func);
936 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000937 return res;
938}
939
Guido van Rossum9bfef441993-03-29 10:43:31 +0000940static int
Fred Drake79912472000-07-09 04:06:11 +0000941instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 PyObject *func;
944 PyObject *arg;
945 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000946
Guido van Rossum2878a691996-08-09 20:53:24 +0000947 if (value == NULL) {
948 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000949 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000950 func = instance_getattr(inst, delitemstr);
951 }
952 else {
953 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000954 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000955 func = instance_getattr(inst, setitemstr);
956 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957 if (func == NULL)
958 return -1;
959 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000963 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000965 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000966 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 res = PyEval_CallObject(func, arg);
968 Py_DECREF(func);
969 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000970 if (res == NULL)
971 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000973 return 0;
974}
975
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000977 (inquiry)instance_length, /* mp_length */
978 (binaryfunc)instance_subscript, /* mp_subscript */
979 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980};
981
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000983instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000984{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986
Guido van Rossum2878a691996-08-09 20:53:24 +0000987 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000988 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000989 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990 if (func == NULL)
991 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995 return NULL;
996 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 res = PyEval_CallObject(func, arg);
998 Py_DECREF(func);
999 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 return res;
1001}
1002
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +00001004sliceobj_from_intint(int i, int j)
1005{
1006 PyObject *start, *end, *res;
1007
1008 start = PyInt_FromLong((long)i);
1009 if (!start)
1010 return NULL;
1011
1012 end = PyInt_FromLong((long)j);
1013 if (!end) {
1014 Py_DECREF(start);
1015 return NULL;
1016 }
1017 res = PySlice_New(start, end, NULL);
1018 Py_DECREF(start);
1019 Py_DECREF(end);
1020 return res;
1021}
1022
1023
1024static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001025instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 PyObject *func, *arg, *res;
1028 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001029
Guido van Rossum2878a691996-08-09 20:53:24 +00001030 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001031 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001032 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001033
1034 if (func == NULL) {
1035 PyErr_Clear();
1036
1037 if (getitemstr == NULL)
1038 getitemstr = PyString_InternFromString("__getitem__");
1039 func = instance_getattr(inst, getitemstr);
1040 if (func == NULL)
1041 return NULL;
1042 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1043 } else
1044 arg = Py_BuildValue("(ii)", i, j);
1045
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 return NULL;
1049 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 res = PyEval_CallObject(func, arg);
1051 Py_DECREF(func);
1052 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053 return res;
1054}
1055
1056static int
Fred Drake79912472000-07-09 04:06:11 +00001057instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001060
Guido van Rossum2878a691996-08-09 20:53:24 +00001061 if (item == NULL) {
1062 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001063 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001064 func = instance_getattr(inst, delitemstr);
1065 }
1066 else {
1067 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001068 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001069 func = instance_getattr(inst, setitemstr);
1070 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001071 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001072 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001077 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001079 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 res = PyEval_CallObject(func, arg);
1082 Py_DECREF(func);
1083 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001084 if (res == NULL)
1085 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001087 return 0;
1088}
1089
1090static int
Fred Drake79912472000-07-09 04:06:11 +00001091instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001093 PyObject *func, *arg, *res;
1094 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001095
Guido van Rossum2878a691996-08-09 20:53:24 +00001096 if (value == NULL) {
1097 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 delslicestr =
1099 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001100 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001101 if (func == NULL) {
1102 PyErr_Clear();
1103 if (delitemstr == NULL)
1104 delitemstr =
1105 PyString_InternFromString("__delitem__");
1106 func = instance_getattr(inst, delitemstr);
1107 if (func == NULL)
1108 return -1;
1109
1110 arg = Py_BuildValue("(N)",
1111 sliceobj_from_intint(i, j));
1112 } else
1113 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001114 }
1115 else {
1116 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 setslicestr =
1118 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001119 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001120 if (func == NULL) {
1121 PyErr_Clear();
1122 if (setitemstr == NULL)
1123 setitemstr =
1124 PyString_InternFromString("__setitem__");
1125 func = instance_getattr(inst, setitemstr);
1126 if (func == NULL)
1127 return -1;
1128
1129 arg = Py_BuildValue("(NO)",
1130 sliceobj_from_intint(i, j), value);
1131 } else
1132 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001133 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001136 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 res = PyEval_CallObject(func, arg);
1139 Py_DECREF(func);
1140 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001141 if (res == NULL)
1142 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001144 return 0;
1145}
1146
Tim Peterscb8d3682001-05-05 21:05:01 +00001147static int
1148instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001149{
1150 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001151 PyObject *func;
1152
1153 /* Try __contains__ first.
1154 * If that can't be done, try iterator-based searching.
1155 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001156
1157 if(__contains__ == NULL) {
1158 __contains__ = PyString_InternFromString("__contains__");
1159 if(__contains__ == NULL)
1160 return -1;
1161 }
1162 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001163 if (func) {
1164 PyObject *res;
1165 int ret;
1166 PyObject *arg = Py_BuildValue("(O)", member);
1167 if(arg == NULL) {
1168 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001169 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001170 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001171 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001172 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001173 Py_DECREF(arg);
1174 if(res == NULL)
1175 return -1;
1176 ret = PyObject_IsTrue(res);
1177 Py_DECREF(res);
1178 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001179 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001180
1181 /* Couldn't find __contains__. */
1182 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1183 /* Assume the failure was simply due to that there is no
1184 * __contains__ attribute, and try iterating instead.
1185 */
1186 PyErr_Clear();
1187 return _PySequence_IterContains((PyObject *)inst, member);
1188 }
1189 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001190 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001191}
1192
Fred Drake79912472000-07-09 04:06:11 +00001193static PySequenceMethods
1194instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001195 (inquiry)instance_length, /* sq_length */
1196 0, /* sq_concat */
1197 0, /* sq_repeat */
1198 (intargfunc)instance_item, /* sq_item */
1199 (intintargfunc)instance_slice, /* sq_slice */
1200 (intobjargproc)instance_ass_item, /* sq_ass_item */
1201 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1202 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001203};
1204
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001206generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001207{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209
1210 if ((func = instance_getattr(self, methodname)) == NULL)
1211 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 res = PyEval_CallObject(func, (PyObject *)NULL);
1213 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001214 return res;
1215}
1216
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001217static PyObject *
1218generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001219{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001220 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001222 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001223 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001224 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001225 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001227 Py_INCREF(Py_NotImplemented);
1228 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001229 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001231 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001233 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001234 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001235 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 Py_DECREF(args);
1237 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001238 return result;
1239}
1240
1241
1242static PyObject *coerce_obj;
1243
1244/* Try one half of a binary operator involving a class instance. */
1245static PyObject *
1246half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1247 int swapped)
1248{
1249 PyObject *args;
1250 PyObject *coercefunc;
1251 PyObject *coerced = NULL;
1252 PyObject *v1;
1253 PyObject *result;
1254
1255 if (!PyInstance_Check(v)) {
1256 Py_INCREF(Py_NotImplemented);
1257 return Py_NotImplemented;
1258 }
1259
1260 if (coerce_obj == NULL) {
1261 coerce_obj = PyString_InternFromString("__coerce__");
1262 if (coerce_obj == NULL)
1263 return NULL;
1264 }
1265 coercefunc = PyObject_GetAttr(v, coerce_obj);
1266 if (coercefunc == NULL) {
1267 PyErr_Clear();
1268 return generic_binary_op(v, w, opname);
1269 }
1270
1271 args = Py_BuildValue("(O)", w);
1272 if (args == NULL) {
1273 return NULL;
1274 }
1275 coerced = PyEval_CallObject(coercefunc, args);
1276 Py_DECREF(args);
1277 Py_DECREF(coercefunc);
1278 if (coerced == NULL) {
1279 return NULL;
1280 }
1281 if (coerced == Py_None || coerced == Py_NotImplemented) {
1282 Py_DECREF(coerced);
1283 return generic_binary_op(v, w, opname);
1284 }
1285 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1286 Py_DECREF(coerced);
1287 PyErr_SetString(PyExc_TypeError,
1288 "coercion should return None or 2-tuple");
1289 return NULL;
1290 }
1291 v1 = PyTuple_GetItem(coerced, 0);
1292 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001293 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001294 /* prevent recursion if __coerce__ returns self as the first
1295 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001296 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001297 } else {
1298 if (swapped)
1299 result = (thisfunc)(w, v1);
1300 else
1301 result = (thisfunc)(v1, w);
1302 }
1303 Py_DECREF(coerced);
1304 return result;
1305}
1306
1307/* Implement a binary operator involving at least one class instance. */
1308static PyObject *
1309do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1310 binaryfunc thisfunc)
1311{
1312 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1313 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001314 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001315 result = half_binop(w, v, ropname, thisfunc, 1);
1316 }
1317 return result;
1318}
1319
1320static PyObject *
1321do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1322 char *ropname, binaryfunc thisfunc)
1323{
1324 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1325 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001326 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001327 result = do_binop(v, w, opname, ropname, thisfunc);
1328 }
1329 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001330}
1331
Guido van Rossum879c5811995-01-10 15:24:06 +00001332static int
Fred Drake79912472000-07-09 04:06:11 +00001333instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001334{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 PyObject *v = *pv;
1336 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001337 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 PyObject *args;
1339 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001340
Guido van Rossum2878a691996-08-09 20:53:24 +00001341 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001342 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001343 if (coerce_obj == NULL)
1344 return -1;
1345 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001346 coercefunc = PyObject_GetAttr(v, coerce_obj);
1347 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001348 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001350 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001351 }
1352 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001354 if (args == NULL) {
1355 return -1;
1356 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001357 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001359 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001360 if (coerced == NULL) {
1361 /* __coerce__ call raised an exception */
1362 return -1;
1363 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001364 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001365 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001367 return 1;
1368 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001370 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 Py_DECREF(coerced);
1372 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001373 "coercion should return None or 2-tuple");
1374 return -1;
1375 }
1376 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377 *pv = PyTuple_GetItem(coerced, 0);
1378 *pw = PyTuple_GetItem(coerced, 1);
1379 Py_INCREF(*pv);
1380 Py_INCREF(*pw);
1381 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001382 return 0;
1383}
1384
Guido van Rossum04691fc1992-08-12 15:35:34 +00001385#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001386static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001388 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001389 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001390}
1391
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001392#define BINARY(f, m, n) \
1393static PyObject *f(PyObject *v, PyObject *w) { \
1394 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1395}
1396
1397#define BINARY_INPLACE(f, m, n) \
1398static PyObject *f(PyObject *v, PyObject *w) { \
1399 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1400 "__r" m "__", n); \
1401}
1402
Guido van Rossum04691fc1992-08-12 15:35:34 +00001403UNARY(instance_neg, "__neg__")
1404UNARY(instance_pos, "__pos__")
1405UNARY(instance_abs, "__abs__")
1406
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001407BINARY(instance_or, "or", PyNumber_Or)
1408BINARY(instance_and, "and", PyNumber_And)
1409BINARY(instance_xor, "xor", PyNumber_Xor)
1410BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1411BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1412BINARY(instance_add, "add", PyNumber_Add)
1413BINARY(instance_sub, "sub", PyNumber_Subtract)
1414BINARY(instance_mul, "mul", PyNumber_Multiply)
1415BINARY(instance_div, "div", PyNumber_Divide)
1416BINARY(instance_mod, "mod", PyNumber_Remainder)
1417BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001418BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1419BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001420
1421BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1422BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1423BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1424BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1425BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1426BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1427BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1428BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1429BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1430BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001431BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1432BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001433
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001434/* Try a 3-way comparison, returning an int; v is an instance. Return:
1435 -2 for an exception;
1436 -1 if v < w;
1437 0 if v == w;
1438 1 if v > w;
1439 2 if this particular 3-way comparison is not implemented or undefined.
1440*/
1441static int
1442half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001443{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001444 static PyObject *cmp_obj;
1445 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001446 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001447 PyObject *result;
1448 long l;
1449
1450 assert(PyInstance_Check(v));
1451
1452 if (cmp_obj == NULL) {
1453 cmp_obj = PyString_InternFromString("__cmp__");
1454 if (cmp_obj == NULL)
1455 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001456 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001457
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001458 cmp_func = PyObject_GetAttr(v, cmp_obj);
1459 if (cmp_func == NULL) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001460 PyErr_Clear();
1461 return 2;
1462 }
1463
1464 args = Py_BuildValue("(O)", w);
1465 if (args == NULL)
1466 return -2;
1467
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001468 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001469 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001470 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001471
1472 if (result == NULL)
1473 return -2;
1474
1475 if (result == Py_NotImplemented) {
1476 Py_DECREF(result);
1477 return 2;
1478 }
1479
1480 l = PyInt_AsLong(result);
1481 Py_DECREF(result);
1482 if (l == -1 && PyErr_Occurred()) {
1483 PyErr_SetString(PyExc_TypeError,
1484 "comparison did not return an int");
1485 return -2;
1486 }
1487
1488 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001489}
1490
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001491/* Try a 3-way comparison, returning an int; either v or w is an instance.
1492 We first try a coercion. Return:
1493 -2 for an exception;
1494 -1 if v < w;
1495 0 if v == w;
1496 1 if v > w;
1497 2 if this particular 3-way comparison is not implemented or undefined.
1498 THIS IS ONLY CALLED FROM object.c!
1499*/
1500static int
1501instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001502{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001503 int c;
1504
1505 c = PyNumber_CoerceEx(&v, &w);
1506 if (c < 0)
1507 return -2;
1508 if (c == 0) {
1509 /* If neither is now an instance, use regular comparison */
1510 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1511 c = PyObject_Compare(v, w);
1512 Py_DECREF(v);
1513 Py_DECREF(w);
1514 if (PyErr_Occurred())
1515 return -2;
1516 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001517 }
1518 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001519 else {
1520 /* The coercion didn't do anything.
1521 Treat this the same as returning v and w unchanged. */
1522 Py_INCREF(v);
1523 Py_INCREF(w);
1524 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001525
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001526 if (PyInstance_Check(v)) {
1527 c = half_cmp(v, w);
1528 if (c <= 1) {
1529 Py_DECREF(v);
1530 Py_DECREF(w);
1531 return c;
1532 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001533 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001534 if (PyInstance_Check(w)) {
1535 c = half_cmp(w, v);
1536 if (c <= 1) {
1537 Py_DECREF(v);
1538 Py_DECREF(w);
1539 if (c >= -1)
1540 c = -c;
1541 return c;
1542 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001543 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001544 Py_DECREF(v);
1545 Py_DECREF(w);
1546 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001547}
1548
Guido van Rossum9bfef441993-03-29 10:43:31 +00001549static int
Fred Drake79912472000-07-09 04:06:11 +00001550instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001551{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001553 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001555
Guido van Rossum2878a691996-08-09 20:53:24 +00001556 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001557 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001558 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001559 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001560 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001561 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001562 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001564 /* Fall back to the default behavior:
1565 all instances are nonzero */
1566 return 1;
1567 }
1568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 res = PyEval_CallObject(func, (PyObject *)NULL);
1570 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001571 if (res == NULL)
1572 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001573 if (!PyInt_Check(res)) {
1574 Py_DECREF(res);
1575 PyErr_SetString(PyExc_TypeError,
1576 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001577 return -1;
1578 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 outcome = PyInt_AsLong(res);
1580 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001581 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 PyErr_SetString(PyExc_ValueError,
1583 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001584 return -1;
1585 }
1586 return outcome > 0;
1587}
1588
1589UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001590UNARY(instance_int, "__int__")
1591UNARY(instance_long, "__long__")
1592UNARY(instance_float, "__float__")
1593UNARY(instance_oct, "__oct__")
1594UNARY(instance_hex, "__hex__")
1595
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001596static PyObject *
1597bin_power(PyObject *v, PyObject *w)
1598{
1599 return PyNumber_Power(v, w, Py_None);
1600}
1601
Guido van Rossum03093a21994-09-28 15:51:32 +00001602/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001604instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001605{
1606 if (z == Py_None) {
1607 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001608 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001609 else {
1610 PyObject *func;
1611 PyObject *args;
1612 PyObject *result;
1613
1614 /* XXX Doesn't do coercions... */
1615 func = PyObject_GetAttrString(v, "__pow__");
1616 if (func == NULL)
1617 return NULL;
1618 args = Py_BuildValue("(OO)", w, z);
1619 if (args == NULL) {
1620 Py_DECREF(func);
1621 return NULL;
1622 }
1623 result = PyEval_CallObject(func, args);
1624 Py_DECREF(func);
1625 Py_DECREF(args);
1626 return result;
1627 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001628}
1629
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001630static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001631bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001632{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001633 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001634}
1635
1636
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001637static PyObject *
1638instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1639{
1640 if (z == Py_None) {
1641 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1642 "__rpow__", bin_inplace_power);
1643 }
1644 else {
1645 /* XXX Doesn't do coercions... */
1646 PyObject *func;
1647 PyObject *args;
1648 PyObject *result;
1649
1650 func = PyObject_GetAttrString(v, "__ipow__");
1651 if (func == NULL) {
1652 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1653 return NULL;
1654 PyErr_Clear();
1655 return instance_pow(v, w, z);
1656 }
1657 args = Py_BuildValue("(OO)", w, z);
1658 if (args == NULL) {
1659 Py_DECREF(func);
1660 return NULL;
1661 }
1662 result = PyEval_CallObject(func, args);
1663 Py_DECREF(func);
1664 Py_DECREF(args);
1665 return result;
1666 }
1667}
1668
1669
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001670/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001671#define NAME_OPS 6
1672static PyObject **name_op = NULL;
1673
1674static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001675init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001676{
1677 int i;
1678 char *_name_op[] = {
1679 "__lt__",
1680 "__le__",
1681 "__eq__",
1682 "__ne__",
1683 "__gt__",
1684 "__ge__",
1685 };
1686
1687 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1688 if (name_op == NULL)
1689 return -1;
1690 for (i = 0; i < NAME_OPS; ++i) {
1691 name_op[i] = PyString_InternFromString(_name_op[i]);
1692 if (name_op[i] == NULL)
1693 return -1;
1694 }
1695 return 0;
1696}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001697
1698static PyObject *
1699half_richcompare(PyObject *v, PyObject *w, int op)
1700{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001701 PyObject *method;
1702 PyObject *args;
1703 PyObject *res;
1704
1705 assert(PyInstance_Check(v));
1706
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001707 if (name_op == NULL) {
1708 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001709 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001710 }
1711 /* If the instance doesn't define an __getattr__ method, use
1712 instance_getattr2 directly because it will not set an
1713 exception on failure. */
1714 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
1715 method = instance_getattr2((PyInstanceObject *)v,
1716 name_op[op]);
1717 if (method == NULL) {
1718 assert(!PyErr_Occurred());
1719 res = Py_NotImplemented;
1720 Py_INCREF(res);
1721 return res;
1722 }
1723 } else {
1724 method = PyObject_GetAttr(v, name_op[op]);
1725 if (method == NULL) {
1726 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1727 return NULL;
1728 PyErr_Clear();
1729 res = Py_NotImplemented;
1730 Py_INCREF(res);
1731 return res;
1732 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001733 }
1734
1735 args = Py_BuildValue("(O)", w);
1736 if (args == NULL) {
1737 Py_DECREF(method);
1738 return NULL;
1739 }
1740
1741 res = PyEval_CallObject(method, args);
1742 Py_DECREF(args);
1743 Py_DECREF(method);
1744
1745 return res;
1746}
1747
1748/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1749static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1750
1751static PyObject *
1752instance_richcompare(PyObject *v, PyObject *w, int op)
1753{
1754 PyObject *res;
1755
1756 if (PyInstance_Check(v)) {
1757 res = half_richcompare(v, w, op);
1758 if (res != Py_NotImplemented)
1759 return res;
1760 Py_DECREF(res);
1761 }
1762
1763 if (PyInstance_Check(w)) {
1764 res = half_richcompare(w, v, swapped_op[op]);
1765 if (res != Py_NotImplemented)
1766 return res;
1767 Py_DECREF(res);
1768 }
1769
1770 Py_INCREF(Py_NotImplemented);
1771 return Py_NotImplemented;
1772}
1773
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001774
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001775/* Get the iterator */
1776static PyObject *
1777instance_getiter(PyInstanceObject *self)
1778{
1779 PyObject *func;
1780
1781 if (iterstr == NULL)
1782 iterstr = PyString_InternFromString("__iter__");
1783 if (getitemstr == NULL)
1784 getitemstr = PyString_InternFromString("__getitem__");
1785
1786 if ((func = instance_getattr(self, iterstr)) != NULL) {
1787 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1788 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001789 if (res != NULL && !PyIter_Check(res)) {
1790 PyErr_Format(PyExc_TypeError,
1791 "__iter__ returned non-iterator "
1792 "of type '%.100s'",
1793 res->ob_type->tp_name);
1794 Py_DECREF(res);
1795 res = NULL;
1796 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001797 return res;
1798 }
1799 PyErr_Clear();
1800 if ((func = instance_getattr(self, getitemstr)) == NULL) {
1801 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1802 return NULL;
1803 }
1804 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001805 return PySeqIter_New((PyObject *)self);
1806}
1807
1808
1809/* Call the iterator's next */
1810static PyObject *
1811instance_iternext(PyInstanceObject *self)
1812{
1813 PyObject *func;
1814
1815 if (nextstr == NULL)
1816 nextstr = PyString_InternFromString("next");
1817
1818 if ((func = instance_getattr(self, nextstr)) != NULL) {
1819 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1820 Py_DECREF(func);
1821 if (res != NULL) {
1822 return res;
1823 }
1824 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1825 PyErr_Clear();
1826 return NULL;
1827 }
1828 return NULL;
1829 }
1830 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1831 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001832}
1833
Tim Peters6d6c1a32001-08-02 04:15:00 +00001834static PyObject *
1835instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1836{
1837 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1838 if (call == NULL) {
1839 PyInstanceObject *inst = (PyInstanceObject*) func;
1840 PyErr_Clear();
1841 PyErr_Format(PyExc_AttributeError,
1842 "%.200s instance has no __call__ method",
1843 PyString_AsString(inst->in_class->cl_name));
1844 return NULL;
1845 }
1846 res = PyObject_Call(call, arg, kw);
1847 Py_DECREF(call);
1848 return res;
1849}
1850
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001851
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001852static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001853 (binaryfunc)instance_add, /* nb_add */
1854 (binaryfunc)instance_sub, /* nb_subtract */
1855 (binaryfunc)instance_mul, /* nb_multiply */
1856 (binaryfunc)instance_div, /* nb_divide */
1857 (binaryfunc)instance_mod, /* nb_remainder */
1858 (binaryfunc)instance_divmod, /* nb_divmod */
1859 (ternaryfunc)instance_pow, /* nb_power */
1860 (unaryfunc)instance_neg, /* nb_negative */
1861 (unaryfunc)instance_pos, /* nb_positive */
1862 (unaryfunc)instance_abs, /* nb_absolute */
1863 (inquiry)instance_nonzero, /* nb_nonzero */
1864 (unaryfunc)instance_invert, /* nb_invert */
1865 (binaryfunc)instance_lshift, /* nb_lshift */
1866 (binaryfunc)instance_rshift, /* nb_rshift */
1867 (binaryfunc)instance_and, /* nb_and */
1868 (binaryfunc)instance_xor, /* nb_xor */
1869 (binaryfunc)instance_or, /* nb_or */
1870 (coercion)instance_coerce, /* nb_coerce */
1871 (unaryfunc)instance_int, /* nb_int */
1872 (unaryfunc)instance_long, /* nb_long */
1873 (unaryfunc)instance_float, /* nb_float */
1874 (unaryfunc)instance_oct, /* nb_oct */
1875 (unaryfunc)instance_hex, /* nb_hex */
1876 (binaryfunc)instance_iadd, /* nb_inplace_add */
1877 (binaryfunc)instance_isub, /* nb_inplace_subtract */
1878 (binaryfunc)instance_imul, /* nb_inplace_multiply */
1879 (binaryfunc)instance_idiv, /* nb_inplace_divide */
1880 (binaryfunc)instance_imod, /* nb_inplace_remainder */
1881 (ternaryfunc)instance_ipow, /* nb_inplace_power */
1882 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
1883 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
1884 (binaryfunc)instance_iand, /* nb_inplace_and */
1885 (binaryfunc)instance_ixor, /* nb_inplace_xor */
1886 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum4668b002001-08-08 05:00:18 +00001887 (binaryfunc)instance_floordiv, /* nb_floor_divide */
1888 (binaryfunc)instance_truediv, /* nb_true_divide */
1889 (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
1890 (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001891};
1892
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001893PyTypeObject PyInstance_Type = {
1894 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001895 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001896 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001897 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001898 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001899 (destructor)instance_dealloc, /* tp_dealloc */
1900 0, /* tp_print */
1901 0, /* tp_getattr */
1902 0, /* tp_setattr */
1903 instance_compare, /* tp_compare */
1904 (reprfunc)instance_repr, /* tp_repr */
1905 &instance_as_number, /* tp_as_number */
1906 &instance_as_sequence, /* tp_as_sequence */
1907 &instance_as_mapping, /* tp_as_mapping */
1908 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001909 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00001910 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001911 (getattrofunc)instance_getattr, /* tp_getattro */
1912 (setattrofunc)instance_setattr, /* tp_setattro */
1913 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001914 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001915 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00001916 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001917 0, /* tp_clear */
1918 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001919 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
1920 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001921 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001922};
1923
1924
Guido van Rossum81daa321993-05-20 14:24:46 +00001925/* Instance method objects are used for two purposes:
1926 (a) as bound instance methods (returned by instancename.methodname)
1927 (b) as unbound methods (returned by ClassName.methodname)
1928 In case (b), im_self is NULL
1929*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001930
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001931static PyMethodObject *free_list;
1932
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001933PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001934PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001935{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001936 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001937 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001938 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001939 return NULL;
1940 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001941 im = free_list;
1942 if (im != NULL) {
1943 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001944 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001945 }
1946 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001947 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001948 if (im == NULL)
1949 return NULL;
1950 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00001951 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001952 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001953 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001954 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001955 im->im_self = self;
Guido van Rossumcdf0d752001-08-17 12:07:34 +00001956 Py_XINCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001957 im->im_class = class;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001958 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001960}
1961
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001962/* Class method methods */
1963
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001964#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965
Guido van Rossume8122f11991-05-05 20:03:07 +00001966static struct memberlist instancemethod_memberlist[] = {
1967 {"im_func", T_OBJECT, OFF(im_func)},
1968 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001969 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001970 /* Dummies that are not handled by getattr() except for __members__ */
1971 {"__doc__", T_INT, 0},
1972 {"__name__", T_INT, 0},
Barry Warsawd6a9e842001-01-15 20:40:19 +00001973 {"__dict__", T_OBJECT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001974 {NULL} /* Sentinel */
1975};
1976
Barry Warsawd6a9e842001-01-15 20:40:19 +00001977static int
1978instancemethod_setattro(register PyMethodObject *im, PyObject *name,
1979 PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001981 char *sname = PyString_AsString(name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00001982
Barry Warsaw4f9b13b2001-02-26 18:09:15 +00001983 PyErr_Format(PyExc_TypeError, "read-only attribute: %s", sname);
1984 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +00001985}
1986
1987
1988static PyObject *
1989instancemethod_getattro(register PyMethodObject *im, PyObject *name)
1990{
1991 PyObject *rtn;
1992 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001993 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001994 /* Inherit __name__ and __doc__ from the callable object
1995 implementing the method */
1996 if (strcmp(sname, "__name__") == 0 ||
1997 strcmp(sname, "__doc__") == 0)
1998 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001999 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002000 if (PyEval_GetRestricted()) {
2001 PyErr_SetString(PyExc_RuntimeError,
2002 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00002003 return NULL;
2004 }
Barry Warsawd6a9e842001-01-15 20:40:19 +00002005 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0)
2006 return PyObject_GetAttr(im->im_func, name);
2007
2008 rtn = PyMember_Get((char *)im, instancemethod_memberlist, sname);
2009 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
2010 PyErr_Clear();
2011 rtn = PyObject_GetAttr(im->im_func, name);
2012 }
2013 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014}
2015
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002016static void
Fred Drake79912472000-07-09 04:06:11 +00002017instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002018{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002019 _PyObject_GC_UNTRACK(im);
Fred Drakedb81e8d2001-03-23 04:19:27 +00002020 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002021 Py_DECREF(im->im_func);
2022 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002023 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002024 im->im_self = (PyObject *)free_list;
2025 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002026}
2027
Guido van Rossumebc8c511992-09-03 20:39:51 +00002028static int
Fred Drake79912472000-07-09 04:06:11 +00002029instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002030{
Guido van Rossume9df7271995-04-06 14:46:51 +00002031 if (a->im_self != b->im_self)
2032 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002033 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002034}
2035
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002036static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002037instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002038{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002039 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002040 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002041 PyObject *klass = a->im_class;
2042 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2043 char *sfuncname = "?", *sklassname = "?";
2044
2045 funcname = PyObject_GetAttrString(func, "__name__");
2046 if (funcname == NULL)
2047 PyErr_Clear();
2048 else if (!PyString_Check(funcname)) {
2049 Py_DECREF(funcname);
2050 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002051 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002052 else
2053 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002054 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002055 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002056 else {
2057 klassname = PyObject_GetAttrString(klass, "__name__");
2058 if (klassname == NULL)
2059 PyErr_Clear();
2060 else if (!PyString_Check(klassname)) {
2061 Py_DECREF(klassname);
2062 klassname = NULL;
2063 }
2064 else
2065 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002066 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002067 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002068 result = PyString_FromFormat("<unbound method %s.%s>",
2069 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002070 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002071 /* XXX Shouldn't use repr() here! */
2072 PyObject *selfrepr = PyObject_Repr(self);
2073 if (selfrepr == NULL)
2074 goto fail;
2075 if (!PyString_Check(selfrepr)) {
2076 Py_DECREF(selfrepr);
2077 goto fail;
2078 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002079 result = PyString_FromFormat("<bound method %s.%s of %s>",
2080 sklassname, sfuncname,
2081 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002082 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002083 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002084 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002085 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002086 Py_XDECREF(klassname);
2087 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002088}
2089
Guido van Rossum9bfef441993-03-29 10:43:31 +00002090static long
Fred Drake79912472000-07-09 04:06:11 +00002091instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002092{
2093 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002094 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002095 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002096 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002098 if (x == -1)
2099 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002100 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002101 if (y == -1)
2102 return -1;
2103 return x ^ y;
2104}
2105
Jeremy Hylton8caad492000-06-23 14:18:11 +00002106static int
2107instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2108{
2109 int err;
2110 if (im->im_func) {
2111 err = visit(im->im_func, arg);
2112 if (err)
2113 return err;
2114 }
2115 if (im->im_self) {
2116 err = visit(im->im_self, arg);
2117 if (err)
2118 return err;
2119 }
2120 if (im->im_class) {
2121 err = visit(im->im_class, arg);
2122 if (err)
2123 return err;
2124 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002125 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002126}
2127
Guido van Rossuma15dece2001-08-24 18:48:27 +00002128static char *
2129getclassname(PyObject *class)
2130{
2131 PyObject *name;
2132
2133 if (class == NULL)
2134 name = NULL;
2135 else
2136 name = PyObject_GetAttrString(class, "__name__");
2137 if (name == NULL) {
2138 PyErr_Clear();
2139 return "?";
2140 }
2141 if (!PyString_Check(name)) {
2142 Py_DECREF(name);
2143 return "?";
2144 }
2145 PyString_InternInPlace(&name);
2146 Py_DECREF(name);
2147 return PyString_AS_STRING(name);
2148}
2149
2150static char *
2151getinstclassname(PyObject *inst)
2152{
2153 PyObject *class;
2154 char *name;
2155
2156 if (inst == NULL)
2157 return "nothing";
2158
2159 class = PyObject_GetAttrString(inst, "__class__");
2160 if (class == NULL) {
2161 PyErr_Clear();
2162 class = (PyObject *)(inst->ob_type);
2163 Py_INCREF(class);
2164 }
2165 name = getclassname(class);
2166 Py_XDECREF(class);
2167 return name;
2168}
2169
Tim Peters6d6c1a32001-08-02 04:15:00 +00002170static PyObject *
2171instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2172{
2173 PyObject *self = PyMethod_GET_SELF(func);
2174 PyObject *class = PyMethod_GET_CLASS(func);
2175 PyObject *result;
2176
2177 func = PyMethod_GET_FUNCTION(func);
2178 if (self == NULL) {
2179 /* Unbound methods must be called with an instance of
2180 the class (or a derived class) as first argument */
2181 int ok;
2182 if (PyTuple_Size(arg) >= 1)
2183 self = PyTuple_GET_ITEM(arg, 0);
2184 if (self == NULL)
2185 ok = 0;
2186 else {
2187 ok = PyObject_IsInstance(self, class);
2188 if (ok < 0)
2189 return NULL;
2190 }
2191 if (!ok) {
2192 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002193 "unbound method %s%s must be called with "
2194 "%s instance as first argument "
2195 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002196 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002197 PyEval_GetFuncDesc(func),
2198 getclassname(class),
2199 getinstclassname(self),
2200 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002201 return NULL;
2202 }
2203 Py_INCREF(arg);
2204 }
2205 else {
2206 int argcount = PyTuple_Size(arg);
2207 PyObject *newarg = PyTuple_New(argcount + 1);
2208 int i;
2209 if (newarg == NULL)
2210 return NULL;
2211 Py_INCREF(self);
2212 PyTuple_SET_ITEM(newarg, 0, self);
2213 for (i = 0; i < argcount; i++) {
2214 PyObject *v = PyTuple_GET_ITEM(arg, i);
2215 Py_XINCREF(v);
2216 PyTuple_SET_ITEM(newarg, i+1, v);
2217 }
2218 arg = newarg;
2219 }
2220 result = PyObject_Call((PyObject *)func, arg, kw);
2221 Py_DECREF(arg);
2222 return result;
2223}
2224
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002225static PyObject *
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002226instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *class)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002227{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002228 /* Don't rebind an already bound method, or an unbound method
2229 of a class that's not a base class of class */
2230 if (PyMethod_GET_SELF(meth) != NULL ||
2231 (PyMethod_GET_CLASS(meth) != NULL &&
2232 !PyObject_IsSubclass(class, PyMethod_GET_CLASS(meth)))) {
Guido van Rossum501c7c72001-08-16 20:41:56 +00002233 Py_INCREF(meth);
2234 return meth;
2235 }
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002236 if (obj == Py_None)
2237 obj = NULL;
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002238 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002239}
2240
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002241PyTypeObject PyMethod_Type = {
2242 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002243 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00002244 "instance method",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002245 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002246 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002247 (destructor)instancemethod_dealloc, /* tp_dealloc */
2248 0, /* tp_print */
2249 0, /* tp_getattr */
2250 0, /* tp_setattr */
2251 (cmpfunc)instancemethod_compare, /* tp_compare */
2252 (reprfunc)instancemethod_repr, /* tp_repr */
2253 0, /* tp_as_number */
2254 0, /* tp_as_sequence */
2255 0, /* tp_as_mapping */
2256 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002257 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002258 0, /* tp_str */
2259 (getattrofunc)instancemethod_getattro, /* tp_getattro */
2260 (setattrofunc)instancemethod_setattro, /* tp_setattro */
2261 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002262 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002263 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002264 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002265 0, /* tp_clear */
2266 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002267 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2268 0, /* tp_iter */
2269 0, /* tp_iternext */
2270 0, /* tp_methods */
2271 0, /* tp_members */
2272 0, /* tp_getset */
2273 0, /* tp_base */
2274 0, /* tp_dict */
2275 instancemethod_descr_get, /* tp_descr_get */
2276 0, /* tp_descr_set */
2277 0, /* tp_dictoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002278};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002279
2280/* Clear out the free list */
2281
2282void
Fred Drake79912472000-07-09 04:06:11 +00002283PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002284{
2285 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002286 PyMethodObject *im = free_list;
2287 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002288 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002289 }
2290}