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