blob: b79f06e9cbeac5311d56bda06b1a02174111791a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Class object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +00006
Guido van Rossum915f0eb2001-10-17 20:26:38 +00007#define TP_DESCR_GET(t) \
8 (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
9
Neil Schemenauer29bfc072001-01-04 01:43:46 +000010
Guido van Rossum52ca98a1994-09-05 07:32:29 +000011/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000012static PyObject *class_lookup(PyClassObject *, PyObject *,
13 PyClassObject **);
14static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
15static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000016
Guido van Rossuma63eff61998-05-29 21:37:21 +000017static PyObject *getattrstr, *setattrstr, *delattrstr;
18
Fred Drake79912472000-07-09 04:06:11 +000019
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
22 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000025 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000026 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000027 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000028 if (docstr == NULL)
29 return NULL;
30 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000031 if (modstr == NULL) {
32 modstr= PyString_InternFromString("__module__");
33 if (modstr == NULL)
34 return NULL;
35 }
36 if (namestr == NULL) {
37 namestr= PyString_InternFromString("__name__");
38 if (namestr == NULL)
39 return NULL;
40 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000041 if (name == NULL || !PyString_Check(name)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000042 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000043 "PyClass_New: name must be a string");
44 return NULL;
45 }
46 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000047 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000048 "PyClass_New: dict must be a dictionary");
49 return NULL;
50 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 if (PyDict_GetItem(dict, docstr) == NULL) {
52 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000053 return NULL;
54 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000055 if (PyDict_GetItem(dict, modstr) == NULL) {
56 PyObject *globals = PyEval_GetGlobals();
57 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000058 PyObject *modname = PyDict_GetItem(globals, namestr);
59 if (modname != NULL) {
60 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000061 return NULL;
62 }
63 }
64 }
Guido van Rossume2966a61991-12-10 13:53:23 +000065 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000067 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000068 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000069 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000070 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +000071 Py_ssize_t i, n;
Guido van Rossum28d80b12001-09-07 21:08:32 +000072 PyObject *base;
Guido van Rossum04d73c41997-10-07 14:54:11 +000073 if (!PyTuple_Check(bases)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000074 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000075 "PyClass_New: bases must be a tuple");
76 return NULL;
77 }
Guido van Rossum28d80b12001-09-07 21:08:32 +000078 n = PyTuple_Size(bases);
79 for (i = 0; i < n; i++) {
80 base = PyTuple_GET_ITEM(bases, i);
81 if (!PyClass_Check(base)) {
82 if (PyCallable_Check(
83 (PyObject *) base->ob_type))
Georg Brandl684fd0c2006-05-25 19:15:31 +000084 return PyObject_CallFunctionObjArgs(
Guido van Rossum28d80b12001-09-07 21:08:32 +000085 (PyObject *) base->ob_type,
Georg Brandl684fd0c2006-05-25 19:15:31 +000086 name, bases, dict, NULL);
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000088 "PyClass_New: base must be a class");
89 return NULL;
90 }
91 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000093 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000094 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000095 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000098 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000101 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000103 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000104 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000105 getattrstr = PyString_InternFromString("__getattr__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000106 if (getattrstr == NULL)
107 return NULL;
Guido van Rossuma412d241997-01-18 07:59:12 +0000108 setattrstr = PyString_InternFromString("__setattr__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000109 if (setattrstr == NULL)
110 return NULL;
Guido van Rossuma412d241997-01-18 07:59:12 +0000111 delattrstr = PyString_InternFromString("__delattr__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000112 if (delattrstr == NULL)
113 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000114 }
115 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
116 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
117 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 Py_XINCREF(op->cl_getattr);
119 Py_XINCREF(op->cl_setattr);
120 Py_XINCREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000121 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossumb479dc52001-09-05 22:52:50 +0000125PyObject *
126PyMethod_Function(PyObject *im)
127{
128 if (!PyMethod_Check(im)) {
129 PyErr_BadInternalCall();
130 return NULL;
131 }
132 return ((PyMethodObject *)im)->im_func;
133}
134
135PyObject *
136PyMethod_Self(PyObject *im)
137{
138 if (!PyMethod_Check(im)) {
139 PyErr_BadInternalCall();
140 return NULL;
141 }
142 return ((PyMethodObject *)im)->im_self;
143}
144
145PyObject *
146PyMethod_Class(PyObject *im)
147{
148 if (!PyMethod_Check(im)) {
149 PyErr_BadInternalCall();
150 return NULL;
151 }
152 return ((PyMethodObject *)im)->im_class;
153}
154
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155PyDoc_STRVAR(class_doc,
156"classobj(name, bases, dict)\n\
157\n\
158Create a class object. The name must be a string; the second argument\n\
159a tuple of classes, and the third a dictionary.");
160
161static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000162class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
163{
164 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000165 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166
167 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
168 &name, &bases, &dict))
169 return NULL;
170 return PyClass_New(bases, dict, name);
171}
172
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173/* Class methods */
174
175static void
Fred Drake79912472000-07-09 04:06:11 +0000176class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000178 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 Py_DECREF(op->cl_bases);
180 Py_DECREF(op->cl_dict);
181 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000182 Py_XDECREF(op->cl_getattr);
183 Py_XDECREF(op->cl_setattr);
184 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000185 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000189class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000190{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000191 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000193 if (value != NULL) {
194 *pclass = cp;
195 return value;
196 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000198 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000199 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 PyObject *v = class_lookup(
201 (PyClassObject *)
202 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000203 if (v != NULL)
204 return v;
205 }
206 return NULL;
207}
208
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000210class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 register PyObject *v;
213 register char *sname = PyString_AsString(name);
Anthony Baxter377be112006-04-11 06:54:30 +0000214 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000215 descrgetfunc f;
216
Guido van Rossum2878a691996-08-09 20:53:24 +0000217 if (sname[0] == '_' && sname[1] == '_') {
218 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 if (PyEval_GetRestricted()) {
220 PyErr_SetString(PyExc_RuntimeError,
221 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000222 return NULL;
223 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000225 return op->cl_dict;
226 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000227 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000229 return op->cl_bases;
230 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000231 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000232 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000234 else
235 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000237 return v;
238 }
Guido van Rossum94308391991-10-20 20:11:48 +0000239 }
Anthony Baxter377be112006-04-11 06:54:30 +0000240 v = class_lookup(op, name, &klass);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000241 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000242 PyErr_Format(PyExc_AttributeError,
243 "class %.50s has no attribute '%.400s'",
244 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000245 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000247 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000248 if (f == NULL)
249 Py_INCREF(v);
250 else
251 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000252 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253}
254
Guido van Rossuma63eff61998-05-29 21:37:21 +0000255static void
Fred Drake79912472000-07-09 04:06:11 +0000256set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000257{
258 PyObject *temp = *slot;
259 Py_XINCREF(v);
260 *slot = v;
261 Py_XDECREF(temp);
262}
263
Guido van Rossum7ba30431998-07-08 13:34:48 +0000264static void
Fred Drake79912472000-07-09 04:06:11 +0000265set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000266{
267 PyClassObject *dummy;
268
269 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
270 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
271 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
272}
273
Guido van Rossuma63eff61998-05-29 21:37:21 +0000274static char *
Fred Drake79912472000-07-09 04:06:11 +0000275set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000276{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000277 if (v == NULL || !PyDict_Check(v))
278 return "__dict__ must be a dictionary object";
279 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000280 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000281 return "";
282}
283
284static char *
Fred Drake79912472000-07-09 04:06:11 +0000285set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000286{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000288
289 if (v == NULL || !PyTuple_Check(v))
290 return "__bases__ must be a tuple object";
291 n = PyTuple_Size(v);
292 for (i = 0; i < n; i++) {
293 PyObject *x = PyTuple_GET_ITEM(v, i);
294 if (!PyClass_Check(x))
295 return "__bases__ items must be classes";
296 if (PyClass_IsSubclass(x, (PyObject *)c))
297 return "a __bases__ item causes an inheritance cycle";
298 }
299 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000300 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000301 return "";
302}
303
304static char *
Fred Drake79912472000-07-09 04:06:11 +0000305set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000306{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000307 if (v == NULL || !PyString_Check(v))
308 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000309 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000310 return "__name__ must not contain null bytes";
311 set_slot(&c->cl_name, v);
312 return "";
313}
314
Guido van Rossum94308391991-10-20 20:11:48 +0000315static int
Fred Drake79912472000-07-09 04:06:11 +0000316class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000317{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000318 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 if (PyEval_GetRestricted()) {
320 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000321 "classes are read-only in restricted mode");
322 return -1;
323 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000324 sname = PyString_AsString(name);
325 if (sname[0] == '_' && sname[1] == '_') {
Martin v. Löwis66851282006-04-22 11:40:03 +0000326 Py_ssize_t n = PyString_Size(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000327 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000328 char *err = NULL;
329 if (strcmp(sname, "__dict__") == 0)
330 err = set_dict(op, v);
331 else if (strcmp(sname, "__bases__") == 0)
332 err = set_bases(op, v);
333 else if (strcmp(sname, "__name__") == 0)
334 err = set_name(op, v);
335 else if (strcmp(sname, "__getattr__") == 0)
336 set_slot(&op->cl_getattr, v);
337 else if (strcmp(sname, "__setattr__") == 0)
338 set_slot(&op->cl_setattr, v);
339 else if (strcmp(sname, "__delattr__") == 0)
340 set_slot(&op->cl_delattr, v);
341 /* For the last three, we fall through to update the
342 dictionary as well. */
343 if (err != NULL) {
344 if (*err == '\0')
345 return 0;
346 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000347 return -1;
348 }
349 }
350 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000351 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000353 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000354 PyErr_Format(PyExc_AttributeError,
355 "class %.50s has no attribute '%.400s'",
356 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000357 return rv;
358 }
Guido van Rossum94308391991-10-20 20:11:48 +0000359 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000361}
362
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000364class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000365{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000366 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000367 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000369 name = "?";
370 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000372 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000373 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000374 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000375 return PyString_FromFormat("<class %s.%s at %p>",
376 PyString_AsString(mod),
377 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000378}
379
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000380static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000381class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000382{
383 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
384 PyObject *name = op->cl_name;
385 PyObject *res;
Martin v. Löwis66851282006-04-22 11:40:03 +0000386 Py_ssize_t m, n;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000387
388 if (name == NULL || !PyString_Check(name))
389 return class_repr(op);
390 if (mod == NULL || !PyString_Check(mod)) {
391 Py_INCREF(name);
392 return name;
393 }
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000394 m = PyString_GET_SIZE(mod);
395 n = PyString_GET_SIZE(name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000396 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
397 if (res != NULL) {
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000398 char *s = PyString_AS_STRING(res);
399 memcpy(s, PyString_AS_STRING(mod), m);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000400 s += m;
401 *s++ = '.';
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000402 memcpy(s, PyString_AS_STRING(name), n);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000403 }
404 return res;
405}
406
Jeremy Hylton8caad492000-06-23 14:18:11 +0000407static int
408class_traverse(PyClassObject *o, visitproc visit, void *arg)
409{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000410 Py_VISIT(o->cl_bases);
411 Py_VISIT(o->cl_dict);
412 Py_VISIT(o->cl_name);
413 Py_VISIT(o->cl_getattr);
414 Py_VISIT(o->cl_setattr);
415 Py_VISIT(o->cl_delattr);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000416 return 0;
417}
418
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419PyTypeObject PyClass_Type = {
420 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000422 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000423 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000425 (destructor)class_dealloc, /* tp_dealloc */
426 0, /* tp_print */
427 0, /* tp_getattr */
428 0, /* tp_setattr */
429 0, /* tp_compare */
430 (reprfunc)class_repr, /* tp_repr */
431 0, /* tp_as_number */
432 0, /* tp_as_sequence */
433 0, /* tp_as_mapping */
434 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000435 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000436 (reprfunc)class_str, /* tp_str */
437 (getattrofunc)class_getattr, /* tp_getattro */
438 (setattrofunc)class_setattr, /* tp_setattro */
439 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000440 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000441 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000442 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000443 0, /* tp_clear */
444 0, /* tp_richcompare */
445 0, /* tp_weaklistoffset */
446 0, /* tp_iter */
447 0, /* tp_iternext */
448 0, /* tp_methods */
449 0, /* tp_members */
450 0, /* tp_getset */
451 0, /* tp_base */
452 0, /* tp_dict */
453 0, /* tp_descr_get */
454 0, /* tp_descr_set */
455 0, /* tp_dictoffset */
456 0, /* tp_init */
457 0, /* tp_alloc */
458 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459};
460
Guido van Rossum81daa321993-05-20 14:24:46 +0000461int
Anthony Baxter377be112006-04-11 06:54:30 +0000462PyClass_IsSubclass(PyObject *klass, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000463{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000464 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 PyClassObject *cp;
Anthony Baxter377be112006-04-11 06:54:30 +0000466 if (klass == base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000467 return 1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000468 if (PyTuple_Check(base)) {
469 n = PyTuple_GET_SIZE(base);
470 for (i = 0; i < n; i++) {
Anthony Baxter377be112006-04-11 06:54:30 +0000471 if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000472 return 1;
473 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000474 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000475 }
Anthony Baxter377be112006-04-11 06:54:30 +0000476 if (klass == NULL || !PyClass_Check(klass))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000477 return 0;
Anthony Baxter377be112006-04-11 06:54:30 +0000478 cp = (PyClassObject *)klass;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000480 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000482 return 1;
483 }
484 return 0;
485}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486
Guido van Rossum81daa321993-05-20 14:24:46 +0000487
488/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000491PyInstance_NewRaw(PyObject *klass, PyObject *dict)
492{
493 PyInstanceObject *inst;
494
495 if (!PyClass_Check(klass)) {
496 PyErr_BadInternalCall();
497 return NULL;
498 }
499 if (dict == NULL) {
500 dict = PyDict_New();
501 if (dict == NULL)
502 return NULL;
503 }
504 else {
505 if (!PyDict_Check(dict)) {
506 PyErr_BadInternalCall();
507 return NULL;
508 }
509 Py_INCREF(dict);
510 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000511 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000512 if (inst == NULL) {
513 Py_DECREF(dict);
514 return NULL;
515 }
Fred Drake4e262a92001-03-22 18:26:47 +0000516 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000517 Py_INCREF(klass);
518 inst->in_class = (PyClassObject *)klass;
519 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000520 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000521 return (PyObject *)inst;
522}
523
524PyObject *
525PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 register PyInstanceObject *inst;
528 PyObject *init;
529 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000530
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000531 if (initstr == NULL) {
532 initstr = PyString_InternFromString("__init__");
533 if (initstr == NULL)
534 return NULL;
535 }
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000536 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000537 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538 return NULL;
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000539 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000540 if (init == NULL) {
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000541 if (PyErr_Occurred()) {
542 Py_DECREF(inst);
543 return NULL;
544 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 if ((arg != NULL && (!PyTuple_Check(arg) ||
546 PyTuple_Size(arg) != 0))
547 || (kw != NULL && (!PyDict_Check(kw) ||
548 PyDict_Size(kw) != 0))) {
549 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000550 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000552 inst = NULL;
553 }
554 }
555 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
557 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000558 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000560 inst = NULL;
561 }
562 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 if (res != Py_None) {
564 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000565 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000567 inst = NULL;
568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000570 }
571 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573}
574
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000575/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000576
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000577PyDoc_STRVAR(instance_doc,
578"instance(class[, dict])\n\
579\n\
580Create an instance without calling its __init__() method.\n\
581The class must be a classic class.\n\
582If present, dict must be a dictionary or None.");
583
584static PyObject *
585instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
586{
587 PyObject *klass;
588 PyObject *dict = Py_None;
589
590 if (!PyArg_ParseTuple(args, "O!|O:instance",
591 &PyClass_Type, &klass, &dict))
592 return NULL;
593
594 if (dict == Py_None)
595 dict = NULL;
596 else if (!PyDict_Check(dict)) {
597 PyErr_SetString(PyExc_TypeError,
598 "instance() second arg must be dictionary or None");
599 return NULL;
600 }
601 return PyInstance_NewRaw(klass, dict);
602}
603
604
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605static void
Fred Drake79912472000-07-09 04:06:11 +0000606instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000607{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 PyObject *error_type, *error_value, *error_traceback;
609 PyObject *del;
610 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000611
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000612 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000613 if (inst->in_weakreflist != NULL)
614 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000615
Tim Peters6b184912000-09-17 14:40:17 +0000616 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000617 assert(inst->ob_type == &PyInstance_Type);
618 assert(inst->ob_refcnt == 0);
619 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000620
621 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000623 /* Execute __del__ method, if any. */
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000624 if (delstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000625 delstr = PyString_InternFromString("__del__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000626 if (delstr == NULL)
Neal Norwitzaf33f2d2006-08-14 00:59:03 +0000627 PyErr_WriteUnraisable((PyObject*)inst);
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000628 }
Neal Norwitzaf33f2d2006-08-14 00:59:03 +0000629 if (delstr && (del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000631 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000632 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000633 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 Py_DECREF(res);
635 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000636 }
Tim Peters6b184912000-09-17 14:40:17 +0000637 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000639
Tim Peters6b184912000-09-17 14:40:17 +0000640 /* Undo the temporary resurrection; can't use DECREF here, it would
641 * cause a recursive call.
642 */
Tim Peters34592512002-07-11 06:23:50 +0000643 assert(inst->ob_refcnt > 0);
644 if (--inst->ob_refcnt == 0) {
645 Py_DECREF(inst->in_class);
646 Py_XDECREF(inst->in_dict);
647 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000648 }
Tim Peters34592512002-07-11 06:23:50 +0000649 else {
Martin v. Löwis66851282006-04-22 11:40:03 +0000650 Py_ssize_t refcnt = inst->ob_refcnt;
Tim Peters34592512002-07-11 06:23:50 +0000651 /* __del__ resurrected it! Make it look like the original
652 * Py_DECREF never happened.
653 */
654 _Py_NewReference((PyObject *)inst);
655 inst->ob_refcnt = refcnt;
656 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000657 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
658 * we need to undo that. */
659 _Py_DEC_REFTOTAL;
660 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
661 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000662 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000663 * _Py_NewReference bumped tp_allocs: both of those need to be
664 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000665 */
Tim Peters6b184912000-09-17 14:40:17 +0000666#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000667 --inst->ob_type->tp_frees;
668 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000669#endif
Tim Peters34592512002-07-11 06:23:50 +0000670 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000671}
672
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000674instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000675{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 register PyObject *v;
677 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000678 if (sname[0] == '_' && sname[1] == '_') {
679 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 if (PyEval_GetRestricted()) {
681 PyErr_SetString(PyExc_RuntimeError,
682 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000683 return NULL;
684 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000686 return inst->in_dict;
687 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000688 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 Py_INCREF(inst->in_class);
690 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000691 }
Guido van Rossum94308391991-10-20 20:11:48 +0000692 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000693 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000694 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000695 PyErr_Format(PyExc_AttributeError,
696 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000697 PyString_AS_STRING(inst->in_class->cl_name), sname);
698 }
699 return v;
700}
701
702static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000703instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000704{
705 register PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000706 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000707 descrgetfunc f;
708
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000710 if (v != NULL) {
711 Py_INCREF(v);
712 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000713 }
Anthony Baxter377be112006-04-11 06:54:30 +0000714 v = class_lookup(inst->in_class, name, &klass);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000715 if (v != NULL) {
716 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000717 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000718 if (f != NULL) {
719 PyObject *w = f(v, (PyObject *)inst,
720 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000722 v = w;
723 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000724 }
725 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726}
727
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000729instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000730{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000732 res = instance_getattr1(inst, name);
733 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000735 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
736 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000738 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000739 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000740 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 res = PyEval_CallObject(func, args);
742 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000743 }
744 return res;
745}
746
Tim Petersdf875b92003-04-07 17:51:59 +0000747/* See classobject.h comments: this only does dict lookups, and is always
748 * safe to call.
749 */
750PyObject *
751_PyInstance_Lookup(PyObject *pinst, PyObject *name)
752{
753 PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000754 PyClassObject *klass;
Tim Petersdf875b92003-04-07 17:51:59 +0000755 PyInstanceObject *inst; /* pinst cast to the right type */
756
757 assert(PyInstance_Check(pinst));
758 inst = (PyInstanceObject *)pinst;
759
760 assert(PyString_Check(name));
761
762 v = PyDict_GetItem(inst->in_dict, name);
763 if (v == NULL)
Anthony Baxter377be112006-04-11 06:54:30 +0000764 v = class_lookup(inst->in_class, name, &klass);
Tim Petersdf875b92003-04-07 17:51:59 +0000765 return v;
766}
767
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768static int
Fred Drake79912472000-07-09 04:06:11 +0000769instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000770{
Guido van Rossum94472a01992-09-04 09:45:18 +0000771 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000773 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000774 PyErr_Format(PyExc_AttributeError,
775 "%.50s instance has no attribute '%.400s'",
776 PyString_AS_STRING(inst->in_class->cl_name),
777 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000778 return rv;
779 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000780 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000782}
783
Guido van Rossume7737541994-09-05 07:31:41 +0000784static int
Fred Drake79912472000-07-09 04:06:11 +0000785instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000786{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000787 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000789 if (sname[0] == '_' && sname[1] == '_') {
Martin v. Löwis66851282006-04-22 11:40:03 +0000790 Py_ssize_t n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000791 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000792 if (strcmp(sname, "__dict__") == 0) {
793 if (PyEval_GetRestricted()) {
794 PyErr_SetString(PyExc_RuntimeError,
795 "__dict__ not accessible in restricted mode");
796 return -1;
797 }
798 if (v == NULL || !PyDict_Check(v)) {
799 PyErr_SetString(PyExc_TypeError,
800 "__dict__ must be set to a dictionary");
801 return -1;
802 }
803 tmp = inst->in_dict;
804 Py_INCREF(v);
805 inst->in_dict = v;
806 Py_DECREF(tmp);
807 return 0;
808 }
809 if (strcmp(sname, "__class__") == 0) {
810 if (PyEval_GetRestricted()) {
811 PyErr_SetString(PyExc_RuntimeError,
812 "__class__ not accessible in restricted mode");
813 return -1;
814 }
815 if (v == NULL || !PyClass_Check(v)) {
816 PyErr_SetString(PyExc_TypeError,
817 "__class__ must be set to a class");
818 return -1;
819 }
820 tmp = (PyObject *)(inst->in_class);
821 Py_INCREF(v);
822 inst->in_class = (PyClassObject *)v;
823 Py_DECREF(tmp);
824 return 0;
825 }
Guido van Rossume7737541994-09-05 07:31:41 +0000826 }
Guido van Rossume7737541994-09-05 07:31:41 +0000827 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000828 if (v == NULL)
829 func = inst->in_class->cl_delattr;
830 else
831 func = inst->in_class->cl_setattr;
832 if (func == NULL)
833 return instance_setattr1(inst, name, v);
834 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000835 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000836 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000837 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000838 if (args == NULL)
839 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 res = PyEval_CallObject(func, args);
841 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000842 if (res == NULL)
843 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000845 return 0;
846}
847
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000849instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000850{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 PyObject *func;
852 PyObject *res;
853 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000854
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000855 if (reprstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000856 reprstr = PyString_InternFromString("__repr__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000857 if (reprstr == NULL)
858 return NULL;
859 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000860 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000862 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000863 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000864 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
865 return NULL;
866 PyErr_Clear();
867 classname = inst->in_class->cl_name;
868 mod = PyDict_GetItemString(inst->in_class->cl_dict,
869 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 if (classname != NULL && PyString_Check(classname))
871 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000872 else
873 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000874 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000875 return PyString_FromFormat("<?.%s instance at %p>",
876 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000877 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000878 return PyString_FromFormat("<%s.%s instance at %p>",
879 PyString_AsString(mod),
880 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000881 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 res = PyEval_CallObject(func, (PyObject *)NULL);
883 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000884 return res;
885}
886
Guido van Rossum82c690f2001-04-30 14:39:18 +0000887static PyObject *
888instance_str(PyInstanceObject *inst)
889{
890 PyObject *func;
891 PyObject *res;
892 static PyObject *strstr;
893
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000894 if (strstr == NULL) {
Guido van Rossum82c690f2001-04-30 14:39:18 +0000895 strstr = PyString_InternFromString("__str__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000896 if (strstr == NULL)
897 return NULL;
898 }
Guido van Rossum82c690f2001-04-30 14:39:18 +0000899 func = instance_getattr(inst, strstr);
900 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000901 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
902 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000903 PyErr_Clear();
904 return instance_repr(inst);
905 }
906 res = PyEval_CallObject(func, (PyObject *)NULL);
907 Py_DECREF(func);
908 return res;
909}
910
Guido van Rossum9bfef441993-03-29 10:43:31 +0000911static long
Fred Drake79912472000-07-09 04:06:11 +0000912instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000913{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 PyObject *func;
915 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000916 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000917 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000918
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000919 if (hashstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000920 hashstr = PyString_InternFromString("__hash__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000921 if (hashstr == NULL)
922 return -1;
923 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000925 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000926 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
927 return -1;
928 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000929 /* If there is no __eq__ and no __cmp__ method, we hash on the
930 address. If an __eq__ or __cmp__ method exists, there must
931 be a __hash__. */
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000932 if (eqstr == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000933 eqstr = PyString_InternFromString("__eq__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000934 if (eqstr == NULL)
935 return -1;
936 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000937 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000938 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000939 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
940 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000942 if (cmpstr == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000943 cmpstr = PyString_InternFromString("__cmp__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000944 if (cmpstr == NULL)
945 return -1;
946 }
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000947 func = instance_getattr(inst, cmpstr);
948 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000949 if (!PyErr_ExceptionMatches(
950 PyExc_AttributeError))
951 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000952 PyErr_Clear();
953 return _Py_HashPointer(inst);
954 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000955 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000956 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000958 return -1;
959 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 res = PyEval_CallObject(func, (PyObject *)NULL);
961 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000962 if (res == NULL)
963 return -1;
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000964 if (PyInt_Check(res) || PyLong_Check(res))
965 /* This already converts a -1 result to -2. */
966 outcome = res->ob_type->tp_hash(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000967 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 PyErr_SetString(PyExc_TypeError,
969 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000970 outcome = -1;
971 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000973 return outcome;
974}
975
Jeremy Hylton8caad492000-06-23 14:18:11 +0000976static int
977instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
978{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000979 Py_VISIT(o->in_class);
980 Py_VISIT(o->in_dict);
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000981 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000982}
983
Guido van Rossum213c7a62001-04-23 14:08:49 +0000984static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
985static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000986
Martin v. Löwis18e16552006-02-15 17:27:45 +0000987static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +0000988instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000989{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 PyObject *func;
991 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000992 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000994 if (lenstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000995 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +0000996 if (lenstr == NULL)
997 return -1;
998 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000999 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 if (func == NULL)
1001 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 res = PyEval_CallObject(func, (PyObject *)NULL);
1003 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001004 if (res == NULL)
1005 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 if (PyInt_Check(res)) {
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001007 outcome = PyInt_AsSsize_t(res);
1008 if (outcome == -1 && PyErr_Occurred()) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001009 Py_DECREF(res);
1010 return -1;
1011 }
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001012#if SIZEOF_SIZE_T < SIZEOF_INT
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001013 /* Overflow check -- range of PyInt is more than C int */
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001014 if (outcome != (int)outcome) {
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001015 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +00001016 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001017 outcome = -1;
1018 }
1019 else
1020#endif
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001021 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 PyErr_SetString(PyExc_ValueError,
1023 "__len__() should return >= 0");
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001024 outcome = -1;
1025 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026 }
1027 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 PyErr_SetString(PyExc_TypeError,
1029 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030 outcome = -1;
1031 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001033 return outcome;
1034}
1035
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001037instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001038{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 PyObject *func;
1040 PyObject *arg;
1041 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001042
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001043 if (getitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001044 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001045 if (getitemstr == NULL)
1046 return NULL;
1047 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001048 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001049 if (func == NULL)
1050 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001051 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054 return NULL;
1055 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 res = PyEval_CallObject(func, arg);
1057 Py_DECREF(func);
1058 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 return res;
1060}
1061
Guido van Rossum9bfef441993-03-29 10:43:31 +00001062static int
Fred Drake79912472000-07-09 04:06:11 +00001063instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 PyObject *func;
1066 PyObject *arg;
1067 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068
Guido van Rossum2878a691996-08-09 20:53:24 +00001069 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001070 if (delitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001071 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001072 if (delitemstr == NULL)
1073 return -1;
1074 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001075 func = instance_getattr(inst, delitemstr);
1076 }
1077 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001078 if (setitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001079 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001080 if (setitemstr == NULL)
1081 return -1;
1082 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001083 func = instance_getattr(inst, setitemstr);
1084 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001085 if (func == NULL)
1086 return -1;
1087 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001088 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001090 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001091 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001093 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001094 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095 res = PyEval_CallObject(func, arg);
1096 Py_DECREF(func);
1097 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098 if (res == NULL)
1099 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001101 return 0;
1102}
1103
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001105 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001106 (binaryfunc)instance_subscript, /* mp_subscript */
1107 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108};
1109
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001111instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112{
Georg Brandle4e023c2006-05-26 20:22:50 +00001113 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001114
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001115 if (getitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001116 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001117 if (getitemstr == NULL)
1118 return NULL;
1119 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001120 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001121 if (func == NULL)
1122 return NULL;
Georg Brandle4e023c2006-05-26 20:22:50 +00001123 res = PyObject_CallFunction(func, "n", i);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125 return res;
1126}
1127
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001129instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001130{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 PyObject *func, *arg, *res;
1132 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001134 if (getslicestr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001135 getslicestr = PyString_InternFromString("__getslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001136 if (getslicestr == NULL)
1137 return NULL;
1138 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001139 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001140
1141 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001142 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1143 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001144 PyErr_Clear();
1145
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001146 if (getitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001147 getitemstr = PyString_InternFromString("__getitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001148 if (getitemstr == NULL)
1149 return NULL;
1150 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001151 func = instance_getattr(inst, getitemstr);
1152 if (func == NULL)
1153 return NULL;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001154 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
Tim Peters34592512002-07-11 06:23:50 +00001155 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001156 arg = Py_BuildValue("(nn)", i, j);
Tim Peters34592512002-07-11 06:23:50 +00001157
Guido van Rossum04691fc1992-08-12 15:35:34 +00001158 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001159 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001160 return NULL;
1161 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001162 res = PyEval_CallObject(func, arg);
1163 Py_DECREF(func);
1164 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001165 return res;
1166}
1167
1168static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001169instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001170{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001172
Guido van Rossum2878a691996-08-09 20:53:24 +00001173 if (item == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001174 if (delitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001175 delitemstr = PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001176 if (delitemstr == NULL)
1177 return -1;
1178 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001179 func = instance_getattr(inst, delitemstr);
1180 }
1181 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001182 if (setitemstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001183 setitemstr = PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001184 if (setitemstr == NULL)
1185 return -1;
1186 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001187 func = instance_getattr(inst, setitemstr);
1188 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001189 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001190 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001191 if (item == NULL)
Georg Brandl2cfaa342006-05-29 19:39:45 +00001192 arg = PyInt_FromSsize_t(i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001193 else
Georg Brandl2cfaa342006-05-29 19:39:45 +00001194 arg = Py_BuildValue("(nO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001195 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001197 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001198 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001199 res = PyEval_CallObject(func, arg);
1200 Py_DECREF(func);
1201 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001202 if (res == NULL)
1203 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001205 return 0;
1206}
1207
1208static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001209instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001210{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 PyObject *func, *arg, *res;
1212 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001213
Guido van Rossum2878a691996-08-09 20:53:24 +00001214 if (value == NULL) {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001215 if (delslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 delslicestr =
1217 PyString_InternFromString("__delslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001218 if (delslicestr == NULL)
1219 return -1;
1220 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001221 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001222 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001223 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1224 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001225 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001226 if (delitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001227 delitemstr =
1228 PyString_InternFromString("__delitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001229 if (delitemstr == NULL)
1230 return -1;
1231 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001232 func = instance_getattr(inst, delitemstr);
1233 if (func == NULL)
1234 return -1;
1235
1236 arg = Py_BuildValue("(N)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001237 _PySlice_FromIndices(i, j));
Thomas Wouters1d75a792000-08-17 22:37:32 +00001238 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001239 arg = Py_BuildValue("(nn)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001240 }
1241 else {
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001242 if (setslicestr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 setslicestr =
1244 PyString_InternFromString("__setslice__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001245 if (setslicestr == NULL)
1246 return -1;
1247 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001248 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001249 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001250 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1251 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001252 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001253 if (setitemstr == NULL) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001254 setitemstr =
1255 PyString_InternFromString("__setitem__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001256 if (setitemstr == NULL)
1257 return -1;
1258 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001259 func = instance_getattr(inst, setitemstr);
1260 if (func == NULL)
1261 return -1;
1262
1263 arg = Py_BuildValue("(NO)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001264 _PySlice_FromIndices(i, j), value);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001265 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001266 arg = Py_BuildValue("(nnO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001267 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001268 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001269 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001270 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001271 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272 res = PyEval_CallObject(func, arg);
1273 Py_DECREF(func);
1274 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001275 if (res == NULL)
1276 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001278 return 0;
1279}
1280
Tim Peterscb8d3682001-05-05 21:05:01 +00001281static int
1282instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001283{
1284 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001285 PyObject *func;
1286
1287 /* Try __contains__ first.
1288 * If that can't be done, try iterator-based searching.
1289 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001290
1291 if(__contains__ == NULL) {
1292 __contains__ = PyString_InternFromString("__contains__");
1293 if(__contains__ == NULL)
1294 return -1;
1295 }
1296 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001297 if (func) {
1298 PyObject *res;
1299 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001300 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001301 if(arg == NULL) {
1302 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001303 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001304 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001305 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001306 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001307 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001308 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001309 return -1;
1310 ret = PyObject_IsTrue(res);
1311 Py_DECREF(res);
1312 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001313 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001314
1315 /* Couldn't find __contains__. */
1316 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1317 /* Assume the failure was simply due to that there is no
1318 * __contains__ attribute, and try iterating instead.
1319 */
1320 PyErr_Clear();
Tim Peters16a77ad2001-09-08 04:00:12 +00001321 return _PySequence_IterSearch((PyObject *)inst, member,
Martin v. Löwis66851282006-04-22 11:40:03 +00001322 PY_ITERSEARCH_CONTAINS) > 0;
Tim Peterscb8d3682001-05-05 21:05:01 +00001323 }
1324 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001325 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001326}
1327
Fred Drake79912472000-07-09 04:06:11 +00001328static PySequenceMethods
1329instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001330 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001331 0, /* sq_concat */
1332 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001333 (ssizeargfunc)instance_item, /* sq_item */
1334 (ssizessizeargfunc)instance_slice, /* sq_slice */
1335 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1336 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001337 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001338};
1339
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001341generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001342{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001344
1345 if ((func = instance_getattr(self, methodname)) == NULL)
1346 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 res = PyEval_CallObject(func, (PyObject *)NULL);
1348 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001349 return res;
1350}
1351
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001352static PyObject *
1353generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001354{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001355 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001357 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001358 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001359 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001360 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001362 Py_INCREF(Py_NotImplemented);
1363 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001364 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001365 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001366 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001368 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001369 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001370 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 Py_DECREF(args);
1372 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001373 return result;
1374}
1375
1376
1377static PyObject *coerce_obj;
1378
1379/* Try one half of a binary operator involving a class instance. */
1380static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001381half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001382 int swapped)
1383{
1384 PyObject *args;
1385 PyObject *coercefunc;
1386 PyObject *coerced = NULL;
1387 PyObject *v1;
1388 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001389
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001390 if (!PyInstance_Check(v)) {
1391 Py_INCREF(Py_NotImplemented);
1392 return Py_NotImplemented;
1393 }
1394
1395 if (coerce_obj == NULL) {
1396 coerce_obj = PyString_InternFromString("__coerce__");
1397 if (coerce_obj == NULL)
1398 return NULL;
1399 }
1400 coercefunc = PyObject_GetAttr(v, coerce_obj);
1401 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001402 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1403 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001404 PyErr_Clear();
1405 return generic_binary_op(v, w, opname);
1406 }
1407
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001408 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001409 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001410 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001411 return NULL;
1412 }
1413 coerced = PyEval_CallObject(coercefunc, args);
1414 Py_DECREF(args);
1415 Py_DECREF(coercefunc);
1416 if (coerced == NULL) {
1417 return NULL;
1418 }
1419 if (coerced == Py_None || coerced == Py_NotImplemented) {
1420 Py_DECREF(coerced);
1421 return generic_binary_op(v, w, opname);
1422 }
1423 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1424 Py_DECREF(coerced);
1425 PyErr_SetString(PyExc_TypeError,
1426 "coercion should return None or 2-tuple");
1427 return NULL;
1428 }
1429 v1 = PyTuple_GetItem(coerced, 0);
1430 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001431 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001432 /* prevent recursion if __coerce__ returns self as the first
1433 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001434 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001435 } else {
Brett Cannonea3912b2006-06-13 21:46:41 +00001436 if (Py_EnterRecursiveCall(" after coercion"))
1437 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001438 if (swapped)
1439 result = (thisfunc)(w, v1);
1440 else
1441 result = (thisfunc)(v1, w);
Brett Cannonea3912b2006-06-13 21:46:41 +00001442 Py_LeaveRecursiveCall();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001443 }
1444 Py_DECREF(coerced);
1445 return result;
1446}
1447
1448/* Implement a binary operator involving at least one class instance. */
1449static PyObject *
1450do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1451 binaryfunc thisfunc)
1452{
1453 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1454 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001455 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001456 result = half_binop(w, v, ropname, thisfunc, 1);
1457 }
1458 return result;
1459}
1460
1461static PyObject *
1462do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1463 char *ropname, binaryfunc thisfunc)
1464{
1465 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1466 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001467 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001468 result = do_binop(v, w, opname, ropname, thisfunc);
1469 }
1470 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001471}
1472
Guido van Rossum879c5811995-01-10 15:24:06 +00001473static int
Fred Drake79912472000-07-09 04:06:11 +00001474instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001475{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 PyObject *v = *pv;
1477 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001478 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479 PyObject *args;
1480 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001481
Guido van Rossum2878a691996-08-09 20:53:24 +00001482 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001483 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001484 if (coerce_obj == NULL)
1485 return -1;
1486 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001487 coercefunc = PyObject_GetAttr(v, coerce_obj);
1488 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001489 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001490 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1491 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001493 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001494 }
1495 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001496 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001497 if (args == NULL) {
1498 return -1;
1499 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001500 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001502 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001503 if (coerced == NULL) {
1504 /* __coerce__ call raised an exception */
1505 return -1;
1506 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001507 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001508 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001510 return 1;
1511 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001513 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 Py_DECREF(coerced);
1515 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001516 "coercion should return None or 2-tuple");
1517 return -1;
1518 }
1519 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 *pv = PyTuple_GetItem(coerced, 0);
1521 *pw = PyTuple_GetItem(coerced, 1);
1522 Py_INCREF(*pv);
1523 Py_INCREF(*pw);
1524 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001525 return 0;
1526}
1527
Guido van Rossum04691fc1992-08-12 15:35:34 +00001528#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001529static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 static PyObject *o; \
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001531 if (o == NULL) { o = PyString_InternFromString(methodname); \
1532 if (o == NULL) return NULL; } \
Guido van Rossum2878a691996-08-09 20:53:24 +00001533 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001534}
1535
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001536#define BINARY(f, m, n) \
1537static PyObject *f(PyObject *v, PyObject *w) { \
1538 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1539}
1540
1541#define BINARY_INPLACE(f, m, n) \
1542static PyObject *f(PyObject *v, PyObject *w) { \
1543 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1544 "__r" m "__", n); \
1545}
1546
Guido van Rossum04691fc1992-08-12 15:35:34 +00001547UNARY(instance_neg, "__neg__")
1548UNARY(instance_pos, "__pos__")
1549UNARY(instance_abs, "__abs__")
1550
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001551BINARY(instance_or, "or", PyNumber_Or)
1552BINARY(instance_and, "and", PyNumber_And)
1553BINARY(instance_xor, "xor", PyNumber_Xor)
1554BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1555BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1556BINARY(instance_add, "add", PyNumber_Add)
1557BINARY(instance_sub, "sub", PyNumber_Subtract)
1558BINARY(instance_mul, "mul", PyNumber_Multiply)
1559BINARY(instance_div, "div", PyNumber_Divide)
1560BINARY(instance_mod, "mod", PyNumber_Remainder)
1561BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001562BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1563BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001564
1565BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1566BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1567BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1568BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1569BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1570BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1571BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1572BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1573BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1574BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001575BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1576BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001577
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001578/* Try a 3-way comparison, returning an int; v is an instance. Return:
1579 -2 for an exception;
1580 -1 if v < w;
1581 0 if v == w;
1582 1 if v > w;
1583 2 if this particular 3-way comparison is not implemented or undefined.
1584*/
1585static int
1586half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001587{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001588 static PyObject *cmp_obj;
1589 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001590 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001591 PyObject *result;
1592 long l;
1593
1594 assert(PyInstance_Check(v));
1595
1596 if (cmp_obj == NULL) {
1597 cmp_obj = PyString_InternFromString("__cmp__");
1598 if (cmp_obj == NULL)
1599 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001600 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001601
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001602 cmp_func = PyObject_GetAttr(v, cmp_obj);
1603 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001604 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1605 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001606 PyErr_Clear();
1607 return 2;
1608 }
1609
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001610 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001611 if (args == NULL) {
1612 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001613 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001614 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001615
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001616 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001617 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001618 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001619
1620 if (result == NULL)
1621 return -2;
1622
1623 if (result == Py_NotImplemented) {
1624 Py_DECREF(result);
1625 return 2;
1626 }
1627
1628 l = PyInt_AsLong(result);
1629 Py_DECREF(result);
1630 if (l == -1 && PyErr_Occurred()) {
1631 PyErr_SetString(PyExc_TypeError,
1632 "comparison did not return an int");
1633 return -2;
1634 }
1635
1636 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001637}
1638
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001639/* Try a 3-way comparison, returning an int; either v or w is an instance.
1640 We first try a coercion. Return:
1641 -2 for an exception;
1642 -1 if v < w;
1643 0 if v == w;
1644 1 if v > w;
1645 2 if this particular 3-way comparison is not implemented or undefined.
1646 THIS IS ONLY CALLED FROM object.c!
1647*/
1648static int
1649instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001650{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001651 int c;
1652
1653 c = PyNumber_CoerceEx(&v, &w);
1654 if (c < 0)
1655 return -2;
1656 if (c == 0) {
1657 /* If neither is now an instance, use regular comparison */
1658 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1659 c = PyObject_Compare(v, w);
1660 Py_DECREF(v);
1661 Py_DECREF(w);
1662 if (PyErr_Occurred())
1663 return -2;
1664 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001665 }
1666 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001667 else {
1668 /* The coercion didn't do anything.
1669 Treat this the same as returning v and w unchanged. */
1670 Py_INCREF(v);
1671 Py_INCREF(w);
1672 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001673
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001674 if (PyInstance_Check(v)) {
1675 c = half_cmp(v, w);
1676 if (c <= 1) {
1677 Py_DECREF(v);
1678 Py_DECREF(w);
1679 return c;
1680 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001681 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001682 if (PyInstance_Check(w)) {
1683 c = half_cmp(w, v);
1684 if (c <= 1) {
1685 Py_DECREF(v);
1686 Py_DECREF(w);
1687 if (c >= -1)
1688 c = -c;
1689 return c;
1690 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001691 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001692 Py_DECREF(v);
1693 Py_DECREF(w);
1694 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001695}
1696
Guido van Rossum9bfef441993-03-29 10:43:31 +00001697static int
Fred Drake79912472000-07-09 04:06:11 +00001698instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001699{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001701 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001703
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001704 if (nonzerostr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001705 nonzerostr = PyString_InternFromString("__nonzero__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001706 if (nonzerostr == NULL)
1707 return -1;
1708 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001709 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001710 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1711 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712 PyErr_Clear();
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001713 if (lenstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001714 lenstr = PyString_InternFromString("__len__");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001715 if (lenstr == NULL)
1716 return -1;
1717 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001718 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001719 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1720 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001722 /* Fall back to the default behavior:
1723 all instances are nonzero */
1724 return 1;
1725 }
1726 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727 res = PyEval_CallObject(func, (PyObject *)NULL);
1728 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001729 if (res == NULL)
1730 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001731 if (!PyInt_Check(res)) {
1732 Py_DECREF(res);
1733 PyErr_SetString(PyExc_TypeError,
1734 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001735 return -1;
1736 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001737 outcome = PyInt_AsLong(res);
1738 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001739 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001740 PyErr_SetString(PyExc_ValueError,
1741 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001742 return -1;
1743 }
1744 return outcome > 0;
1745}
1746
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001747static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001748instance_index(PyInstanceObject *self)
1749{
1750 PyObject *func, *res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001751 static PyObject *indexstr = NULL;
1752
1753 if (indexstr == NULL) {
1754 indexstr = PyString_InternFromString("__index__");
1755 if (indexstr == NULL)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001756 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001757 }
1758 if ((func = instance_getattr(self, indexstr)) == NULL) {
1759 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001760 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001761 PyErr_Clear();
1762 PyErr_SetString(PyExc_TypeError,
1763 "object cannot be interpreted as an index");
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001764 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001765 }
1766 res = PyEval_CallObject(func, (PyObject *)NULL);
1767 Py_DECREF(func);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001768 return res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001769}
1770
1771
Guido van Rossum04691fc1992-08-12 15:35:34 +00001772UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001773UNARY(instance_int, "__int__")
1774UNARY(instance_long, "__long__")
1775UNARY(instance_float, "__float__")
1776UNARY(instance_oct, "__oct__")
1777UNARY(instance_hex, "__hex__")
1778
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001779static PyObject *
1780bin_power(PyObject *v, PyObject *w)
1781{
1782 return PyNumber_Power(v, w, Py_None);
1783}
1784
Guido van Rossum03093a21994-09-28 15:51:32 +00001785/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001787instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001788{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001789 if (z == Py_None) {
1790 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001791 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001792 else {
1793 PyObject *func;
1794 PyObject *args;
1795 PyObject *result;
1796
1797 /* XXX Doesn't do coercions... */
1798 func = PyObject_GetAttrString(v, "__pow__");
1799 if (func == NULL)
1800 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001801 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001802 if (args == NULL) {
1803 Py_DECREF(func);
1804 return NULL;
1805 }
1806 result = PyEval_CallObject(func, args);
1807 Py_DECREF(func);
1808 Py_DECREF(args);
1809 return result;
1810 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001811}
1812
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001813static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001814bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001815{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001816 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001817}
1818
1819
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001820static PyObject *
1821instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1822{
1823 if (z == Py_None) {
1824 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1825 "__rpow__", bin_inplace_power);
1826 }
1827 else {
1828 /* XXX Doesn't do coercions... */
1829 PyObject *func;
1830 PyObject *args;
1831 PyObject *result;
1832
1833 func = PyObject_GetAttrString(v, "__ipow__");
1834 if (func == NULL) {
1835 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1836 return NULL;
1837 PyErr_Clear();
1838 return instance_pow(v, w, z);
1839 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001840 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001841 if (args == NULL) {
1842 Py_DECREF(func);
1843 return NULL;
1844 }
1845 result = PyEval_CallObject(func, args);
1846 Py_DECREF(func);
1847 Py_DECREF(args);
1848 return result;
1849 }
1850}
1851
1852
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001853/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001854#define NAME_OPS 6
1855static PyObject **name_op = NULL;
1856
Tim Peters34592512002-07-11 06:23:50 +00001857static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001858init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001859{
1860 int i;
1861 char *_name_op[] = {
1862 "__lt__",
1863 "__le__",
1864 "__eq__",
1865 "__ne__",
1866 "__gt__",
1867 "__ge__",
1868 };
1869
1870 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1871 if (name_op == NULL)
1872 return -1;
1873 for (i = 0; i < NAME_OPS; ++i) {
1874 name_op[i] = PyString_InternFromString(_name_op[i]);
1875 if (name_op[i] == NULL)
1876 return -1;
1877 }
1878 return 0;
1879}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001880
1881static PyObject *
1882half_richcompare(PyObject *v, PyObject *w, int op)
1883{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001884 PyObject *method;
1885 PyObject *args;
1886 PyObject *res;
1887
1888 assert(PyInstance_Check(v));
1889
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001890 if (name_op == NULL) {
1891 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001892 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001893 }
1894 /* If the instance doesn't define an __getattr__ method, use
1895 instance_getattr2 directly because it will not set an
1896 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001897 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001898 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001899 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001900 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001901 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001902 if (method == NULL) {
1903 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001904 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1905 return NULL;
1906 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001907 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001908 res = Py_NotImplemented;
1909 Py_INCREF(res);
1910 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001911 }
1912
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001913 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001914 if (args == NULL) {
1915 Py_DECREF(method);
1916 return NULL;
1917 }
1918
1919 res = PyEval_CallObject(method, args);
1920 Py_DECREF(args);
1921 Py_DECREF(method);
1922
1923 return res;
1924}
1925
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001926static PyObject *
1927instance_richcompare(PyObject *v, PyObject *w, int op)
1928{
1929 PyObject *res;
1930
1931 if (PyInstance_Check(v)) {
1932 res = half_richcompare(v, w, op);
1933 if (res != Py_NotImplemented)
1934 return res;
1935 Py_DECREF(res);
1936 }
1937
1938 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00001939 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001940 if (res != Py_NotImplemented)
1941 return res;
1942 Py_DECREF(res);
1943 }
1944
1945 Py_INCREF(Py_NotImplemented);
1946 return Py_NotImplemented;
1947}
1948
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001949
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001950/* Get the iterator */
1951static PyObject *
1952instance_getiter(PyInstanceObject *self)
1953{
1954 PyObject *func;
1955
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001956 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001957 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001958 if (iterstr == NULL)
1959 return NULL;
1960 }
1961 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001962 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001963 if (getitemstr == NULL)
1964 return NULL;
1965 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001966
1967 if ((func = instance_getattr(self, iterstr)) != NULL) {
1968 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1969 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001970 if (res != NULL && !PyIter_Check(res)) {
1971 PyErr_Format(PyExc_TypeError,
1972 "__iter__ returned non-iterator "
1973 "of type '%.100s'",
1974 res->ob_type->tp_name);
1975 Py_DECREF(res);
1976 res = NULL;
1977 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001978 return res;
1979 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001980 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1981 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001982 PyErr_Clear();
1983 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001984 PyErr_SetString(PyExc_TypeError,
1985 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001986 return NULL;
1987 }
1988 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001989 return PySeqIter_New((PyObject *)self);
1990}
1991
1992
1993/* Call the iterator's next */
1994static PyObject *
1995instance_iternext(PyInstanceObject *self)
1996{
1997 PyObject *func;
1998
Neal Norwitzb09f4f52006-08-13 18:10:28 +00001999 if (nextstr == NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002000 nextstr = PyString_InternFromString("next");
Neal Norwitzb09f4f52006-08-13 18:10:28 +00002001 if (nextstr == NULL)
2002 return NULL;
2003 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002004
2005 if ((func = instance_getattr(self, nextstr)) != NULL) {
2006 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2007 Py_DECREF(func);
2008 if (res != NULL) {
2009 return res;
2010 }
2011 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
2012 PyErr_Clear();
2013 return NULL;
2014 }
2015 return NULL;
2016 }
2017 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
2018 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002019}
2020
Tim Peters6d6c1a32001-08-02 04:15:00 +00002021static PyObject *
2022instance_call(PyObject *func, PyObject *arg, PyObject *kw)
2023{
2024 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2025 if (call == NULL) {
2026 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002027 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2028 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002029 PyErr_Clear();
2030 PyErr_Format(PyExc_AttributeError,
2031 "%.200s instance has no __call__ method",
2032 PyString_AsString(inst->in_class->cl_name));
2033 return NULL;
2034 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00002035 /* We must check and increment the recursion depth here. Scenario:
2036 class A:
2037 pass
2038 A.__call__ = A() # that's right
2039 a = A() # ok
2040 a() # infinite recursion
2041 This bounces between instance_call() and PyObject_Call() without
2042 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002043 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002044 res = NULL;
2045 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00002046 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002047 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00002048 Py_LeaveRecursiveCall();
2049 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002050 Py_DECREF(call);
2051 return res;
2052}
2053
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055static PyNumberMethods instance_as_number = {
Georg Brandl347b3002006-03-30 11:57:00 +00002056 instance_add, /* nb_add */
2057 instance_sub, /* nb_subtract */
2058 instance_mul, /* nb_multiply */
2059 instance_div, /* nb_divide */
2060 instance_mod, /* nb_remainder */
2061 instance_divmod, /* nb_divmod */
2062 instance_pow, /* nb_power */
2063 (unaryfunc)instance_neg, /* nb_negative */
2064 (unaryfunc)instance_pos, /* nb_positive */
2065 (unaryfunc)instance_abs, /* nb_absolute */
2066 (inquiry)instance_nonzero, /* nb_nonzero */
2067 (unaryfunc)instance_invert, /* nb_invert */
2068 instance_lshift, /* nb_lshift */
2069 instance_rshift, /* nb_rshift */
2070 instance_and, /* nb_and */
2071 instance_xor, /* nb_xor */
2072 instance_or, /* nb_or */
2073 instance_coerce, /* nb_coerce */
2074 (unaryfunc)instance_int, /* nb_int */
2075 (unaryfunc)instance_long, /* nb_long */
2076 (unaryfunc)instance_float, /* nb_float */
2077 (unaryfunc)instance_oct, /* nb_oct */
2078 (unaryfunc)instance_hex, /* nb_hex */
2079 instance_iadd, /* nb_inplace_add */
2080 instance_isub, /* nb_inplace_subtract */
2081 instance_imul, /* nb_inplace_multiply */
2082 instance_idiv, /* nb_inplace_divide */
2083 instance_imod, /* nb_inplace_remainder */
2084 instance_ipow, /* nb_inplace_power */
2085 instance_ilshift, /* nb_inplace_lshift */
2086 instance_irshift, /* nb_inplace_rshift */
2087 instance_iand, /* nb_inplace_and */
2088 instance_ixor, /* nb_inplace_xor */
2089 instance_ior, /* nb_inplace_or */
2090 instance_floordiv, /* nb_floor_divide */
2091 instance_truediv, /* nb_true_divide */
2092 instance_ifloordiv, /* nb_inplace_floor_divide */
2093 instance_itruediv, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00002094 (unaryfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002095};
2096
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097PyTypeObject PyInstance_Type = {
2098 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002099 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002100 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002101 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002102 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002103 (destructor)instance_dealloc, /* tp_dealloc */
2104 0, /* tp_print */
2105 0, /* tp_getattr */
2106 0, /* tp_setattr */
2107 instance_compare, /* tp_compare */
2108 (reprfunc)instance_repr, /* tp_repr */
2109 &instance_as_number, /* tp_as_number */
2110 &instance_as_sequence, /* tp_as_sequence */
2111 &instance_as_mapping, /* tp_as_mapping */
2112 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002113 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002114 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002115 (getattrofunc)instance_getattr, /* tp_getattro */
2116 (setattrofunc)instance_setattr, /* tp_setattro */
2117 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002118 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002119 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002120 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002121 0, /* tp_clear */
2122 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002123 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2124 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002125 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002126 0, /* tp_methods */
2127 0, /* tp_members */
2128 0, /* tp_getset */
2129 0, /* tp_base */
2130 0, /* tp_dict */
2131 0, /* tp_descr_get */
2132 0, /* tp_descr_set */
2133 0, /* tp_dictoffset */
2134 0, /* tp_init */
2135 0, /* tp_alloc */
2136 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002137};
2138
2139
Guido van Rossum81daa321993-05-20 14:24:46 +00002140/* Instance method objects are used for two purposes:
2141 (a) as bound instance methods (returned by instancename.methodname)
2142 (b) as unbound methods (returned by ClassName.methodname)
2143 In case (b), im_self is NULL
2144*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002145
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002146static PyMethodObject *free_list;
2147
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002148PyObject *
Anthony Baxter377be112006-04-11 06:54:30 +00002149PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002150{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002151 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002152 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002153 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002154 return NULL;
2155 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002156 im = free_list;
2157 if (im != NULL) {
2158 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002159 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002160 }
2161 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002162 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002163 if (im == NULL)
2164 return NULL;
2165 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002166 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002167 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002168 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002169 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002170 im->im_self = self;
Anthony Baxter377be112006-04-11 06:54:30 +00002171 Py_XINCREF(klass);
2172 im->im_class = klass;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002173 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002174 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002175}
2176
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002177/* Descriptors for PyMethod attributes */
2178
2179/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002180
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002181#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002182
Guido van Rossum6f799372001-09-20 20:46:19 +00002183static PyMemberDef instancemethod_memberlist[] = {
2184 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2185 "the class associated with a method"},
2186 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2187 "the function (or other callable) implementing a method"},
2188 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2189 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002190 {NULL} /* Sentinel */
2191};
2192
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002193/* Christian Tismer argued convincingly that method attributes should
2194 (nearly) always override function attributes.
2195 The one exception is __doc__; there's a default __doc__ which
2196 should only be used for the class, not for instances */
2197
2198static PyObject *
2199instancemethod_get_doc(PyMethodObject *im, void *context)
2200{
2201 static PyObject *docstr;
2202 if (docstr == NULL) {
2203 docstr= PyString_InternFromString("__doc__");
2204 if (docstr == NULL)
2205 return NULL;
2206 }
2207 return PyObject_GetAttr(im->im_func, docstr);
2208}
2209
2210static PyGetSetDef instancemethod_getset[] = {
2211 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2212 {0}
2213};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002214
2215static PyObject *
2216instancemethod_getattro(PyObject *obj, PyObject *name)
2217{
2218 PyMethodObject *im = (PyMethodObject *)obj;
2219 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002220 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002221
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002222 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2223 if (tp->tp_dict == NULL) {
2224 if (PyType_Ready(tp) < 0)
2225 return NULL;
2226 }
2227 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002228 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002229
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002230 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002231 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2232 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002233 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002234 else {
2235 Py_INCREF(descr);
2236 return descr;
2237 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002238 }
2239
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002240 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002241}
2242
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002243PyDoc_STRVAR(instancemethod_doc,
2244"instancemethod(function, instance, class)\n\
2245\n\
2246Create an instance method object.");
2247
2248static PyObject *
2249instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2250{
2251 PyObject *func;
2252 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002253 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002254
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002255 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002256 &func, &self, &classObj))
2257 return NULL;
2258 if (!PyCallable_Check(func)) {
2259 PyErr_SetString(PyExc_TypeError,
2260 "first argument must be callable");
2261 return NULL;
2262 }
2263 if (self == Py_None)
2264 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002265 if (self == NULL && classObj == NULL) {
2266 PyErr_SetString(PyExc_TypeError,
2267 "unbound methods must have non-NULL im_class");
2268 return NULL;
2269 }
2270
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002271 return PyMethod_New(func, self, classObj);
2272}
2273
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002274static void
Fred Drake79912472000-07-09 04:06:11 +00002275instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002276{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002277 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002278 if (im->im_weakreflist != NULL)
2279 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002280 Py_DECREF(im->im_func);
2281 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002282 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002283 im->im_self = (PyObject *)free_list;
2284 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002285}
2286
Guido van Rossumebc8c511992-09-03 20:39:51 +00002287static int
Fred Drake79912472000-07-09 04:06:11 +00002288instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002289{
Armin Rigofd01d792006-06-08 10:56:24 +00002290 int cmp;
2291 cmp = PyObject_Compare(a->im_func, b->im_func);
2292 if (cmp)
2293 return cmp;
2294
2295 if (a->im_self == b->im_self)
2296 return 0;
2297 if (a->im_self == NULL || b->im_self == NULL)
Guido van Rossume9df7271995-04-06 14:46:51 +00002298 return (a->im_self < b->im_self) ? -1 : 1;
Armin Rigofd01d792006-06-08 10:56:24 +00002299 else
2300 return PyObject_Compare(a->im_self, b->im_self);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002301}
2302
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002303static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002304instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002305{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002306 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002307 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002308 PyObject *klass = a->im_class;
2309 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2310 char *sfuncname = "?", *sklassname = "?";
2311
2312 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002313 if (funcname == NULL) {
2314 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2315 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002316 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002317 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002318 else if (!PyString_Check(funcname)) {
2319 Py_DECREF(funcname);
2320 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002321 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002322 else
2323 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002324 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002325 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002326 else {
2327 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002328 if (klassname == NULL) {
2329 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2330 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002331 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002332 }
Guido van Rossum40667692001-08-17 13:59:27 +00002333 else if (!PyString_Check(klassname)) {
2334 Py_DECREF(klassname);
2335 klassname = NULL;
2336 }
2337 else
2338 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002339 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002340 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002341 result = PyString_FromFormat("<unbound method %s.%s>",
2342 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002343 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002344 /* XXX Shouldn't use repr() here! */
2345 PyObject *selfrepr = PyObject_Repr(self);
2346 if (selfrepr == NULL)
2347 goto fail;
2348 if (!PyString_Check(selfrepr)) {
2349 Py_DECREF(selfrepr);
2350 goto fail;
2351 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002352 result = PyString_FromFormat("<bound method %s.%s of %s>",
2353 sklassname, sfuncname,
2354 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002355 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002356 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002357 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002358 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002359 Py_XDECREF(klassname);
2360 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002361}
2362
Guido van Rossum9bfef441993-03-29 10:43:31 +00002363static long
Fred Drake79912472000-07-09 04:06:11 +00002364instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002365{
2366 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002367 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002368 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002369 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002370 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002371 if (x == -1)
2372 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002373 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002374 if (y == -1)
2375 return -1;
Armin Rigofd01d792006-06-08 10:56:24 +00002376 x = x ^ y;
2377 if (x == -1)
2378 x = -2;
2379 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002380}
2381
Jeremy Hylton8caad492000-06-23 14:18:11 +00002382static int
2383instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2384{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002385 Py_VISIT(im->im_func);
2386 Py_VISIT(im->im_self);
2387 Py_VISIT(im->im_class);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002388 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002389}
2390
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002391static void
Anthony Baxter377be112006-04-11 06:54:30 +00002392getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002393{
2394 PyObject *name;
2395
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002396 assert(bufsize > 1);
2397 strcpy(buf, "?"); /* Default outcome */
Anthony Baxter377be112006-04-11 06:54:30 +00002398 if (klass == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002399 return;
Anthony Baxter377be112006-04-11 06:54:30 +00002400 name = PyObject_GetAttrString(klass, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002401 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002402 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002403 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002404 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002405 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002406 if (PyString_Check(name)) {
2407 strncpy(buf, PyString_AS_STRING(name), bufsize);
2408 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002409 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002410 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002411}
2412
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002413static void
2414getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002415{
Anthony Baxter377be112006-04-11 06:54:30 +00002416 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002417
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002418 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002419 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002420 strcpy(buf, "nothing");
2421 return;
2422 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002423
Anthony Baxter377be112006-04-11 06:54:30 +00002424 klass = PyObject_GetAttrString(inst, "__class__");
2425 if (klass == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002426 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002427 PyErr_Clear();
Anthony Baxter377be112006-04-11 06:54:30 +00002428 klass = (PyObject *)(inst->ob_type);
2429 Py_INCREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002430 }
Anthony Baxter377be112006-04-11 06:54:30 +00002431 getclassname(klass, buf, bufsize);
2432 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002433}
2434
Tim Peters6d6c1a32001-08-02 04:15:00 +00002435static PyObject *
2436instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2437{
2438 PyObject *self = PyMethod_GET_SELF(func);
Anthony Baxter377be112006-04-11 06:54:30 +00002439 PyObject *klass = PyMethod_GET_CLASS(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002440 PyObject *result;
2441
2442 func = PyMethod_GET_FUNCTION(func);
2443 if (self == NULL) {
2444 /* Unbound methods must be called with an instance of
2445 the class (or a derived class) as first argument */
2446 int ok;
2447 if (PyTuple_Size(arg) >= 1)
2448 self = PyTuple_GET_ITEM(arg, 0);
2449 if (self == NULL)
2450 ok = 0;
2451 else {
Anthony Baxter377be112006-04-11 06:54:30 +00002452 ok = PyObject_IsInstance(self, klass);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002453 if (ok < 0)
2454 return NULL;
2455 }
2456 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002457 char clsbuf[256];
2458 char instbuf[256];
Anthony Baxter377be112006-04-11 06:54:30 +00002459 getclassname(klass, clsbuf, sizeof(clsbuf));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002460 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002461 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002462 "unbound method %s%s must be called with "
2463 "%s instance as first argument "
2464 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002465 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002466 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002467 clsbuf,
2468 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002469 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002470 return NULL;
2471 }
2472 Py_INCREF(arg);
2473 }
2474 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002475 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002476 PyObject *newarg = PyTuple_New(argcount + 1);
2477 int i;
2478 if (newarg == NULL)
2479 return NULL;
2480 Py_INCREF(self);
2481 PyTuple_SET_ITEM(newarg, 0, self);
2482 for (i = 0; i < argcount; i++) {
2483 PyObject *v = PyTuple_GET_ITEM(arg, i);
2484 Py_XINCREF(v);
2485 PyTuple_SET_ITEM(newarg, i+1, v);
2486 }
2487 arg = newarg;
2488 }
2489 result = PyObject_Call((PyObject *)func, arg, kw);
2490 Py_DECREF(arg);
2491 return result;
2492}
2493
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002494static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002495instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002496{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002497 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002498 of a class that's not a base class of cls. */
2499
2500 if (PyMethod_GET_SELF(meth) != NULL) {
2501 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002502 Py_INCREF(meth);
2503 return meth;
2504 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002505 /* No, it is an unbound method */
2506 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2507 /* Do subclass test. If it fails, return meth unchanged. */
2508 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2509 if (ok < 0)
2510 return NULL;
2511 if (!ok) {
2512 Py_INCREF(meth);
2513 return meth;
2514 }
2515 }
2516 /* Bind it to obj */
2517 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002518}
2519
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002520PyTypeObject PyMethod_Type = {
2521 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002522 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002523 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002524 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002525 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002526 (destructor)instancemethod_dealloc, /* tp_dealloc */
2527 0, /* tp_print */
2528 0, /* tp_getattr */
2529 0, /* tp_setattr */
2530 (cmpfunc)instancemethod_compare, /* tp_compare */
2531 (reprfunc)instancemethod_repr, /* tp_repr */
2532 0, /* tp_as_number */
2533 0, /* tp_as_sequence */
2534 0, /* tp_as_mapping */
2535 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002536 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002537 0, /* tp_str */
Georg Brandl347b3002006-03-30 11:57:00 +00002538 instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002539 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002540 0, /* tp_as_buffer */
Raymond Hettingerbff60ae2005-06-19 08:42:20 +00002541 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002542 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002543 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002544 0, /* tp_clear */
2545 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002546 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2547 0, /* tp_iter */
2548 0, /* tp_iternext */
2549 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002550 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002551 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002552 0, /* tp_base */
2553 0, /* tp_dict */
2554 instancemethod_descr_get, /* tp_descr_get */
2555 0, /* tp_descr_set */
2556 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002557 0, /* tp_init */
2558 0, /* tp_alloc */
2559 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002560};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002561
2562/* Clear out the free list */
2563
2564void
Fred Drake79912472000-07-09 04:06:11 +00002565PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002566{
2567 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002568 PyMethodObject *im = free_list;
2569 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002570 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002571 }
2572}