blob: 9f364e2e88a6ec983590a51fd84e209b9d5e5f2e [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
Guido van Rossum915f0eb2001-10-17 20:26:38 +00007#define TP_DESCR_GET(t) \
8 (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
9
Neil Schemenauer29bfc072001-01-04 01:43:46 +000010
Guido van Rossum52ca98a1994-09-05 07:32:29 +000011/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000012static PyObject *class_lookup(PyClassObject *, PyObject *,
13 PyClassObject **);
14static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
15static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000016
Guido van Rossuma63eff61998-05-29 21:37:21 +000017static PyObject *getattrstr, *setattrstr, *delattrstr;
18
Fred Drake79912472000-07-09 04:06:11 +000019
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
22 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000025 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000026 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000027 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000028 if (docstr == NULL)
29 return NULL;
30 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000031 if (modstr == NULL) {
32 modstr= PyString_InternFromString("__module__");
33 if (modstr == NULL)
34 return NULL;
35 }
36 if (namestr == NULL) {
37 namestr= PyString_InternFromString("__name__");
38 if (namestr == NULL)
39 return NULL;
40 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000041 if (name == NULL || !PyString_Check(name)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000042 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000043 "PyClass_New: name must be a string");
44 return NULL;
45 }
46 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000047 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000048 "PyClass_New: dict must be a dictionary");
49 return NULL;
50 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 if (PyDict_GetItem(dict, docstr) == NULL) {
52 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000053 return NULL;
54 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000055 if (PyDict_GetItem(dict, modstr) == NULL) {
56 PyObject *globals = PyEval_GetGlobals();
57 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000058 PyObject *modname = PyDict_GetItem(globals, namestr);
59 if (modname != NULL) {
60 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000061 return NULL;
62 }
63 }
64 }
Guido van Rossume2966a61991-12-10 13:53:23 +000065 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000067 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000068 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000069 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000070 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +000071 Py_ssize_t i, n;
Guido van Rossum28d80b12001-09-07 21:08:32 +000072 PyObject *base;
Guido van Rossum04d73c41997-10-07 14:54:11 +000073 if (!PyTuple_Check(bases)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000074 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000075 "PyClass_New: bases must be a tuple");
76 return NULL;
77 }
Guido van Rossum28d80b12001-09-07 21:08:32 +000078 n = PyTuple_Size(bases);
79 for (i = 0; i < n; i++) {
80 base = PyTuple_GET_ITEM(bases, i);
81 if (!PyClass_Check(base)) {
82 if (PyCallable_Check(
83 (PyObject *) base->ob_type))
Georg Brandl684fd0c2006-05-25 19:15:31 +000084 return PyObject_CallFunctionObjArgs(
Guido van Rossum28d80b12001-09-07 21:08:32 +000085 (PyObject *) base->ob_type,
Georg Brandl684fd0c2006-05-25 19:15:31 +000086 name, bases, dict, NULL);
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000088 "PyClass_New: base must be a class");
89 return NULL;
90 }
91 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000093 }
Neal Norwitz6cbb7262006-08-19 04:22:33 +000094
95 if (getattrstr == NULL) {
96 getattrstr = PyString_InternFromString("__getattr__");
97 if (getattrstr == NULL)
98 goto alloc_error;
99 setattrstr = PyString_InternFromString("__setattr__");
100 if (setattrstr == NULL)
101 goto alloc_error;
102 delattrstr = PyString_InternFromString("__delattr__");
103 if (delattrstr == NULL)
104 goto alloc_error;
105 }
106
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000107 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000108 if (op == NULL) {
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000109alloc_error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000112 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000115 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000117 op->cl_name = name;
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000118
Guido van Rossum2878a691996-08-09 20:53:24 +0000119 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
120 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
121 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 Py_XINCREF(op->cl_getattr);
123 Py_XINCREF(op->cl_setattr);
124 Py_XINCREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000125 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127}
128
Guido van Rossumb479dc52001-09-05 22:52:50 +0000129PyObject *
130PyMethod_Function(PyObject *im)
131{
132 if (!PyMethod_Check(im)) {
133 PyErr_BadInternalCall();
134 return NULL;
135 }
136 return ((PyMethodObject *)im)->im_func;
137}
138
139PyObject *
140PyMethod_Self(PyObject *im)
141{
142 if (!PyMethod_Check(im)) {
143 PyErr_BadInternalCall();
144 return NULL;
145 }
146 return ((PyMethodObject *)im)->im_self;
147}
148
149PyObject *
150PyMethod_Class(PyObject *im)
151{
152 if (!PyMethod_Check(im)) {
153 PyErr_BadInternalCall();
154 return NULL;
155 }
156 return ((PyMethodObject *)im)->im_class;
157}
158
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000159PyDoc_STRVAR(class_doc,
160"classobj(name, bases, dict)\n\
161\n\
162Create a class object. The name must be a string; the second argument\n\
163a tuple of classes, and the third a dictionary.");
164
165static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
167{
168 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000169 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170
171 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
172 &name, &bases, &dict))
173 return NULL;
174 return PyClass_New(bases, dict, name);
175}
176
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177/* Class methods */
178
179static void
Fred Drake79912472000-07-09 04:06:11 +0000180class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000182 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 Py_DECREF(op->cl_bases);
184 Py_DECREF(op->cl_dict);
185 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000186 Py_XDECREF(op->cl_getattr);
187 Py_XDECREF(op->cl_setattr);
188 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000189 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190}
191
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000193class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000194{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000195 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000197 if (value != NULL) {
198 *pclass = cp;
199 return value;
200 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000202 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000203 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyObject *v = class_lookup(
205 (PyClassObject *)
206 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000207 if (v != NULL)
208 return v;
209 }
210 return NULL;
211}
212
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000214class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 register PyObject *v;
217 register char *sname = PyString_AsString(name);
Anthony Baxter377be112006-04-11 06:54:30 +0000218 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000219 descrgetfunc f;
220
Guido van Rossum2878a691996-08-09 20:53:24 +0000221 if (sname[0] == '_' && sname[1] == '_') {
222 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 if (PyEval_GetRestricted()) {
224 PyErr_SetString(PyExc_RuntimeError,
225 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000226 return NULL;
227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000229 return op->cl_dict;
230 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000231 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000233 return op->cl_bases;
234 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000235 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000236 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000238 else
239 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000241 return v;
242 }
Guido van Rossum94308391991-10-20 20:11:48 +0000243 }
Anthony Baxter377be112006-04-11 06:54:30 +0000244 v = class_lookup(op, name, &klass);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000245 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000246 PyErr_Format(PyExc_AttributeError,
247 "class %.50s has no attribute '%.400s'",
248 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000249 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000251 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000252 if (f == NULL)
253 Py_INCREF(v);
254 else
255 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000256 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257}
258
Guido van Rossuma63eff61998-05-29 21:37:21 +0000259static void
Fred Drake79912472000-07-09 04:06:11 +0000260set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000261{
262 PyObject *temp = *slot;
263 Py_XINCREF(v);
264 *slot = v;
265 Py_XDECREF(temp);
266}
267
Guido van Rossum7ba30431998-07-08 13:34:48 +0000268static void
Fred Drake79912472000-07-09 04:06:11 +0000269set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000270{
271 PyClassObject *dummy;
272
273 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
274 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
275 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
276}
277
Guido van Rossuma63eff61998-05-29 21:37:21 +0000278static char *
Fred Drake79912472000-07-09 04:06:11 +0000279set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000280{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000281 if (v == NULL || !PyDict_Check(v))
282 return "__dict__ must be a dictionary object";
283 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000284 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000285 return "";
286}
287
288static char *
Fred Drake79912472000-07-09 04:06:11 +0000289set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000290{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000291 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000292
293 if (v == NULL || !PyTuple_Check(v))
294 return "__bases__ must be a tuple object";
295 n = PyTuple_Size(v);
296 for (i = 0; i < n; i++) {
297 PyObject *x = PyTuple_GET_ITEM(v, i);
298 if (!PyClass_Check(x))
299 return "__bases__ items must be classes";
300 if (PyClass_IsSubclass(x, (PyObject *)c))
301 return "a __bases__ item causes an inheritance cycle";
302 }
303 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000304 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000305 return "";
306}
307
308static char *
Fred Drake79912472000-07-09 04:06:11 +0000309set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000310{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000311 if (v == NULL || !PyString_Check(v))
312 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000313 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000314 return "__name__ must not contain null bytes";
315 set_slot(&c->cl_name, v);
316 return "";
317}
318
Guido van Rossum94308391991-10-20 20:11:48 +0000319static int
Fred Drake79912472000-07-09 04:06:11 +0000320class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000321{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000322 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 if (PyEval_GetRestricted()) {
324 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000325 "classes are read-only in restricted mode");
326 return -1;
327 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000328 sname = PyString_AsString(name);
329 if (sname[0] == '_' && sname[1] == '_') {
Martin v. Löwis66851282006-04-22 11:40:03 +0000330 Py_ssize_t n = PyString_Size(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000331 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000332 char *err = NULL;
333 if (strcmp(sname, "__dict__") == 0)
334 err = set_dict(op, v);
335 else if (strcmp(sname, "__bases__") == 0)
336 err = set_bases(op, v);
337 else if (strcmp(sname, "__name__") == 0)
338 err = set_name(op, v);
339 else if (strcmp(sname, "__getattr__") == 0)
340 set_slot(&op->cl_getattr, v);
341 else if (strcmp(sname, "__setattr__") == 0)
342 set_slot(&op->cl_setattr, v);
343 else if (strcmp(sname, "__delattr__") == 0)
344 set_slot(&op->cl_delattr, v);
345 /* For the last three, we fall through to update the
346 dictionary as well. */
347 if (err != NULL) {
348 if (*err == '\0')
349 return 0;
350 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000351 return -1;
352 }
353 }
354 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000355 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000357 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000358 PyErr_Format(PyExc_AttributeError,
359 "class %.50s has no attribute '%.400s'",
360 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000361 return rv;
362 }
Guido van Rossum94308391991-10-20 20:11:48 +0000363 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000365}
366
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000368class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000369{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000370 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000371 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000373 name = "?";
374 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000376 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000377 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000378 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000379 return PyString_FromFormat("<class %s.%s at %p>",
380 PyString_AsString(mod),
381 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000382}
383
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000384static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000385class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000386{
387 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
388 PyObject *name = op->cl_name;
389 PyObject *res;
Martin v. Löwis66851282006-04-22 11:40:03 +0000390 Py_ssize_t m, n;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000391
392 if (name == NULL || !PyString_Check(name))
393 return class_repr(op);
394 if (mod == NULL || !PyString_Check(mod)) {
395 Py_INCREF(name);
396 return name;
397 }
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000398 m = PyString_GET_SIZE(mod);
399 n = PyString_GET_SIZE(name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000400 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
401 if (res != NULL) {
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000402 char *s = PyString_AS_STRING(res);
403 memcpy(s, PyString_AS_STRING(mod), m);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000404 s += m;
405 *s++ = '.';
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000406 memcpy(s, PyString_AS_STRING(name), n);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000407 }
408 return res;
409}
410
Jeremy Hylton8caad492000-06-23 14:18:11 +0000411static int
412class_traverse(PyClassObject *o, visitproc visit, void *arg)
413{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000414 Py_VISIT(o->cl_bases);
415 Py_VISIT(o->cl_dict);
416 Py_VISIT(o->cl_name);
417 Py_VISIT(o->cl_getattr);
418 Py_VISIT(o->cl_setattr);
419 Py_VISIT(o->cl_delattr);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000420 return 0;
421}
422
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423PyTypeObject PyClass_Type = {
424 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000426 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000427 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000429 (destructor)class_dealloc, /* tp_dealloc */
430 0, /* tp_print */
431 0, /* tp_getattr */
432 0, /* tp_setattr */
433 0, /* tp_compare */
434 (reprfunc)class_repr, /* tp_repr */
435 0, /* tp_as_number */
436 0, /* tp_as_sequence */
437 0, /* tp_as_mapping */
438 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000439 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000440 (reprfunc)class_str, /* tp_str */
441 (getattrofunc)class_getattr, /* tp_getattro */
442 (setattrofunc)class_setattr, /* tp_setattro */
443 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000444 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000445 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000446 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000447 0, /* tp_clear */
448 0, /* tp_richcompare */
449 0, /* tp_weaklistoffset */
450 0, /* tp_iter */
451 0, /* tp_iternext */
452 0, /* tp_methods */
453 0, /* tp_members */
454 0, /* tp_getset */
455 0, /* tp_base */
456 0, /* tp_dict */
457 0, /* tp_descr_get */
458 0, /* tp_descr_set */
459 0, /* tp_dictoffset */
460 0, /* tp_init */
461 0, /* tp_alloc */
462 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463};
464
Guido van Rossum81daa321993-05-20 14:24:46 +0000465int
Anthony Baxter377be112006-04-11 06:54:30 +0000466PyClass_IsSubclass(PyObject *klass, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000467{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 PyClassObject *cp;
Anthony Baxter377be112006-04-11 06:54:30 +0000470 if (klass == base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000471 return 1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000472 if (PyTuple_Check(base)) {
473 n = PyTuple_GET_SIZE(base);
474 for (i = 0; i < n; i++) {
Anthony Baxter377be112006-04-11 06:54:30 +0000475 if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000476 return 1;
477 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000478 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000479 }
Anthony Baxter377be112006-04-11 06:54:30 +0000480 if (klass == NULL || !PyClass_Check(klass))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000481 return 0;
Anthony Baxter377be112006-04-11 06:54:30 +0000482 cp = (PyClassObject *)klass;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000484 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000485 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000486 return 1;
487 }
488 return 0;
489}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490
Guido van Rossum81daa321993-05-20 14:24:46 +0000491
492/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000495PyInstance_NewRaw(PyObject *klass, PyObject *dict)
496{
497 PyInstanceObject *inst;
498
499 if (!PyClass_Check(klass)) {
500 PyErr_BadInternalCall();
501 return NULL;
502 }
503 if (dict == NULL) {
504 dict = PyDict_New();
505 if (dict == NULL)
506 return NULL;
507 }
508 else {
509 if (!PyDict_Check(dict)) {
510 PyErr_BadInternalCall();
511 return NULL;
512 }
513 Py_INCREF(dict);
514 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000515 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000516 if (inst == NULL) {
517 Py_DECREF(dict);
518 return NULL;
519 }
Fred Drake4e262a92001-03-22 18:26:47 +0000520 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000521 Py_INCREF(klass);
522 inst->in_class = (PyClassObject *)klass;
523 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000524 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000525 return (PyObject *)inst;
526}
527
528PyObject *
529PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 register PyInstanceObject *inst;
532 PyObject *init;
533 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000534
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000535 if (initstr == NULL) {
536 initstr = PyString_InternFromString("__init__");
537 if (initstr == NULL)
538 return NULL;
539 }
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000540 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000541 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542 return NULL;
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000543 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000544 if (init == NULL) {
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000545 if (PyErr_Occurred()) {
546 Py_DECREF(inst);
547 return NULL;
548 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 if ((arg != NULL && (!PyTuple_Check(arg) ||
550 PyTuple_Size(arg) != 0))
551 || (kw != NULL && (!PyDict_Check(kw) ||
552 PyDict_Size(kw) != 0))) {
553 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000554 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000556 inst = NULL;
557 }
558 }
559 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
561 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000562 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000564 inst = NULL;
565 }
566 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 if (res != Py_None) {
568 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000569 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000571 inst = NULL;
572 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000574 }
575 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000577}
578
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000579/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000580
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000581PyDoc_STRVAR(instance_doc,
582"instance(class[, dict])\n\
583\n\
584Create an instance without calling its __init__() method.\n\
585The class must be a classic class.\n\
586If present, dict must be a dictionary or None.");
587
588static PyObject *
589instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
590{
591 PyObject *klass;
592 PyObject *dict = Py_None;
593
594 if (!PyArg_ParseTuple(args, "O!|O:instance",
595 &PyClass_Type, &klass, &dict))
596 return NULL;
597
598 if (dict == Py_None)
599 dict = NULL;
600 else if (!PyDict_Check(dict)) {
601 PyErr_SetString(PyExc_TypeError,
602 "instance() second arg must be dictionary or None");
603 return NULL;
604 }
605 return PyInstance_NewRaw(klass, dict);
606}
607
608
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609static void
Fred Drake79912472000-07-09 04:06:11 +0000610instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000611{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyObject *error_type, *error_value, *error_traceback;
613 PyObject *del;
614 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000615
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000616 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000617 if (inst->in_weakreflist != NULL)
618 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000619
Tim Peters6b184912000-09-17 14:40:17 +0000620 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000621 assert(inst->ob_type == &PyInstance_Type);
622 assert(inst->ob_refcnt == 0);
623 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000624
625 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000627 /* Execute __del__ method, if any. */
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000628 if (delstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000629 delstr = PyString_InternFromString("__del__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000630 if (delstr == NULL)
Neal Norwitzaf33f2d2006-08-14 00:59:03 +0000631 PyErr_WriteUnraisable((PyObject*)inst);
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000632 }
Neal Norwitzaf33f2d2006-08-14 00:59:03 +0000633 if (delstr && (del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000635 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000636 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000637 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 Py_DECREF(res);
639 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000640 }
Tim Peters6b184912000-09-17 14:40:17 +0000641 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000643
Tim Peters6b184912000-09-17 14:40:17 +0000644 /* Undo the temporary resurrection; can't use DECREF here, it would
645 * cause a recursive call.
646 */
Tim Peters34592512002-07-11 06:23:50 +0000647 assert(inst->ob_refcnt > 0);
648 if (--inst->ob_refcnt == 0) {
Guido van Rossum9ff1a442008-01-18 20:56:30 +0000649
650 /* New weakrefs could be created during the finalizer call.
651 If this occurs, clear them out without calling their
652 finalizers since they might rely on part of the object
653 being finalized that has already been destroyed. */
654 while (inst->in_weakreflist != NULL) {
655 _PyWeakref_ClearRef((PyWeakReference *)
656 (inst->in_weakreflist));
657 }
658
Tim Peters34592512002-07-11 06:23:50 +0000659 Py_DECREF(inst->in_class);
660 Py_XDECREF(inst->in_dict);
661 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000662 }
Tim Peters34592512002-07-11 06:23:50 +0000663 else {
Martin v. Löwis66851282006-04-22 11:40:03 +0000664 Py_ssize_t refcnt = inst->ob_refcnt;
Tim Peters34592512002-07-11 06:23:50 +0000665 /* __del__ resurrected it! Make it look like the original
666 * Py_DECREF never happened.
667 */
668 _Py_NewReference((PyObject *)inst);
669 inst->ob_refcnt = refcnt;
670 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000671 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
672 * we need to undo that. */
673 _Py_DEC_REFTOTAL;
674 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
675 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000676 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000677 * _Py_NewReference bumped tp_allocs: both of those need to be
678 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000679 */
Tim Peters6b184912000-09-17 14:40:17 +0000680#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000681 --inst->ob_type->tp_frees;
682 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000683#endif
Tim Peters34592512002-07-11 06:23:50 +0000684 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000685}
686
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000688instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000689{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 register PyObject *v;
691 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000692 if (sname[0] == '_' && sname[1] == '_') {
693 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 if (PyEval_GetRestricted()) {
695 PyErr_SetString(PyExc_RuntimeError,
696 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000697 return NULL;
698 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000700 return inst->in_dict;
701 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000702 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 Py_INCREF(inst->in_class);
704 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000705 }
Guido van Rossum94308391991-10-20 20:11:48 +0000706 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000707 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000708 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000709 PyErr_Format(PyExc_AttributeError,
710 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000711 PyString_AS_STRING(inst->in_class->cl_name), sname);
712 }
713 return v;
714}
715
716static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000717instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000718{
719 register PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000720 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721 descrgetfunc f;
722
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000724 if (v != NULL) {
725 Py_INCREF(v);
726 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000727 }
Anthony Baxter377be112006-04-11 06:54:30 +0000728 v = class_lookup(inst->in_class, name, &klass);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000729 if (v != NULL) {
730 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000731 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000732 if (f != NULL) {
733 PyObject *w = f(v, (PyObject *)inst,
734 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000736 v = w;
737 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000738 }
739 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000740}
741
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000743instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000744{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000746 res = instance_getattr1(inst, name);
747 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000749 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
750 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000752 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000753 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000754 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 res = PyEval_CallObject(func, args);
756 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000757 }
758 return res;
759}
760
Tim Petersdf875b92003-04-07 17:51:59 +0000761/* See classobject.h comments: this only does dict lookups, and is always
762 * safe to call.
763 */
764PyObject *
765_PyInstance_Lookup(PyObject *pinst, PyObject *name)
766{
767 PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000768 PyClassObject *klass;
Tim Petersdf875b92003-04-07 17:51:59 +0000769 PyInstanceObject *inst; /* pinst cast to the right type */
770
771 assert(PyInstance_Check(pinst));
772 inst = (PyInstanceObject *)pinst;
773
774 assert(PyString_Check(name));
775
776 v = PyDict_GetItem(inst->in_dict, name);
777 if (v == NULL)
Anthony Baxter377be112006-04-11 06:54:30 +0000778 v = class_lookup(inst->in_class, name, &klass);
Tim Petersdf875b92003-04-07 17:51:59 +0000779 return v;
780}
781
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000782static int
Fred Drake79912472000-07-09 04:06:11 +0000783instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784{
Guido van Rossum94472a01992-09-04 09:45:18 +0000785 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000787 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000788 PyErr_Format(PyExc_AttributeError,
789 "%.50s instance has no attribute '%.400s'",
790 PyString_AS_STRING(inst->in_class->cl_name),
791 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000792 return rv;
793 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000794 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000796}
797
Guido van Rossume7737541994-09-05 07:31:41 +0000798static int
Fred Drake79912472000-07-09 04:06:11 +0000799instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000800{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000801 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000803 if (sname[0] == '_' && sname[1] == '_') {
Martin v. Löwis66851282006-04-22 11:40:03 +0000804 Py_ssize_t n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000805 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000806 if (strcmp(sname, "__dict__") == 0) {
807 if (PyEval_GetRestricted()) {
808 PyErr_SetString(PyExc_RuntimeError,
809 "__dict__ not accessible in restricted mode");
810 return -1;
811 }
812 if (v == NULL || !PyDict_Check(v)) {
813 PyErr_SetString(PyExc_TypeError,
814 "__dict__ must be set to a dictionary");
815 return -1;
816 }
817 tmp = inst->in_dict;
818 Py_INCREF(v);
819 inst->in_dict = v;
820 Py_DECREF(tmp);
821 return 0;
822 }
823 if (strcmp(sname, "__class__") == 0) {
824 if (PyEval_GetRestricted()) {
825 PyErr_SetString(PyExc_RuntimeError,
826 "__class__ not accessible in restricted mode");
827 return -1;
828 }
829 if (v == NULL || !PyClass_Check(v)) {
830 PyErr_SetString(PyExc_TypeError,
831 "__class__ must be set to a class");
832 return -1;
833 }
834 tmp = (PyObject *)(inst->in_class);
835 Py_INCREF(v);
836 inst->in_class = (PyClassObject *)v;
837 Py_DECREF(tmp);
838 return 0;
839 }
Guido van Rossume7737541994-09-05 07:31:41 +0000840 }
Guido van Rossume7737541994-09-05 07:31:41 +0000841 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000842 if (v == NULL)
843 func = inst->in_class->cl_delattr;
844 else
845 func = inst->in_class->cl_setattr;
846 if (func == NULL)
847 return instance_setattr1(inst, name, v);
848 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000849 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000850 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000851 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000852 if (args == NULL)
853 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 res = PyEval_CallObject(func, args);
855 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000856 if (res == NULL)
857 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000859 return 0;
860}
861
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000863instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000864{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 PyObject *func;
866 PyObject *res;
867 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000868
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000869 if (reprstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000870 reprstr = PyString_InternFromString("__repr__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000871 if (reprstr == NULL)
872 return NULL;
873 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000874 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000876 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000877 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000878 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
879 return NULL;
880 PyErr_Clear();
881 classname = inst->in_class->cl_name;
882 mod = PyDict_GetItemString(inst->in_class->cl_dict,
883 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 if (classname != NULL && PyString_Check(classname))
885 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000886 else
887 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000888 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000889 return PyString_FromFormat("<?.%s instance at %p>",
890 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000891 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000892 return PyString_FromFormat("<%s.%s instance at %p>",
893 PyString_AsString(mod),
894 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000895 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 res = PyEval_CallObject(func, (PyObject *)NULL);
897 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898 return res;
899}
900
Guido van Rossum82c690f2001-04-30 14:39:18 +0000901static PyObject *
902instance_str(PyInstanceObject *inst)
903{
904 PyObject *func;
905 PyObject *res;
906 static PyObject *strstr;
907
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000908 if (strstr == NULL) {
Guido van Rossum82c690f2001-04-30 14:39:18 +0000909 strstr = PyString_InternFromString("__str__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000910 if (strstr == NULL)
911 return NULL;
912 }
Guido van Rossum82c690f2001-04-30 14:39:18 +0000913 func = instance_getattr(inst, strstr);
914 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000915 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
916 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000917 PyErr_Clear();
918 return instance_repr(inst);
919 }
920 res = PyEval_CallObject(func, (PyObject *)NULL);
921 Py_DECREF(func);
922 return res;
923}
924
Guido van Rossum9bfef441993-03-29 10:43:31 +0000925static long
Fred Drake79912472000-07-09 04:06:11 +0000926instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000927{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 PyObject *func;
929 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000930 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000931 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000932
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000933 if (hashstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000934 hashstr = PyString_InternFromString("__hash__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000935 if (hashstr == NULL)
936 return -1;
937 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000938 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000939 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000940 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
941 return -1;
942 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000943 /* If there is no __eq__ and no __cmp__ method, we hash on the
944 address. If an __eq__ or __cmp__ method exists, there must
945 be a __hash__. */
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000946 if (eqstr == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000947 eqstr = PyString_InternFromString("__eq__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000948 if (eqstr == NULL)
949 return -1;
950 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000951 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000952 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000953 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
954 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000956 if (cmpstr == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000957 cmpstr = PyString_InternFromString("__cmp__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000958 if (cmpstr == NULL)
959 return -1;
960 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000961 func = instance_getattr(inst, cmpstr);
962 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000963 if (!PyErr_ExceptionMatches(
964 PyExc_AttributeError))
965 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000966 PyErr_Clear();
967 return _Py_HashPointer(inst);
968 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000969 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000970 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000972 return -1;
973 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 res = PyEval_CallObject(func, (PyObject *)NULL);
975 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000976 if (res == NULL)
977 return -1;
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000978 if (PyInt_Check(res) || PyLong_Check(res))
979 /* This already converts a -1 result to -2. */
980 outcome = res->ob_type->tp_hash(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000981 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 PyErr_SetString(PyExc_TypeError,
983 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000984 outcome = -1;
985 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000987 return outcome;
988}
989
Jeremy Hylton8caad492000-06-23 14:18:11 +0000990static int
991instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
992{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000993 Py_VISIT(o->in_class);
994 Py_VISIT(o->in_dict);
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000995 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000996}
997
Guido van Rossum213c7a62001-04-23 14:08:49 +0000998static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
999static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001000
Martin v. Löwis18e16552006-02-15 17:27:45 +00001001static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001002instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 PyObject *func;
1005 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001006 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001007
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001008 if (lenstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001009 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001010 if (lenstr == NULL)
1011 return -1;
1012 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001013 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001014 if (func == NULL)
1015 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 res = PyEval_CallObject(func, (PyObject *)NULL);
1017 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001018 if (res == NULL)
1019 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 if (PyInt_Check(res)) {
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001021 outcome = PyInt_AsSsize_t(res);
1022 if (outcome == -1 && PyErr_Occurred()) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001023 Py_DECREF(res);
1024 return -1;
1025 }
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001026#if SIZEOF_SIZE_T < SIZEOF_INT
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001027 /* Overflow check -- range of PyInt is more than C int */
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001028 if (outcome != (int)outcome) {
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001029 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +00001030 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001031 outcome = -1;
1032 }
1033 else
1034#endif
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001035 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyErr_SetString(PyExc_ValueError,
1037 "__len__() should return >= 0");
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001038 outcome = -1;
1039 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001040 }
1041 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 PyErr_SetString(PyExc_TypeError,
1043 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044 outcome = -1;
1045 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001047 return outcome;
1048}
1049
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001051instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyObject *func;
1054 PyObject *arg;
1055 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001057 if (getitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001058 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001059 if (getitemstr == NULL)
1060 return NULL;
1061 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001062 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063 if (func == NULL)
1064 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001065 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001066 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068 return NULL;
1069 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 res = PyEval_CallObject(func, arg);
1071 Py_DECREF(func);
1072 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073 return res;
1074}
1075
Guido van Rossum9bfef441993-03-29 10:43:31 +00001076static int
Fred Drake79912472000-07-09 04:06:11 +00001077instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 PyObject *func;
1080 PyObject *arg;
1081 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001082
Guido van Rossum2878a691996-08-09 20:53:24 +00001083 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001084 if (delitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001085 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001086 if (delitemstr == NULL)
1087 return -1;
1088 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001089 func = instance_getattr(inst, delitemstr);
1090 }
1091 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001092 if (setitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001093 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001094 if (setitemstr == NULL)
1095 return -1;
1096 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001097 func = instance_getattr(inst, setitemstr);
1098 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001099 if (func == NULL)
1100 return -1;
1101 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001102 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001103 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001104 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001107 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 res = PyEval_CallObject(func, arg);
1110 Py_DECREF(func);
1111 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112 if (res == NULL)
1113 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001115 return 0;
1116}
1117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001119 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001120 (binaryfunc)instance_subscript, /* mp_subscript */
1121 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122};
1123
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001125instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001126{
Georg Brandle4e023c2006-05-26 20:22:50 +00001127 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001128
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001129 if (getitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001130 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001131 if (getitemstr == NULL)
1132 return NULL;
1133 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001134 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001135 if (func == NULL)
1136 return NULL;
Georg Brandle4e023c2006-05-26 20:22:50 +00001137 res = PyObject_CallFunction(func, "n", i);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139 return res;
1140}
1141
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001142static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001143instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001144{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001145 PyObject *func, *arg, *res;
1146 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001147
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001148 if (getslicestr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001149 getslicestr = PyString_InternFromString("__getslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001150 if (getslicestr == NULL)
1151 return NULL;
1152 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001153 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001154
1155 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001156 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1157 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001158 PyErr_Clear();
1159
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001160 if (getitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001161 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001162 if (getitemstr == NULL)
1163 return NULL;
1164 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001165 func = instance_getattr(inst, getitemstr);
1166 if (func == NULL)
1167 return NULL;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001168 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
Tim Peters34592512002-07-11 06:23:50 +00001169 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001170 arg = Py_BuildValue("(nn)", i, j);
Tim Peters34592512002-07-11 06:23:50 +00001171
Guido van Rossum04691fc1992-08-12 15:35:34 +00001172 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001173 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001174 return NULL;
1175 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 res = PyEval_CallObject(func, arg);
1177 Py_DECREF(func);
1178 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001179 return res;
1180}
1181
1182static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001183instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001184{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186
Guido van Rossum2878a691996-08-09 20:53:24 +00001187 if (item == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001188 if (delitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001189 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001190 if (delitemstr == NULL)
1191 return -1;
1192 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001193 func = instance_getattr(inst, delitemstr);
1194 }
1195 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001196 if (setitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001197 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001198 if (setitemstr == NULL)
1199 return -1;
1200 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001201 func = instance_getattr(inst, setitemstr);
1202 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001203 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001204 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001205 if (item == NULL)
Georg Brandl2cfaa342006-05-29 19:39:45 +00001206 arg = PyInt_FromSsize_t(i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001207 else
Georg Brandl2cfaa342006-05-29 19:39:45 +00001208 arg = Py_BuildValue("(nO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001211 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001212 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 res = PyEval_CallObject(func, arg);
1214 Py_DECREF(func);
1215 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001216 if (res == NULL)
1217 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001219 return 0;
1220}
1221
1222static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001223instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001224{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 PyObject *func, *arg, *res;
1226 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001227
Guido van Rossum2878a691996-08-09 20:53:24 +00001228 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001229 if (delslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 delslicestr =
1231 PyString_InternFromString("__delslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001232 if (delslicestr == NULL)
1233 return -1;
1234 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001235 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001236 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001237 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1238 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001239 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001240 if (delitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001241 delitemstr =
1242 PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001243 if (delitemstr == NULL)
1244 return -1;
1245 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001246 func = instance_getattr(inst, delitemstr);
1247 if (func == NULL)
1248 return -1;
1249
1250 arg = Py_BuildValue("(N)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001251 _PySlice_FromIndices(i, j));
Thomas Wouters1d75a792000-08-17 22:37:32 +00001252 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001253 arg = Py_BuildValue("(nn)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001254 }
1255 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001256 if (setslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 setslicestr =
1258 PyString_InternFromString("__setslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001259 if (setslicestr == NULL)
1260 return -1;
1261 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001262 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001263 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001264 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1265 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001266 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001267 if (setitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001268 setitemstr =
1269 PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001270 if (setitemstr == NULL)
1271 return -1;
1272 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001273 func = instance_getattr(inst, setitemstr);
1274 if (func == NULL)
1275 return -1;
1276
1277 arg = Py_BuildValue("(NO)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001278 _PySlice_FromIndices(i, j), value);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001279 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001280 arg = Py_BuildValue("(nnO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001281 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001282 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001284 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001285 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 res = PyEval_CallObject(func, arg);
1287 Py_DECREF(func);
1288 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001289 if (res == NULL)
1290 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001292 return 0;
1293}
1294
Tim Peterscb8d3682001-05-05 21:05:01 +00001295static int
1296instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001297{
1298 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001299 PyObject *func;
1300
1301 /* Try __contains__ first.
1302 * If that can't be done, try iterator-based searching.
1303 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001304
1305 if(__contains__ == NULL) {
1306 __contains__ = PyString_InternFromString("__contains__");
1307 if(__contains__ == NULL)
1308 return -1;
1309 }
1310 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001311 if (func) {
1312 PyObject *res;
1313 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001314 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001315 if(arg == NULL) {
1316 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001317 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001318 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001319 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001320 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001321 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001322 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001323 return -1;
1324 ret = PyObject_IsTrue(res);
1325 Py_DECREF(res);
1326 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001327 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001328
1329 /* Couldn't find __contains__. */
1330 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Martin v. Löwis3a624042006-11-08 06:46:37 +00001331 Py_ssize_t rc;
Tim Peterscb8d3682001-05-05 21:05:01 +00001332 /* Assume the failure was simply due to that there is no
1333 * __contains__ attribute, and try iterating instead.
1334 */
1335 PyErr_Clear();
Martin v. Löwis3a624042006-11-08 06:46:37 +00001336 rc = _PySequence_IterSearch((PyObject *)inst, member,
1337 PY_ITERSEARCH_CONTAINS);
1338 if (rc >= 0)
1339 return rc > 0;
Tim Peterscb8d3682001-05-05 21:05:01 +00001340 }
Martin v. Löwis3a624042006-11-08 06:46:37 +00001341 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001342}
1343
Fred Drake79912472000-07-09 04:06:11 +00001344static PySequenceMethods
1345instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001346 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001347 0, /* sq_concat */
1348 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001349 (ssizeargfunc)instance_item, /* sq_item */
1350 (ssizessizeargfunc)instance_slice, /* sq_slice */
1351 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1352 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001353 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001354};
1355
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001357generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001358{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001360
1361 if ((func = instance_getattr(self, methodname)) == NULL)
1362 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 res = PyEval_CallObject(func, (PyObject *)NULL);
1364 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001365 return res;
1366}
1367
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001368static PyObject *
1369generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001370{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001371 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001373 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001374 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001375 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001376 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001378 Py_INCREF(Py_NotImplemented);
1379 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001380 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001381 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001382 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001384 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001385 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001386 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 Py_DECREF(args);
1388 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001389 return result;
1390}
1391
1392
1393static PyObject *coerce_obj;
1394
1395/* Try one half of a binary operator involving a class instance. */
1396static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001397half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001398 int swapped)
1399{
1400 PyObject *args;
1401 PyObject *coercefunc;
1402 PyObject *coerced = NULL;
1403 PyObject *v1;
1404 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001405
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001406 if (!PyInstance_Check(v)) {
1407 Py_INCREF(Py_NotImplemented);
1408 return Py_NotImplemented;
1409 }
1410
1411 if (coerce_obj == NULL) {
1412 coerce_obj = PyString_InternFromString("__coerce__");
1413 if (coerce_obj == NULL)
1414 return NULL;
1415 }
1416 coercefunc = PyObject_GetAttr(v, coerce_obj);
1417 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001418 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1419 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001420 PyErr_Clear();
1421 return generic_binary_op(v, w, opname);
1422 }
1423
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001424 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001425 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001426 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001427 return NULL;
1428 }
1429 coerced = PyEval_CallObject(coercefunc, args);
1430 Py_DECREF(args);
1431 Py_DECREF(coercefunc);
1432 if (coerced == NULL) {
1433 return NULL;
1434 }
1435 if (coerced == Py_None || coerced == Py_NotImplemented) {
1436 Py_DECREF(coerced);
1437 return generic_binary_op(v, w, opname);
1438 }
1439 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1440 Py_DECREF(coerced);
1441 PyErr_SetString(PyExc_TypeError,
1442 "coercion should return None or 2-tuple");
1443 return NULL;
1444 }
1445 v1 = PyTuple_GetItem(coerced, 0);
1446 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001447 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001448 /* prevent recursion if __coerce__ returns self as the first
1449 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001450 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001451 } else {
Brett Cannonea3912b2006-06-13 21:46:41 +00001452 if (Py_EnterRecursiveCall(" after coercion"))
1453 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001454 if (swapped)
1455 result = (thisfunc)(w, v1);
1456 else
1457 result = (thisfunc)(v1, w);
Brett Cannonea3912b2006-06-13 21:46:41 +00001458 Py_LeaveRecursiveCall();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001459 }
1460 Py_DECREF(coerced);
1461 return result;
1462}
1463
1464/* Implement a binary operator involving at least one class instance. */
1465static PyObject *
1466do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1467 binaryfunc thisfunc)
1468{
1469 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1470 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001471 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001472 result = half_binop(w, v, ropname, thisfunc, 1);
1473 }
1474 return result;
1475}
1476
1477static PyObject *
1478do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1479 char *ropname, binaryfunc thisfunc)
1480{
1481 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1482 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001483 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001484 result = do_binop(v, w, opname, ropname, thisfunc);
1485 }
1486 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001487}
1488
Guido van Rossum879c5811995-01-10 15:24:06 +00001489static int
Fred Drake79912472000-07-09 04:06:11 +00001490instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001491{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 PyObject *v = *pv;
1493 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001494 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495 PyObject *args;
1496 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001497
Guido van Rossum2878a691996-08-09 20:53:24 +00001498 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001499 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001500 if (coerce_obj == NULL)
1501 return -1;
1502 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001503 coercefunc = PyObject_GetAttr(v, coerce_obj);
1504 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001505 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001506 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1507 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001509 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001510 }
1511 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001512 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001513 if (args == NULL) {
1514 return -1;
1515 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001516 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001518 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001519 if (coerced == NULL) {
1520 /* __coerce__ call raised an exception */
1521 return -1;
1522 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001523 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001524 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001526 return 1;
1527 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001529 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 Py_DECREF(coerced);
1531 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001532 "coercion should return None or 2-tuple");
1533 return -1;
1534 }
1535 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 *pv = PyTuple_GetItem(coerced, 0);
1537 *pw = PyTuple_GetItem(coerced, 1);
1538 Py_INCREF(*pv);
1539 Py_INCREF(*pw);
1540 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001541 return 0;
1542}
1543
Guido van Rossum04691fc1992-08-12 15:35:34 +00001544#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001545static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 static PyObject *o; \
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001547 if (o == NULL) { o = PyString_InternFromString(methodname); \
1548 if (o == NULL) return NULL; } \
Guido van Rossum2878a691996-08-09 20:53:24 +00001549 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001550}
1551
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001552/* unary function with a fallback */
1553#define UNARY_FB(funcname, methodname, funcname_fb) \
1554static PyObject *funcname(PyInstanceObject *self) { \
1555 static PyObject *o; \
1556 if (o == NULL) { o = PyString_InternFromString(methodname); \
1557 if (o == NULL) return NULL; } \
1558 if (PyObject_HasAttr((PyObject*)self, o)) \
1559 return generic_unary_op(self, o); \
1560 else \
1561 return funcname_fb(self); \
1562}
1563
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001564#define BINARY(f, m, n) \
1565static PyObject *f(PyObject *v, PyObject *w) { \
1566 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1567}
1568
1569#define BINARY_INPLACE(f, m, n) \
1570static PyObject *f(PyObject *v, PyObject *w) { \
1571 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1572 "__r" m "__", n); \
1573}
1574
Guido van Rossum04691fc1992-08-12 15:35:34 +00001575UNARY(instance_neg, "__neg__")
1576UNARY(instance_pos, "__pos__")
1577UNARY(instance_abs, "__abs__")
1578
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001579BINARY(instance_or, "or", PyNumber_Or)
1580BINARY(instance_and, "and", PyNumber_And)
1581BINARY(instance_xor, "xor", PyNumber_Xor)
1582BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1583BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1584BINARY(instance_add, "add", PyNumber_Add)
1585BINARY(instance_sub, "sub", PyNumber_Subtract)
1586BINARY(instance_mul, "mul", PyNumber_Multiply)
1587BINARY(instance_div, "div", PyNumber_Divide)
1588BINARY(instance_mod, "mod", PyNumber_Remainder)
1589BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001590BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1591BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001592
1593BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1594BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1595BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1596BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1597BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1598BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1599BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1600BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1601BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1602BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001603BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1604BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001605
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001606/* Try a 3-way comparison, returning an int; v is an instance. Return:
1607 -2 for an exception;
1608 -1 if v < w;
1609 0 if v == w;
1610 1 if v > w;
1611 2 if this particular 3-way comparison is not implemented or undefined.
1612*/
1613static int
1614half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001615{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001616 static PyObject *cmp_obj;
1617 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001618 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001619 PyObject *result;
1620 long l;
1621
1622 assert(PyInstance_Check(v));
1623
1624 if (cmp_obj == NULL) {
1625 cmp_obj = PyString_InternFromString("__cmp__");
1626 if (cmp_obj == NULL)
1627 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001628 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001629
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001630 cmp_func = PyObject_GetAttr(v, cmp_obj);
1631 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001632 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1633 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001634 PyErr_Clear();
1635 return 2;
1636 }
1637
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001638 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001639 if (args == NULL) {
1640 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001641 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001642 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001643
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001644 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001645 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001646 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001647
1648 if (result == NULL)
1649 return -2;
1650
1651 if (result == Py_NotImplemented) {
1652 Py_DECREF(result);
1653 return 2;
1654 }
1655
1656 l = PyInt_AsLong(result);
1657 Py_DECREF(result);
1658 if (l == -1 && PyErr_Occurred()) {
1659 PyErr_SetString(PyExc_TypeError,
1660 "comparison did not return an int");
1661 return -2;
1662 }
1663
1664 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001665}
1666
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001667/* Try a 3-way comparison, returning an int; either v or w is an instance.
1668 We first try a coercion. Return:
1669 -2 for an exception;
1670 -1 if v < w;
1671 0 if v == w;
1672 1 if v > w;
1673 2 if this particular 3-way comparison is not implemented or undefined.
1674 THIS IS ONLY CALLED FROM object.c!
1675*/
1676static int
1677instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001678{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001679 int c;
1680
1681 c = PyNumber_CoerceEx(&v, &w);
1682 if (c < 0)
1683 return -2;
1684 if (c == 0) {
1685 /* If neither is now an instance, use regular comparison */
1686 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1687 c = PyObject_Compare(v, w);
1688 Py_DECREF(v);
1689 Py_DECREF(w);
1690 if (PyErr_Occurred())
1691 return -2;
1692 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001693 }
1694 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001695 else {
1696 /* The coercion didn't do anything.
1697 Treat this the same as returning v and w unchanged. */
1698 Py_INCREF(v);
1699 Py_INCREF(w);
1700 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001701
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001702 if (PyInstance_Check(v)) {
1703 c = half_cmp(v, w);
1704 if (c <= 1) {
1705 Py_DECREF(v);
1706 Py_DECREF(w);
1707 return c;
1708 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001709 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001710 if (PyInstance_Check(w)) {
1711 c = half_cmp(w, v);
1712 if (c <= 1) {
1713 Py_DECREF(v);
1714 Py_DECREF(w);
1715 if (c >= -1)
1716 c = -c;
1717 return c;
1718 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001719 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001720 Py_DECREF(v);
1721 Py_DECREF(w);
1722 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001723}
1724
Guido van Rossum9bfef441993-03-29 10:43:31 +00001725static int
Fred Drake79912472000-07-09 04:06:11 +00001726instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001727{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001728 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001729 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001731
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001732 if (nonzerostr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001733 nonzerostr = PyString_InternFromString("__nonzero__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001734 if (nonzerostr == NULL)
1735 return -1;
1736 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001737 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001738 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1739 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001740 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001741 if (lenstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001742 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001743 if (lenstr == NULL)
1744 return -1;
1745 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001746 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001747 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1748 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001749 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001750 /* Fall back to the default behavior:
1751 all instances are nonzero */
1752 return 1;
1753 }
1754 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001755 res = PyEval_CallObject(func, (PyObject *)NULL);
1756 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001757 if (res == NULL)
1758 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001759 if (!PyInt_Check(res)) {
1760 Py_DECREF(res);
1761 PyErr_SetString(PyExc_TypeError,
1762 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001763 return -1;
1764 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001765 outcome = PyInt_AsLong(res);
1766 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001767 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001768 PyErr_SetString(PyExc_ValueError,
1769 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001770 return -1;
1771 }
1772 return outcome > 0;
1773}
1774
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001775static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001776instance_index(PyInstanceObject *self)
1777{
1778 PyObject *func, *res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001779 static PyObject *indexstr = NULL;
1780
1781 if (indexstr == NULL) {
1782 indexstr = PyString_InternFromString("__index__");
1783 if (indexstr == NULL)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001784 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001785 }
1786 if ((func = instance_getattr(self, indexstr)) == NULL) {
1787 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001788 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001789 PyErr_Clear();
1790 PyErr_SetString(PyExc_TypeError,
1791 "object cannot be interpreted as an index");
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001792 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001793 }
1794 res = PyEval_CallObject(func, (PyObject *)NULL);
1795 Py_DECREF(func);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001796 return res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001797}
1798
1799
Guido van Rossum04691fc1992-08-12 15:35:34 +00001800UNARY(instance_invert, "__invert__")
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001801UNARY(_instance_trunc, "__trunc__")
1802
1803static PyObject *
1804instance_int(PyInstanceObject *self)
1805{
1806 PyObject *truncated;
1807 static PyObject *int_name;
1808 if (int_name == NULL) {
1809 int_name = PyString_InternFromString("__int__");
1810 if (int_name == NULL)
1811 return NULL;
1812 }
1813 if (PyObject_HasAttr((PyObject*)self, int_name))
1814 return generic_unary_op(self, int_name);
1815
1816 truncated = _instance_trunc(self);
1817 /* __trunc__ is specified to return an Integral type, but
1818 int() needs to return an int. */
1819 return _PyNumber_ConvertIntegralToInt(
1820 truncated,
1821 "__trunc__ returned non-Integral (type %.200s)");
1822}
1823
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001824UNARY_FB(instance_long, "__long__", instance_int)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001825UNARY(instance_float, "__float__")
1826UNARY(instance_oct, "__oct__")
1827UNARY(instance_hex, "__hex__")
1828
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001829static PyObject *
1830bin_power(PyObject *v, PyObject *w)
1831{
1832 return PyNumber_Power(v, w, Py_None);
1833}
1834
Guido van Rossum03093a21994-09-28 15:51:32 +00001835/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001836static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001837instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001838{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001839 if (z == Py_None) {
1840 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001841 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001842 else {
1843 PyObject *func;
1844 PyObject *args;
1845 PyObject *result;
1846
1847 /* XXX Doesn't do coercions... */
1848 func = PyObject_GetAttrString(v, "__pow__");
1849 if (func == NULL)
1850 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001851 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001852 if (args == NULL) {
1853 Py_DECREF(func);
1854 return NULL;
1855 }
1856 result = PyEval_CallObject(func, args);
1857 Py_DECREF(func);
1858 Py_DECREF(args);
1859 return result;
1860 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001861}
1862
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001863static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001864bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001865{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001866 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001867}
1868
1869
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001870static PyObject *
1871instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1872{
1873 if (z == Py_None) {
1874 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1875 "__rpow__", bin_inplace_power);
1876 }
1877 else {
1878 /* XXX Doesn't do coercions... */
1879 PyObject *func;
1880 PyObject *args;
1881 PyObject *result;
1882
1883 func = PyObject_GetAttrString(v, "__ipow__");
1884 if (func == NULL) {
1885 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1886 return NULL;
1887 PyErr_Clear();
1888 return instance_pow(v, w, z);
1889 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001890 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001891 if (args == NULL) {
1892 Py_DECREF(func);
1893 return NULL;
1894 }
1895 result = PyEval_CallObject(func, args);
1896 Py_DECREF(func);
1897 Py_DECREF(args);
1898 return result;
1899 }
1900}
1901
1902
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001903/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001904#define NAME_OPS 6
1905static PyObject **name_op = NULL;
1906
Tim Peters34592512002-07-11 06:23:50 +00001907static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001908init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001909{
1910 int i;
1911 char *_name_op[] = {
1912 "__lt__",
1913 "__le__",
1914 "__eq__",
1915 "__ne__",
1916 "__gt__",
1917 "__ge__",
1918 };
1919
1920 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1921 if (name_op == NULL)
1922 return -1;
1923 for (i = 0; i < NAME_OPS; ++i) {
1924 name_op[i] = PyString_InternFromString(_name_op[i]);
1925 if (name_op[i] == NULL)
1926 return -1;
1927 }
1928 return 0;
1929}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001930
1931static PyObject *
1932half_richcompare(PyObject *v, PyObject *w, int op)
1933{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001934 PyObject *method;
1935 PyObject *args;
1936 PyObject *res;
1937
1938 assert(PyInstance_Check(v));
1939
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001940 if (name_op == NULL) {
1941 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001942 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001943 }
1944 /* If the instance doesn't define an __getattr__ method, use
1945 instance_getattr2 directly because it will not set an
1946 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001947 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001948 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001949 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001950 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001951 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001952 if (method == NULL) {
1953 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001954 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1955 return NULL;
1956 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001957 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001958 res = Py_NotImplemented;
1959 Py_INCREF(res);
1960 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001961 }
1962
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001963 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001964 if (args == NULL) {
1965 Py_DECREF(method);
1966 return NULL;
1967 }
1968
1969 res = PyEval_CallObject(method, args);
1970 Py_DECREF(args);
1971 Py_DECREF(method);
1972
1973 return res;
1974}
1975
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001976static PyObject *
1977instance_richcompare(PyObject *v, PyObject *w, int op)
1978{
1979 PyObject *res;
1980
1981 if (PyInstance_Check(v)) {
1982 res = half_richcompare(v, w, op);
1983 if (res != Py_NotImplemented)
1984 return res;
1985 Py_DECREF(res);
1986 }
1987
1988 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00001989 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001990 if (res != Py_NotImplemented)
1991 return res;
1992 Py_DECREF(res);
1993 }
1994
1995 Py_INCREF(Py_NotImplemented);
1996 return Py_NotImplemented;
1997}
1998
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001999
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002000/* Get the iterator */
2001static PyObject *
2002instance_getiter(PyInstanceObject *self)
2003{
2004 PyObject *func;
2005
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002006 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002007 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002008 if (iterstr == NULL)
2009 return NULL;
2010 }
2011 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002012 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002013 if (getitemstr == NULL)
2014 return NULL;
2015 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002016
2017 if ((func = instance_getattr(self, iterstr)) != NULL) {
2018 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2019 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002020 if (res != NULL && !PyIter_Check(res)) {
2021 PyErr_Format(PyExc_TypeError,
2022 "__iter__ returned non-iterator "
2023 "of type '%.100s'",
2024 res->ob_type->tp_name);
2025 Py_DECREF(res);
2026 res = NULL;
2027 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002028 return res;
2029 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002030 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2031 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002032 PyErr_Clear();
2033 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002034 PyErr_SetString(PyExc_TypeError,
2035 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002036 return NULL;
2037 }
2038 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002039 return PySeqIter_New((PyObject *)self);
2040}
2041
2042
2043/* Call the iterator's next */
2044static PyObject *
2045instance_iternext(PyInstanceObject *self)
2046{
2047 PyObject *func;
2048
Neal Norwitzb09f4f52006-08-13 18:10:28 +00002049 if (nextstr == NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002050 nextstr = PyString_InternFromString("next");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00002051 if (nextstr == NULL)
2052 return NULL;
2053 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002054
2055 if ((func = instance_getattr(self, nextstr)) != NULL) {
2056 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2057 Py_DECREF(func);
2058 if (res != NULL) {
2059 return res;
2060 }
2061 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
2062 PyErr_Clear();
2063 return NULL;
2064 }
2065 return NULL;
2066 }
2067 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
2068 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002069}
2070
Tim Peters6d6c1a32001-08-02 04:15:00 +00002071static PyObject *
2072instance_call(PyObject *func, PyObject *arg, PyObject *kw)
2073{
2074 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2075 if (call == NULL) {
2076 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002077 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2078 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002079 PyErr_Clear();
2080 PyErr_Format(PyExc_AttributeError,
2081 "%.200s instance has no __call__ method",
2082 PyString_AsString(inst->in_class->cl_name));
2083 return NULL;
2084 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00002085 /* We must check and increment the recursion depth here. Scenario:
2086 class A:
2087 pass
2088 A.__call__ = A() # that's right
2089 a = A() # ok
2090 a() # infinite recursion
2091 This bounces between instance_call() and PyObject_Call() without
2092 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002093 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002094 res = NULL;
2095 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00002096 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002097 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00002098 Py_LeaveRecursiveCall();
2099 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002100 Py_DECREF(call);
2101 return res;
2102}
2103
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002104
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002105static PyNumberMethods instance_as_number = {
Georg Brandl347b3002006-03-30 11:57:00 +00002106 instance_add, /* nb_add */
2107 instance_sub, /* nb_subtract */
2108 instance_mul, /* nb_multiply */
2109 instance_div, /* nb_divide */
2110 instance_mod, /* nb_remainder */
2111 instance_divmod, /* nb_divmod */
2112 instance_pow, /* nb_power */
2113 (unaryfunc)instance_neg, /* nb_negative */
2114 (unaryfunc)instance_pos, /* nb_positive */
2115 (unaryfunc)instance_abs, /* nb_absolute */
2116 (inquiry)instance_nonzero, /* nb_nonzero */
2117 (unaryfunc)instance_invert, /* nb_invert */
2118 instance_lshift, /* nb_lshift */
2119 instance_rshift, /* nb_rshift */
2120 instance_and, /* nb_and */
2121 instance_xor, /* nb_xor */
2122 instance_or, /* nb_or */
2123 instance_coerce, /* nb_coerce */
2124 (unaryfunc)instance_int, /* nb_int */
2125 (unaryfunc)instance_long, /* nb_long */
2126 (unaryfunc)instance_float, /* nb_float */
2127 (unaryfunc)instance_oct, /* nb_oct */
2128 (unaryfunc)instance_hex, /* nb_hex */
2129 instance_iadd, /* nb_inplace_add */
2130 instance_isub, /* nb_inplace_subtract */
2131 instance_imul, /* nb_inplace_multiply */
2132 instance_idiv, /* nb_inplace_divide */
2133 instance_imod, /* nb_inplace_remainder */
2134 instance_ipow, /* nb_inplace_power */
2135 instance_ilshift, /* nb_inplace_lshift */
2136 instance_irshift, /* nb_inplace_rshift */
2137 instance_iand, /* nb_inplace_and */
2138 instance_ixor, /* nb_inplace_xor */
2139 instance_ior, /* nb_inplace_or */
2140 instance_floordiv, /* nb_floor_divide */
2141 instance_truediv, /* nb_true_divide */
2142 instance_ifloordiv, /* nb_inplace_floor_divide */
2143 instance_itruediv, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002144 (unaryfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002145};
2146
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002147PyTypeObject PyInstance_Type = {
2148 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002149 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002150 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002151 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002152 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002153 (destructor)instance_dealloc, /* tp_dealloc */
2154 0, /* tp_print */
2155 0, /* tp_getattr */
2156 0, /* tp_setattr */
2157 instance_compare, /* tp_compare */
2158 (reprfunc)instance_repr, /* tp_repr */
2159 &instance_as_number, /* tp_as_number */
2160 &instance_as_sequence, /* tp_as_sequence */
2161 &instance_as_mapping, /* tp_as_mapping */
2162 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002163 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002164 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002165 (getattrofunc)instance_getattr, /* tp_getattro */
2166 (setattrofunc)instance_setattr, /* tp_setattro */
2167 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002168 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002169 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002170 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002171 0, /* tp_clear */
2172 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002173 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2174 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002175 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002176 0, /* tp_methods */
2177 0, /* tp_members */
2178 0, /* tp_getset */
2179 0, /* tp_base */
2180 0, /* tp_dict */
2181 0, /* tp_descr_get */
2182 0, /* tp_descr_set */
2183 0, /* tp_dictoffset */
2184 0, /* tp_init */
2185 0, /* tp_alloc */
2186 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002187};
2188
2189
Guido van Rossum81daa321993-05-20 14:24:46 +00002190/* Instance method objects are used for two purposes:
2191 (a) as bound instance methods (returned by instancename.methodname)
2192 (b) as unbound methods (returned by ClassName.methodname)
2193 In case (b), im_self is NULL
2194*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002195
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002196static PyMethodObject *free_list;
2197
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002198PyObject *
Anthony Baxter377be112006-04-11 06:54:30 +00002199PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002200{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002201 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002202 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002204 return NULL;
2205 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002206 im = free_list;
2207 if (im != NULL) {
2208 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002209 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002210 }
2211 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002212 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002213 if (im == NULL)
2214 return NULL;
2215 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002216 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002217 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002218 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002219 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002220 im->im_self = self;
Anthony Baxter377be112006-04-11 06:54:30 +00002221 Py_XINCREF(klass);
2222 im->im_class = klass;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002223 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002224 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002225}
2226
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002227/* Descriptors for PyMethod attributes */
2228
2229/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002230
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002231#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232
Guido van Rossum6f799372001-09-20 20:46:19 +00002233static PyMemberDef instancemethod_memberlist[] = {
2234 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2235 "the class associated with a method"},
2236 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2237 "the function (or other callable) implementing a method"},
2238 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2239 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002240 {NULL} /* Sentinel */
2241};
2242
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002243/* Christian Tismer argued convincingly that method attributes should
2244 (nearly) always override function attributes.
2245 The one exception is __doc__; there's a default __doc__ which
2246 should only be used for the class, not for instances */
2247
2248static PyObject *
2249instancemethod_get_doc(PyMethodObject *im, void *context)
2250{
2251 static PyObject *docstr;
2252 if (docstr == NULL) {
2253 docstr= PyString_InternFromString("__doc__");
2254 if (docstr == NULL)
2255 return NULL;
2256 }
2257 return PyObject_GetAttr(im->im_func, docstr);
2258}
2259
2260static PyGetSetDef instancemethod_getset[] = {
2261 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2262 {0}
2263};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002264
2265static PyObject *
2266instancemethod_getattro(PyObject *obj, PyObject *name)
2267{
2268 PyMethodObject *im = (PyMethodObject *)obj;
2269 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002270 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002271
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002272 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2273 if (tp->tp_dict == NULL) {
2274 if (PyType_Ready(tp) < 0)
2275 return NULL;
2276 }
2277 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002278 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002279
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002280 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002281 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2282 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002283 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002284 else {
2285 Py_INCREF(descr);
2286 return descr;
2287 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002288 }
2289
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002290 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002291}
2292
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002293PyDoc_STRVAR(instancemethod_doc,
2294"instancemethod(function, instance, class)\n\
2295\n\
2296Create an instance method object.");
2297
2298static PyObject *
2299instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2300{
2301 PyObject *func;
2302 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002303 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002304
Georg Brandl5d59c092006-09-30 08:43:30 +00002305 if (!_PyArg_NoKeywords("instancemethod", kw))
2306 return NULL;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002307 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002308 &func, &self, &classObj))
2309 return NULL;
2310 if (!PyCallable_Check(func)) {
2311 PyErr_SetString(PyExc_TypeError,
2312 "first argument must be callable");
2313 return NULL;
2314 }
2315 if (self == Py_None)
2316 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002317 if (self == NULL && classObj == NULL) {
2318 PyErr_SetString(PyExc_TypeError,
2319 "unbound methods must have non-NULL im_class");
2320 return NULL;
2321 }
2322
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002323 return PyMethod_New(func, self, classObj);
2324}
2325
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002326static void
Fred Drake79912472000-07-09 04:06:11 +00002327instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002328{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002329 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002330 if (im->im_weakreflist != NULL)
2331 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002332 Py_DECREF(im->im_func);
2333 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002334 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002335 im->im_self = (PyObject *)free_list;
2336 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002337}
2338
Guido van Rossumebc8c511992-09-03 20:39:51 +00002339static int
Fred Drake79912472000-07-09 04:06:11 +00002340instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002341{
Armin Rigofd01d792006-06-08 10:56:24 +00002342 int cmp;
2343 cmp = PyObject_Compare(a->im_func, b->im_func);
2344 if (cmp)
2345 return cmp;
2346
2347 if (a->im_self == b->im_self)
2348 return 0;
2349 if (a->im_self == NULL || b->im_self == NULL)
Guido van Rossume9df7271995-04-06 14:46:51 +00002350 return (a->im_self < b->im_self) ? -1 : 1;
Armin Rigofd01d792006-06-08 10:56:24 +00002351 else
2352 return PyObject_Compare(a->im_self, b->im_self);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002353}
2354
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002355static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002356instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002357{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002358 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002359 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002360 PyObject *klass = a->im_class;
2361 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2362 char *sfuncname = "?", *sklassname = "?";
2363
2364 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002365 if (funcname == NULL) {
2366 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2367 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002368 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002369 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002370 else if (!PyString_Check(funcname)) {
2371 Py_DECREF(funcname);
2372 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002373 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002374 else
2375 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002376 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002377 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002378 else {
2379 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002380 if (klassname == NULL) {
2381 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2382 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002383 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002384 }
Guido van Rossum40667692001-08-17 13:59:27 +00002385 else if (!PyString_Check(klassname)) {
2386 Py_DECREF(klassname);
2387 klassname = NULL;
2388 }
2389 else
2390 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002391 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002392 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002393 result = PyString_FromFormat("<unbound method %s.%s>",
2394 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002395 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002396 /* XXX Shouldn't use repr() here! */
2397 PyObject *selfrepr = PyObject_Repr(self);
2398 if (selfrepr == NULL)
2399 goto fail;
2400 if (!PyString_Check(selfrepr)) {
2401 Py_DECREF(selfrepr);
2402 goto fail;
2403 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002404 result = PyString_FromFormat("<bound method %s.%s of %s>",
2405 sklassname, sfuncname,
2406 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002407 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002408 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002409 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002410 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002411 Py_XDECREF(klassname);
2412 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002413}
2414
Guido van Rossum9bfef441993-03-29 10:43:31 +00002415static long
Fred Drake79912472000-07-09 04:06:11 +00002416instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002417{
2418 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002419 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002420 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002421 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002422 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002423 if (x == -1)
2424 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002425 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002426 if (y == -1)
2427 return -1;
Armin Rigofd01d792006-06-08 10:56:24 +00002428 x = x ^ y;
2429 if (x == -1)
2430 x = -2;
2431 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002432}
2433
Jeremy Hylton8caad492000-06-23 14:18:11 +00002434static int
2435instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2436{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002437 Py_VISIT(im->im_func);
2438 Py_VISIT(im->im_self);
2439 Py_VISIT(im->im_class);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002440 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002441}
2442
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002443static void
Anthony Baxter377be112006-04-11 06:54:30 +00002444getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002445{
2446 PyObject *name;
2447
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002448 assert(bufsize > 1);
2449 strcpy(buf, "?"); /* Default outcome */
Anthony Baxter377be112006-04-11 06:54:30 +00002450 if (klass == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002451 return;
Anthony Baxter377be112006-04-11 06:54:30 +00002452 name = PyObject_GetAttrString(klass, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002453 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002454 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002455 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002456 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002457 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002458 if (PyString_Check(name)) {
2459 strncpy(buf, PyString_AS_STRING(name), bufsize);
2460 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002461 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002462 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002463}
2464
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002465static void
2466getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002467{
Anthony Baxter377be112006-04-11 06:54:30 +00002468 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002469
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002470 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002471 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002472 strcpy(buf, "nothing");
2473 return;
2474 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002475
Anthony Baxter377be112006-04-11 06:54:30 +00002476 klass = PyObject_GetAttrString(inst, "__class__");
2477 if (klass == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002478 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002479 PyErr_Clear();
Anthony Baxter377be112006-04-11 06:54:30 +00002480 klass = (PyObject *)(inst->ob_type);
2481 Py_INCREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002482 }
Anthony Baxter377be112006-04-11 06:54:30 +00002483 getclassname(klass, buf, bufsize);
2484 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002485}
2486
Tim Peters6d6c1a32001-08-02 04:15:00 +00002487static PyObject *
2488instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2489{
2490 PyObject *self = PyMethod_GET_SELF(func);
Anthony Baxter377be112006-04-11 06:54:30 +00002491 PyObject *klass = PyMethod_GET_CLASS(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002492 PyObject *result;
2493
2494 func = PyMethod_GET_FUNCTION(func);
2495 if (self == NULL) {
2496 /* Unbound methods must be called with an instance of
2497 the class (or a derived class) as first argument */
2498 int ok;
2499 if (PyTuple_Size(arg) >= 1)
2500 self = PyTuple_GET_ITEM(arg, 0);
2501 if (self == NULL)
2502 ok = 0;
2503 else {
Anthony Baxter377be112006-04-11 06:54:30 +00002504 ok = PyObject_IsInstance(self, klass);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002505 if (ok < 0)
2506 return NULL;
2507 }
2508 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002509 char clsbuf[256];
2510 char instbuf[256];
Anthony Baxter377be112006-04-11 06:54:30 +00002511 getclassname(klass, clsbuf, sizeof(clsbuf));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002512 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002513 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002514 "unbound method %s%s must be called with "
2515 "%s instance as first argument "
2516 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002517 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002518 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002519 clsbuf,
2520 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002521 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002522 return NULL;
2523 }
2524 Py_INCREF(arg);
2525 }
2526 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002527 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002528 PyObject *newarg = PyTuple_New(argcount + 1);
2529 int i;
2530 if (newarg == NULL)
2531 return NULL;
2532 Py_INCREF(self);
2533 PyTuple_SET_ITEM(newarg, 0, self);
2534 for (i = 0; i < argcount; i++) {
2535 PyObject *v = PyTuple_GET_ITEM(arg, i);
2536 Py_XINCREF(v);
2537 PyTuple_SET_ITEM(newarg, i+1, v);
2538 }
2539 arg = newarg;
2540 }
2541 result = PyObject_Call((PyObject *)func, arg, kw);
2542 Py_DECREF(arg);
2543 return result;
2544}
2545
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002546static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002547instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002548{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002549 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002550 of a class that's not a base class of cls. */
2551
2552 if (PyMethod_GET_SELF(meth) != NULL) {
2553 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002554 Py_INCREF(meth);
2555 return meth;
2556 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002557 /* No, it is an unbound method */
2558 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2559 /* Do subclass test. If it fails, return meth unchanged. */
2560 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2561 if (ok < 0)
2562 return NULL;
2563 if (!ok) {
2564 Py_INCREF(meth);
2565 return meth;
2566 }
2567 }
2568 /* Bind it to obj */
2569 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002570}
2571
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002572PyTypeObject PyMethod_Type = {
2573 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002574 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002575 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002576 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002577 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002578 (destructor)instancemethod_dealloc, /* tp_dealloc */
2579 0, /* tp_print */
2580 0, /* tp_getattr */
2581 0, /* tp_setattr */
2582 (cmpfunc)instancemethod_compare, /* tp_compare */
2583 (reprfunc)instancemethod_repr, /* tp_repr */
2584 0, /* tp_as_number */
2585 0, /* tp_as_sequence */
2586 0, /* tp_as_mapping */
2587 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002588 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002589 0, /* tp_str */
Georg Brandl347b3002006-03-30 11:57:00 +00002590 instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002591 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002592 0, /* tp_as_buffer */
Raymond Hettingerbff60ae2005-06-19 08:42:20 +00002593 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002594 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002595 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002596 0, /* tp_clear */
2597 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002598 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2599 0, /* tp_iter */
2600 0, /* tp_iternext */
2601 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002602 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002603 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002604 0, /* tp_base */
2605 0, /* tp_dict */
2606 instancemethod_descr_get, /* tp_descr_get */
2607 0, /* tp_descr_set */
2608 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002609 0, /* tp_init */
2610 0, /* tp_alloc */
2611 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002612};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002613
2614/* Clear out the free list */
2615
2616void
Fred Drake79912472000-07-09 04:06:11 +00002617PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002618{
2619 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002620 PyMethodObject *im = free_list;
2621 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002622 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002623 }
2624}