blob: 8560b6842cec2213488ee0c1796ce9a1c1785069 [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) {
649 Py_DECREF(inst->in_class);
650 Py_XDECREF(inst->in_dict);
651 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000652 }
Tim Peters34592512002-07-11 06:23:50 +0000653 else {
Martin v. Löwis66851282006-04-22 11:40:03 +0000654 Py_ssize_t refcnt = inst->ob_refcnt;
Tim Peters34592512002-07-11 06:23:50 +0000655 /* __del__ resurrected it! Make it look like the original
656 * Py_DECREF never happened.
657 */
658 _Py_NewReference((PyObject *)inst);
659 inst->ob_refcnt = refcnt;
660 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000661 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
662 * we need to undo that. */
663 _Py_DEC_REFTOTAL;
664 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
665 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000666 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000667 * _Py_NewReference bumped tp_allocs: both of those need to be
668 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000669 */
Tim Peters6b184912000-09-17 14:40:17 +0000670#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000671 --inst->ob_type->tp_frees;
672 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000673#endif
Tim Peters34592512002-07-11 06:23:50 +0000674 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000675}
676
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000678instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000679{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 register PyObject *v;
681 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000682 if (sname[0] == '_' && sname[1] == '_') {
683 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 if (PyEval_GetRestricted()) {
685 PyErr_SetString(PyExc_RuntimeError,
686 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000687 return NULL;
688 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000690 return inst->in_dict;
691 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000692 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 Py_INCREF(inst->in_class);
694 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000695 }
Guido van Rossum94308391991-10-20 20:11:48 +0000696 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000697 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000698 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000699 PyErr_Format(PyExc_AttributeError,
700 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000701 PyString_AS_STRING(inst->in_class->cl_name), sname);
702 }
703 return v;
704}
705
706static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000707instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000708{
709 register PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000710 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000711 descrgetfunc f;
712
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000714 if (v != NULL) {
715 Py_INCREF(v);
716 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000717 }
Anthony Baxter377be112006-04-11 06:54:30 +0000718 v = class_lookup(inst->in_class, name, &klass);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000719 if (v != NULL) {
720 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000721 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000722 if (f != NULL) {
723 PyObject *w = f(v, (PyObject *)inst,
724 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000726 v = w;
727 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000728 }
729 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730}
731
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000733instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000734{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000736 res = instance_getattr1(inst, name);
737 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000739 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
740 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000742 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000743 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000744 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 res = PyEval_CallObject(func, args);
746 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000747 }
748 return res;
749}
750
Tim Petersdf875b92003-04-07 17:51:59 +0000751/* See classobject.h comments: this only does dict lookups, and is always
752 * safe to call.
753 */
754PyObject *
755_PyInstance_Lookup(PyObject *pinst, PyObject *name)
756{
757 PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000758 PyClassObject *klass;
Tim Petersdf875b92003-04-07 17:51:59 +0000759 PyInstanceObject *inst; /* pinst cast to the right type */
760
761 assert(PyInstance_Check(pinst));
762 inst = (PyInstanceObject *)pinst;
763
764 assert(PyString_Check(name));
765
766 v = PyDict_GetItem(inst->in_dict, name);
767 if (v == NULL)
Anthony Baxter377be112006-04-11 06:54:30 +0000768 v = class_lookup(inst->in_class, name, &klass);
Tim Petersdf875b92003-04-07 17:51:59 +0000769 return v;
770}
771
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000772static int
Fred Drake79912472000-07-09 04:06:11 +0000773instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000774{
Guido van Rossum94472a01992-09-04 09:45:18 +0000775 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000777 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000778 PyErr_Format(PyExc_AttributeError,
779 "%.50s instance has no attribute '%.400s'",
780 PyString_AS_STRING(inst->in_class->cl_name),
781 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000782 return rv;
783 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000786}
787
Guido van Rossume7737541994-09-05 07:31:41 +0000788static int
Fred Drake79912472000-07-09 04:06:11 +0000789instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000790{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000791 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000793 if (sname[0] == '_' && sname[1] == '_') {
Martin v. Löwis66851282006-04-22 11:40:03 +0000794 Py_ssize_t n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000795 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000796 if (strcmp(sname, "__dict__") == 0) {
797 if (PyEval_GetRestricted()) {
798 PyErr_SetString(PyExc_RuntimeError,
799 "__dict__ not accessible in restricted mode");
800 return -1;
801 }
802 if (v == NULL || !PyDict_Check(v)) {
803 PyErr_SetString(PyExc_TypeError,
804 "__dict__ must be set to a dictionary");
805 return -1;
806 }
807 tmp = inst->in_dict;
808 Py_INCREF(v);
809 inst->in_dict = v;
810 Py_DECREF(tmp);
811 return 0;
812 }
813 if (strcmp(sname, "__class__") == 0) {
814 if (PyEval_GetRestricted()) {
815 PyErr_SetString(PyExc_RuntimeError,
816 "__class__ not accessible in restricted mode");
817 return -1;
818 }
819 if (v == NULL || !PyClass_Check(v)) {
820 PyErr_SetString(PyExc_TypeError,
821 "__class__ must be set to a class");
822 return -1;
823 }
824 tmp = (PyObject *)(inst->in_class);
825 Py_INCREF(v);
826 inst->in_class = (PyClassObject *)v;
827 Py_DECREF(tmp);
828 return 0;
829 }
Guido van Rossume7737541994-09-05 07:31:41 +0000830 }
Guido van Rossume7737541994-09-05 07:31:41 +0000831 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000832 if (v == NULL)
833 func = inst->in_class->cl_delattr;
834 else
835 func = inst->in_class->cl_setattr;
836 if (func == NULL)
837 return instance_setattr1(inst, name, v);
838 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000839 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000840 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000841 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000842 if (args == NULL)
843 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 res = PyEval_CallObject(func, args);
845 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000846 if (res == NULL)
847 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000849 return 0;
850}
851
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000853instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000854{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 PyObject *func;
856 PyObject *res;
857 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000859 if (reprstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000860 reprstr = PyString_InternFromString("__repr__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000861 if (reprstr == NULL)
862 return NULL;
863 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000864 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000866 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000867 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000868 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
869 return NULL;
870 PyErr_Clear();
871 classname = inst->in_class->cl_name;
872 mod = PyDict_GetItemString(inst->in_class->cl_dict,
873 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 if (classname != NULL && PyString_Check(classname))
875 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000876 else
877 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000878 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000879 return PyString_FromFormat("<?.%s instance at %p>",
880 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000881 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000882 return PyString_FromFormat("<%s.%s instance at %p>",
883 PyString_AsString(mod),
884 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 res = PyEval_CallObject(func, (PyObject *)NULL);
887 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888 return res;
889}
890
Guido van Rossum82c690f2001-04-30 14:39:18 +0000891static PyObject *
892instance_str(PyInstanceObject *inst)
893{
894 PyObject *func;
895 PyObject *res;
896 static PyObject *strstr;
897
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000898 if (strstr == NULL) {
Guido van Rossum82c690f2001-04-30 14:39:18 +0000899 strstr = PyString_InternFromString("__str__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000900 if (strstr == NULL)
901 return NULL;
902 }
Guido van Rossum82c690f2001-04-30 14:39:18 +0000903 func = instance_getattr(inst, strstr);
904 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000905 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
906 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000907 PyErr_Clear();
908 return instance_repr(inst);
909 }
910 res = PyEval_CallObject(func, (PyObject *)NULL);
911 Py_DECREF(func);
912 return res;
913}
914
Guido van Rossum9bfef441993-03-29 10:43:31 +0000915static long
Fred Drake79912472000-07-09 04:06:11 +0000916instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000917{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 PyObject *func;
919 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000920 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000921 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000922
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000923 if (hashstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000924 hashstr = PyString_InternFromString("__hash__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000925 if (hashstr == NULL)
926 return -1;
927 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000928 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000929 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000930 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
931 return -1;
932 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000933 /* If there is no __eq__ and no __cmp__ method, we hash on the
934 address. If an __eq__ or __cmp__ method exists, there must
935 be a __hash__. */
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000936 if (eqstr == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000937 eqstr = PyString_InternFromString("__eq__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000938 if (eqstr == NULL)
939 return -1;
940 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000941 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000942 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000943 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
944 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000946 if (cmpstr == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000947 cmpstr = PyString_InternFromString("__cmp__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000948 if (cmpstr == NULL)
949 return -1;
950 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000951 func = instance_getattr(inst, cmpstr);
952 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000953 if (!PyErr_ExceptionMatches(
954 PyExc_AttributeError))
955 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000956 PyErr_Clear();
957 return _Py_HashPointer(inst);
958 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000959 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000960 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000962 return -1;
963 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 res = PyEval_CallObject(func, (PyObject *)NULL);
965 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000966 if (res == NULL)
967 return -1;
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000968 if (PyInt_Check(res) || PyLong_Check(res))
969 /* This already converts a -1 result to -2. */
970 outcome = res->ob_type->tp_hash(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000971 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 PyErr_SetString(PyExc_TypeError,
973 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000974 outcome = -1;
975 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000977 return outcome;
978}
979
Jeremy Hylton8caad492000-06-23 14:18:11 +0000980static int
981instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
982{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000983 Py_VISIT(o->in_class);
984 Py_VISIT(o->in_dict);
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000985 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000986}
987
Guido van Rossum213c7a62001-04-23 14:08:49 +0000988static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
989static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000990
Martin v. Löwis18e16552006-02-15 17:27:45 +0000991static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +0000992instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyObject *func;
995 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000996 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000998 if (lenstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000999 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001000 if (lenstr == NULL)
1001 return -1;
1002 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001003 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001004 if (func == NULL)
1005 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 res = PyEval_CallObject(func, (PyObject *)NULL);
1007 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001008 if (res == NULL)
1009 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 if (PyInt_Check(res)) {
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001011 outcome = PyInt_AsSsize_t(res);
1012 if (outcome == -1 && PyErr_Occurred()) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001013 Py_DECREF(res);
1014 return -1;
1015 }
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001016#if SIZEOF_SIZE_T < SIZEOF_INT
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001017 /* Overflow check -- range of PyInt is more than C int */
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001018 if (outcome != (int)outcome) {
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001019 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +00001020 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001021 outcome = -1;
1022 }
1023 else
1024#endif
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001025 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 PyErr_SetString(PyExc_ValueError,
1027 "__len__() should return >= 0");
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001028 outcome = -1;
1029 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030 }
1031 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyErr_SetString(PyExc_TypeError,
1033 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 outcome = -1;
1035 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001037 return outcome;
1038}
1039
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001041instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001042{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 PyObject *func;
1044 PyObject *arg;
1045 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001047 if (getitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001048 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001049 if (getitemstr == NULL)
1050 return NULL;
1051 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001052 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053 if (func == NULL)
1054 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001055 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058 return NULL;
1059 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 res = PyEval_CallObject(func, arg);
1061 Py_DECREF(func);
1062 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063 return res;
1064}
1065
Guido van Rossum9bfef441993-03-29 10:43:31 +00001066static int
Fred Drake79912472000-07-09 04:06:11 +00001067instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 PyObject *func;
1070 PyObject *arg;
1071 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072
Guido van Rossum2878a691996-08-09 20:53:24 +00001073 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001074 if (delitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001075 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001076 if (delitemstr == NULL)
1077 return -1;
1078 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001079 func = instance_getattr(inst, delitemstr);
1080 }
1081 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001082 if (setitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001083 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001084 if (setitemstr == NULL)
1085 return -1;
1086 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001087 func = instance_getattr(inst, setitemstr);
1088 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 if (func == NULL)
1090 return -1;
1091 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001092 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001094 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001095 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001097 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 res = PyEval_CallObject(func, arg);
1100 Py_DECREF(func);
1101 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001102 if (res == NULL)
1103 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105 return 0;
1106}
1107
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001109 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001110 (binaryfunc)instance_subscript, /* mp_subscript */
1111 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112};
1113
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001115instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001116{
Georg Brandle4e023c2006-05-26 20:22:50 +00001117 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001119 if (getitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001120 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001121 if (getitemstr == NULL)
1122 return NULL;
1123 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001124 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125 if (func == NULL)
1126 return NULL;
Georg Brandle4e023c2006-05-26 20:22:50 +00001127 res = PyObject_CallFunction(func, "n", i);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001129 return res;
1130}
1131
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001133instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 PyObject *func, *arg, *res;
1136 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001138 if (getslicestr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001139 getslicestr = PyString_InternFromString("__getslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001140 if (getslicestr == NULL)
1141 return NULL;
1142 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001143 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001144
1145 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001146 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1147 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001148 PyErr_Clear();
1149
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001150 if (getitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001151 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001152 if (getitemstr == NULL)
1153 return NULL;
1154 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001155 func = instance_getattr(inst, getitemstr);
1156 if (func == NULL)
1157 return NULL;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001158 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
Tim Peters34592512002-07-11 06:23:50 +00001159 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001160 arg = Py_BuildValue("(nn)", i, j);
Tim Peters34592512002-07-11 06:23:50 +00001161
Guido van Rossum04691fc1992-08-12 15:35:34 +00001162 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001164 return NULL;
1165 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 res = PyEval_CallObject(func, arg);
1167 Py_DECREF(func);
1168 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001169 return res;
1170}
1171
1172static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001173instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001174{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001176
Guido van Rossum2878a691996-08-09 20:53:24 +00001177 if (item == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001178 if (delitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001179 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001180 if (delitemstr == NULL)
1181 return -1;
1182 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001183 func = instance_getattr(inst, delitemstr);
1184 }
1185 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001186 if (setitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001187 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001188 if (setitemstr == NULL)
1189 return -1;
1190 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001191 func = instance_getattr(inst, setitemstr);
1192 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001193 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001194 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001195 if (item == NULL)
Georg Brandl2cfaa342006-05-29 19:39:45 +00001196 arg = PyInt_FromSsize_t(i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001197 else
Georg Brandl2cfaa342006-05-29 19:39:45 +00001198 arg = Py_BuildValue("(nO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001199 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001201 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001202 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 res = PyEval_CallObject(func, arg);
1204 Py_DECREF(func);
1205 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001206 if (res == NULL)
1207 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209 return 0;
1210}
1211
1212static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001213instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001214{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 PyObject *func, *arg, *res;
1216 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001217
Guido van Rossum2878a691996-08-09 20:53:24 +00001218 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001219 if (delslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 delslicestr =
1221 PyString_InternFromString("__delslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001222 if (delslicestr == NULL)
1223 return -1;
1224 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001225 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001226 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001227 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1228 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001229 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001230 if (delitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001231 delitemstr =
1232 PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001233 if (delitemstr == NULL)
1234 return -1;
1235 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001236 func = instance_getattr(inst, delitemstr);
1237 if (func == NULL)
1238 return -1;
1239
1240 arg = Py_BuildValue("(N)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001241 _PySlice_FromIndices(i, j));
Thomas Wouters1d75a792000-08-17 22:37:32 +00001242 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001243 arg = Py_BuildValue("(nn)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001244 }
1245 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001246 if (setslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 setslicestr =
1248 PyString_InternFromString("__setslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001249 if (setslicestr == NULL)
1250 return -1;
1251 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001252 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001253 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001254 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1255 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001256 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001257 if (setitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001258 setitemstr =
1259 PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001260 if (setitemstr == NULL)
1261 return -1;
1262 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001263 func = instance_getattr(inst, setitemstr);
1264 if (func == NULL)
1265 return -1;
1266
1267 arg = Py_BuildValue("(NO)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001268 _PySlice_FromIndices(i, j), value);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001269 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001270 arg = Py_BuildValue("(nnO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001271 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001272 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001274 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001275 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001276 res = PyEval_CallObject(func, arg);
1277 Py_DECREF(func);
1278 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001279 if (res == NULL)
1280 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001282 return 0;
1283}
1284
Tim Peterscb8d3682001-05-05 21:05:01 +00001285static int
1286instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001287{
1288 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001289 PyObject *func;
1290
1291 /* Try __contains__ first.
1292 * If that can't be done, try iterator-based searching.
1293 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001294
1295 if(__contains__ == NULL) {
1296 __contains__ = PyString_InternFromString("__contains__");
1297 if(__contains__ == NULL)
1298 return -1;
1299 }
1300 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001301 if (func) {
1302 PyObject *res;
1303 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001304 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001305 if(arg == NULL) {
1306 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001307 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001308 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001309 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001310 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001311 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001312 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001313 return -1;
1314 ret = PyObject_IsTrue(res);
1315 Py_DECREF(res);
1316 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001317 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001318
1319 /* Couldn't find __contains__. */
1320 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Martin v. Löwis3a624042006-11-08 06:46:37 +00001321 Py_ssize_t rc;
Tim Peterscb8d3682001-05-05 21:05:01 +00001322 /* Assume the failure was simply due to that there is no
1323 * __contains__ attribute, and try iterating instead.
1324 */
1325 PyErr_Clear();
Martin v. Löwis3a624042006-11-08 06:46:37 +00001326 rc = _PySequence_IterSearch((PyObject *)inst, member,
1327 PY_ITERSEARCH_CONTAINS);
1328 if (rc >= 0)
1329 return rc > 0;
Tim Peterscb8d3682001-05-05 21:05:01 +00001330 }
Martin v. Löwis3a624042006-11-08 06:46:37 +00001331 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001332}
1333
Fred Drake79912472000-07-09 04:06:11 +00001334static PySequenceMethods
1335instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001336 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001337 0, /* sq_concat */
1338 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001339 (ssizeargfunc)instance_item, /* sq_item */
1340 (ssizessizeargfunc)instance_slice, /* sq_slice */
1341 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1342 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001343 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001344};
1345
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001347generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001348{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001350
1351 if ((func = instance_getattr(self, methodname)) == NULL)
1352 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 res = PyEval_CallObject(func, (PyObject *)NULL);
1354 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001355 return res;
1356}
1357
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001358static PyObject *
1359generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001360{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001361 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001363 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001364 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001365 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001366 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001368 Py_INCREF(Py_NotImplemented);
1369 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001370 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001371 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001372 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001374 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001375 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001376 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377 Py_DECREF(args);
1378 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001379 return result;
1380}
1381
1382
1383static PyObject *coerce_obj;
1384
1385/* Try one half of a binary operator involving a class instance. */
1386static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001387half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001388 int swapped)
1389{
1390 PyObject *args;
1391 PyObject *coercefunc;
1392 PyObject *coerced = NULL;
1393 PyObject *v1;
1394 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001395
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001396 if (!PyInstance_Check(v)) {
1397 Py_INCREF(Py_NotImplemented);
1398 return Py_NotImplemented;
1399 }
1400
1401 if (coerce_obj == NULL) {
1402 coerce_obj = PyString_InternFromString("__coerce__");
1403 if (coerce_obj == NULL)
1404 return NULL;
1405 }
1406 coercefunc = PyObject_GetAttr(v, coerce_obj);
1407 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001408 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1409 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001410 PyErr_Clear();
1411 return generic_binary_op(v, w, opname);
1412 }
1413
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001414 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001415 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001416 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001417 return NULL;
1418 }
1419 coerced = PyEval_CallObject(coercefunc, args);
1420 Py_DECREF(args);
1421 Py_DECREF(coercefunc);
1422 if (coerced == NULL) {
1423 return NULL;
1424 }
1425 if (coerced == Py_None || coerced == Py_NotImplemented) {
1426 Py_DECREF(coerced);
1427 return generic_binary_op(v, w, opname);
1428 }
1429 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1430 Py_DECREF(coerced);
1431 PyErr_SetString(PyExc_TypeError,
1432 "coercion should return None or 2-tuple");
1433 return NULL;
1434 }
1435 v1 = PyTuple_GetItem(coerced, 0);
1436 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001437 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001438 /* prevent recursion if __coerce__ returns self as the first
1439 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001440 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001441 } else {
Brett Cannonea3912b2006-06-13 21:46:41 +00001442 if (Py_EnterRecursiveCall(" after coercion"))
1443 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001444 if (swapped)
1445 result = (thisfunc)(w, v1);
1446 else
1447 result = (thisfunc)(v1, w);
Brett Cannonea3912b2006-06-13 21:46:41 +00001448 Py_LeaveRecursiveCall();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001449 }
1450 Py_DECREF(coerced);
1451 return result;
1452}
1453
1454/* Implement a binary operator involving at least one class instance. */
1455static PyObject *
1456do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1457 binaryfunc thisfunc)
1458{
1459 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1460 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001461 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001462 result = half_binop(w, v, ropname, thisfunc, 1);
1463 }
1464 return result;
1465}
1466
1467static PyObject *
1468do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1469 char *ropname, binaryfunc thisfunc)
1470{
1471 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1472 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001473 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001474 result = do_binop(v, w, opname, ropname, thisfunc);
1475 }
1476 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001477}
1478
Guido van Rossum879c5811995-01-10 15:24:06 +00001479static int
Fred Drake79912472000-07-09 04:06:11 +00001480instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001481{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 PyObject *v = *pv;
1483 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001484 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485 PyObject *args;
1486 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001487
Guido van Rossum2878a691996-08-09 20:53:24 +00001488 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001489 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001490 if (coerce_obj == NULL)
1491 return -1;
1492 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001493 coercefunc = PyObject_GetAttr(v, coerce_obj);
1494 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001495 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001496 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1497 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001499 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001500 }
1501 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001502 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001503 if (args == NULL) {
1504 return -1;
1505 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001506 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001508 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001509 if (coerced == NULL) {
1510 /* __coerce__ call raised an exception */
1511 return -1;
1512 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001513 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001514 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001516 return 1;
1517 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001519 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 Py_DECREF(coerced);
1521 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001522 "coercion should return None or 2-tuple");
1523 return -1;
1524 }
1525 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 *pv = PyTuple_GetItem(coerced, 0);
1527 *pw = PyTuple_GetItem(coerced, 1);
1528 Py_INCREF(*pv);
1529 Py_INCREF(*pw);
1530 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001531 return 0;
1532}
1533
Guido van Rossum04691fc1992-08-12 15:35:34 +00001534#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001535static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 static PyObject *o; \
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001537 if (o == NULL) { o = PyString_InternFromString(methodname); \
1538 if (o == NULL) return NULL; } \
Guido van Rossum2878a691996-08-09 20:53:24 +00001539 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001540}
1541
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001542#define BINARY(f, m, n) \
1543static PyObject *f(PyObject *v, PyObject *w) { \
1544 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1545}
1546
1547#define BINARY_INPLACE(f, m, n) \
1548static PyObject *f(PyObject *v, PyObject *w) { \
1549 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1550 "__r" m "__", n); \
1551}
1552
Guido van Rossum04691fc1992-08-12 15:35:34 +00001553UNARY(instance_neg, "__neg__")
1554UNARY(instance_pos, "__pos__")
1555UNARY(instance_abs, "__abs__")
1556
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001557BINARY(instance_or, "or", PyNumber_Or)
1558BINARY(instance_and, "and", PyNumber_And)
1559BINARY(instance_xor, "xor", PyNumber_Xor)
1560BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1561BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1562BINARY(instance_add, "add", PyNumber_Add)
1563BINARY(instance_sub, "sub", PyNumber_Subtract)
1564BINARY(instance_mul, "mul", PyNumber_Multiply)
1565BINARY(instance_div, "div", PyNumber_Divide)
1566BINARY(instance_mod, "mod", PyNumber_Remainder)
1567BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001568BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1569BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001570
1571BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1572BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1573BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1574BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1575BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1576BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1577BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1578BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1579BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1580BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001581BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1582BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001583
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001584/* Try a 3-way comparison, returning an int; v is an instance. Return:
1585 -2 for an exception;
1586 -1 if v < w;
1587 0 if v == w;
1588 1 if v > w;
1589 2 if this particular 3-way comparison is not implemented or undefined.
1590*/
1591static int
1592half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001593{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001594 static PyObject *cmp_obj;
1595 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001596 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001597 PyObject *result;
1598 long l;
1599
1600 assert(PyInstance_Check(v));
1601
1602 if (cmp_obj == NULL) {
1603 cmp_obj = PyString_InternFromString("__cmp__");
1604 if (cmp_obj == NULL)
1605 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001606 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001607
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001608 cmp_func = PyObject_GetAttr(v, cmp_obj);
1609 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001610 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1611 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001612 PyErr_Clear();
1613 return 2;
1614 }
1615
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001616 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001617 if (args == NULL) {
1618 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001619 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001620 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001621
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001622 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001623 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001624 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001625
1626 if (result == NULL)
1627 return -2;
1628
1629 if (result == Py_NotImplemented) {
1630 Py_DECREF(result);
1631 return 2;
1632 }
1633
1634 l = PyInt_AsLong(result);
1635 Py_DECREF(result);
1636 if (l == -1 && PyErr_Occurred()) {
1637 PyErr_SetString(PyExc_TypeError,
1638 "comparison did not return an int");
1639 return -2;
1640 }
1641
1642 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001643}
1644
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001645/* Try a 3-way comparison, returning an int; either v or w is an instance.
1646 We first try a coercion. Return:
1647 -2 for an exception;
1648 -1 if v < w;
1649 0 if v == w;
1650 1 if v > w;
1651 2 if this particular 3-way comparison is not implemented or undefined.
1652 THIS IS ONLY CALLED FROM object.c!
1653*/
1654static int
1655instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001656{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001657 int c;
1658
1659 c = PyNumber_CoerceEx(&v, &w);
1660 if (c < 0)
1661 return -2;
1662 if (c == 0) {
1663 /* If neither is now an instance, use regular comparison */
1664 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1665 c = PyObject_Compare(v, w);
1666 Py_DECREF(v);
1667 Py_DECREF(w);
1668 if (PyErr_Occurred())
1669 return -2;
1670 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001671 }
1672 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001673 else {
1674 /* The coercion didn't do anything.
1675 Treat this the same as returning v and w unchanged. */
1676 Py_INCREF(v);
1677 Py_INCREF(w);
1678 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001679
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001680 if (PyInstance_Check(v)) {
1681 c = half_cmp(v, w);
1682 if (c <= 1) {
1683 Py_DECREF(v);
1684 Py_DECREF(w);
1685 return c;
1686 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001687 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001688 if (PyInstance_Check(w)) {
1689 c = half_cmp(w, v);
1690 if (c <= 1) {
1691 Py_DECREF(v);
1692 Py_DECREF(w);
1693 if (c >= -1)
1694 c = -c;
1695 return c;
1696 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001697 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001698 Py_DECREF(v);
1699 Py_DECREF(w);
1700 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001701}
1702
Guido van Rossum9bfef441993-03-29 10:43:31 +00001703static int
Fred Drake79912472000-07-09 04:06:11 +00001704instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001705{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001707 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001709
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001710 if (nonzerostr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001711 nonzerostr = PyString_InternFromString("__nonzero__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001712 if (nonzerostr == NULL)
1713 return -1;
1714 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001715 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001716 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1717 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001718 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001719 if (lenstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001720 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001721 if (lenstr == NULL)
1722 return -1;
1723 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001724 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001725 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1726 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001728 /* Fall back to the default behavior:
1729 all instances are nonzero */
1730 return 1;
1731 }
1732 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 res = PyEval_CallObject(func, (PyObject *)NULL);
1734 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001735 if (res == NULL)
1736 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001737 if (!PyInt_Check(res)) {
1738 Py_DECREF(res);
1739 PyErr_SetString(PyExc_TypeError,
1740 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001741 return -1;
1742 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001743 outcome = PyInt_AsLong(res);
1744 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001745 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 PyErr_SetString(PyExc_ValueError,
1747 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001748 return -1;
1749 }
1750 return outcome > 0;
1751}
1752
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001753static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001754instance_index(PyInstanceObject *self)
1755{
1756 PyObject *func, *res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001757 static PyObject *indexstr = NULL;
1758
1759 if (indexstr == NULL) {
1760 indexstr = PyString_InternFromString("__index__");
1761 if (indexstr == NULL)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001762 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001763 }
1764 if ((func = instance_getattr(self, indexstr)) == NULL) {
1765 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001766 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001767 PyErr_Clear();
1768 PyErr_SetString(PyExc_TypeError,
1769 "object cannot be interpreted as an index");
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001770 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001771 }
1772 res = PyEval_CallObject(func, (PyObject *)NULL);
1773 Py_DECREF(func);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001774 return res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001775}
1776
1777
Guido van Rossum04691fc1992-08-12 15:35:34 +00001778UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001779UNARY(instance_int, "__int__")
1780UNARY(instance_long, "__long__")
1781UNARY(instance_float, "__float__")
1782UNARY(instance_oct, "__oct__")
1783UNARY(instance_hex, "__hex__")
1784
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001785static PyObject *
1786bin_power(PyObject *v, PyObject *w)
1787{
1788 return PyNumber_Power(v, w, Py_None);
1789}
1790
Guido van Rossum03093a21994-09-28 15:51:32 +00001791/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001792static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001793instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001794{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001795 if (z == Py_None) {
1796 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001797 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001798 else {
1799 PyObject *func;
1800 PyObject *args;
1801 PyObject *result;
1802
1803 /* XXX Doesn't do coercions... */
1804 func = PyObject_GetAttrString(v, "__pow__");
1805 if (func == NULL)
1806 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001807 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001808 if (args == NULL) {
1809 Py_DECREF(func);
1810 return NULL;
1811 }
1812 result = PyEval_CallObject(func, args);
1813 Py_DECREF(func);
1814 Py_DECREF(args);
1815 return result;
1816 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001817}
1818
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001819static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001820bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001821{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001822 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001823}
1824
1825
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001826static PyObject *
1827instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1828{
1829 if (z == Py_None) {
1830 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1831 "__rpow__", bin_inplace_power);
1832 }
1833 else {
1834 /* XXX Doesn't do coercions... */
1835 PyObject *func;
1836 PyObject *args;
1837 PyObject *result;
1838
1839 func = PyObject_GetAttrString(v, "__ipow__");
1840 if (func == NULL) {
1841 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1842 return NULL;
1843 PyErr_Clear();
1844 return instance_pow(v, w, z);
1845 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001846 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001847 if (args == NULL) {
1848 Py_DECREF(func);
1849 return NULL;
1850 }
1851 result = PyEval_CallObject(func, args);
1852 Py_DECREF(func);
1853 Py_DECREF(args);
1854 return result;
1855 }
1856}
1857
1858
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001859/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001860#define NAME_OPS 6
1861static PyObject **name_op = NULL;
1862
Tim Peters34592512002-07-11 06:23:50 +00001863static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001864init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001865{
1866 int i;
1867 char *_name_op[] = {
1868 "__lt__",
1869 "__le__",
1870 "__eq__",
1871 "__ne__",
1872 "__gt__",
1873 "__ge__",
1874 };
1875
1876 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1877 if (name_op == NULL)
1878 return -1;
1879 for (i = 0; i < NAME_OPS; ++i) {
1880 name_op[i] = PyString_InternFromString(_name_op[i]);
1881 if (name_op[i] == NULL)
1882 return -1;
1883 }
1884 return 0;
1885}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001886
1887static PyObject *
1888half_richcompare(PyObject *v, PyObject *w, int op)
1889{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001890 PyObject *method;
1891 PyObject *args;
1892 PyObject *res;
1893
1894 assert(PyInstance_Check(v));
1895
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001896 if (name_op == NULL) {
1897 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001898 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001899 }
1900 /* If the instance doesn't define an __getattr__ method, use
1901 instance_getattr2 directly because it will not set an
1902 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001903 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001904 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001905 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001906 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001907 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001908 if (method == NULL) {
1909 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001910 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1911 return NULL;
1912 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001913 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001914 res = Py_NotImplemented;
1915 Py_INCREF(res);
1916 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001917 }
1918
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001919 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001920 if (args == NULL) {
1921 Py_DECREF(method);
1922 return NULL;
1923 }
1924
1925 res = PyEval_CallObject(method, args);
1926 Py_DECREF(args);
1927 Py_DECREF(method);
1928
1929 return res;
1930}
1931
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001932static PyObject *
1933instance_richcompare(PyObject *v, PyObject *w, int op)
1934{
1935 PyObject *res;
1936
1937 if (PyInstance_Check(v)) {
1938 res = half_richcompare(v, w, op);
1939 if (res != Py_NotImplemented)
1940 return res;
1941 Py_DECREF(res);
1942 }
1943
1944 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00001945 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001946 if (res != Py_NotImplemented)
1947 return res;
1948 Py_DECREF(res);
1949 }
1950
1951 Py_INCREF(Py_NotImplemented);
1952 return Py_NotImplemented;
1953}
1954
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001955
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001956/* Get the iterator */
1957static PyObject *
1958instance_getiter(PyInstanceObject *self)
1959{
1960 PyObject *func;
1961
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001962 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001963 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001964 if (iterstr == NULL)
1965 return NULL;
1966 }
1967 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001968 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001969 if (getitemstr == NULL)
1970 return NULL;
1971 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001972
1973 if ((func = instance_getattr(self, iterstr)) != NULL) {
1974 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1975 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001976 if (res != NULL && !PyIter_Check(res)) {
1977 PyErr_Format(PyExc_TypeError,
1978 "__iter__ returned non-iterator "
1979 "of type '%.100s'",
1980 res->ob_type->tp_name);
1981 Py_DECREF(res);
1982 res = NULL;
1983 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001984 return res;
1985 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001986 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1987 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001988 PyErr_Clear();
1989 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001990 PyErr_SetString(PyExc_TypeError,
1991 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001992 return NULL;
1993 }
1994 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001995 return PySeqIter_New((PyObject *)self);
1996}
1997
1998
1999/* Call the iterator's next */
2000static PyObject *
2001instance_iternext(PyInstanceObject *self)
2002{
2003 PyObject *func;
2004
Neal Norwitzb09f4f52006-08-13 18:10:28 +00002005 if (nextstr == NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002006 nextstr = PyString_InternFromString("next");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00002007 if (nextstr == NULL)
2008 return NULL;
2009 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002010
2011 if ((func = instance_getattr(self, nextstr)) != NULL) {
2012 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2013 Py_DECREF(func);
2014 if (res != NULL) {
2015 return res;
2016 }
2017 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
2018 PyErr_Clear();
2019 return NULL;
2020 }
2021 return NULL;
2022 }
2023 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
2024 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002025}
2026
Tim Peters6d6c1a32001-08-02 04:15:00 +00002027static PyObject *
2028instance_call(PyObject *func, PyObject *arg, PyObject *kw)
2029{
2030 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2031 if (call == NULL) {
2032 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002033 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2034 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002035 PyErr_Clear();
2036 PyErr_Format(PyExc_AttributeError,
2037 "%.200s instance has no __call__ method",
2038 PyString_AsString(inst->in_class->cl_name));
2039 return NULL;
2040 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00002041 /* We must check and increment the recursion depth here. Scenario:
2042 class A:
2043 pass
2044 A.__call__ = A() # that's right
2045 a = A() # ok
2046 a() # infinite recursion
2047 This bounces between instance_call() and PyObject_Call() without
2048 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002049 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002050 res = NULL;
2051 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00002052 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002053 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00002054 Py_LeaveRecursiveCall();
2055 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002056 Py_DECREF(call);
2057 return res;
2058}
2059
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002060
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002061static PyNumberMethods instance_as_number = {
Georg Brandl347b3002006-03-30 11:57:00 +00002062 instance_add, /* nb_add */
2063 instance_sub, /* nb_subtract */
2064 instance_mul, /* nb_multiply */
2065 instance_div, /* nb_divide */
2066 instance_mod, /* nb_remainder */
2067 instance_divmod, /* nb_divmod */
2068 instance_pow, /* nb_power */
2069 (unaryfunc)instance_neg, /* nb_negative */
2070 (unaryfunc)instance_pos, /* nb_positive */
2071 (unaryfunc)instance_abs, /* nb_absolute */
2072 (inquiry)instance_nonzero, /* nb_nonzero */
2073 (unaryfunc)instance_invert, /* nb_invert */
2074 instance_lshift, /* nb_lshift */
2075 instance_rshift, /* nb_rshift */
2076 instance_and, /* nb_and */
2077 instance_xor, /* nb_xor */
2078 instance_or, /* nb_or */
2079 instance_coerce, /* nb_coerce */
2080 (unaryfunc)instance_int, /* nb_int */
2081 (unaryfunc)instance_long, /* nb_long */
2082 (unaryfunc)instance_float, /* nb_float */
2083 (unaryfunc)instance_oct, /* nb_oct */
2084 (unaryfunc)instance_hex, /* nb_hex */
2085 instance_iadd, /* nb_inplace_add */
2086 instance_isub, /* nb_inplace_subtract */
2087 instance_imul, /* nb_inplace_multiply */
2088 instance_idiv, /* nb_inplace_divide */
2089 instance_imod, /* nb_inplace_remainder */
2090 instance_ipow, /* nb_inplace_power */
2091 instance_ilshift, /* nb_inplace_lshift */
2092 instance_irshift, /* nb_inplace_rshift */
2093 instance_iand, /* nb_inplace_and */
2094 instance_ixor, /* nb_inplace_xor */
2095 instance_ior, /* nb_inplace_or */
2096 instance_floordiv, /* nb_floor_divide */
2097 instance_truediv, /* nb_true_divide */
2098 instance_ifloordiv, /* nb_inplace_floor_divide */
2099 instance_itruediv, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002100 (unaryfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002101};
2102
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002103PyTypeObject PyInstance_Type = {
2104 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002105 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002106 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002107 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002108 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002109 (destructor)instance_dealloc, /* tp_dealloc */
2110 0, /* tp_print */
2111 0, /* tp_getattr */
2112 0, /* tp_setattr */
2113 instance_compare, /* tp_compare */
2114 (reprfunc)instance_repr, /* tp_repr */
2115 &instance_as_number, /* tp_as_number */
2116 &instance_as_sequence, /* tp_as_sequence */
2117 &instance_as_mapping, /* tp_as_mapping */
2118 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002119 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002120 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002121 (getattrofunc)instance_getattr, /* tp_getattro */
2122 (setattrofunc)instance_setattr, /* tp_setattro */
2123 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002124 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002125 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002126 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002127 0, /* tp_clear */
2128 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002129 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2130 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002131 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002132 0, /* tp_methods */
2133 0, /* tp_members */
2134 0, /* tp_getset */
2135 0, /* tp_base */
2136 0, /* tp_dict */
2137 0, /* tp_descr_get */
2138 0, /* tp_descr_set */
2139 0, /* tp_dictoffset */
2140 0, /* tp_init */
2141 0, /* tp_alloc */
2142 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002143};
2144
2145
Guido van Rossum81daa321993-05-20 14:24:46 +00002146/* Instance method objects are used for two purposes:
2147 (a) as bound instance methods (returned by instancename.methodname)
2148 (b) as unbound methods (returned by ClassName.methodname)
2149 In case (b), im_self is NULL
2150*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002151
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002152static PyMethodObject *free_list;
2153
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002154PyObject *
Anthony Baxter377be112006-04-11 06:54:30 +00002155PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002157 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002158 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002159 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002160 return NULL;
2161 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002162 im = free_list;
2163 if (im != NULL) {
2164 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002165 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002166 }
2167 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002168 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002169 if (im == NULL)
2170 return NULL;
2171 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002172 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002173 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002174 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002176 im->im_self = self;
Anthony Baxter377be112006-04-11 06:54:30 +00002177 Py_XINCREF(klass);
2178 im->im_class = klass;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002179 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002180 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002181}
2182
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002183/* Descriptors for PyMethod attributes */
2184
2185/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002186
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002188
Guido van Rossum6f799372001-09-20 20:46:19 +00002189static PyMemberDef instancemethod_memberlist[] = {
2190 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2191 "the class associated with a method"},
2192 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2193 "the function (or other callable) implementing a method"},
2194 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2195 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002196 {NULL} /* Sentinel */
2197};
2198
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002199/* Christian Tismer argued convincingly that method attributes should
2200 (nearly) always override function attributes.
2201 The one exception is __doc__; there's a default __doc__ which
2202 should only be used for the class, not for instances */
2203
2204static PyObject *
2205instancemethod_get_doc(PyMethodObject *im, void *context)
2206{
2207 static PyObject *docstr;
2208 if (docstr == NULL) {
2209 docstr= PyString_InternFromString("__doc__");
2210 if (docstr == NULL)
2211 return NULL;
2212 }
2213 return PyObject_GetAttr(im->im_func, docstr);
2214}
2215
2216static PyGetSetDef instancemethod_getset[] = {
2217 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2218 {0}
2219};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002220
2221static PyObject *
2222instancemethod_getattro(PyObject *obj, PyObject *name)
2223{
2224 PyMethodObject *im = (PyMethodObject *)obj;
2225 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002226 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002227
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002228 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2229 if (tp->tp_dict == NULL) {
2230 if (PyType_Ready(tp) < 0)
2231 return NULL;
2232 }
2233 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002234 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002235
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002236 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002237 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2238 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002239 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002240 else {
2241 Py_INCREF(descr);
2242 return descr;
2243 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002244 }
2245
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002246 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002247}
2248
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002249PyDoc_STRVAR(instancemethod_doc,
2250"instancemethod(function, instance, class)\n\
2251\n\
2252Create an instance method object.");
2253
2254static PyObject *
2255instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2256{
2257 PyObject *func;
2258 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002259 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002260
Georg Brandl5d59c092006-09-30 08:43:30 +00002261 if (!_PyArg_NoKeywords("instancemethod", kw))
2262 return NULL;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002263 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002264 &func, &self, &classObj))
2265 return NULL;
2266 if (!PyCallable_Check(func)) {
2267 PyErr_SetString(PyExc_TypeError,
2268 "first argument must be callable");
2269 return NULL;
2270 }
2271 if (self == Py_None)
2272 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002273 if (self == NULL && classObj == NULL) {
2274 PyErr_SetString(PyExc_TypeError,
2275 "unbound methods must have non-NULL im_class");
2276 return NULL;
2277 }
2278
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002279 return PyMethod_New(func, self, classObj);
2280}
2281
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002282static void
Fred Drake79912472000-07-09 04:06:11 +00002283instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002284{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002285 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002286 if (im->im_weakreflist != NULL)
2287 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002288 Py_DECREF(im->im_func);
2289 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002290 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002291 im->im_self = (PyObject *)free_list;
2292 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002293}
2294
Guido van Rossumebc8c511992-09-03 20:39:51 +00002295static int
Fred Drake79912472000-07-09 04:06:11 +00002296instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002297{
Armin Rigofd01d792006-06-08 10:56:24 +00002298 int cmp;
2299 cmp = PyObject_Compare(a->im_func, b->im_func);
2300 if (cmp)
2301 return cmp;
2302
2303 if (a->im_self == b->im_self)
2304 return 0;
2305 if (a->im_self == NULL || b->im_self == NULL)
Guido van Rossume9df7271995-04-06 14:46:51 +00002306 return (a->im_self < b->im_self) ? -1 : 1;
Armin Rigofd01d792006-06-08 10:56:24 +00002307 else
2308 return PyObject_Compare(a->im_self, b->im_self);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002309}
2310
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002311static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002312instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002313{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002314 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002315 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002316 PyObject *klass = a->im_class;
2317 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2318 char *sfuncname = "?", *sklassname = "?";
2319
2320 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002321 if (funcname == NULL) {
2322 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2323 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002324 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002325 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002326 else if (!PyString_Check(funcname)) {
2327 Py_DECREF(funcname);
2328 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002329 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002330 else
2331 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002332 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002333 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002334 else {
2335 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002336 if (klassname == NULL) {
2337 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2338 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002339 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002340 }
Guido van Rossum40667692001-08-17 13:59:27 +00002341 else if (!PyString_Check(klassname)) {
2342 Py_DECREF(klassname);
2343 klassname = NULL;
2344 }
2345 else
2346 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002347 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002348 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002349 result = PyString_FromFormat("<unbound method %s.%s>",
2350 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002351 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002352 /* XXX Shouldn't use repr() here! */
2353 PyObject *selfrepr = PyObject_Repr(self);
2354 if (selfrepr == NULL)
2355 goto fail;
2356 if (!PyString_Check(selfrepr)) {
2357 Py_DECREF(selfrepr);
2358 goto fail;
2359 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002360 result = PyString_FromFormat("<bound method %s.%s of %s>",
2361 sklassname, sfuncname,
2362 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002363 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002364 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002365 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002366 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002367 Py_XDECREF(klassname);
2368 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002369}
2370
Guido van Rossum9bfef441993-03-29 10:43:31 +00002371static long
Fred Drake79912472000-07-09 04:06:11 +00002372instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002373{
2374 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002375 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002376 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002377 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002378 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002379 if (x == -1)
2380 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002381 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002382 if (y == -1)
2383 return -1;
Armin Rigofd01d792006-06-08 10:56:24 +00002384 x = x ^ y;
2385 if (x == -1)
2386 x = -2;
2387 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002388}
2389
Jeremy Hylton8caad492000-06-23 14:18:11 +00002390static int
2391instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2392{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002393 Py_VISIT(im->im_func);
2394 Py_VISIT(im->im_self);
2395 Py_VISIT(im->im_class);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002396 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002397}
2398
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002399static void
Anthony Baxter377be112006-04-11 06:54:30 +00002400getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002401{
2402 PyObject *name;
2403
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002404 assert(bufsize > 1);
2405 strcpy(buf, "?"); /* Default outcome */
Anthony Baxter377be112006-04-11 06:54:30 +00002406 if (klass == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002407 return;
Anthony Baxter377be112006-04-11 06:54:30 +00002408 name = PyObject_GetAttrString(klass, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002409 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002410 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002411 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002412 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002413 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002414 if (PyString_Check(name)) {
2415 strncpy(buf, PyString_AS_STRING(name), bufsize);
2416 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002417 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002418 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002419}
2420
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002421static void
2422getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002423{
Anthony Baxter377be112006-04-11 06:54:30 +00002424 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002425
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002426 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002427 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002428 strcpy(buf, "nothing");
2429 return;
2430 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002431
Anthony Baxter377be112006-04-11 06:54:30 +00002432 klass = PyObject_GetAttrString(inst, "__class__");
2433 if (klass == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002434 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002435 PyErr_Clear();
Anthony Baxter377be112006-04-11 06:54:30 +00002436 klass = (PyObject *)(inst->ob_type);
2437 Py_INCREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002438 }
Anthony Baxter377be112006-04-11 06:54:30 +00002439 getclassname(klass, buf, bufsize);
2440 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002441}
2442
Tim Peters6d6c1a32001-08-02 04:15:00 +00002443static PyObject *
2444instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2445{
2446 PyObject *self = PyMethod_GET_SELF(func);
Anthony Baxter377be112006-04-11 06:54:30 +00002447 PyObject *klass = PyMethod_GET_CLASS(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002448 PyObject *result;
2449
2450 func = PyMethod_GET_FUNCTION(func);
2451 if (self == NULL) {
2452 /* Unbound methods must be called with an instance of
2453 the class (or a derived class) as first argument */
2454 int ok;
2455 if (PyTuple_Size(arg) >= 1)
2456 self = PyTuple_GET_ITEM(arg, 0);
2457 if (self == NULL)
2458 ok = 0;
2459 else {
Anthony Baxter377be112006-04-11 06:54:30 +00002460 ok = PyObject_IsInstance(self, klass);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002461 if (ok < 0)
2462 return NULL;
2463 }
2464 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002465 char clsbuf[256];
2466 char instbuf[256];
Anthony Baxter377be112006-04-11 06:54:30 +00002467 getclassname(klass, clsbuf, sizeof(clsbuf));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002468 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002469 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002470 "unbound method %s%s must be called with "
2471 "%s instance as first argument "
2472 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002473 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002474 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002475 clsbuf,
2476 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002477 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002478 return NULL;
2479 }
2480 Py_INCREF(arg);
2481 }
2482 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002483 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002484 PyObject *newarg = PyTuple_New(argcount + 1);
2485 int i;
2486 if (newarg == NULL)
2487 return NULL;
2488 Py_INCREF(self);
2489 PyTuple_SET_ITEM(newarg, 0, self);
2490 for (i = 0; i < argcount; i++) {
2491 PyObject *v = PyTuple_GET_ITEM(arg, i);
2492 Py_XINCREF(v);
2493 PyTuple_SET_ITEM(newarg, i+1, v);
2494 }
2495 arg = newarg;
2496 }
2497 result = PyObject_Call((PyObject *)func, arg, kw);
2498 Py_DECREF(arg);
2499 return result;
2500}
2501
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002502static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002503instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002504{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002505 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002506 of a class that's not a base class of cls. */
2507
2508 if (PyMethod_GET_SELF(meth) != NULL) {
2509 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002510 Py_INCREF(meth);
2511 return meth;
2512 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002513 /* No, it is an unbound method */
2514 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2515 /* Do subclass test. If it fails, return meth unchanged. */
2516 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2517 if (ok < 0)
2518 return NULL;
2519 if (!ok) {
2520 Py_INCREF(meth);
2521 return meth;
2522 }
2523 }
2524 /* Bind it to obj */
2525 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002526}
2527
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002528PyTypeObject PyMethod_Type = {
2529 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002530 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002531 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002532 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002533 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002534 (destructor)instancemethod_dealloc, /* tp_dealloc */
2535 0, /* tp_print */
2536 0, /* tp_getattr */
2537 0, /* tp_setattr */
2538 (cmpfunc)instancemethod_compare, /* tp_compare */
2539 (reprfunc)instancemethod_repr, /* tp_repr */
2540 0, /* tp_as_number */
2541 0, /* tp_as_sequence */
2542 0, /* tp_as_mapping */
2543 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002544 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002545 0, /* tp_str */
Georg Brandl347b3002006-03-30 11:57:00 +00002546 instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002547 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002548 0, /* tp_as_buffer */
Raymond Hettingerbff60ae2005-06-19 08:42:20 +00002549 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002550 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002551 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002552 0, /* tp_clear */
2553 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002554 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2555 0, /* tp_iter */
2556 0, /* tp_iternext */
2557 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002558 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002559 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002560 0, /* tp_base */
2561 0, /* tp_dict */
2562 instancemethod_descr_get, /* tp_descr_get */
2563 0, /* tp_descr_set */
2564 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002565 0, /* tp_init */
2566 0, /* tp_alloc */
2567 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002568};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002569
2570/* Clear out the free list */
2571
2572void
Fred Drake79912472000-07-09 04:06:11 +00002573PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002574{
2575 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002576 PyMethodObject *im = free_list;
2577 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002578 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002579 }
2580}