blob: 032d354ef0cf60cb9e96fea607f41ae092fcfaab [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
Christian Heimes6075a822008-02-06 12:44:34 +00007/* Free list for method objects to safe malloc/free overhead
8 * The im_self element is used to chain the elements.
9 */
10static PyMethodObject *free_list;
11static int numfree = 0;
Christian Heimes5b970ad2008-02-06 13:33:44 +000012#ifndef PyMethod_MAXFREELIST
13#define PyMethod_MAXFREELIST 256
14#endif
Christian Heimes6075a822008-02-06 12:44:34 +000015
Guido van Rossum915f0eb2001-10-17 20:26:38 +000016#define TP_DESCR_GET(t) \
17 (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
18
Guido van Rossum52ca98a1994-09-05 07:32:29 +000019/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000020static PyObject *class_lookup(PyClassObject *, PyObject *,
21 PyClassObject **);
22static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
23static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000024
Guido van Rossuma63eff61998-05-29 21:37:21 +000025static PyObject *getattrstr, *setattrstr, *delattrstr;
26
Fred Drake79912472000-07-09 04:06:11 +000027
Guido van Rossumc0b618a1997-05-02 03:12:38 +000028PyObject *
Fred Drake79912472000-07-09 04:06:11 +000029PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
30 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000033 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000034 if (docstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000035 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000036 if (docstr == NULL)
37 return NULL;
38 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000039 if (modstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000040 modstr= PyString_InternFromString("__module__");
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000041 if (modstr == NULL)
42 return NULL;
43 }
44 if (namestr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000045 namestr= PyString_InternFromString("__name__");
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000046 if (namestr == NULL)
47 return NULL;
48 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +000049 if (name == NULL || !PyString_Check(name)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000051 "PyClass_New: name must be a string");
52 return NULL;
53 }
54 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000055 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000056 "PyClass_New: dict must be a dictionary");
57 return NULL;
58 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059 if (PyDict_GetItem(dict, docstr) == NULL) {
60 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000061 return NULL;
62 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000063 if (PyDict_GetItem(dict, modstr) == NULL) {
64 PyObject *globals = PyEval_GetGlobals();
65 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000066 PyObject *modname = PyDict_GetItem(globals, namestr);
67 if (modname != NULL) {
68 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000069 return NULL;
70 }
71 }
72 }
Guido van Rossume2966a61991-12-10 13:53:23 +000073 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000074 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000075 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000076 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000077 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000078 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +000079 Py_ssize_t i, n;
Guido van Rossum28d80b12001-09-07 21:08:32 +000080 PyObject *base;
Guido van Rossum04d73c41997-10-07 14:54:11 +000081 if (!PyTuple_Check(bases)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000083 "PyClass_New: bases must be a tuple");
84 return NULL;
85 }
Guido van Rossum28d80b12001-09-07 21:08:32 +000086 n = PyTuple_Size(bases);
87 for (i = 0; i < n; i++) {
88 base = PyTuple_GET_ITEM(bases, i);
89 if (!PyClass_Check(base)) {
90 if (PyCallable_Check(
91 (PyObject *) base->ob_type))
Georg Brandl684fd0c2006-05-25 19:15:31 +000092 return PyObject_CallFunctionObjArgs(
Guido van Rossum28d80b12001-09-07 21:08:32 +000093 (PyObject *) base->ob_type,
Georg Brandl684fd0c2006-05-25 19:15:31 +000094 name, bases, dict, NULL);
Tim Peters6d6c1a32001-08-02 04:15:00 +000095 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000096 "PyClass_New: base must be a class");
97 return NULL;
98 }
99 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +0000101 }
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000102
103 if (getattrstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000104 getattrstr = PyString_InternFromString("__getattr__");
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000105 if (getattrstr == NULL)
106 goto alloc_error;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000107 setattrstr = PyString_InternFromString("__setattr__");
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000108 if (setattrstr == NULL)
109 goto alloc_error;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000110 delattrstr = PyString_InternFromString("__delattr__");
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000111 if (delattrstr == NULL)
112 goto alloc_error;
113 }
114
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000115 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000116 if (op == NULL) {
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000117alloc_error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000120 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000123 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000125 op->cl_name = name;
Antoine Pitroua57df2c2010-03-31 21:32:15 +0000126 op->cl_weakreflist = NULL;
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000127
Guido van Rossum2878a691996-08-09 20:53:24 +0000128 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
129 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
130 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 Py_XINCREF(op->cl_getattr);
132 Py_XINCREF(op->cl_setattr);
133 Py_XINCREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000134 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
Guido van Rossumb479dc52001-09-05 22:52:50 +0000138PyObject *
139PyMethod_Function(PyObject *im)
140{
141 if (!PyMethod_Check(im)) {
142 PyErr_BadInternalCall();
143 return NULL;
144 }
145 return ((PyMethodObject *)im)->im_func;
146}
147
148PyObject *
149PyMethod_Self(PyObject *im)
150{
151 if (!PyMethod_Check(im)) {
152 PyErr_BadInternalCall();
153 return NULL;
154 }
155 return ((PyMethodObject *)im)->im_self;
156}
157
158PyObject *
159PyMethod_Class(PyObject *im)
160{
161 if (!PyMethod_Check(im)) {
162 PyErr_BadInternalCall();
163 return NULL;
164 }
165 return ((PyMethodObject *)im)->im_class;
166}
167
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000168PyDoc_STRVAR(class_doc,
169"classobj(name, bases, dict)\n\
170\n\
171Create a class object. The name must be a string; the second argument\n\
172a tuple of classes, and the third a dictionary.");
173
174static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000175class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
176{
177 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000178 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000179
180 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
181 &name, &bases, &dict))
182 return NULL;
183 return PyClass_New(bases, dict, name);
184}
185
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186/* Class methods */
187
188static void
Fred Drake79912472000-07-09 04:06:11 +0000189class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000191 _PyObject_GC_UNTRACK(op);
Antoine Pitroua57df2c2010-03-31 21:32:15 +0000192 if (op->cl_weakreflist != NULL)
193 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 Py_DECREF(op->cl_bases);
195 Py_DECREF(op->cl_dict);
196 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000197 Py_XDECREF(op->cl_getattr);
198 Py_XDECREF(op->cl_setattr);
199 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000200 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201}
202
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000204class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000205{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000206 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000208 if (value != NULL) {
209 *pclass = cp;
210 return value;
211 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000213 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000214 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyObject *v = class_lookup(
216 (PyClassObject *)
217 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000218 if (v != NULL)
219 return v;
220 }
221 return NULL;
222}
223
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000225class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 register PyObject *v;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000228 register char *sname = PyString_AsString(name);
Anthony Baxter377be112006-04-11 06:54:30 +0000229 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000230 descrgetfunc f;
231
Guido van Rossum2878a691996-08-09 20:53:24 +0000232 if (sname[0] == '_' && sname[1] == '_') {
233 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 if (PyEval_GetRestricted()) {
235 PyErr_SetString(PyExc_RuntimeError,
236 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000237 return NULL;
238 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000240 return op->cl_dict;
241 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000242 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000244 return op->cl_bases;
245 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000246 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000247 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000249 else
250 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000252 return v;
253 }
Guido van Rossum94308391991-10-20 20:11:48 +0000254 }
Anthony Baxter377be112006-04-11 06:54:30 +0000255 v = class_lookup(op, name, &klass);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000256 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000257 PyErr_Format(PyExc_AttributeError,
258 "class %.50s has no attribute '%.400s'",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000259 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000260 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000262 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000263 if (f == NULL)
264 Py_INCREF(v);
265 else
266 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000267 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268}
269
Guido van Rossuma63eff61998-05-29 21:37:21 +0000270static void
Fred Drake79912472000-07-09 04:06:11 +0000271set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000272{
273 PyObject *temp = *slot;
274 Py_XINCREF(v);
275 *slot = v;
276 Py_XDECREF(temp);
277}
278
Guido van Rossum7ba30431998-07-08 13:34:48 +0000279static void
Fred Drake79912472000-07-09 04:06:11 +0000280set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000281{
282 PyClassObject *dummy;
283
284 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
285 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
286 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
287}
288
Guido van Rossuma63eff61998-05-29 21:37:21 +0000289static char *
Fred Drake79912472000-07-09 04:06:11 +0000290set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000291{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000292 if (v == NULL || !PyDict_Check(v))
293 return "__dict__ must be a dictionary object";
294 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000295 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000296 return "";
297}
298
299static char *
Fred Drake79912472000-07-09 04:06:11 +0000300set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000301{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000302 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000303
304 if (v == NULL || !PyTuple_Check(v))
305 return "__bases__ must be a tuple object";
306 n = PyTuple_Size(v);
307 for (i = 0; i < n; i++) {
308 PyObject *x = PyTuple_GET_ITEM(v, i);
309 if (!PyClass_Check(x))
310 return "__bases__ items must be classes";
311 if (PyClass_IsSubclass(x, (PyObject *)c))
312 return "a __bases__ item causes an inheritance cycle";
313 }
314 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000315 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000316 return "";
317}
318
319static char *
Fred Drake79912472000-07-09 04:06:11 +0000320set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000321{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000322 if (v == NULL || !PyString_Check(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000323 return "__name__ must be a string object";
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000324 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000325 return "__name__ must not contain null bytes";
326 set_slot(&c->cl_name, v);
327 return "";
328}
329
Guido van Rossum94308391991-10-20 20:11:48 +0000330static int
Fred Drake79912472000-07-09 04:06:11 +0000331class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000332{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000333 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 if (PyEval_GetRestricted()) {
335 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000336 "classes are read-only in restricted mode");
337 return -1;
338 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000339 sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000340 if (sname[0] == '_' && sname[1] == '_') {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000341 Py_ssize_t n = PyString_Size(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000342 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000343 char *err = NULL;
344 if (strcmp(sname, "__dict__") == 0)
345 err = set_dict(op, v);
346 else if (strcmp(sname, "__bases__") == 0)
347 err = set_bases(op, v);
348 else if (strcmp(sname, "__name__") == 0)
349 err = set_name(op, v);
350 else if (strcmp(sname, "__getattr__") == 0)
351 set_slot(&op->cl_getattr, v);
352 else if (strcmp(sname, "__setattr__") == 0)
353 set_slot(&op->cl_setattr, v);
354 else if (strcmp(sname, "__delattr__") == 0)
355 set_slot(&op->cl_delattr, v);
356 /* For the last three, we fall through to update the
357 dictionary as well. */
358 if (err != NULL) {
359 if (*err == '\0')
360 return 0;
361 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000362 return -1;
363 }
364 }
365 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000366 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000368 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000369 PyErr_Format(PyExc_AttributeError,
370 "class %.50s has no attribute '%.400s'",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000371 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000372 return rv;
373 }
Guido van Rossum94308391991-10-20 20:11:48 +0000374 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000376}
377
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000379class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000380{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000381 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000382 char *name;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000383 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000384 name = "?";
385 else
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000386 name = PyString_AsString(op->cl_name);
387 if (mod == NULL || !PyString_Check(mod))
388 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000389 else
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000390 return PyString_FromFormat("<class %s.%s at %p>",
391 PyString_AsString(mod),
Barry Warsaw7ce36942001-08-24 18:34:26 +0000392 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000393}
394
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000395static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000396class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000397{
398 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
399 PyObject *name = op->cl_name;
400 PyObject *res;
Martin v. Löwis66851282006-04-22 11:40:03 +0000401 Py_ssize_t m, n;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000402
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000403 if (name == NULL || !PyString_Check(name))
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000404 return class_repr(op);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000405 if (mod == NULL || !PyString_Check(mod)) {
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000406 Py_INCREF(name);
407 return name;
408 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000409 m = PyString_GET_SIZE(mod);
410 n = PyString_GET_SIZE(name);
411 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000412 if (res != NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000413 char *s = PyString_AS_STRING(res);
414 memcpy(s, PyString_AS_STRING(mod), m);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000415 s += m;
416 *s++ = '.';
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000417 memcpy(s, PyString_AS_STRING(name), n);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000418 }
419 return res;
420}
421
Jeremy Hylton8caad492000-06-23 14:18:11 +0000422static int
423class_traverse(PyClassObject *o, visitproc visit, void *arg)
424{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000425 Py_VISIT(o->cl_bases);
426 Py_VISIT(o->cl_dict);
427 Py_VISIT(o->cl_name);
428 Py_VISIT(o->cl_getattr);
429 Py_VISIT(o->cl_setattr);
430 Py_VISIT(o->cl_delattr);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000431 return 0;
432}
433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434PyTypeObject PyClass_Type = {
435 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000437 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000438 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000440 (destructor)class_dealloc, /* tp_dealloc */
441 0, /* tp_print */
442 0, /* tp_getattr */
443 0, /* tp_setattr */
444 0, /* tp_compare */
445 (reprfunc)class_repr, /* tp_repr */
446 0, /* tp_as_number */
447 0, /* tp_as_sequence */
448 0, /* tp_as_mapping */
449 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000451 (reprfunc)class_str, /* tp_str */
452 (getattrofunc)class_getattr, /* tp_getattro */
453 (setattrofunc)class_setattr, /* tp_setattro */
454 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000455 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000456 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000457 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000458 0, /* tp_clear */
459 0, /* tp_richcompare */
Antoine Pitroua57df2c2010-03-31 21:32:15 +0000460 offsetof(PyClassObject, cl_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000461 0, /* tp_iter */
462 0, /* tp_iternext */
463 0, /* tp_methods */
464 0, /* tp_members */
465 0, /* tp_getset */
466 0, /* tp_base */
467 0, /* tp_dict */
468 0, /* tp_descr_get */
469 0, /* tp_descr_set */
470 0, /* tp_dictoffset */
471 0, /* tp_init */
472 0, /* tp_alloc */
473 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474};
475
Guido van Rossum81daa321993-05-20 14:24:46 +0000476int
Anthony Baxter377be112006-04-11 06:54:30 +0000477PyClass_IsSubclass(PyObject *klass, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000478{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000479 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 PyClassObject *cp;
Anthony Baxter377be112006-04-11 06:54:30 +0000481 if (klass == base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000482 return 1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000483 if (PyTuple_Check(base)) {
484 n = PyTuple_GET_SIZE(base);
485 for (i = 0; i < n; i++) {
Anthony Baxter377be112006-04-11 06:54:30 +0000486 if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000487 return 1;
488 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000489 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000490 }
Anthony Baxter377be112006-04-11 06:54:30 +0000491 if (klass == NULL || !PyClass_Check(klass))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000492 return 0;
Anthony Baxter377be112006-04-11 06:54:30 +0000493 cp = (PyClassObject *)klass;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000495 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000497 return 1;
498 }
499 return 0;
500}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501
Guido van Rossum81daa321993-05-20 14:24:46 +0000502
503/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000504
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000506PyInstance_NewRaw(PyObject *klass, PyObject *dict)
507{
508 PyInstanceObject *inst;
509
510 if (!PyClass_Check(klass)) {
511 PyErr_BadInternalCall();
512 return NULL;
513 }
514 if (dict == NULL) {
515 dict = PyDict_New();
516 if (dict == NULL)
517 return NULL;
518 }
519 else {
520 if (!PyDict_Check(dict)) {
521 PyErr_BadInternalCall();
522 return NULL;
523 }
524 Py_INCREF(dict);
525 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000526 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000527 if (inst == NULL) {
528 Py_DECREF(dict);
529 return NULL;
530 }
Fred Drake4e262a92001-03-22 18:26:47 +0000531 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000532 Py_INCREF(klass);
533 inst->in_class = (PyClassObject *)klass;
534 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000535 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000536 return (PyObject *)inst;
537}
538
539PyObject *
540PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 register PyInstanceObject *inst;
543 PyObject *init;
544 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000545
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000546 if (initstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000547 initstr = PyString_InternFromString("__init__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000548 if (initstr == NULL)
549 return NULL;
550 }
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000551 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000552 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553 return NULL;
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000554 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000555 if (init == NULL) {
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000556 if (PyErr_Occurred()) {
557 Py_DECREF(inst);
558 return NULL;
559 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 if ((arg != NULL && (!PyTuple_Check(arg) ||
561 PyTuple_Size(arg) != 0))
562 || (kw != NULL && (!PyDict_Check(kw) ||
563 PyDict_Size(kw) != 0))) {
564 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000565 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000567 inst = NULL;
568 }
569 }
570 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
572 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000573 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000575 inst = NULL;
576 }
577 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 if (res != Py_None) {
579 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000580 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000582 inst = NULL;
583 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000585 }
586 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000588}
589
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000590/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000591
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000592PyDoc_STRVAR(instance_doc,
593"instance(class[, dict])\n\
594\n\
595Create an instance without calling its __init__() method.\n\
596The class must be a classic class.\n\
597If present, dict must be a dictionary or None.");
598
599static PyObject *
600instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
601{
602 PyObject *klass;
603 PyObject *dict = Py_None;
604
605 if (!PyArg_ParseTuple(args, "O!|O:instance",
606 &PyClass_Type, &klass, &dict))
607 return NULL;
608
609 if (dict == Py_None)
610 dict = NULL;
611 else if (!PyDict_Check(dict)) {
612 PyErr_SetString(PyExc_TypeError,
613 "instance() second arg must be dictionary or None");
614 return NULL;
615 }
616 return PyInstance_NewRaw(klass, dict);
617}
618
619
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000620static void
Fred Drake79912472000-07-09 04:06:11 +0000621instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 PyObject *error_type, *error_value, *error_traceback;
624 PyObject *del;
625 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000626
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000627 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000628 if (inst->in_weakreflist != NULL)
629 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000630
Tim Peters6b184912000-09-17 14:40:17 +0000631 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000632 assert(inst->ob_type == &PyInstance_Type);
633 assert(inst->ob_refcnt == 0);
634 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000635
636 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000638 /* Execute __del__ method, if any. */
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000639 if (delstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000640 delstr = PyString_InternFromString("__del__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000641 if (delstr == NULL)
Neal Norwitzaf33f2d2006-08-14 00:59:03 +0000642 PyErr_WriteUnraisable((PyObject*)inst);
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000643 }
Neal Norwitzaf33f2d2006-08-14 00:59:03 +0000644 if (delstr && (del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000646 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000647 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000648 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 Py_DECREF(res);
650 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000651 }
Tim Peters6b184912000-09-17 14:40:17 +0000652 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000654
Tim Peters6b184912000-09-17 14:40:17 +0000655 /* Undo the temporary resurrection; can't use DECREF here, it would
656 * cause a recursive call.
657 */
Tim Peters34592512002-07-11 06:23:50 +0000658 assert(inst->ob_refcnt > 0);
659 if (--inst->ob_refcnt == 0) {
Guido van Rossum9ff1a442008-01-18 20:56:30 +0000660
661 /* New weakrefs could be created during the finalizer call.
662 If this occurs, clear them out without calling their
663 finalizers since they might rely on part of the object
664 being finalized that has already been destroyed. */
665 while (inst->in_weakreflist != NULL) {
666 _PyWeakref_ClearRef((PyWeakReference *)
667 (inst->in_weakreflist));
668 }
669
Tim Peters34592512002-07-11 06:23:50 +0000670 Py_DECREF(inst->in_class);
671 Py_XDECREF(inst->in_dict);
672 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000673 }
Tim Peters34592512002-07-11 06:23:50 +0000674 else {
Martin v. Löwis66851282006-04-22 11:40:03 +0000675 Py_ssize_t refcnt = inst->ob_refcnt;
Tim Peters34592512002-07-11 06:23:50 +0000676 /* __del__ resurrected it! Make it look like the original
677 * Py_DECREF never happened.
678 */
679 _Py_NewReference((PyObject *)inst);
680 inst->ob_refcnt = refcnt;
681 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000682 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
683 * we need to undo that. */
684 _Py_DEC_REFTOTAL;
685 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
686 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000687 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000688 * _Py_NewReference bumped tp_allocs: both of those need to be
689 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000690 */
Tim Peters6b184912000-09-17 14:40:17 +0000691#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000692 --inst->ob_type->tp_frees;
693 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000694#endif
Tim Peters34592512002-07-11 06:23:50 +0000695 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000696}
697
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000699instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000700{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 register PyObject *v;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000702 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000703 if (sname[0] == '_' && sname[1] == '_') {
704 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 if (PyEval_GetRestricted()) {
706 PyErr_SetString(PyExc_RuntimeError,
707 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000708 return NULL;
709 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000711 return inst->in_dict;
712 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000713 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 Py_INCREF(inst->in_class);
715 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000716 }
Guido van Rossum94308391991-10-20 20:11:48 +0000717 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000718 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000719 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000720 PyErr_Format(PyExc_AttributeError,
721 "%.50s instance has no attribute '%.400s'",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000722 PyString_AS_STRING(inst->in_class->cl_name), sname);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000723 }
724 return v;
725}
726
727static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000728instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000729{
730 register PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000731 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000732 descrgetfunc f;
733
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000735 if (v != NULL) {
736 Py_INCREF(v);
737 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000738 }
Anthony Baxter377be112006-04-11 06:54:30 +0000739 v = class_lookup(inst->in_class, name, &klass);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000740 if (v != NULL) {
741 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000742 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000743 if (f != NULL) {
744 PyObject *w = f(v, (PyObject *)inst,
745 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000747 v = w;
748 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000749 }
750 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000751}
752
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000754instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000755{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000757 res = instance_getattr1(inst, name);
758 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000760 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
761 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000763 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000764 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000765 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 res = PyEval_CallObject(func, args);
767 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000768 }
769 return res;
770}
771
Tim Petersdf875b92003-04-07 17:51:59 +0000772/* See classobject.h comments: this only does dict lookups, and is always
773 * safe to call.
774 */
775PyObject *
776_PyInstance_Lookup(PyObject *pinst, PyObject *name)
777{
778 PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000779 PyClassObject *klass;
Tim Petersdf875b92003-04-07 17:51:59 +0000780 PyInstanceObject *inst; /* pinst cast to the right type */
781
782 assert(PyInstance_Check(pinst));
783 inst = (PyInstanceObject *)pinst;
784
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000785 assert(PyString_Check(name));
Tim Petersdf875b92003-04-07 17:51:59 +0000786
787 v = PyDict_GetItem(inst->in_dict, name);
788 if (v == NULL)
Anthony Baxter377be112006-04-11 06:54:30 +0000789 v = class_lookup(inst->in_class, name, &klass);
Tim Petersdf875b92003-04-07 17:51:59 +0000790 return v;
791}
792
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000793static int
Fred Drake79912472000-07-09 04:06:11 +0000794instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000795{
Guido van Rossum94472a01992-09-04 09:45:18 +0000796 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000798 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000799 PyErr_Format(PyExc_AttributeError,
800 "%.50s instance has no attribute '%.400s'",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000801 PyString_AS_STRING(inst->in_class->cl_name),
802 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000803 return rv;
804 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000805 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000807}
808
Guido van Rossume7737541994-09-05 07:31:41 +0000809static int
Fred Drake79912472000-07-09 04:06:11 +0000810instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000811{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000812 PyObject *func, *args, *res, *tmp;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000813 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000814 if (sname[0] == '_' && sname[1] == '_') {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000815 Py_ssize_t n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000816 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000817 if (strcmp(sname, "__dict__") == 0) {
818 if (PyEval_GetRestricted()) {
819 PyErr_SetString(PyExc_RuntimeError,
820 "__dict__ not accessible in restricted mode");
821 return -1;
822 }
823 if (v == NULL || !PyDict_Check(v)) {
824 PyErr_SetString(PyExc_TypeError,
825 "__dict__ must be set to a dictionary");
826 return -1;
827 }
828 tmp = inst->in_dict;
829 Py_INCREF(v);
830 inst->in_dict = v;
831 Py_DECREF(tmp);
832 return 0;
833 }
834 if (strcmp(sname, "__class__") == 0) {
835 if (PyEval_GetRestricted()) {
836 PyErr_SetString(PyExc_RuntimeError,
837 "__class__ not accessible in restricted mode");
838 return -1;
839 }
840 if (v == NULL || !PyClass_Check(v)) {
841 PyErr_SetString(PyExc_TypeError,
842 "__class__ must be set to a class");
843 return -1;
844 }
845 tmp = (PyObject *)(inst->in_class);
846 Py_INCREF(v);
847 inst->in_class = (PyClassObject *)v;
848 Py_DECREF(tmp);
849 return 0;
850 }
Guido van Rossume7737541994-09-05 07:31:41 +0000851 }
Guido van Rossume7737541994-09-05 07:31:41 +0000852 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000853 if (v == NULL)
854 func = inst->in_class->cl_delattr;
855 else
856 func = inst->in_class->cl_setattr;
857 if (func == NULL)
858 return instance_setattr1(inst, name, v);
859 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000860 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000861 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000862 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000863 if (args == NULL)
864 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 res = PyEval_CallObject(func, args);
866 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000867 if (res == NULL)
868 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000870 return 0;
871}
872
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000874instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyObject *func;
877 PyObject *res;
878 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000879
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000880 if (reprstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000881 reprstr = PyString_InternFromString("__repr__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000882 if (reprstr == NULL)
883 return NULL;
884 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000885 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000886 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000887 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000888 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000889 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
890 return NULL;
891 PyErr_Clear();
892 classname = inst->in_class->cl_name;
893 mod = PyDict_GetItemString(inst->in_class->cl_dict,
894 "__module__");
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000895 if (classname != NULL && PyString_Check(classname))
896 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000897 else
898 cname = "?";
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000899 if (mod == NULL || !PyString_Check(mod))
900 return PyString_FromFormat("<?.%s instance at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +0000901 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000902 else
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000903 return PyString_FromFormat("<%s.%s instance at %p>",
904 PyString_AsString(mod),
Barry Warsaw7ce36942001-08-24 18:34:26 +0000905 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000906 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 res = PyEval_CallObject(func, (PyObject *)NULL);
908 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000909 return res;
910}
911
Guido van Rossum82c690f2001-04-30 14:39:18 +0000912static PyObject *
913instance_str(PyInstanceObject *inst)
914{
915 PyObject *func;
916 PyObject *res;
917 static PyObject *strstr;
918
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000919 if (strstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000920 strstr = PyString_InternFromString("__str__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000921 if (strstr == NULL)
922 return NULL;
923 }
Guido van Rossum82c690f2001-04-30 14:39:18 +0000924 func = instance_getattr(inst, strstr);
925 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000926 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
927 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000928 PyErr_Clear();
929 return instance_repr(inst);
930 }
931 res = PyEval_CallObject(func, (PyObject *)NULL);
932 Py_DECREF(func);
933 return res;
934}
935
Guido van Rossum9bfef441993-03-29 10:43:31 +0000936static long
Fred Drake79912472000-07-09 04:06:11 +0000937instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000938{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939 PyObject *func;
940 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000941 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000942 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000943
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000944 if (hashstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000945 hashstr = PyString_InternFromString("__hash__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000946 if (hashstr == NULL)
947 return -1;
948 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000949 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000950 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000951 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
952 return -1;
953 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000954 /* If there is no __eq__ and no __cmp__ method, we hash on the
955 address. If an __eq__ or __cmp__ method exists, there must
956 be a __hash__. */
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000957 if (eqstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000958 eqstr = PyString_InternFromString("__eq__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000959 if (eqstr == NULL)
960 return -1;
961 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000962 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000963 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000964 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
965 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000967 if (cmpstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000968 cmpstr = PyString_InternFromString("__cmp__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000969 if (cmpstr == NULL)
970 return -1;
971 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000972 func = instance_getattr(inst, cmpstr);
973 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000974 if (!PyErr_ExceptionMatches(
975 PyExc_AttributeError))
976 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000977 PyErr_Clear();
978 return _Py_HashPointer(inst);
979 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000980 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000981 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000983 return -1;
984 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 res = PyEval_CallObject(func, (PyObject *)NULL);
986 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000987 if (res == NULL)
988 return -1;
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000989 if (PyInt_Check(res) || PyLong_Check(res))
990 /* This already converts a -1 result to -2. */
991 outcome = res->ob_type->tp_hash(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000992 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 PyErr_SetString(PyExc_TypeError,
994 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000995 outcome = -1;
996 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000998 return outcome;
999}
1000
Jeremy Hylton8caad492000-06-23 14:18:11 +00001001static int
1002instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
1003{
Thomas Woutersc6e55062006-04-15 21:47:09 +00001004 Py_VISIT(o->in_class);
1005 Py_VISIT(o->in_dict);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001006 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001007}
1008
Guido van Rossum213c7a62001-04-23 14:08:49 +00001009static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
1010static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001011
Martin v. Löwis18e16552006-02-15 17:27:45 +00001012static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001013instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001014{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 PyObject *func;
1016 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001017 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001018
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001019 if (lenstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001020 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001021 if (lenstr == NULL)
1022 return -1;
1023 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001024 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001025 if (func == NULL)
1026 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 res = PyEval_CallObject(func, (PyObject *)NULL);
1028 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001029 if (res == NULL)
1030 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001031 if (PyInt_Check(res)) {
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001032 outcome = PyInt_AsSsize_t(res);
1033 if (outcome == -1 && PyErr_Occurred()) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001034 Py_DECREF(res);
1035 return -1;
1036 }
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001037#if SIZEOF_SIZE_T < SIZEOF_INT
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001038 /* Overflow check -- range of PyInt is more than C int */
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001039 if (outcome != (int)outcome) {
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001040 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +00001041 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001042 outcome = -1;
1043 }
1044 else
1045#endif
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001046 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 PyErr_SetString(PyExc_ValueError,
1048 "__len__() should return >= 0");
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001049 outcome = -1;
1050 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051 }
1052 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyErr_SetString(PyExc_TypeError,
1054 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 outcome = -1;
1056 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058 return outcome;
1059}
1060
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001062instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 PyObject *func;
1065 PyObject *arg;
1066 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001067
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001068 if (getitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001069 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001070 if (getitemstr == NULL)
1071 return NULL;
1072 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001073 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074 if (func == NULL)
1075 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001076 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001077 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 return NULL;
1080 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 res = PyEval_CallObject(func, arg);
1082 Py_DECREF(func);
1083 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001084 return res;
1085}
1086
Guido van Rossum9bfef441993-03-29 10:43:31 +00001087static int
Fred Drake79912472000-07-09 04:06:11 +00001088instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 PyObject *func;
1091 PyObject *arg;
1092 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093
Guido van Rossum2878a691996-08-09 20:53:24 +00001094 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001095 if (delitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001096 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001097 if (delitemstr == NULL)
1098 return -1;
1099 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001100 func = instance_getattr(inst, delitemstr);
1101 }
1102 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001103 if (setitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001104 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001105 if (setitemstr == NULL)
1106 return -1;
1107 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001108 func = instance_getattr(inst, setitemstr);
1109 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001110 if (func == NULL)
1111 return -1;
1112 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001113 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001114 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001115 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001116 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001118 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001119 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 res = PyEval_CallObject(func, arg);
1121 Py_DECREF(func);
1122 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001123 if (res == NULL)
1124 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001126 return 0;
1127}
1128
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001130 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001131 (binaryfunc)instance_subscript, /* mp_subscript */
1132 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133};
1134
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001136instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137{
Georg Brandle4e023c2006-05-26 20:22:50 +00001138 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001140 if (getitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001141 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001142 if (getitemstr == NULL)
1143 return NULL;
1144 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001145 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001146 if (func == NULL)
1147 return NULL;
Georg Brandle4e023c2006-05-26 20:22:50 +00001148 res = PyObject_CallFunction(func, "n", i);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001150 return res;
1151}
1152
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001154instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001155{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001156 PyObject *func, *arg, *res;
1157 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001158
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001159 if (getslicestr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001160 getslicestr = PyString_InternFromString("__getslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001161 if (getslicestr == NULL)
1162 return NULL;
1163 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001164 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001165
1166 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001167 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1168 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001169 PyErr_Clear();
1170
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001171 if (getitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001172 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001173 if (getitemstr == NULL)
1174 return NULL;
1175 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001176 func = instance_getattr(inst, getitemstr);
1177 if (func == NULL)
1178 return NULL;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001179 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
Benjamin Peterson712ee922008-08-24 18:10:20 +00001180 }
1181 else {
1182 if (PyErr_WarnPy3k("in 3.x, __getslice__ has been removed; "
1183 "use __getitem__", 1) < 0) {
1184 Py_DECREF(func);
1185 return NULL;
1186 }
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001187 arg = Py_BuildValue("(nn)", i, j);
Benjamin Peterson712ee922008-08-24 18:10:20 +00001188 }
Tim Peters34592512002-07-11 06:23:50 +00001189
Guido van Rossum04691fc1992-08-12 15:35:34 +00001190 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001192 return NULL;
1193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 res = PyEval_CallObject(func, arg);
1195 Py_DECREF(func);
1196 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001197 return res;
1198}
1199
1200static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001201instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001202{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001204
Guido van Rossum2878a691996-08-09 20:53:24 +00001205 if (item == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001206 if (delitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001207 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001208 if (delitemstr == NULL)
1209 return -1;
1210 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001211 func = instance_getattr(inst, delitemstr);
1212 }
1213 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001214 if (setitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001215 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001216 if (setitemstr == NULL)
1217 return -1;
1218 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001219 func = instance_getattr(inst, setitemstr);
1220 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001221 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001222 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001223 if (item == NULL)
Georg Brandl2cfaa342006-05-29 19:39:45 +00001224 arg = PyInt_FromSsize_t(i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001225 else
Georg Brandl2cfaa342006-05-29 19:39:45 +00001226 arg = Py_BuildValue("(nO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001227 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001229 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001230 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 res = PyEval_CallObject(func, arg);
1232 Py_DECREF(func);
1233 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001234 if (res == NULL)
1235 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001237 return 0;
1238}
1239
1240static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001241instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001242{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 PyObject *func, *arg, *res;
1244 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001245
Guido van Rossum2878a691996-08-09 20:53:24 +00001246 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001247 if (delslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 delslicestr =
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001249 PyString_InternFromString("__delslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001250 if (delslicestr == NULL)
1251 return -1;
1252 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001253 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001254 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001255 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1256 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001257 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001258 if (delitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001259 delitemstr =
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001260 PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001261 if (delitemstr == NULL)
1262 return -1;
1263 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001264 func = instance_getattr(inst, delitemstr);
1265 if (func == NULL)
1266 return -1;
1267
1268 arg = Py_BuildValue("(N)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001269 _PySlice_FromIndices(i, j));
Benjamin Peterson712ee922008-08-24 18:10:20 +00001270 }
1271 else {
1272 if (PyErr_WarnPy3k("in 3.x, __delslice__ has been "
1273 "removed; use __delitem__", 1) < 0) {
1274 Py_DECREF(func);
1275 return -1;
1276 }
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001277 arg = Py_BuildValue("(nn)", i, j);
Benjamin Peterson712ee922008-08-24 18:10:20 +00001278 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001279 }
1280 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001281 if (setslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 setslicestr =
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001283 PyString_InternFromString("__setslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001284 if (setslicestr == NULL)
1285 return -1;
1286 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001287 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001288 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001289 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1290 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001291 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001292 if (setitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001293 setitemstr =
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001294 PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001295 if (setitemstr == NULL)
1296 return -1;
1297 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001298 func = instance_getattr(inst, setitemstr);
1299 if (func == NULL)
1300 return -1;
1301
1302 arg = Py_BuildValue("(NO)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001303 _PySlice_FromIndices(i, j), value);
Benjamin Peterson712ee922008-08-24 18:10:20 +00001304 }
1305 else {
1306 if (PyErr_WarnPy3k("in 3.x, __setslice__ has been "
1307 "removed; use __setitem__", 1) < 0) {
1308 Py_DECREF(func);
1309 return -1;
1310 }
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001311 arg = Py_BuildValue("(nnO)", i, j, value);
Benjamin Peterson712ee922008-08-24 18:10:20 +00001312 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001313 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001314 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001316 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001317 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 res = PyEval_CallObject(func, arg);
1319 Py_DECREF(func);
1320 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001321 if (res == NULL)
1322 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001324 return 0;
1325}
1326
Tim Peterscb8d3682001-05-05 21:05:01 +00001327static int
1328instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001329{
1330 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001331 PyObject *func;
1332
1333 /* Try __contains__ first.
1334 * If that can't be done, try iterator-based searching.
1335 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001336
1337 if(__contains__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001338 __contains__ = PyString_InternFromString("__contains__");
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001339 if(__contains__ == NULL)
1340 return -1;
1341 }
1342 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001343 if (func) {
1344 PyObject *res;
1345 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001346 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001347 if(arg == NULL) {
1348 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001349 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001350 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001351 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001352 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001353 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001354 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001355 return -1;
1356 ret = PyObject_IsTrue(res);
1357 Py_DECREF(res);
1358 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001359 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001360
1361 /* Couldn't find __contains__. */
1362 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Martin v. Löwis3a624042006-11-08 06:46:37 +00001363 Py_ssize_t rc;
Tim Peterscb8d3682001-05-05 21:05:01 +00001364 /* Assume the failure was simply due to that there is no
1365 * __contains__ attribute, and try iterating instead.
1366 */
1367 PyErr_Clear();
Martin v. Löwis3a624042006-11-08 06:46:37 +00001368 rc = _PySequence_IterSearch((PyObject *)inst, member,
1369 PY_ITERSEARCH_CONTAINS);
1370 if (rc >= 0)
1371 return rc > 0;
Tim Peterscb8d3682001-05-05 21:05:01 +00001372 }
Martin v. Löwis3a624042006-11-08 06:46:37 +00001373 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001374}
1375
Fred Drake79912472000-07-09 04:06:11 +00001376static PySequenceMethods
1377instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001378 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001379 0, /* sq_concat */
1380 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001381 (ssizeargfunc)instance_item, /* sq_item */
1382 (ssizessizeargfunc)instance_slice, /* sq_slice */
1383 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1384 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001385 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001386};
1387
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001389generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001390{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001392
1393 if ((func = instance_getattr(self, methodname)) == NULL)
1394 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395 res = PyEval_CallObject(func, (PyObject *)NULL);
1396 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001397 return res;
1398}
1399
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001400static PyObject *
1401generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001402{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001403 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001405 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001406 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001407 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001408 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001410 Py_INCREF(Py_NotImplemented);
1411 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001412 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001413 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001414 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001416 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001417 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001418 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 Py_DECREF(args);
1420 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001421 return result;
1422}
1423
1424
1425static PyObject *coerce_obj;
1426
1427/* Try one half of a binary operator involving a class instance. */
1428static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001429half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001430 int swapped)
1431{
1432 PyObject *args;
1433 PyObject *coercefunc;
1434 PyObject *coerced = NULL;
1435 PyObject *v1;
1436 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001437
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001438 if (!PyInstance_Check(v)) {
1439 Py_INCREF(Py_NotImplemented);
1440 return Py_NotImplemented;
1441 }
1442
1443 if (coerce_obj == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001444 coerce_obj = PyString_InternFromString("__coerce__");
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001445 if (coerce_obj == NULL)
1446 return NULL;
1447 }
1448 coercefunc = PyObject_GetAttr(v, coerce_obj);
1449 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001450 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1451 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001452 PyErr_Clear();
1453 return generic_binary_op(v, w, opname);
1454 }
1455
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001456 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001457 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001458 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001459 return NULL;
1460 }
1461 coerced = PyEval_CallObject(coercefunc, args);
1462 Py_DECREF(args);
1463 Py_DECREF(coercefunc);
1464 if (coerced == NULL) {
1465 return NULL;
1466 }
1467 if (coerced == Py_None || coerced == Py_NotImplemented) {
1468 Py_DECREF(coerced);
1469 return generic_binary_op(v, w, opname);
1470 }
1471 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1472 Py_DECREF(coerced);
1473 PyErr_SetString(PyExc_TypeError,
1474 "coercion should return None or 2-tuple");
1475 return NULL;
1476 }
1477 v1 = PyTuple_GetItem(coerced, 0);
1478 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001479 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001480 /* prevent recursion if __coerce__ returns self as the first
1481 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001482 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001483 } else {
Brett Cannonea3912b2006-06-13 21:46:41 +00001484 if (Py_EnterRecursiveCall(" after coercion"))
1485 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001486 if (swapped)
1487 result = (thisfunc)(w, v1);
1488 else
1489 result = (thisfunc)(v1, w);
Brett Cannonea3912b2006-06-13 21:46:41 +00001490 Py_LeaveRecursiveCall();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001491 }
1492 Py_DECREF(coerced);
1493 return result;
1494}
1495
1496/* Implement a binary operator involving at least one class instance. */
1497static PyObject *
1498do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1499 binaryfunc thisfunc)
1500{
1501 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1502 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001503 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001504 result = half_binop(w, v, ropname, thisfunc, 1);
1505 }
1506 return result;
1507}
1508
1509static PyObject *
1510do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1511 char *ropname, binaryfunc thisfunc)
1512{
1513 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1514 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001515 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001516 result = do_binop(v, w, opname, ropname, thisfunc);
1517 }
1518 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001519}
1520
Guido van Rossum879c5811995-01-10 15:24:06 +00001521static int
Fred Drake79912472000-07-09 04:06:11 +00001522instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001523{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 PyObject *v = *pv;
1525 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001526 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527 PyObject *args;
1528 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001529
Guido van Rossum2878a691996-08-09 20:53:24 +00001530 if (coerce_obj == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001531 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001532 if (coerce_obj == NULL)
1533 return -1;
1534 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001535 coercefunc = PyObject_GetAttr(v, coerce_obj);
1536 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001537 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001538 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1539 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001541 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001542 }
1543 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001544 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001545 if (args == NULL) {
1546 return -1;
1547 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001548 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001550 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001551 if (coerced == NULL) {
1552 /* __coerce__ call raised an exception */
1553 return -1;
1554 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001555 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001556 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001557 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001558 return 1;
1559 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001561 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001562 Py_DECREF(coerced);
1563 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001564 "coercion should return None or 2-tuple");
1565 return -1;
1566 }
1567 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 *pv = PyTuple_GetItem(coerced, 0);
1569 *pw = PyTuple_GetItem(coerced, 1);
1570 Py_INCREF(*pv);
1571 Py_INCREF(*pw);
1572 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001573 return 0;
1574}
1575
Guido van Rossum04691fc1992-08-12 15:35:34 +00001576#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001577static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 static PyObject *o; \
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001579 if (o == NULL) { o = PyString_InternFromString(methodname); \
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001580 if (o == NULL) return NULL; } \
Guido van Rossum2878a691996-08-09 20:53:24 +00001581 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001582}
1583
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001584/* unary function with a fallback */
1585#define UNARY_FB(funcname, methodname, funcname_fb) \
1586static PyObject *funcname(PyInstanceObject *self) { \
1587 static PyObject *o; \
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001588 if (o == NULL) { o = PyString_InternFromString(methodname); \
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001589 if (o == NULL) return NULL; } \
1590 if (PyObject_HasAttr((PyObject*)self, o)) \
1591 return generic_unary_op(self, o); \
1592 else \
1593 return funcname_fb(self); \
1594}
1595
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001596#define BINARY(f, m, n) \
1597static PyObject *f(PyObject *v, PyObject *w) { \
1598 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1599}
1600
1601#define BINARY_INPLACE(f, m, n) \
1602static PyObject *f(PyObject *v, PyObject *w) { \
1603 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1604 "__r" m "__", n); \
1605}
1606
Guido van Rossum04691fc1992-08-12 15:35:34 +00001607UNARY(instance_neg, "__neg__")
1608UNARY(instance_pos, "__pos__")
1609UNARY(instance_abs, "__abs__")
1610
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001611BINARY(instance_or, "or", PyNumber_Or)
1612BINARY(instance_and, "and", PyNumber_And)
1613BINARY(instance_xor, "xor", PyNumber_Xor)
1614BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1615BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1616BINARY(instance_add, "add", PyNumber_Add)
1617BINARY(instance_sub, "sub", PyNumber_Subtract)
1618BINARY(instance_mul, "mul", PyNumber_Multiply)
1619BINARY(instance_div, "div", PyNumber_Divide)
1620BINARY(instance_mod, "mod", PyNumber_Remainder)
1621BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001622BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1623BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001624
1625BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1626BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1627BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1628BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1629BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1630BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1631BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1632BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1633BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1634BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001635BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1636BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001637
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001638/* Try a 3-way comparison, returning an int; v is an instance. Return:
1639 -2 for an exception;
1640 -1 if v < w;
1641 0 if v == w;
1642 1 if v > w;
1643 2 if this particular 3-way comparison is not implemented or undefined.
1644*/
1645static int
1646half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001647{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001648 static PyObject *cmp_obj;
1649 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001650 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001651 PyObject *result;
1652 long l;
1653
1654 assert(PyInstance_Check(v));
1655
1656 if (cmp_obj == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001657 cmp_obj = PyString_InternFromString("__cmp__");
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001658 if (cmp_obj == NULL)
1659 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001660 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001661
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001662 cmp_func = PyObject_GetAttr(v, cmp_obj);
1663 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001664 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1665 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001666 PyErr_Clear();
1667 return 2;
1668 }
1669
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001670 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001671 if (args == NULL) {
1672 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001673 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001674 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001675
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001676 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001677 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001678 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001679
1680 if (result == NULL)
1681 return -2;
1682
1683 if (result == Py_NotImplemented) {
1684 Py_DECREF(result);
1685 return 2;
1686 }
1687
1688 l = PyInt_AsLong(result);
1689 Py_DECREF(result);
1690 if (l == -1 && PyErr_Occurred()) {
1691 PyErr_SetString(PyExc_TypeError,
1692 "comparison did not return an int");
1693 return -2;
1694 }
1695
1696 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001697}
1698
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001699/* Try a 3-way comparison, returning an int; either v or w is an instance.
1700 We first try a coercion. Return:
1701 -2 for an exception;
1702 -1 if v < w;
1703 0 if v == w;
1704 1 if v > w;
1705 2 if this particular 3-way comparison is not implemented or undefined.
1706 THIS IS ONLY CALLED FROM object.c!
1707*/
1708static int
1709instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001710{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001711 int c;
1712
1713 c = PyNumber_CoerceEx(&v, &w);
1714 if (c < 0)
1715 return -2;
1716 if (c == 0) {
1717 /* If neither is now an instance, use regular comparison */
1718 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1719 c = PyObject_Compare(v, w);
1720 Py_DECREF(v);
1721 Py_DECREF(w);
1722 if (PyErr_Occurred())
1723 return -2;
1724 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001725 }
1726 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001727 else {
1728 /* The coercion didn't do anything.
1729 Treat this the same as returning v and w unchanged. */
1730 Py_INCREF(v);
1731 Py_INCREF(w);
1732 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001733
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001734 if (PyInstance_Check(v)) {
1735 c = half_cmp(v, w);
1736 if (c <= 1) {
1737 Py_DECREF(v);
1738 Py_DECREF(w);
1739 return c;
1740 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001741 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001742 if (PyInstance_Check(w)) {
1743 c = half_cmp(w, v);
1744 if (c <= 1) {
1745 Py_DECREF(v);
1746 Py_DECREF(w);
1747 if (c >= -1)
1748 c = -c;
1749 return c;
1750 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001751 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001752 Py_DECREF(v);
1753 Py_DECREF(w);
1754 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001755}
1756
Guido van Rossum9bfef441993-03-29 10:43:31 +00001757static int
Fred Drake79912472000-07-09 04:06:11 +00001758instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001759{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001760 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001761 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001763
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001764 if (nonzerostr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001765 nonzerostr = PyString_InternFromString("__nonzero__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001766 if (nonzerostr == NULL)
1767 return -1;
1768 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001769 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001770 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1771 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001772 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001773 if (lenstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001774 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001775 if (lenstr == NULL)
1776 return -1;
1777 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001778 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001779 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1780 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001782 /* Fall back to the default behavior:
1783 all instances are nonzero */
1784 return 1;
1785 }
1786 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787 res = PyEval_CallObject(func, (PyObject *)NULL);
1788 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001789 if (res == NULL)
1790 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001791 if (!PyInt_Check(res)) {
1792 Py_DECREF(res);
1793 PyErr_SetString(PyExc_TypeError,
1794 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001795 return -1;
1796 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001797 outcome = PyInt_AsLong(res);
1798 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001799 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001800 PyErr_SetString(PyExc_ValueError,
1801 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001802 return -1;
1803 }
1804 return outcome > 0;
1805}
1806
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001807static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001808instance_index(PyInstanceObject *self)
1809{
1810 PyObject *func, *res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001811 static PyObject *indexstr = NULL;
1812
1813 if (indexstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001814 indexstr = PyString_InternFromString("__index__");
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001815 if (indexstr == NULL)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001816 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001817 }
1818 if ((func = instance_getattr(self, indexstr)) == NULL) {
1819 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001820 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001821 PyErr_Clear();
1822 PyErr_SetString(PyExc_TypeError,
1823 "object cannot be interpreted as an index");
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001824 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001825 }
1826 res = PyEval_CallObject(func, (PyObject *)NULL);
1827 Py_DECREF(func);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001828 return res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001829}
1830
1831
Guido van Rossum04691fc1992-08-12 15:35:34 +00001832UNARY(instance_invert, "__invert__")
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001833UNARY(_instance_trunc, "__trunc__")
1834
1835static PyObject *
1836instance_int(PyInstanceObject *self)
1837{
1838 PyObject *truncated;
1839 static PyObject *int_name;
1840 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001841 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001842 if (int_name == NULL)
1843 return NULL;
1844 }
1845 if (PyObject_HasAttr((PyObject*)self, int_name))
1846 return generic_unary_op(self, int_name);
1847
1848 truncated = _instance_trunc(self);
1849 /* __trunc__ is specified to return an Integral type, but
1850 int() needs to return an int. */
1851 return _PyNumber_ConvertIntegralToInt(
1852 truncated,
1853 "__trunc__ returned non-Integral (type %.200s)");
1854}
1855
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001856UNARY_FB(instance_long, "__long__", instance_int)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001857UNARY(instance_float, "__float__")
1858UNARY(instance_oct, "__oct__")
1859UNARY(instance_hex, "__hex__")
1860
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001861static PyObject *
1862bin_power(PyObject *v, PyObject *w)
1863{
1864 return PyNumber_Power(v, w, Py_None);
1865}
1866
Guido van Rossum03093a21994-09-28 15:51:32 +00001867/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001868static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001869instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001870{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001871 if (z == Py_None) {
1872 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001873 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001874 else {
1875 PyObject *func;
1876 PyObject *args;
1877 PyObject *result;
1878
1879 /* XXX Doesn't do coercions... */
1880 func = PyObject_GetAttrString(v, "__pow__");
1881 if (func == NULL)
1882 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001883 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001884 if (args == NULL) {
1885 Py_DECREF(func);
1886 return NULL;
1887 }
1888 result = PyEval_CallObject(func, args);
1889 Py_DECREF(func);
1890 Py_DECREF(args);
1891 return result;
1892 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001893}
1894
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001895static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001896bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001897{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001898 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001899}
1900
1901
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001902static PyObject *
1903instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1904{
1905 if (z == Py_None) {
1906 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1907 "__rpow__", bin_inplace_power);
1908 }
1909 else {
1910 /* XXX Doesn't do coercions... */
1911 PyObject *func;
1912 PyObject *args;
1913 PyObject *result;
1914
1915 func = PyObject_GetAttrString(v, "__ipow__");
1916 if (func == NULL) {
1917 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1918 return NULL;
1919 PyErr_Clear();
1920 return instance_pow(v, w, z);
1921 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001922 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001923 if (args == NULL) {
1924 Py_DECREF(func);
1925 return NULL;
1926 }
1927 result = PyEval_CallObject(func, args);
1928 Py_DECREF(func);
1929 Py_DECREF(args);
1930 return result;
1931 }
1932}
1933
1934
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001935/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001936#define NAME_OPS 6
1937static PyObject **name_op = NULL;
1938
Tim Peters34592512002-07-11 06:23:50 +00001939static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001940init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001941{
1942 int i;
1943 char *_name_op[] = {
1944 "__lt__",
1945 "__le__",
1946 "__eq__",
1947 "__ne__",
1948 "__gt__",
1949 "__ge__",
1950 };
1951
1952 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1953 if (name_op == NULL)
1954 return -1;
1955 for (i = 0; i < NAME_OPS; ++i) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001956 name_op[i] = PyString_InternFromString(_name_op[i]);
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001957 if (name_op[i] == NULL)
1958 return -1;
1959 }
1960 return 0;
1961}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001962
1963static PyObject *
1964half_richcompare(PyObject *v, PyObject *w, int op)
1965{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001966 PyObject *method;
1967 PyObject *args;
1968 PyObject *res;
1969
1970 assert(PyInstance_Check(v));
1971
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001972 if (name_op == NULL) {
1973 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001974 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001975 }
1976 /* If the instance doesn't define an __getattr__ method, use
1977 instance_getattr2 directly because it will not set an
1978 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001979 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001980 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001981 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001982 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001983 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001984 if (method == NULL) {
1985 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001986 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1987 return NULL;
1988 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001989 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001990 res = Py_NotImplemented;
1991 Py_INCREF(res);
1992 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001993 }
1994
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001995 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001996 if (args == NULL) {
1997 Py_DECREF(method);
1998 return NULL;
1999 }
2000
2001 res = PyEval_CallObject(method, args);
2002 Py_DECREF(args);
2003 Py_DECREF(method);
2004
2005 return res;
2006}
2007
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002008static PyObject *
2009instance_richcompare(PyObject *v, PyObject *w, int op)
2010{
2011 PyObject *res;
2012
2013 if (PyInstance_Check(v)) {
2014 res = half_richcompare(v, w, op);
2015 if (res != Py_NotImplemented)
2016 return res;
2017 Py_DECREF(res);
2018 }
2019
2020 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00002021 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002022 if (res != Py_NotImplemented)
2023 return res;
2024 Py_DECREF(res);
2025 }
2026
2027 Py_INCREF(Py_NotImplemented);
2028 return Py_NotImplemented;
2029}
2030
Neil Schemenauer29bfc072001-01-04 01:43:46 +00002031
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002032/* Get the iterator */
2033static PyObject *
2034instance_getiter(PyInstanceObject *self)
2035{
2036 PyObject *func;
2037
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002038 if (iterstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002039 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002040 if (iterstr == NULL)
2041 return NULL;
2042 }
2043 if (getitemstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002044 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002045 if (getitemstr == NULL)
2046 return NULL;
2047 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002048
2049 if ((func = instance_getattr(self, iterstr)) != NULL) {
2050 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2051 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002052 if (res != NULL && !PyIter_Check(res)) {
2053 PyErr_Format(PyExc_TypeError,
2054 "__iter__ returned non-iterator "
2055 "of type '%.100s'",
2056 res->ob_type->tp_name);
2057 Py_DECREF(res);
2058 res = NULL;
2059 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002060 return res;
2061 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002062 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2063 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002064 PyErr_Clear();
2065 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002066 PyErr_SetString(PyExc_TypeError,
2067 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002068 return NULL;
2069 }
2070 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002071 return PySeqIter_New((PyObject *)self);
2072}
2073
2074
2075/* Call the iterator's next */
2076static PyObject *
2077instance_iternext(PyInstanceObject *self)
2078{
2079 PyObject *func;
2080
Neal Norwitzb09f4f52006-08-13 18:10:28 +00002081 if (nextstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002082 nextstr = PyString_InternFromString("next");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00002083 if (nextstr == NULL)
2084 return NULL;
2085 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002086
2087 if ((func = instance_getattr(self, nextstr)) != NULL) {
2088 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2089 Py_DECREF(func);
2090 if (res != NULL) {
2091 return res;
2092 }
2093 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
2094 PyErr_Clear();
2095 return NULL;
2096 }
2097 return NULL;
2098 }
2099 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
2100 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002101}
2102
Tim Peters6d6c1a32001-08-02 04:15:00 +00002103static PyObject *
2104instance_call(PyObject *func, PyObject *arg, PyObject *kw)
2105{
2106 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2107 if (call == NULL) {
2108 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002109 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2110 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002111 PyErr_Clear();
2112 PyErr_Format(PyExc_AttributeError,
2113 "%.200s instance has no __call__ method",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002114 PyString_AsString(inst->in_class->cl_name));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002115 return NULL;
2116 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00002117 /* We must check and increment the recursion depth here. Scenario:
2118 class A:
2119 pass
2120 A.__call__ = A() # that's right
2121 a = A() # ok
2122 a() # infinite recursion
2123 This bounces between instance_call() and PyObject_Call() without
2124 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002125 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002126 res = NULL;
2127 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00002128 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002129 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00002130 Py_LeaveRecursiveCall();
2131 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002132 Py_DECREF(call);
2133 return res;
2134}
2135
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002136
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002137static PyNumberMethods instance_as_number = {
Georg Brandl347b3002006-03-30 11:57:00 +00002138 instance_add, /* nb_add */
2139 instance_sub, /* nb_subtract */
2140 instance_mul, /* nb_multiply */
2141 instance_div, /* nb_divide */
2142 instance_mod, /* nb_remainder */
2143 instance_divmod, /* nb_divmod */
2144 instance_pow, /* nb_power */
2145 (unaryfunc)instance_neg, /* nb_negative */
2146 (unaryfunc)instance_pos, /* nb_positive */
2147 (unaryfunc)instance_abs, /* nb_absolute */
2148 (inquiry)instance_nonzero, /* nb_nonzero */
2149 (unaryfunc)instance_invert, /* nb_invert */
2150 instance_lshift, /* nb_lshift */
2151 instance_rshift, /* nb_rshift */
2152 instance_and, /* nb_and */
2153 instance_xor, /* nb_xor */
2154 instance_or, /* nb_or */
2155 instance_coerce, /* nb_coerce */
2156 (unaryfunc)instance_int, /* nb_int */
2157 (unaryfunc)instance_long, /* nb_long */
2158 (unaryfunc)instance_float, /* nb_float */
2159 (unaryfunc)instance_oct, /* nb_oct */
2160 (unaryfunc)instance_hex, /* nb_hex */
2161 instance_iadd, /* nb_inplace_add */
2162 instance_isub, /* nb_inplace_subtract */
2163 instance_imul, /* nb_inplace_multiply */
2164 instance_idiv, /* nb_inplace_divide */
2165 instance_imod, /* nb_inplace_remainder */
2166 instance_ipow, /* nb_inplace_power */
2167 instance_ilshift, /* nb_inplace_lshift */
2168 instance_irshift, /* nb_inplace_rshift */
2169 instance_iand, /* nb_inplace_and */
2170 instance_ixor, /* nb_inplace_xor */
2171 instance_ior, /* nb_inplace_or */
2172 instance_floordiv, /* nb_floor_divide */
2173 instance_truediv, /* nb_true_divide */
2174 instance_ifloordiv, /* nb_inplace_floor_divide */
2175 instance_itruediv, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002176 (unaryfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002177};
2178
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002179PyTypeObject PyInstance_Type = {
2180 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002181 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002182 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002183 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002184 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002185 (destructor)instance_dealloc, /* tp_dealloc */
2186 0, /* tp_print */
2187 0, /* tp_getattr */
2188 0, /* tp_setattr */
2189 instance_compare, /* tp_compare */
2190 (reprfunc)instance_repr, /* tp_repr */
2191 &instance_as_number, /* tp_as_number */
2192 &instance_as_sequence, /* tp_as_sequence */
2193 &instance_as_mapping, /* tp_as_mapping */
2194 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002195 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002196 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002197 (getattrofunc)instance_getattr, /* tp_getattro */
2198 (setattrofunc)instance_setattr, /* tp_setattro */
2199 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002200 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002201 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002202 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002203 0, /* tp_clear */
2204 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002205 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2206 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002207 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002208 0, /* tp_methods */
2209 0, /* tp_members */
2210 0, /* tp_getset */
2211 0, /* tp_base */
2212 0, /* tp_dict */
2213 0, /* tp_descr_get */
2214 0, /* tp_descr_set */
2215 0, /* tp_dictoffset */
2216 0, /* tp_init */
2217 0, /* tp_alloc */
2218 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002219};
2220
2221
Guido van Rossum81daa321993-05-20 14:24:46 +00002222/* Instance method objects are used for two purposes:
2223 (a) as bound instance methods (returned by instancename.methodname)
2224 (b) as unbound methods (returned by ClassName.methodname)
2225 In case (b), im_self is NULL
2226*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002227
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002228PyObject *
Anthony Baxter377be112006-04-11 06:54:30 +00002229PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002230{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002231 register PyMethodObject *im;
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002232 im = free_list;
2233 if (im != NULL) {
2234 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002235 PyObject_INIT(im, &PyMethod_Type);
Christian Heimes6075a822008-02-06 12:44:34 +00002236 numfree--;
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002237 }
2238 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002239 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002240 if (im == NULL)
2241 return NULL;
2242 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002243 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002244 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002245 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002246 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002247 im->im_self = self;
Anthony Baxter377be112006-04-11 06:54:30 +00002248 Py_XINCREF(klass);
2249 im->im_class = klass;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002250 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002251 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002252}
2253
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002254/* Descriptors for PyMethod attributes */
2255
2256/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002257
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002258#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002259
Guido van Rossum6f799372001-09-20 20:46:19 +00002260static PyMemberDef instancemethod_memberlist[] = {
2261 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2262 "the class associated with a method"},
2263 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2264 "the function (or other callable) implementing a method"},
Neal Norwitzb1d3d962008-03-18 04:46:00 +00002265 {"__func__", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2266 "the function (or other callable) implementing a method"},
Guido van Rossum6f799372001-09-20 20:46:19 +00002267 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2268 "the instance to which a method is bound; None for unbound methods"},
Neal Norwitzb1d3d962008-03-18 04:46:00 +00002269 {"__self__", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2270 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271 {NULL} /* Sentinel */
2272};
2273
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002274/* Christian Tismer argued convincingly that method attributes should
2275 (nearly) always override function attributes.
2276 The one exception is __doc__; there's a default __doc__ which
2277 should only be used for the class, not for instances */
2278
2279static PyObject *
2280instancemethod_get_doc(PyMethodObject *im, void *context)
2281{
2282 static PyObject *docstr;
2283 if (docstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002284 docstr= PyString_InternFromString("__doc__");
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002285 if (docstr == NULL)
2286 return NULL;
2287 }
2288 return PyObject_GetAttr(im->im_func, docstr);
2289}
2290
2291static PyGetSetDef instancemethod_getset[] = {
2292 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2293 {0}
2294};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002295
2296static PyObject *
2297instancemethod_getattro(PyObject *obj, PyObject *name)
2298{
2299 PyMethodObject *im = (PyMethodObject *)obj;
2300 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002301 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002302
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002303 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2304 if (tp->tp_dict == NULL) {
2305 if (PyType_Ready(tp) < 0)
2306 return NULL;
2307 }
2308 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002309 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002310
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002311 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002312 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2313 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002314 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002315 else {
2316 Py_INCREF(descr);
2317 return descr;
2318 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002319 }
2320
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002321 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002322}
2323
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002324PyDoc_STRVAR(instancemethod_doc,
2325"instancemethod(function, instance, class)\n\
2326\n\
2327Create an instance method object.");
2328
2329static PyObject *
2330instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2331{
2332 PyObject *func;
2333 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002334 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002335
Georg Brandl5d59c092006-09-30 08:43:30 +00002336 if (!_PyArg_NoKeywords("instancemethod", kw))
2337 return NULL;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002338 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002339 &func, &self, &classObj))
2340 return NULL;
2341 if (!PyCallable_Check(func)) {
2342 PyErr_SetString(PyExc_TypeError,
2343 "first argument must be callable");
2344 return NULL;
2345 }
2346 if (self == Py_None)
2347 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002348 if (self == NULL && classObj == NULL) {
2349 PyErr_SetString(PyExc_TypeError,
2350 "unbound methods must have non-NULL im_class");
2351 return NULL;
2352 }
2353
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002354 return PyMethod_New(func, self, classObj);
2355}
2356
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002357static void
Fred Drake79912472000-07-09 04:06:11 +00002358instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002359{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002360 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002361 if (im->im_weakreflist != NULL)
2362 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002363 Py_DECREF(im->im_func);
2364 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002365 Py_XDECREF(im->im_class);
Christian Heimes5b970ad2008-02-06 13:33:44 +00002366 if (numfree < PyMethod_MAXFREELIST) {
Christian Heimes6075a822008-02-06 12:44:34 +00002367 im->im_self = (PyObject *)free_list;
2368 free_list = im;
2369 numfree++;
2370 }
2371 else {
2372 PyObject_GC_Del(im);
2373 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002374}
2375
Guido van Rossumebc8c511992-09-03 20:39:51 +00002376static int
Fred Drake79912472000-07-09 04:06:11 +00002377instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002378{
Armin Rigofd01d792006-06-08 10:56:24 +00002379 int cmp;
2380 cmp = PyObject_Compare(a->im_func, b->im_func);
2381 if (cmp)
2382 return cmp;
2383
2384 if (a->im_self == b->im_self)
2385 return 0;
2386 if (a->im_self == NULL || b->im_self == NULL)
Guido van Rossume9df7271995-04-06 14:46:51 +00002387 return (a->im_self < b->im_self) ? -1 : 1;
Armin Rigofd01d792006-06-08 10:56:24 +00002388 else
2389 return PyObject_Compare(a->im_self, b->im_self);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002390}
2391
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002392static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002393instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002394{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002395 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002396 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002397 PyObject *klass = a->im_class;
2398 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2399 char *sfuncname = "?", *sklassname = "?";
2400
2401 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002402 if (funcname == NULL) {
2403 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2404 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002405 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002406 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002407 else if (!PyString_Check(funcname)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002408 Py_DECREF(funcname);
2409 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002410 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002411 else
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002412 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002413 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002414 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002415 else {
2416 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002417 if (klassname == NULL) {
2418 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2419 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002420 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002421 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002422 else if (!PyString_Check(klassname)) {
Guido van Rossum40667692001-08-17 13:59:27 +00002423 Py_DECREF(klassname);
2424 klassname = NULL;
2425 }
2426 else
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002427 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002428 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002429 if (self == NULL)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002430 result = PyString_FromFormat("<unbound method %s.%s>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002431 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002432 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002433 /* XXX Shouldn't use repr() here! */
2434 PyObject *selfrepr = PyObject_Repr(self);
2435 if (selfrepr == NULL)
2436 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002437 if (!PyString_Check(selfrepr)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002438 Py_DECREF(selfrepr);
2439 goto fail;
2440 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002441 result = PyString_FromFormat("<bound method %s.%s of %s>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002442 sklassname, sfuncname,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002443 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002444 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002445 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002446 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002447 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002448 Py_XDECREF(klassname);
2449 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002450}
2451
Guido van Rossum9bfef441993-03-29 10:43:31 +00002452static long
Fred Drake79912472000-07-09 04:06:11 +00002453instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002454{
2455 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002456 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002457 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002458 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002459 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002460 if (x == -1)
2461 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002462 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002463 if (y == -1)
2464 return -1;
Armin Rigofd01d792006-06-08 10:56:24 +00002465 x = x ^ y;
2466 if (x == -1)
2467 x = -2;
2468 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002469}
2470
Jeremy Hylton8caad492000-06-23 14:18:11 +00002471static int
2472instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2473{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002474 Py_VISIT(im->im_func);
2475 Py_VISIT(im->im_self);
2476 Py_VISIT(im->im_class);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002477 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002478}
2479
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002480static void
Anthony Baxter377be112006-04-11 06:54:30 +00002481getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002482{
2483 PyObject *name;
2484
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002485 assert(bufsize > 1);
2486 strcpy(buf, "?"); /* Default outcome */
Anthony Baxter377be112006-04-11 06:54:30 +00002487 if (klass == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002488 return;
Anthony Baxter377be112006-04-11 06:54:30 +00002489 name = PyObject_GetAttrString(klass, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002490 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002491 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002492 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002493 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002494 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002495 if (PyString_Check(name)) {
2496 strncpy(buf, PyString_AS_STRING(name), bufsize);
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002497 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002498 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002499 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002500}
2501
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002502static void
2503getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002504{
Anthony Baxter377be112006-04-11 06:54:30 +00002505 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002506
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002507 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002508 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002509 strcpy(buf, "nothing");
2510 return;
2511 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002512
Anthony Baxter377be112006-04-11 06:54:30 +00002513 klass = PyObject_GetAttrString(inst, "__class__");
2514 if (klass == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002515 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002516 PyErr_Clear();
Anthony Baxter377be112006-04-11 06:54:30 +00002517 klass = (PyObject *)(inst->ob_type);
2518 Py_INCREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002519 }
Anthony Baxter377be112006-04-11 06:54:30 +00002520 getclassname(klass, buf, bufsize);
2521 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002522}
2523
Tim Peters6d6c1a32001-08-02 04:15:00 +00002524static PyObject *
2525instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2526{
2527 PyObject *self = PyMethod_GET_SELF(func);
Anthony Baxter377be112006-04-11 06:54:30 +00002528 PyObject *klass = PyMethod_GET_CLASS(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002529 PyObject *result;
2530
2531 func = PyMethod_GET_FUNCTION(func);
2532 if (self == NULL) {
2533 /* Unbound methods must be called with an instance of
2534 the class (or a derived class) as first argument */
2535 int ok;
2536 if (PyTuple_Size(arg) >= 1)
2537 self = PyTuple_GET_ITEM(arg, 0);
2538 if (self == NULL)
2539 ok = 0;
2540 else {
Anthony Baxter377be112006-04-11 06:54:30 +00002541 ok = PyObject_IsInstance(self, klass);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002542 if (ok < 0)
2543 return NULL;
2544 }
2545 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002546 char clsbuf[256];
2547 char instbuf[256];
Anthony Baxter377be112006-04-11 06:54:30 +00002548 getclassname(klass, clsbuf, sizeof(clsbuf));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002549 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002550 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002551 "unbound method %s%s must be called with "
2552 "%s instance as first argument "
2553 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002554 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002555 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002556 clsbuf,
2557 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002558 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002559 return NULL;
2560 }
2561 Py_INCREF(arg);
2562 }
2563 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002564 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002565 PyObject *newarg = PyTuple_New(argcount + 1);
2566 int i;
2567 if (newarg == NULL)
2568 return NULL;
2569 Py_INCREF(self);
2570 PyTuple_SET_ITEM(newarg, 0, self);
2571 for (i = 0; i < argcount; i++) {
2572 PyObject *v = PyTuple_GET_ITEM(arg, i);
2573 Py_XINCREF(v);
2574 PyTuple_SET_ITEM(newarg, i+1, v);
2575 }
2576 arg = newarg;
2577 }
2578 result = PyObject_Call((PyObject *)func, arg, kw);
2579 Py_DECREF(arg);
2580 return result;
2581}
2582
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002583static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002584instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002585{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002586 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002587 of a class that's not a base class of cls. */
2588
2589 if (PyMethod_GET_SELF(meth) != NULL) {
2590 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002591 Py_INCREF(meth);
2592 return meth;
2593 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002594 /* No, it is an unbound method */
2595 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2596 /* Do subclass test. If it fails, return meth unchanged. */
2597 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2598 if (ok < 0)
2599 return NULL;
2600 if (!ok) {
2601 Py_INCREF(meth);
2602 return meth;
2603 }
2604 }
2605 /* Bind it to obj */
2606 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002607}
2608
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002609PyTypeObject PyMethod_Type = {
2610 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002611 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002612 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002613 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002614 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002615 (destructor)instancemethod_dealloc, /* tp_dealloc */
2616 0, /* tp_print */
2617 0, /* tp_getattr */
2618 0, /* tp_setattr */
2619 (cmpfunc)instancemethod_compare, /* tp_compare */
2620 (reprfunc)instancemethod_repr, /* tp_repr */
2621 0, /* tp_as_number */
2622 0, /* tp_as_sequence */
2623 0, /* tp_as_mapping */
2624 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002625 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002626 0, /* tp_str */
Georg Brandl347b3002006-03-30 11:57:00 +00002627 instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002628 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002629 0, /* tp_as_buffer */
Raymond Hettingerbff60ae2005-06-19 08:42:20 +00002630 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002631 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002632 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002633 0, /* tp_clear */
2634 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002635 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2636 0, /* tp_iter */
2637 0, /* tp_iternext */
2638 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002639 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002640 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002641 0, /* tp_base */
2642 0, /* tp_dict */
2643 instancemethod_descr_get, /* tp_descr_get */
2644 0, /* tp_descr_set */
2645 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002646 0, /* tp_init */
2647 0, /* tp_alloc */
2648 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002649};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002650
2651/* Clear out the free list */
2652
Christian Heimes3b718a72008-02-14 12:47:33 +00002653int
2654PyMethod_ClearFreeList(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002655{
Christian Heimes3b718a72008-02-14 12:47:33 +00002656 int freelist_size = numfree;
2657
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002658 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002659 PyMethodObject *im = free_list;
2660 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002661 PyObject_GC_Del(im);
Christian Heimes6075a822008-02-06 12:44:34 +00002662 numfree--;
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002663 }
Christian Heimes6075a822008-02-06 12:44:34 +00002664 assert(numfree == 0);
Christian Heimes3b718a72008-02-14 12:47:33 +00002665 return freelist_size;
2666}
2667
2668void
2669PyMethod_Fini(void)
2670{
2671 (void)PyMethod_ClearFreeList();
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002672}