blob: f3f7e692d97ed703f5b91a95582a478c4cff12e4 [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 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000085 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000088 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000091 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000093 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000094 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000095 getattrstr = PyString_InternFromString("__getattr__");
96 setattrstr = PyString_InternFromString("__setattr__");
97 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +000098 }
99 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
100 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
101 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 Py_XINCREF(op->cl_getattr);
103 Py_XINCREF(op->cl_setattr);
104 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000105 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
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{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000126 PyObject_GC_Fini(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);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000133 op = (PyClassObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000134 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
136
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000138class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000139{
140 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000142 if (value != NULL) {
143 *pclass = cp;
144 return value;
145 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000147 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000148 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 PyObject *v = class_lookup(
150 (PyClassObject *)
151 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000152 if (v != NULL)
153 return v;
154 }
155 return NULL;
156}
157
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000159class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 register PyObject *v;
162 register char *sname = PyString_AsString(name);
163 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 descrgetfunc f;
165
Guido van Rossum2878a691996-08-09 20:53:24 +0000166 if (sname[0] == '_' && sname[1] == '_') {
167 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 if (PyEval_GetRestricted()) {
169 PyErr_SetString(PyExc_RuntimeError,
170 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000171 return NULL;
172 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000174 return op->cl_dict;
175 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000176 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000178 return op->cl_bases;
179 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000180 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000181 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000183 else
184 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000186 return v;
187 }
Guido van Rossum94308391991-10-20 20:11:48 +0000188 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000189 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000190 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000191 PyErr_Format(PyExc_AttributeError,
192 "class %.50s has no attribute '%.400s'",
193 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000194 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000196 f = v->ob_type->tp_descr_get;
197 if (f == NULL)
198 Py_INCREF(v);
199 else
200 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000201 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202}
203
Guido van Rossuma63eff61998-05-29 21:37:21 +0000204static void
Fred Drake79912472000-07-09 04:06:11 +0000205set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000206{
207 PyObject *temp = *slot;
208 Py_XINCREF(v);
209 *slot = v;
210 Py_XDECREF(temp);
211}
212
Guido van Rossum7ba30431998-07-08 13:34:48 +0000213static void
Fred Drake79912472000-07-09 04:06:11 +0000214set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000215{
216 PyClassObject *dummy;
217
218 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
219 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
220 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
221}
222
Guido van Rossuma63eff61998-05-29 21:37:21 +0000223static char *
Fred Drake79912472000-07-09 04:06:11 +0000224set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000225{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000226 if (v == NULL || !PyDict_Check(v))
227 return "__dict__ must be a dictionary object";
228 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000229 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000230 return "";
231}
232
233static char *
Fred Drake79912472000-07-09 04:06:11 +0000234set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000235{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000236 int i, n;
237
238 if (v == NULL || !PyTuple_Check(v))
239 return "__bases__ must be a tuple object";
240 n = PyTuple_Size(v);
241 for (i = 0; i < n; i++) {
242 PyObject *x = PyTuple_GET_ITEM(v, i);
243 if (!PyClass_Check(x))
244 return "__bases__ items must be classes";
245 if (PyClass_IsSubclass(x, (PyObject *)c))
246 return "a __bases__ item causes an inheritance cycle";
247 }
248 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000249 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000250 return "";
251}
252
253static char *
Fred Drake79912472000-07-09 04:06:11 +0000254set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000255{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000256 if (v == NULL || !PyString_Check(v))
257 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000258 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000259 return "__name__ must not contain null bytes";
260 set_slot(&c->cl_name, v);
261 return "";
262}
263
Guido van Rossum94308391991-10-20 20:11:48 +0000264static int
Fred Drake79912472000-07-09 04:06:11 +0000265class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000266{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000267 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268 if (PyEval_GetRestricted()) {
269 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000270 "classes are read-only in restricted mode");
271 return -1;
272 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000273 sname = PyString_AsString(name);
274 if (sname[0] == '_' && sname[1] == '_') {
275 int n = PyString_Size(name);
276 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000277 char *err = NULL;
278 if (strcmp(sname, "__dict__") == 0)
279 err = set_dict(op, v);
280 else if (strcmp(sname, "__bases__") == 0)
281 err = set_bases(op, v);
282 else if (strcmp(sname, "__name__") == 0)
283 err = set_name(op, v);
284 else if (strcmp(sname, "__getattr__") == 0)
285 set_slot(&op->cl_getattr, v);
286 else if (strcmp(sname, "__setattr__") == 0)
287 set_slot(&op->cl_setattr, v);
288 else if (strcmp(sname, "__delattr__") == 0)
289 set_slot(&op->cl_delattr, v);
290 /* For the last three, we fall through to update the
291 dictionary as well. */
292 if (err != NULL) {
293 if (*err == '\0')
294 return 0;
295 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000296 return -1;
297 }
298 }
299 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000300 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000302 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000303 PyErr_Format(PyExc_AttributeError,
304 "class %.50s has no attribute '%.400s'",
305 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000306 return rv;
307 }
Guido van Rossum94308391991-10-20 20:11:48 +0000308 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000310}
311
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000313class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000314{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000315 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000316 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000318 name = "?";
319 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000321 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000322 return PyString_FromFormat("<class ?.s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000323 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000324 return PyString_FromFormat("<class %s.%s at %p>",
325 PyString_AsString(mod),
326 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000327}
328
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000329static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000330class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000331{
332 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
333 PyObject *name = op->cl_name;
334 PyObject *res;
335 int m, n;
336
337 if (name == NULL || !PyString_Check(name))
338 return class_repr(op);
339 if (mod == NULL || !PyString_Check(mod)) {
340 Py_INCREF(name);
341 return name;
342 }
343 m = PyString_Size(mod);
344 n = PyString_Size(name);
345 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
346 if (res != NULL) {
347 char *s = PyString_AsString(res);
348 memcpy(s, PyString_AsString(mod), m);
349 s += m;
350 *s++ = '.';
351 memcpy(s, PyString_AsString(name), n);
352 }
353 return res;
354}
355
Jeremy Hylton8caad492000-06-23 14:18:11 +0000356static int
357class_traverse(PyClassObject *o, visitproc visit, void *arg)
358{
359 int err;
360 if (o->cl_bases) {
361 err = visit(o->cl_bases, arg);
362 if (err)
363 return err;
364 }
365 if (o->cl_dict) {
366 err = visit(o->cl_dict, arg);
367 if (err)
368 return err;
369 }
370 if (o->cl_name) {
371 err = visit(o->cl_name, arg);
372 if (err)
373 return err;
374 }
375 if (o->cl_getattr) {
376 err = visit(o->cl_getattr, arg);
377 if (err)
378 return err;
379 }
380 if (o->cl_setattr) {
381 err = visit(o->cl_setattr, arg);
382 if (err)
383 return err;
384 }
385 if (o->cl_delattr) {
386 err = visit(o->cl_delattr, arg);
387 if (err)
388 return err;
389 }
390 return 0;
391}
392
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393PyTypeObject PyClass_Type = {
394 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 0,
396 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000397 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000399 (destructor)class_dealloc, /* tp_dealloc */
400 0, /* tp_print */
401 0, /* tp_getattr */
402 0, /* tp_setattr */
403 0, /* tp_compare */
404 (reprfunc)class_repr, /* tp_repr */
405 0, /* tp_as_number */
406 0, /* tp_as_sequence */
407 0, /* tp_as_mapping */
408 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000409 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000410 (reprfunc)class_str, /* tp_str */
411 (getattrofunc)class_getattr, /* tp_getattro */
412 (setattrofunc)class_setattr, /* tp_setattro */
413 0, /* tp_as_buffer */
414 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
415 0, /* tp_doc */
416 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000417 0, /* tp_clear */
418 0, /* tp_richcompare */
419 0, /* tp_weaklistoffset */
420 0, /* tp_iter */
421 0, /* tp_iternext */
422 0, /* tp_methods */
423 0, /* tp_members */
424 0, /* tp_getset */
425 0, /* tp_base */
426 0, /* tp_dict */
427 0, /* tp_descr_get */
428 0, /* tp_descr_set */
429 0, /* tp_dictoffset */
430 0, /* tp_init */
431 0, /* tp_alloc */
432 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433};
434
Guido van Rossum81daa321993-05-20 14:24:46 +0000435int
Fred Drake79912472000-07-09 04:06:11 +0000436PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000437{
438 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000440 if (class == base)
441 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000443 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 cp = (PyClassObject *)class;
445 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000446 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000448 return 1;
449 }
450 return 0;
451}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452
Guido van Rossum81daa321993-05-20 14:24:46 +0000453
454/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000457PyInstance_NewRaw(PyObject *klass, PyObject *dict)
458{
459 PyInstanceObject *inst;
460
461 if (!PyClass_Check(klass)) {
462 PyErr_BadInternalCall();
463 return NULL;
464 }
465 if (dict == NULL) {
466 dict = PyDict_New();
467 if (dict == NULL)
468 return NULL;
469 }
470 else {
471 if (!PyDict_Check(dict)) {
472 PyErr_BadInternalCall();
473 return NULL;
474 }
475 Py_INCREF(dict);
476 }
477 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
478 if (inst == NULL) {
479 Py_DECREF(dict);
480 return NULL;
481 }
Fred Drake4e262a92001-03-22 18:26:47 +0000482 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000483 Py_INCREF(klass);
484 inst->in_class = (PyClassObject *)klass;
485 inst->in_dict = dict;
486 PyObject_GC_Init(inst);
487 return (PyObject *)inst;
488}
489
490PyObject *
491PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 register PyInstanceObject *inst;
494 PyObject *init;
495 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000496
497 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000498 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000499 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000500 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000501 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000502 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000503 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 if ((arg != NULL && (!PyTuple_Check(arg) ||
505 PyTuple_Size(arg) != 0))
506 || (kw != NULL && (!PyDict_Check(kw) ||
507 PyDict_Size(kw) != 0))) {
508 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000509 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000511 inst = NULL;
512 }
513 }
514 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
516 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000517 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000519 inst = NULL;
520 }
521 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 if (res != Py_None) {
523 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000524 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000526 inst = NULL;
527 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000529 }
530 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000532}
533
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000534/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000535
536static void
Fred Drake79912472000-07-09 04:06:11 +0000537instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 PyObject *error_type, *error_value, *error_traceback;
540 PyObject *del;
541 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000542#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000543 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000544#endif
Fred Drake41deb1e2001-02-01 05:27:45 +0000545
Fred Drakeb60654b2001-02-26 18:56:37 +0000546 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000547
Tim Peters6b184912000-09-17 14:40:17 +0000548 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000549#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000550#ifndef Py_REF_DEBUG
551# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
552#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000553 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000555 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000556#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000557 /* compensate for boost in _Py_NewReference; note that
558 * _Py_RefTotal was also boosted; we'll knock that down later.
559 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000560 inst->ob_type->tp_allocs--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000561#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000562#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000563 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000565#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000566
567 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000569 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000570 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000571 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000572 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000574 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000575 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000576 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 Py_DECREF(res);
578 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000579 }
Tim Peters6b184912000-09-17 14:40:17 +0000580 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000582 /* Undo the temporary resurrection; can't use DECREF here, it would
583 * cause a recursive call.
584 */
585#ifdef Py_REF_DEBUG
586 /* _Py_RefTotal was boosted either by _Py_NewReference or
587 * Py_INCREF above.
588 */
589 _Py_RefTotal--;
590#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000591 if (--inst->ob_refcnt > 0) {
592#ifdef COUNT_ALLOCS
Tim Peters6d6c1a32001-08-02 04:15:00 +0000593 inst->ob_type->tp_frees--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000594#endif
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
Neil Schemenauerce209672000-09-15 18:57:21 +0000607 PyObject_GC_Fini(inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_DECREF(inst->in_class);
609 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000610 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000611 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612}
613
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000615instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000616{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 register PyObject *v;
618 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000619 if (sname[0] == '_' && sname[1] == '_') {
620 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 if (PyEval_GetRestricted()) {
622 PyErr_SetString(PyExc_RuntimeError,
623 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000624 return NULL;
625 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000627 return inst->in_dict;
628 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000629 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 Py_INCREF(inst->in_class);
631 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000632 }
Guido van Rossum94308391991-10-20 20:11:48 +0000633 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000634 v = instance_getattr2(inst, name);
635 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000636 PyErr_Format(PyExc_AttributeError,
637 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000638 PyString_AS_STRING(inst->in_class->cl_name), sname);
639 }
640 return v;
641}
642
643static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000644instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000645{
646 register PyObject *v;
647 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000648 descrgetfunc f;
649
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000651 if (v != NULL) {
652 Py_INCREF(v);
653 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654 }
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000655 v = class_lookup(inst->in_class, name, &class);
656 if (v != NULL) {
657 Py_INCREF(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000658 f = v->ob_type->tp_descr_get;
659 if (f != NULL) {
660 PyObject *w = f(v, (PyObject *)inst,
661 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000663 v = w;
664 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000665 }
666 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000667}
668
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000670instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000671{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000673 res = instance_getattr1(inst, name);
674 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyObject *args;
676 PyErr_Clear();
677 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000678 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000679 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 res = PyEval_CallObject(func, args);
681 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000682 }
683 return res;
684}
685
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686static int
Fred Drake79912472000-07-09 04:06:11 +0000687instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688{
Guido van Rossum94472a01992-09-04 09:45:18 +0000689 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000691 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000692 PyErr_Format(PyExc_AttributeError,
693 "%.50s instance has no attribute '%.400s'",
694 PyString_AS_STRING(inst->in_class->cl_name),
695 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000696 return rv;
697 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000700}
701
Guido van Rossume7737541994-09-05 07:31:41 +0000702static int
Fred Drake79912472000-07-09 04:06:11 +0000703instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000704{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000705 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000707 if (sname[0] == '_' && sname[1] == '_') {
708 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000709 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000710 if (strcmp(sname, "__dict__") == 0) {
711 if (PyEval_GetRestricted()) {
712 PyErr_SetString(PyExc_RuntimeError,
713 "__dict__ not accessible in restricted mode");
714 return -1;
715 }
716 if (v == NULL || !PyDict_Check(v)) {
717 PyErr_SetString(PyExc_TypeError,
718 "__dict__ must be set to a dictionary");
719 return -1;
720 }
721 tmp = inst->in_dict;
722 Py_INCREF(v);
723 inst->in_dict = v;
724 Py_DECREF(tmp);
725 return 0;
726 }
727 if (strcmp(sname, "__class__") == 0) {
728 if (PyEval_GetRestricted()) {
729 PyErr_SetString(PyExc_RuntimeError,
730 "__class__ not accessible in restricted mode");
731 return -1;
732 }
733 if (v == NULL || !PyClass_Check(v)) {
734 PyErr_SetString(PyExc_TypeError,
735 "__class__ must be set to a class");
736 return -1;
737 }
738 tmp = (PyObject *)(inst->in_class);
739 Py_INCREF(v);
740 inst->in_class = (PyClassObject *)v;
741 Py_DECREF(tmp);
742 return 0;
743 }
Guido van Rossume7737541994-09-05 07:31:41 +0000744 }
Guido van Rossume7737541994-09-05 07:31:41 +0000745 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000746 if (v == NULL)
747 func = inst->in_class->cl_delattr;
748 else
749 func = inst->in_class->cl_setattr;
750 if (func == NULL)
751 return instance_setattr1(inst, name, v);
752 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000754 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000756 if (args == NULL)
757 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758 res = PyEval_CallObject(func, args);
759 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000760 if (res == NULL)
761 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000763 return 0;
764}
765
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000767instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 PyObject *func;
770 PyObject *res;
771 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000772
Guido van Rossum2878a691996-08-09 20:53:24 +0000773 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000774 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000775 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000778 PyObject *mod = PyDict_GetItemString(
779 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000780 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 if (classname != NULL && PyString_Check(classname))
782 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000783 else
784 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000786 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000787 return PyString_FromFormat("<?.%s instance at %p>",
788 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000789 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000790 return PyString_FromFormat("<%s.%s instance at %p>",
791 PyString_AsString(mod),
792 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000793 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 res = PyEval_CallObject(func, (PyObject *)NULL);
795 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000796 return res;
797}
798
Guido van Rossum82c690f2001-04-30 14:39:18 +0000799static PyObject *
800instance_str(PyInstanceObject *inst)
801{
802 PyObject *func;
803 PyObject *res;
804 static PyObject *strstr;
805
806 if (strstr == NULL)
807 strstr = PyString_InternFromString("__str__");
808 func = instance_getattr(inst, strstr);
809 if (func == NULL) {
810 PyErr_Clear();
811 return instance_repr(inst);
812 }
813 res = PyEval_CallObject(func, (PyObject *)NULL);
814 Py_DECREF(func);
815 return res;
816}
817
Guido van Rossum9bfef441993-03-29 10:43:31 +0000818static long
Fred Drake79912472000-07-09 04:06:11 +0000819instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000820{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821 PyObject *func;
822 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000823 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000824 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000825
Guido van Rossum2878a691996-08-09 20:53:24 +0000826 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000827 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000828 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000829 if (func == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000830 /* If there is no __eq__ and no __cmp__ method, we hash on the
831 address. If an __eq__ or __cmp__ method exists, there must
832 be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000834 if (eqstr == NULL)
835 eqstr = PyString_InternFromString("__eq__");
836 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000837 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000839 if (cmpstr == NULL)
840 cmpstr = PyString_InternFromString("__cmp__");
841 func = instance_getattr(inst, cmpstr);
842 if (func == NULL) {
843 PyErr_Clear();
844 return _Py_HashPointer(inst);
845 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000846 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000848 return -1;
849 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 res = PyEval_CallObject(func, (PyObject *)NULL);
851 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000852 if (res == NULL)
853 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 if (PyInt_Check(res)) {
855 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000856 if (outcome == -1)
857 outcome = -2;
858 }
859 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 PyErr_SetString(PyExc_TypeError,
861 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000862 outcome = -1;
863 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000865 return outcome;
866}
867
Jeremy Hylton8caad492000-06-23 14:18:11 +0000868static int
869instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
870{
871 int err;
872 if (o->in_class) {
873 err = visit((PyObject *)(o->in_class), arg);
874 if (err)
875 return err;
876 }
877 if (o->in_dict) {
878 err = visit(o->in_dict, arg);
879 if (err)
880 return err;
881 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000882 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000883}
884
Guido van Rossum213c7a62001-04-23 14:08:49 +0000885static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
886static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000887
Guido van Rossum9bfef441993-03-29 10:43:31 +0000888static int
Fred Drake79912472000-07-09 04:06:11 +0000889instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 PyObject *func;
892 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000893 int outcome;
894
Guido van Rossum2878a691996-08-09 20:53:24 +0000895 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000896 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000897 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898 if (func == NULL)
899 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 res = PyEval_CallObject(func, (PyObject *)NULL);
901 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000902 if (res == NULL)
903 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 if (PyInt_Check(res)) {
905 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000906 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 PyErr_SetString(PyExc_ValueError,
908 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000909 }
910 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 PyErr_SetString(PyExc_TypeError,
912 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913 outcome = -1;
914 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000916 return outcome;
917}
918
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000920instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000921{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 PyObject *func;
923 PyObject *arg;
924 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925
Guido van Rossum2878a691996-08-09 20:53:24 +0000926 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000927 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000928 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929 if (func == NULL)
930 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934 return NULL;
935 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 res = PyEval_CallObject(func, arg);
937 Py_DECREF(func);
938 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000939 return res;
940}
941
Guido van Rossum9bfef441993-03-29 10:43:31 +0000942static int
Fred Drake79912472000-07-09 04:06:11 +0000943instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945 PyObject *func;
946 PyObject *arg;
947 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948
Guido van Rossum2878a691996-08-09 20:53:24 +0000949 if (value == NULL) {
950 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000951 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000952 func = instance_getattr(inst, delitemstr);
953 }
954 else {
955 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000956 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000957 func = instance_getattr(inst, setitemstr);
958 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000959 if (func == NULL)
960 return -1;
961 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000963 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000965 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000967 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000968 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 res = PyEval_CallObject(func, arg);
970 Py_DECREF(func);
971 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000972 if (res == NULL)
973 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000975 return 0;
976}
977
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000979 (inquiry)instance_length, /* mp_length */
980 (binaryfunc)instance_subscript, /* mp_subscript */
981 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +0000982};
983
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000985instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988
Guido van Rossum2878a691996-08-09 20:53:24 +0000989 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000990 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000991 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000992 if (func == NULL)
993 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997 return NULL;
998 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 res = PyEval_CallObject(func, arg);
1000 Py_DECREF(func);
1001 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001002 return res;
1003}
1004
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +00001006sliceobj_from_intint(int i, int j)
1007{
1008 PyObject *start, *end, *res;
1009
1010 start = PyInt_FromLong((long)i);
1011 if (!start)
1012 return NULL;
1013
1014 end = PyInt_FromLong((long)j);
1015 if (!end) {
1016 Py_DECREF(start);
1017 return NULL;
1018 }
1019 res = PySlice_New(start, end, NULL);
1020 Py_DECREF(start);
1021 Py_DECREF(end);
1022 return res;
1023}
1024
1025
1026static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001027instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001028{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 PyObject *func, *arg, *res;
1030 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031
Guido van Rossum2878a691996-08-09 20:53:24 +00001032 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001033 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001034 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001035
1036 if (func == NULL) {
1037 PyErr_Clear();
1038
1039 if (getitemstr == NULL)
1040 getitemstr = PyString_InternFromString("__getitem__");
1041 func = instance_getattr(inst, getitemstr);
1042 if (func == NULL)
1043 return NULL;
1044 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1045 } else
1046 arg = Py_BuildValue("(ii)", i, j);
1047
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 return NULL;
1051 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 res = PyEval_CallObject(func, arg);
1053 Py_DECREF(func);
1054 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 return res;
1056}
1057
1058static int
Fred Drake79912472000-07-09 04:06:11 +00001059instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001060{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062
Guido van Rossum2878a691996-08-09 20:53:24 +00001063 if (item == NULL) {
1064 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001065 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001066 func = instance_getattr(inst, delitemstr);
1067 }
1068 else {
1069 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001070 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001071 func = instance_getattr(inst, setitemstr);
1072 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001074 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001077 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001081 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001082 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 res = PyEval_CallObject(func, arg);
1084 Py_DECREF(func);
1085 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086 if (res == NULL)
1087 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 return 0;
1090}
1091
1092static int
Fred Drake79912472000-07-09 04:06:11 +00001093instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001094{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095 PyObject *func, *arg, *res;
1096 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001097
Guido van Rossum2878a691996-08-09 20:53:24 +00001098 if (value == NULL) {
1099 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 delslicestr =
1101 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001102 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001103 if (func == NULL) {
1104 PyErr_Clear();
1105 if (delitemstr == NULL)
1106 delitemstr =
1107 PyString_InternFromString("__delitem__");
1108 func = instance_getattr(inst, delitemstr);
1109 if (func == NULL)
1110 return -1;
1111
1112 arg = Py_BuildValue("(N)",
1113 sliceobj_from_intint(i, j));
1114 } else
1115 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001116 }
1117 else {
1118 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001119 setslicestr =
1120 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001121 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001122 if (func == NULL) {
1123 PyErr_Clear();
1124 if (setitemstr == NULL)
1125 setitemstr =
1126 PyString_InternFromString("__setitem__");
1127 func = instance_getattr(inst, setitemstr);
1128 if (func == NULL)
1129 return -1;
1130
1131 arg = Py_BuildValue("(NO)",
1132 sliceobj_from_intint(i, j), value);
1133 } else
1134 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001135 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001138 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 res = PyEval_CallObject(func, arg);
1141 Py_DECREF(func);
1142 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001143 if (res == NULL)
1144 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001145 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001146 return 0;
1147}
1148
Tim Peterscb8d3682001-05-05 21:05:01 +00001149static int
1150instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001151{
1152 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001153 PyObject *func;
1154
1155 /* Try __contains__ first.
1156 * If that can't be done, try iterator-based searching.
1157 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001158
1159 if(__contains__ == NULL) {
1160 __contains__ = PyString_InternFromString("__contains__");
1161 if(__contains__ == NULL)
1162 return -1;
1163 }
1164 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001165 if (func) {
1166 PyObject *res;
1167 int ret;
1168 PyObject *arg = Py_BuildValue("(O)", member);
1169 if(arg == NULL) {
1170 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001171 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001172 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001173 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001174 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001175 Py_DECREF(arg);
1176 if(res == NULL)
1177 return -1;
1178 ret = PyObject_IsTrue(res);
1179 Py_DECREF(res);
1180 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001181 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001182
1183 /* Couldn't find __contains__. */
1184 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1185 /* Assume the failure was simply due to that there is no
1186 * __contains__ attribute, and try iterating instead.
1187 */
1188 PyErr_Clear();
1189 return _PySequence_IterContains((PyObject *)inst, member);
1190 }
1191 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001192 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001193}
1194
Fred Drake79912472000-07-09 04:06:11 +00001195static PySequenceMethods
1196instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001197 (inquiry)instance_length, /* sq_length */
1198 0, /* sq_concat */
1199 0, /* sq_repeat */
1200 (intargfunc)instance_item, /* sq_item */
1201 (intintargfunc)instance_slice, /* sq_slice */
1202 (intobjargproc)instance_ass_item, /* sq_ass_item */
1203 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1204 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001205};
1206
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001208generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001211
1212 if ((func = instance_getattr(self, methodname)) == NULL)
1213 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214 res = PyEval_CallObject(func, (PyObject *)NULL);
1215 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001216 return res;
1217}
1218
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001219static PyObject *
1220generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001221{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001222 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001224 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001225 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001226 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001227 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001229 Py_INCREF(Py_NotImplemented);
1230 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001231 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001233 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001235 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001236 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001237 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 Py_DECREF(args);
1239 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001240 return result;
1241}
1242
1243
1244static PyObject *coerce_obj;
1245
1246/* Try one half of a binary operator involving a class instance. */
1247static PyObject *
1248half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1249 int swapped)
1250{
1251 PyObject *args;
1252 PyObject *coercefunc;
1253 PyObject *coerced = NULL;
1254 PyObject *v1;
1255 PyObject *result;
1256
1257 if (!PyInstance_Check(v)) {
1258 Py_INCREF(Py_NotImplemented);
1259 return Py_NotImplemented;
1260 }
1261
1262 if (coerce_obj == NULL) {
1263 coerce_obj = PyString_InternFromString("__coerce__");
1264 if (coerce_obj == NULL)
1265 return NULL;
1266 }
1267 coercefunc = PyObject_GetAttr(v, coerce_obj);
1268 if (coercefunc == NULL) {
1269 PyErr_Clear();
1270 return generic_binary_op(v, w, opname);
1271 }
1272
1273 args = Py_BuildValue("(O)", w);
1274 if (args == NULL) {
1275 return NULL;
1276 }
1277 coerced = PyEval_CallObject(coercefunc, args);
1278 Py_DECREF(args);
1279 Py_DECREF(coercefunc);
1280 if (coerced == NULL) {
1281 return NULL;
1282 }
1283 if (coerced == Py_None || coerced == Py_NotImplemented) {
1284 Py_DECREF(coerced);
1285 return generic_binary_op(v, w, opname);
1286 }
1287 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1288 Py_DECREF(coerced);
1289 PyErr_SetString(PyExc_TypeError,
1290 "coercion should return None or 2-tuple");
1291 return NULL;
1292 }
1293 v1 = PyTuple_GetItem(coerced, 0);
1294 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001295 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001296 /* prevent recursion if __coerce__ returns self as the first
1297 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001298 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001299 } else {
1300 if (swapped)
1301 result = (thisfunc)(w, v1);
1302 else
1303 result = (thisfunc)(v1, w);
1304 }
1305 Py_DECREF(coerced);
1306 return result;
1307}
1308
1309/* Implement a binary operator involving at least one class instance. */
1310static PyObject *
1311do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1312 binaryfunc thisfunc)
1313{
1314 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1315 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001316 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001317 result = half_binop(w, v, ropname, thisfunc, 1);
1318 }
1319 return result;
1320}
1321
1322static PyObject *
1323do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1324 char *ropname, binaryfunc thisfunc)
1325{
1326 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1327 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001328 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001329 result = do_binop(v, w, opname, ropname, thisfunc);
1330 }
1331 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001332}
1333
Guido van Rossum879c5811995-01-10 15:24:06 +00001334static int
Fred Drake79912472000-07-09 04:06:11 +00001335instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001336{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 PyObject *v = *pv;
1338 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001339 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 PyObject *args;
1341 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001342
Guido van Rossum2878a691996-08-09 20:53:24 +00001343 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001344 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001345 if (coerce_obj == NULL)
1346 return -1;
1347 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001348 coercefunc = PyObject_GetAttr(v, coerce_obj);
1349 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001350 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001352 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001353 }
1354 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001356 if (args == NULL) {
1357 return -1;
1358 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001359 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001361 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001362 if (coerced == NULL) {
1363 /* __coerce__ call raised an exception */
1364 return -1;
1365 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001366 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001367 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001369 return 1;
1370 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001372 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 Py_DECREF(coerced);
1374 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001375 "coercion should return None or 2-tuple");
1376 return -1;
1377 }
1378 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 *pv = PyTuple_GetItem(coerced, 0);
1380 *pw = PyTuple_GetItem(coerced, 1);
1381 Py_INCREF(*pv);
1382 Py_INCREF(*pw);
1383 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001384 return 0;
1385}
1386
Guido van Rossum04691fc1992-08-12 15:35:34 +00001387#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001388static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001390 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001391 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001392}
1393
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001394#define BINARY(f, m, n) \
1395static PyObject *f(PyObject *v, PyObject *w) { \
1396 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1397}
1398
1399#define BINARY_INPLACE(f, m, n) \
1400static PyObject *f(PyObject *v, PyObject *w) { \
1401 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1402 "__r" m "__", n); \
1403}
1404
Guido van Rossum04691fc1992-08-12 15:35:34 +00001405UNARY(instance_neg, "__neg__")
1406UNARY(instance_pos, "__pos__")
1407UNARY(instance_abs, "__abs__")
1408
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001409BINARY(instance_or, "or", PyNumber_Or)
1410BINARY(instance_and, "and", PyNumber_And)
1411BINARY(instance_xor, "xor", PyNumber_Xor)
1412BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1413BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1414BINARY(instance_add, "add", PyNumber_Add)
1415BINARY(instance_sub, "sub", PyNumber_Subtract)
1416BINARY(instance_mul, "mul", PyNumber_Multiply)
1417BINARY(instance_div, "div", PyNumber_Divide)
1418BINARY(instance_mod, "mod", PyNumber_Remainder)
1419BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001420BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1421BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001422
1423BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1424BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1425BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1426BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1427BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1428BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1429BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1430BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1431BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1432BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001433BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1434BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001435
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001436/* Try a 3-way comparison, returning an int; v is an instance. Return:
1437 -2 for an exception;
1438 -1 if v < w;
1439 0 if v == w;
1440 1 if v > w;
1441 2 if this particular 3-way comparison is not implemented or undefined.
1442*/
1443static int
1444half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001445{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001446 static PyObject *cmp_obj;
1447 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001448 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001449 PyObject *result;
1450 long l;
1451
1452 assert(PyInstance_Check(v));
1453
1454 if (cmp_obj == NULL) {
1455 cmp_obj = PyString_InternFromString("__cmp__");
1456 if (cmp_obj == NULL)
1457 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001458 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001459
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001460 cmp_func = PyObject_GetAttr(v, cmp_obj);
1461 if (cmp_func == NULL) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001462 PyErr_Clear();
1463 return 2;
1464 }
1465
1466 args = Py_BuildValue("(O)", w);
1467 if (args == NULL)
1468 return -2;
1469
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001470 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001471 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001472 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001473
1474 if (result == NULL)
1475 return -2;
1476
1477 if (result == Py_NotImplemented) {
1478 Py_DECREF(result);
1479 return 2;
1480 }
1481
1482 l = PyInt_AsLong(result);
1483 Py_DECREF(result);
1484 if (l == -1 && PyErr_Occurred()) {
1485 PyErr_SetString(PyExc_TypeError,
1486 "comparison did not return an int");
1487 return -2;
1488 }
1489
1490 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001491}
1492
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001493/* Try a 3-way comparison, returning an int; either v or w is an instance.
1494 We first try a coercion. Return:
1495 -2 for an exception;
1496 -1 if v < w;
1497 0 if v == w;
1498 1 if v > w;
1499 2 if this particular 3-way comparison is not implemented or undefined.
1500 THIS IS ONLY CALLED FROM object.c!
1501*/
1502static int
1503instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001504{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001505 int c;
1506
1507 c = PyNumber_CoerceEx(&v, &w);
1508 if (c < 0)
1509 return -2;
1510 if (c == 0) {
1511 /* If neither is now an instance, use regular comparison */
1512 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1513 c = PyObject_Compare(v, w);
1514 Py_DECREF(v);
1515 Py_DECREF(w);
1516 if (PyErr_Occurred())
1517 return -2;
1518 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001519 }
1520 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001521 else {
1522 /* The coercion didn't do anything.
1523 Treat this the same as returning v and w unchanged. */
1524 Py_INCREF(v);
1525 Py_INCREF(w);
1526 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001527
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001528 if (PyInstance_Check(v)) {
1529 c = half_cmp(v, w);
1530 if (c <= 1) {
1531 Py_DECREF(v);
1532 Py_DECREF(w);
1533 return c;
1534 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001535 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001536 if (PyInstance_Check(w)) {
1537 c = half_cmp(w, v);
1538 if (c <= 1) {
1539 Py_DECREF(v);
1540 Py_DECREF(w);
1541 if (c >= -1)
1542 c = -c;
1543 return c;
1544 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001545 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001546 Py_DECREF(v);
1547 Py_DECREF(w);
1548 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001549}
1550
Guido van Rossum9bfef441993-03-29 10:43:31 +00001551static int
Fred Drake79912472000-07-09 04:06:11 +00001552instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001553{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001555 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001557
Guido van Rossum2878a691996-08-09 20:53:24 +00001558 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001559 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001560 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001561 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001562 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001563 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001564 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001566 /* Fall back to the default behavior:
1567 all instances are nonzero */
1568 return 1;
1569 }
1570 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571 res = PyEval_CallObject(func, (PyObject *)NULL);
1572 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001573 if (res == NULL)
1574 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575 if (!PyInt_Check(res)) {
1576 Py_DECREF(res);
1577 PyErr_SetString(PyExc_TypeError,
1578 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001579 return -1;
1580 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581 outcome = PyInt_AsLong(res);
1582 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001583 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001584 PyErr_SetString(PyExc_ValueError,
1585 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001586 return -1;
1587 }
1588 return outcome > 0;
1589}
1590
1591UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001592UNARY(instance_int, "__int__")
1593UNARY(instance_long, "__long__")
1594UNARY(instance_float, "__float__")
1595UNARY(instance_oct, "__oct__")
1596UNARY(instance_hex, "__hex__")
1597
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001598static PyObject *
1599bin_power(PyObject *v, PyObject *w)
1600{
1601 return PyNumber_Power(v, w, Py_None);
1602}
1603
Guido van Rossum03093a21994-09-28 15:51:32 +00001604/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001605static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001606instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001607{
1608 if (z == Py_None) {
1609 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001610 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001611 else {
1612 PyObject *func;
1613 PyObject *args;
1614 PyObject *result;
1615
1616 /* XXX Doesn't do coercions... */
1617 func = PyObject_GetAttrString(v, "__pow__");
1618 if (func == NULL)
1619 return NULL;
1620 args = Py_BuildValue("(OO)", w, z);
1621 if (args == NULL) {
1622 Py_DECREF(func);
1623 return NULL;
1624 }
1625 result = PyEval_CallObject(func, args);
1626 Py_DECREF(func);
1627 Py_DECREF(args);
1628 return result;
1629 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001630}
1631
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001632static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001633bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001634{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001635 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001636}
1637
1638
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001639static PyObject *
1640instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1641{
1642 if (z == Py_None) {
1643 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1644 "__rpow__", bin_inplace_power);
1645 }
1646 else {
1647 /* XXX Doesn't do coercions... */
1648 PyObject *func;
1649 PyObject *args;
1650 PyObject *result;
1651
1652 func = PyObject_GetAttrString(v, "__ipow__");
1653 if (func == NULL) {
1654 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1655 return NULL;
1656 PyErr_Clear();
1657 return instance_pow(v, w, z);
1658 }
1659 args = Py_BuildValue("(OO)", w, z);
1660 if (args == NULL) {
1661 Py_DECREF(func);
1662 return NULL;
1663 }
1664 result = PyEval_CallObject(func, args);
1665 Py_DECREF(func);
1666 Py_DECREF(args);
1667 return result;
1668 }
1669}
1670
1671
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001672/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001673#define NAME_OPS 6
1674static PyObject **name_op = NULL;
1675
1676static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001677init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001678{
1679 int i;
1680 char *_name_op[] = {
1681 "__lt__",
1682 "__le__",
1683 "__eq__",
1684 "__ne__",
1685 "__gt__",
1686 "__ge__",
1687 };
1688
1689 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1690 if (name_op == NULL)
1691 return -1;
1692 for (i = 0; i < NAME_OPS; ++i) {
1693 name_op[i] = PyString_InternFromString(_name_op[i]);
1694 if (name_op[i] == NULL)
1695 return -1;
1696 }
1697 return 0;
1698}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001699
1700static PyObject *
1701half_richcompare(PyObject *v, PyObject *w, int op)
1702{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001703 PyObject *method;
1704 PyObject *args;
1705 PyObject *res;
1706
1707 assert(PyInstance_Check(v));
1708
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001709 if (name_op == NULL) {
1710 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001711 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001712 }
1713 /* If the instance doesn't define an __getattr__ method, use
1714 instance_getattr2 directly because it will not set an
1715 exception on failure. */
1716 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
1717 method = instance_getattr2((PyInstanceObject *)v,
1718 name_op[op]);
1719 if (method == NULL) {
1720 assert(!PyErr_Occurred());
1721 res = Py_NotImplemented;
1722 Py_INCREF(res);
1723 return res;
1724 }
1725 } else {
1726 method = PyObject_GetAttr(v, name_op[op]);
1727 if (method == NULL) {
1728 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1729 return NULL;
1730 PyErr_Clear();
1731 res = Py_NotImplemented;
1732 Py_INCREF(res);
1733 return res;
1734 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001735 }
1736
1737 args = Py_BuildValue("(O)", w);
1738 if (args == NULL) {
1739 Py_DECREF(method);
1740 return NULL;
1741 }
1742
1743 res = PyEval_CallObject(method, args);
1744 Py_DECREF(args);
1745 Py_DECREF(method);
1746
1747 return res;
1748}
1749
1750/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1751static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1752
1753static PyObject *
1754instance_richcompare(PyObject *v, PyObject *w, int op)
1755{
1756 PyObject *res;
1757
1758 if (PyInstance_Check(v)) {
1759 res = half_richcompare(v, w, op);
1760 if (res != Py_NotImplemented)
1761 return res;
1762 Py_DECREF(res);
1763 }
1764
1765 if (PyInstance_Check(w)) {
1766 res = half_richcompare(w, v, swapped_op[op]);
1767 if (res != Py_NotImplemented)
1768 return res;
1769 Py_DECREF(res);
1770 }
1771
1772 Py_INCREF(Py_NotImplemented);
1773 return Py_NotImplemented;
1774}
1775
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001776
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001777/* Get the iterator */
1778static PyObject *
1779instance_getiter(PyInstanceObject *self)
1780{
1781 PyObject *func;
1782
1783 if (iterstr == NULL)
1784 iterstr = PyString_InternFromString("__iter__");
1785 if (getitemstr == NULL)
1786 getitemstr = PyString_InternFromString("__getitem__");
1787
1788 if ((func = instance_getattr(self, iterstr)) != NULL) {
1789 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1790 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001791 if (res != NULL && !PyIter_Check(res)) {
1792 PyErr_Format(PyExc_TypeError,
1793 "__iter__ returned non-iterator "
1794 "of type '%.100s'",
1795 res->ob_type->tp_name);
1796 Py_DECREF(res);
1797 res = NULL;
1798 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001799 return res;
1800 }
1801 PyErr_Clear();
1802 if ((func = instance_getattr(self, getitemstr)) == NULL) {
1803 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1804 return NULL;
1805 }
1806 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001807 return PySeqIter_New((PyObject *)self);
1808}
1809
1810
1811/* Call the iterator's next */
1812static PyObject *
1813instance_iternext(PyInstanceObject *self)
1814{
1815 PyObject *func;
1816
1817 if (nextstr == NULL)
1818 nextstr = PyString_InternFromString("next");
1819
1820 if ((func = instance_getattr(self, nextstr)) != NULL) {
1821 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1822 Py_DECREF(func);
1823 if (res != NULL) {
1824 return res;
1825 }
1826 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1827 PyErr_Clear();
1828 return NULL;
1829 }
1830 return NULL;
1831 }
1832 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1833 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001834}
1835
Tim Peters6d6c1a32001-08-02 04:15:00 +00001836static PyObject *
1837instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1838{
1839 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1840 if (call == NULL) {
1841 PyInstanceObject *inst = (PyInstanceObject*) func;
1842 PyErr_Clear();
1843 PyErr_Format(PyExc_AttributeError,
1844 "%.200s instance has no __call__ method",
1845 PyString_AsString(inst->in_class->cl_name));
1846 return NULL;
1847 }
1848 res = PyObject_Call(call, arg, kw);
1849 Py_DECREF(call);
1850 return res;
1851}
1852
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001853
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001854static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001855 (binaryfunc)instance_add, /* nb_add */
1856 (binaryfunc)instance_sub, /* nb_subtract */
1857 (binaryfunc)instance_mul, /* nb_multiply */
1858 (binaryfunc)instance_div, /* nb_divide */
1859 (binaryfunc)instance_mod, /* nb_remainder */
1860 (binaryfunc)instance_divmod, /* nb_divmod */
1861 (ternaryfunc)instance_pow, /* nb_power */
1862 (unaryfunc)instance_neg, /* nb_negative */
1863 (unaryfunc)instance_pos, /* nb_positive */
1864 (unaryfunc)instance_abs, /* nb_absolute */
1865 (inquiry)instance_nonzero, /* nb_nonzero */
1866 (unaryfunc)instance_invert, /* nb_invert */
1867 (binaryfunc)instance_lshift, /* nb_lshift */
1868 (binaryfunc)instance_rshift, /* nb_rshift */
1869 (binaryfunc)instance_and, /* nb_and */
1870 (binaryfunc)instance_xor, /* nb_xor */
1871 (binaryfunc)instance_or, /* nb_or */
1872 (coercion)instance_coerce, /* nb_coerce */
1873 (unaryfunc)instance_int, /* nb_int */
1874 (unaryfunc)instance_long, /* nb_long */
1875 (unaryfunc)instance_float, /* nb_float */
1876 (unaryfunc)instance_oct, /* nb_oct */
1877 (unaryfunc)instance_hex, /* nb_hex */
1878 (binaryfunc)instance_iadd, /* nb_inplace_add */
1879 (binaryfunc)instance_isub, /* nb_inplace_subtract */
1880 (binaryfunc)instance_imul, /* nb_inplace_multiply */
1881 (binaryfunc)instance_idiv, /* nb_inplace_divide */
1882 (binaryfunc)instance_imod, /* nb_inplace_remainder */
1883 (ternaryfunc)instance_ipow, /* nb_inplace_power */
1884 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
1885 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
1886 (binaryfunc)instance_iand, /* nb_inplace_and */
1887 (binaryfunc)instance_ixor, /* nb_inplace_xor */
1888 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum4668b002001-08-08 05:00:18 +00001889 (binaryfunc)instance_floordiv, /* nb_floor_divide */
1890 (binaryfunc)instance_truediv, /* nb_true_divide */
1891 (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
1892 (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001893};
1894
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001895PyTypeObject PyInstance_Type = {
1896 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001897 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001898 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001899 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001900 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001901 (destructor)instance_dealloc, /* tp_dealloc */
1902 0, /* tp_print */
1903 0, /* tp_getattr */
1904 0, /* tp_setattr */
1905 instance_compare, /* tp_compare */
1906 (reprfunc)instance_repr, /* tp_repr */
1907 &instance_as_number, /* tp_as_number */
1908 &instance_as_sequence, /* tp_as_sequence */
1909 &instance_as_mapping, /* tp_as_mapping */
1910 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001911 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00001912 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001913 (getattrofunc)instance_getattr, /* tp_getattro */
1914 (setattrofunc)instance_setattr, /* tp_setattro */
1915 0, /* tp_as_buffer */
1916 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
1917 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00001918 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001919 0, /* tp_clear */
1920 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001921 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
1922 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001923 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001924};
1925
1926
Guido van Rossum81daa321993-05-20 14:24:46 +00001927/* Instance method objects are used for two purposes:
1928 (a) as bound instance methods (returned by instancename.methodname)
1929 (b) as unbound methods (returned by ClassName.methodname)
1930 In case (b), im_self is NULL
1931*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001932
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001933static PyMethodObject *free_list;
1934
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001935PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001936PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001937{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001938 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001939 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001940 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001941 return NULL;
1942 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001943 im = free_list;
1944 if (im != NULL) {
1945 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001946 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001947 }
1948 else {
1949 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1950 if (im == NULL)
1951 return NULL;
1952 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00001953 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001954 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001955 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001956 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001957 im->im_self = self;
Guido van Rossumcdf0d752001-08-17 12:07:34 +00001958 Py_XINCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001959 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001960 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001961 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001962}
1963
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001964/* Class method methods */
1965
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001966#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001967
Guido van Rossume8122f11991-05-05 20:03:07 +00001968static struct memberlist instancemethod_memberlist[] = {
1969 {"im_func", T_OBJECT, OFF(im_func)},
1970 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001971 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001972 /* Dummies that are not handled by getattr() except for __members__ */
1973 {"__doc__", T_INT, 0},
1974 {"__name__", T_INT, 0},
Barry Warsawd6a9e842001-01-15 20:40:19 +00001975 {"__dict__", T_OBJECT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001976 {NULL} /* Sentinel */
1977};
1978
Barry Warsawd6a9e842001-01-15 20:40:19 +00001979static int
1980instancemethod_setattro(register PyMethodObject *im, PyObject *name,
1981 PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001983 char *sname = PyString_AsString(name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00001984
Barry Warsaw4f9b13b2001-02-26 18:09:15 +00001985 PyErr_Format(PyExc_TypeError, "read-only attribute: %s", sname);
1986 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +00001987}
1988
1989
1990static PyObject *
1991instancemethod_getattro(register PyMethodObject *im, PyObject *name)
1992{
1993 PyObject *rtn;
1994 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001995 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001996 /* Inherit __name__ and __doc__ from the callable object
1997 implementing the method */
1998 if (strcmp(sname, "__name__") == 0 ||
1999 strcmp(sname, "__doc__") == 0)
2000 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00002001 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002002 if (PyEval_GetRestricted()) {
2003 PyErr_SetString(PyExc_RuntimeError,
2004 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00002005 return NULL;
2006 }
Barry Warsawd6a9e842001-01-15 20:40:19 +00002007 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0)
2008 return PyObject_GetAttr(im->im_func, name);
2009
2010 rtn = PyMember_Get((char *)im, instancemethod_memberlist, sname);
2011 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
2012 PyErr_Clear();
2013 rtn = PyObject_GetAttr(im->im_func, name);
2014 }
2015 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016}
2017
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002018static void
Fred Drake79912472000-07-09 04:06:11 +00002019instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002020{
Fred Drakedb81e8d2001-03-23 04:19:27 +00002021 PyObject_ClearWeakRefs((PyObject *)im);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002022 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023 Py_DECREF(im->im_func);
2024 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002025 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002026 im->im_self = (PyObject *)free_list;
2027 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002028}
2029
Guido van Rossumebc8c511992-09-03 20:39:51 +00002030static int
Fred Drake79912472000-07-09 04:06:11 +00002031instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002032{
Guido van Rossume9df7271995-04-06 14:46:51 +00002033 if (a->im_self != b->im_self)
2034 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002035 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002036}
2037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002038static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002039instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002040{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002041 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002042 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002043 PyObject *klass = a->im_class;
2044 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2045 char *sfuncname = "?", *sklassname = "?";
2046
2047 funcname = PyObject_GetAttrString(func, "__name__");
2048 if (funcname == NULL)
2049 PyErr_Clear();
2050 else if (!PyString_Check(funcname)) {
2051 Py_DECREF(funcname);
2052 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002053 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002054 else
2055 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002056 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002057 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002058 else {
2059 klassname = PyObject_GetAttrString(klass, "__name__");
2060 if (klassname == NULL)
2061 PyErr_Clear();
2062 else if (!PyString_Check(klassname)) {
2063 Py_DECREF(klassname);
2064 klassname = NULL;
2065 }
2066 else
2067 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002068 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002069 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002070 result = PyString_FromFormat("<unbound method %s.%s>",
2071 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002072 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002073 /* XXX Shouldn't use repr() here! */
2074 PyObject *selfrepr = PyObject_Repr(self);
2075 if (selfrepr == NULL)
2076 goto fail;
2077 if (!PyString_Check(selfrepr)) {
2078 Py_DECREF(selfrepr);
2079 goto fail;
2080 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002081 result = PyString_FromFormat("<bound method %s.%s of %s>",
2082 sklassname, sfuncname,
2083 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002084 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002085 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002086 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002087 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002088 Py_XDECREF(klassname);
2089 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002090}
2091
Guido van Rossum9bfef441993-03-29 10:43:31 +00002092static long
Fred Drake79912472000-07-09 04:06:11 +00002093instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002094{
2095 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002096 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002098 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002099 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002100 if (x == -1)
2101 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002102 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002103 if (y == -1)
2104 return -1;
2105 return x ^ y;
2106}
2107
Jeremy Hylton8caad492000-06-23 14:18:11 +00002108static int
2109instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2110{
2111 int err;
2112 if (im->im_func) {
2113 err = visit(im->im_func, arg);
2114 if (err)
2115 return err;
2116 }
2117 if (im->im_self) {
2118 err = visit(im->im_self, arg);
2119 if (err)
2120 return err;
2121 }
2122 if (im->im_class) {
2123 err = visit(im->im_class, arg);
2124 if (err)
2125 return err;
2126 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002127 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002128}
2129
Guido van Rossuma15dece2001-08-24 18:48:27 +00002130static char *
2131getclassname(PyObject *class)
2132{
2133 PyObject *name;
2134
2135 if (class == NULL)
2136 name = NULL;
2137 else
2138 name = PyObject_GetAttrString(class, "__name__");
2139 if (name == NULL) {
2140 PyErr_Clear();
2141 return "?";
2142 }
2143 if (!PyString_Check(name)) {
2144 Py_DECREF(name);
2145 return "?";
2146 }
2147 PyString_InternInPlace(&name);
2148 Py_DECREF(name);
2149 return PyString_AS_STRING(name);
2150}
2151
2152static char *
2153getinstclassname(PyObject *inst)
2154{
2155 PyObject *class;
2156 char *name;
2157
2158 if (inst == NULL)
2159 return "nothing";
2160
2161 class = PyObject_GetAttrString(inst, "__class__");
2162 if (class == NULL) {
2163 PyErr_Clear();
2164 class = (PyObject *)(inst->ob_type);
2165 Py_INCREF(class);
2166 }
2167 name = getclassname(class);
2168 Py_XDECREF(class);
2169 return name;
2170}
2171
Tim Peters6d6c1a32001-08-02 04:15:00 +00002172static PyObject *
2173instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2174{
2175 PyObject *self = PyMethod_GET_SELF(func);
2176 PyObject *class = PyMethod_GET_CLASS(func);
2177 PyObject *result;
2178
2179 func = PyMethod_GET_FUNCTION(func);
2180 if (self == NULL) {
2181 /* Unbound methods must be called with an instance of
2182 the class (or a derived class) as first argument */
2183 int ok;
2184 if (PyTuple_Size(arg) >= 1)
2185 self = PyTuple_GET_ITEM(arg, 0);
2186 if (self == NULL)
2187 ok = 0;
2188 else {
2189 ok = PyObject_IsInstance(self, class);
2190 if (ok < 0)
2191 return NULL;
2192 }
2193 if (!ok) {
2194 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002195 "unbound method %s%s must be called with "
2196 "%s instance as first argument "
2197 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002198 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002199 PyEval_GetFuncDesc(func),
2200 getclassname(class),
2201 getinstclassname(self),
2202 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002203 return NULL;
2204 }
2205 Py_INCREF(arg);
2206 }
2207 else {
2208 int argcount = PyTuple_Size(arg);
2209 PyObject *newarg = PyTuple_New(argcount + 1);
2210 int i;
2211 if (newarg == NULL)
2212 return NULL;
2213 Py_INCREF(self);
2214 PyTuple_SET_ITEM(newarg, 0, self);
2215 for (i = 0; i < argcount; i++) {
2216 PyObject *v = PyTuple_GET_ITEM(arg, i);
2217 Py_XINCREF(v);
2218 PyTuple_SET_ITEM(newarg, i+1, v);
2219 }
2220 arg = newarg;
2221 }
2222 result = PyObject_Call((PyObject *)func, arg, kw);
2223 Py_DECREF(arg);
2224 return result;
2225}
2226
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002227static PyObject *
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002228instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *class)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002229{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002230 /* Don't rebind an already bound method, or an unbound method
2231 of a class that's not a base class of class */
2232 if (PyMethod_GET_SELF(meth) != NULL ||
2233 (PyMethod_GET_CLASS(meth) != NULL &&
2234 !PyObject_IsSubclass(class, PyMethod_GET_CLASS(meth)))) {
Guido van Rossum501c7c72001-08-16 20:41:56 +00002235 Py_INCREF(meth);
2236 return meth;
2237 }
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002238 if (obj == Py_None)
2239 obj = NULL;
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002240 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002241}
2242
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002243PyTypeObject PyMethod_Type = {
2244 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002245 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00002246 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002247 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002248 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002249 (destructor)instancemethod_dealloc, /* tp_dealloc */
2250 0, /* tp_print */
2251 0, /* tp_getattr */
2252 0, /* tp_setattr */
2253 (cmpfunc)instancemethod_compare, /* tp_compare */
2254 (reprfunc)instancemethod_repr, /* tp_repr */
2255 0, /* tp_as_number */
2256 0, /* tp_as_sequence */
2257 0, /* tp_as_mapping */
2258 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002259 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002260 0, /* tp_str */
2261 (getattrofunc)instancemethod_getattro, /* tp_getattro */
2262 (setattrofunc)instancemethod_setattro, /* tp_setattro */
2263 0, /* tp_as_buffer */
Fred Drake4dcb85b2001-05-03 16:04:13 +00002264 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002265 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002266 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002267 0, /* tp_clear */
2268 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002269 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2270 0, /* tp_iter */
2271 0, /* tp_iternext */
2272 0, /* tp_methods */
2273 0, /* tp_members */
2274 0, /* tp_getset */
2275 0, /* tp_base */
2276 0, /* tp_dict */
2277 instancemethod_descr_get, /* tp_descr_get */
2278 0, /* tp_descr_set */
2279 0, /* tp_dictoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002280};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002281
2282/* Clear out the free list */
2283
2284void
Fred Drake79912472000-07-09 04:06:11 +00002285PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002286{
2287 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002288 PyMethodObject *im = free_list;
2289 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00002290 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002291 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002292 }
2293}