blob: 8c338232e4877ecd83aac2842f9e4a43c3803b2e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Class object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +00006
Christian Heimes6075a822008-02-06 12:44:34 +00007/* Free list for method objects to safe malloc/free overhead
8 * The im_self element is used to chain the elements.
9 */
10static PyMethodObject *free_list;
11static int numfree = 0;
Christian Heimes5b970ad2008-02-06 13:33:44 +000012#ifndef PyMethod_MAXFREELIST
13#define PyMethod_MAXFREELIST 256
14#endif
Christian Heimes6075a822008-02-06 12:44:34 +000015
Guido van Rossum915f0eb2001-10-17 20:26:38 +000016#define TP_DESCR_GET(t) \
17 (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
18
Guido van Rossum52ca98a1994-09-05 07:32:29 +000019/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000020static PyObject *class_lookup(PyClassObject *, PyObject *,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000021 PyClassObject **);
Tim Petersdbd9ba62000-07-09 03:09:57 +000022static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
23static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000024
Guido van Rossuma63eff61998-05-29 21:37:21 +000025static PyObject *getattrstr, *setattrstr, *delattrstr;
26
Fred Drake79912472000-07-09 04:06:11 +000027
Guido van Rossumc0b618a1997-05-02 03:12:38 +000028PyObject *
Fred Drake79912472000-07-09 04:06:11 +000029PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
30 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000032 PyClassObject *op, *dummy;
33 static PyObject *docstr, *modstr, *namestr;
34 if (docstr == NULL) {
35 docstr= PyString_InternFromString("__doc__");
36 if (docstr == NULL)
37 return NULL;
38 }
39 if (modstr == NULL) {
40 modstr= PyString_InternFromString("__module__");
41 if (modstr == NULL)
42 return NULL;
43 }
44 if (namestr == NULL) {
45 namestr= PyString_InternFromString("__name__");
46 if (namestr == NULL)
47 return NULL;
48 }
49 if (name == NULL || !PyString_Check(name)) {
50 PyErr_SetString(PyExc_TypeError,
51 "PyClass_New: name must be a string");
52 return NULL;
53 }
54 if (dict == NULL || !PyDict_Check(dict)) {
55 PyErr_SetString(PyExc_TypeError,
56 "PyClass_New: dict must be a dictionary");
57 return NULL;
58 }
59 if (PyDict_GetItem(dict, docstr) == NULL) {
60 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
61 return NULL;
62 }
63 if (PyDict_GetItem(dict, modstr) == NULL) {
64 PyObject *globals = PyEval_GetGlobals();
65 if (globals != NULL) {
66 PyObject *modname = PyDict_GetItem(globals, namestr);
67 if (modname != NULL) {
68 if (PyDict_SetItem(dict, modstr, modname) < 0)
69 return NULL;
70 }
71 }
72 }
73 if (bases == NULL) {
74 bases = PyTuple_New(0);
75 if (bases == NULL)
76 return NULL;
77 }
78 else {
79 Py_ssize_t i, n;
80 PyObject *base;
81 if (!PyTuple_Check(bases)) {
82 PyErr_SetString(PyExc_TypeError,
83 "PyClass_New: bases must be a tuple");
84 return NULL;
85 }
86 n = PyTuple_Size(bases);
87 for (i = 0; i < n; i++) {
88 base = PyTuple_GET_ITEM(bases, i);
89 if (!PyClass_Check(base)) {
90 if (PyCallable_Check(
91 (PyObject *) base->ob_type))
92 return PyObject_CallFunctionObjArgs(
93 (PyObject *) base->ob_type,
94 name, bases, dict, NULL);
95 PyErr_SetString(PyExc_TypeError,
96 "PyClass_New: base must be a class");
97 return NULL;
98 }
99 }
100 Py_INCREF(bases);
101 }
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000102
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000103 if (getattrstr == NULL) {
104 getattrstr = PyString_InternFromString("__getattr__");
105 if (getattrstr == NULL)
106 goto alloc_error;
107 setattrstr = PyString_InternFromString("__setattr__");
108 if (setattrstr == NULL)
109 goto alloc_error;
110 delattrstr = PyString_InternFromString("__delattr__");
111 if (delattrstr == NULL)
112 goto alloc_error;
113 }
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000114
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000115 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
116 if (op == NULL) {
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000117alloc_error:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000118 Py_DECREF(bases);
119 return NULL;
120 }
121 op->cl_bases = bases;
122 Py_INCREF(dict);
123 op->cl_dict = dict;
124 Py_XINCREF(name);
125 op->cl_name = name;
Neal Norwitz6cbb7262006-08-19 04:22:33 +0000126
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000127 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
128 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
129 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
130 Py_XINCREF(op->cl_getattr);
131 Py_XINCREF(op->cl_setattr);
132 Py_XINCREF(op->cl_delattr);
133 _PyObject_GC_TRACK(op);
134 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
136
Guido van Rossumb479dc52001-09-05 22:52:50 +0000137PyObject *
138PyMethod_Function(PyObject *im)
139{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000140 if (!PyMethod_Check(im)) {
141 PyErr_BadInternalCall();
142 return NULL;
143 }
144 return ((PyMethodObject *)im)->im_func;
Guido van Rossumb479dc52001-09-05 22:52:50 +0000145}
146
147PyObject *
148PyMethod_Self(PyObject *im)
149{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000150 if (!PyMethod_Check(im)) {
151 PyErr_BadInternalCall();
152 return NULL;
153 }
154 return ((PyMethodObject *)im)->im_self;
Guido van Rossumb479dc52001-09-05 22:52:50 +0000155}
156
157PyObject *
158PyMethod_Class(PyObject *im)
159{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000160 if (!PyMethod_Check(im)) {
161 PyErr_BadInternalCall();
162 return NULL;
163 }
164 return ((PyMethodObject *)im)->im_class;
Guido van Rossumb479dc52001-09-05 22:52:50 +0000165}
166
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000167PyDoc_STRVAR(class_doc,
168"classobj(name, bases, dict)\n\
169\n\
170Create a class object. The name must be a string; the second argument\n\
171a tuple of classes, and the third a dictionary.");
172
173static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
175{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000176 PyObject *name, *bases, *dict;
177 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000179 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
180 &name, &bases, &dict))
181 return NULL;
182 return PyClass_New(bases, dict, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000183}
184
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185/* Class methods */
186
187static void
Fred Drake79912472000-07-09 04:06:11 +0000188class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000190 _PyObject_GC_UNTRACK(op);
191 Py_DECREF(op->cl_bases);
192 Py_DECREF(op->cl_dict);
193 Py_XDECREF(op->cl_name);
194 Py_XDECREF(op->cl_getattr);
195 Py_XDECREF(op->cl_setattr);
196 Py_XDECREF(op->cl_delattr);
197 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198}
199
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000201class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000202{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000203 Py_ssize_t i, n;
204 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
205 if (value != NULL) {
206 *pclass = cp;
207 return value;
208 }
209 n = PyTuple_Size(cp->cl_bases);
210 for (i = 0; i < n; i++) {
211 /* XXX What if one of the bases is not a class? */
212 PyObject *v = class_lookup(
213 (PyClassObject *)
214 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
215 if (v != NULL)
216 return v;
217 }
218 return NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000219}
220
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000222class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000224 register PyObject *v;
225 register char *sname = PyString_AsString(name);
226 PyClassObject *klass;
227 descrgetfunc f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000228
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000229 if (sname[0] == '_' && sname[1] == '_') {
230 if (strcmp(sname, "__dict__") == 0) {
231 if (PyEval_GetRestricted()) {
232 PyErr_SetString(PyExc_RuntimeError,
233 "class.__dict__ not accessible in restricted mode");
234 return NULL;
235 }
236 Py_INCREF(op->cl_dict);
237 return op->cl_dict;
238 }
239 if (strcmp(sname, "__bases__") == 0) {
240 Py_INCREF(op->cl_bases);
241 return op->cl_bases;
242 }
243 if (strcmp(sname, "__name__") == 0) {
244 if (op->cl_name == NULL)
245 v = Py_None;
246 else
247 v = op->cl_name;
248 Py_INCREF(v);
249 return v;
250 }
251 }
252 v = class_lookup(op, name, &klass);
253 if (v == NULL) {
254 PyErr_Format(PyExc_AttributeError,
255 "class %.50s has no attribute '%.400s'",
256 PyString_AS_STRING(op->cl_name), sname);
257 return NULL;
258 }
259 f = TP_DESCR_GET(v->ob_type);
260 if (f == NULL)
261 Py_INCREF(v);
262 else
263 v = f(v, (PyObject *)NULL, (PyObject *)op);
264 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265}
266
Guido van Rossuma63eff61998-05-29 21:37:21 +0000267static void
Fred Drake79912472000-07-09 04:06:11 +0000268set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000269{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000270 PyObject *temp = *slot;
271 Py_XINCREF(v);
272 *slot = v;
273 Py_XDECREF(temp);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000274}
275
Guido van Rossum7ba30431998-07-08 13:34:48 +0000276static void
Fred Drake79912472000-07-09 04:06:11 +0000277set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000278{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000279 PyClassObject *dummy;
Guido van Rossum7ba30431998-07-08 13:34:48 +0000280
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000281 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
282 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
283 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
Guido van Rossum7ba30431998-07-08 13:34:48 +0000284}
285
Guido van Rossuma63eff61998-05-29 21:37:21 +0000286static char *
Fred Drake79912472000-07-09 04:06:11 +0000287set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000288{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000289 if (v == NULL || !PyDict_Check(v))
290 return "__dict__ must be a dictionary object";
291 set_slot(&c->cl_dict, v);
292 set_attr_slots(c);
293 return "";
Guido van Rossuma63eff61998-05-29 21:37:21 +0000294}
295
296static char *
Fred Drake79912472000-07-09 04:06:11 +0000297set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000298{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000299 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000300
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000301 if (v == NULL || !PyTuple_Check(v))
302 return "__bases__ must be a tuple object";
303 n = PyTuple_Size(v);
304 for (i = 0; i < n; i++) {
305 PyObject *x = PyTuple_GET_ITEM(v, i);
306 if (!PyClass_Check(x))
307 return "__bases__ items must be classes";
308 if (PyClass_IsSubclass(x, (PyObject *)c))
309 return "a __bases__ item causes an inheritance cycle";
310 }
311 set_slot(&c->cl_bases, v);
312 set_attr_slots(c);
313 return "";
Guido van Rossuma63eff61998-05-29 21:37:21 +0000314}
315
316static char *
Fred Drake79912472000-07-09 04:06:11 +0000317set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000318{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000319 if (v == NULL || !PyString_Check(v))
320 return "__name__ must be a string object";
321 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
322 return "__name__ must not contain null bytes";
323 set_slot(&c->cl_name, v);
324 return "";
Guido van Rossuma63eff61998-05-29 21:37:21 +0000325}
326
Guido van Rossum94308391991-10-20 20:11:48 +0000327static int
Fred Drake79912472000-07-09 04:06:11 +0000328class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000329{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000330 char *sname;
331 if (PyEval_GetRestricted()) {
332 PyErr_SetString(PyExc_RuntimeError,
333 "classes are read-only in restricted mode");
334 return -1;
335 }
336 sname = PyString_AsString(name);
337 if (sname[0] == '_' && sname[1] == '_') {
338 Py_ssize_t n = PyString_Size(name);
339 if (sname[n-1] == '_' && sname[n-2] == '_') {
340 char *err = NULL;
341 if (strcmp(sname, "__dict__") == 0)
342 err = set_dict(op, v);
343 else if (strcmp(sname, "__bases__") == 0)
344 err = set_bases(op, v);
345 else if (strcmp(sname, "__name__") == 0)
346 err = set_name(op, v);
347 else if (strcmp(sname, "__getattr__") == 0)
348 set_slot(&op->cl_getattr, v);
349 else if (strcmp(sname, "__setattr__") == 0)
350 set_slot(&op->cl_setattr, v);
351 else if (strcmp(sname, "__delattr__") == 0)
352 set_slot(&op->cl_delattr, v);
353 /* For the last three, we fall through to update the
354 dictionary as well. */
355 if (err != NULL) {
356 if (*err == '\0')
357 return 0;
358 PyErr_SetString(PyExc_TypeError, err);
359 return -1;
360 }
361 }
362 }
363 if (v == NULL) {
364 int rv = PyDict_DelItem(op->cl_dict, name);
365 if (rv < 0)
366 PyErr_Format(PyExc_AttributeError,
367 "class %.50s has no attribute '%.400s'",
368 PyString_AS_STRING(op->cl_name), sname);
369 return rv;
370 }
371 else
372 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000376class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000377{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000378 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
379 char *name;
380 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
381 name = "?";
382 else
383 name = PyString_AsString(op->cl_name);
384 if (mod == NULL || !PyString_Check(mod))
385 return PyString_FromFormat("<class ?.%s at %p>", name, op);
386 else
387 return PyString_FromFormat("<class %s.%s at %p>",
388 PyString_AsString(mod),
389 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000390}
391
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000392static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000393class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000394{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000395 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
396 PyObject *name = op->cl_name;
397 PyObject *res;
398 Py_ssize_t m, n;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000399
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000400 if (name == NULL || !PyString_Check(name))
401 return class_repr(op);
402 if (mod == NULL || !PyString_Check(mod)) {
403 Py_INCREF(name);
404 return name;
405 }
406 m = PyString_GET_SIZE(mod);
407 n = PyString_GET_SIZE(name);
408 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
409 if (res != NULL) {
410 char *s = PyString_AS_STRING(res);
411 memcpy(s, PyString_AS_STRING(mod), m);
412 s += m;
413 *s++ = '.';
414 memcpy(s, PyString_AS_STRING(name), n);
415 }
416 return res;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000417}
418
Jeremy Hylton8caad492000-06-23 14:18:11 +0000419static int
420class_traverse(PyClassObject *o, visitproc visit, void *arg)
421{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000422 Py_VISIT(o->cl_bases);
423 Py_VISIT(o->cl_dict);
424 Py_VISIT(o->cl_name);
425 Py_VISIT(o->cl_getattr);
426 Py_VISIT(o->cl_setattr);
427 Py_VISIT(o->cl_delattr);
428 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000429}
430
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431PyTypeObject PyClass_Type = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000432 PyObject_HEAD_INIT(&PyType_Type)
433 0,
434 "classobj",
435 sizeof(PyClassObject),
436 0,
437 (destructor)class_dealloc, /* tp_dealloc */
438 0, /* tp_print */
439 0, /* tp_getattr */
440 0, /* tp_setattr */
441 0, /* tp_compare */
442 (reprfunc)class_repr, /* tp_repr */
443 0, /* tp_as_number */
444 0, /* tp_as_sequence */
445 0, /* tp_as_mapping */
446 0, /* tp_hash */
447 PyInstance_New, /* tp_call */
448 (reprfunc)class_str, /* tp_str */
449 (getattrofunc)class_getattr, /* tp_getattro */
450 (setattrofunc)class_setattr, /* tp_setattro */
451 0, /* tp_as_buffer */
452 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
453 class_doc, /* tp_doc */
454 (traverseproc)class_traverse, /* tp_traverse */
455 0, /* tp_clear */
456 0, /* tp_richcompare */
457 0, /* tp_weaklistoffset */
458 0, /* tp_iter */
459 0, /* tp_iternext */
460 0, /* tp_methods */
461 0, /* tp_members */
462 0, /* tp_getset */
463 0, /* tp_base */
464 0, /* tp_dict */
465 0, /* tp_descr_get */
466 0, /* tp_descr_set */
467 0, /* tp_dictoffset */
468 0, /* tp_init */
469 0, /* tp_alloc */
470 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471};
472
Guido van Rossum81daa321993-05-20 14:24:46 +0000473int
Anthony Baxter377be112006-04-11 06:54:30 +0000474PyClass_IsSubclass(PyObject *klass, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000475{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000476 Py_ssize_t i, n;
477 PyClassObject *cp;
478 if (klass == base)
479 return 1;
480 if (PyTuple_Check(base)) {
481 n = PyTuple_GET_SIZE(base);
482 for (i = 0; i < n; i++) {
483 if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
484 return 1;
485 }
486 return 0;
487 }
488 if (klass == NULL || !PyClass_Check(klass))
489 return 0;
490 cp = (PyClassObject *)klass;
491 n = PyTuple_Size(cp->cl_bases);
492 for (i = 0; i < n; i++) {
493 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
494 return 1;
495 }
496 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000497}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498
Guido van Rossum81daa321993-05-20 14:24:46 +0000499
500/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000503PyInstance_NewRaw(PyObject *klass, PyObject *dict)
504{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000505 PyInstanceObject *inst;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000506
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000507 if (!PyClass_Check(klass)) {
508 PyErr_BadInternalCall();
509 return NULL;
510 }
511 if (dict == NULL) {
512 dict = PyDict_New();
513 if (dict == NULL)
514 return NULL;
515 }
516 else {
517 if (!PyDict_Check(dict)) {
518 PyErr_BadInternalCall();
519 return NULL;
520 }
521 Py_INCREF(dict);
522 }
523 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
524 if (inst == NULL) {
525 Py_DECREF(dict);
526 return NULL;
527 }
528 inst->in_weakreflist = NULL;
529 Py_INCREF(klass);
530 inst->in_class = (PyClassObject *)klass;
531 inst->in_dict = dict;
532 _PyObject_GC_TRACK(inst);
533 return (PyObject *)inst;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000534}
535
536PyObject *
537PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000539 register PyInstanceObject *inst;
540 PyObject *init;
541 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000542
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000543 if (initstr == NULL) {
544 initstr = PyString_InternFromString("__init__");
545 if (initstr == NULL)
546 return NULL;
547 }
548 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
549 if (inst == NULL)
550 return NULL;
551 init = instance_getattr2(inst, initstr);
552 if (init == NULL) {
553 if (PyErr_Occurred()) {
554 Py_DECREF(inst);
555 return NULL;
556 }
557 if ((arg != NULL && (!PyTuple_Check(arg) ||
558 PyTuple_Size(arg) != 0))
559 || (kw != NULL && (!PyDict_Check(kw) ||
560 PyDict_Size(kw) != 0))) {
561 PyErr_SetString(PyExc_TypeError,
562 "this constructor takes no arguments");
563 Py_DECREF(inst);
564 inst = NULL;
565 }
566 }
567 else {
568 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
569 Py_DECREF(init);
570 if (res == NULL) {
571 Py_DECREF(inst);
572 inst = NULL;
573 }
574 else {
575 if (res != Py_None) {
576 PyErr_SetString(PyExc_TypeError,
577 "__init__() should return None");
578 Py_DECREF(inst);
579 inst = NULL;
580 }
581 Py_DECREF(res);
582 }
583 }
584 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585}
586
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000587/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000588
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000589PyDoc_STRVAR(instance_doc,
590"instance(class[, dict])\n\
591\n\
592Create an instance without calling its __init__() method.\n\
593The class must be a classic class.\n\
594If present, dict must be a dictionary or None.");
595
596static PyObject *
597instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
598{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000599 PyObject *klass;
600 PyObject *dict = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000601
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000602 if (!PyArg_ParseTuple(args, "O!|O:instance",
603 &PyClass_Type, &klass, &dict))
604 return NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000605
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000606 if (dict == Py_None)
607 dict = NULL;
608 else if (!PyDict_Check(dict)) {
609 PyErr_SetString(PyExc_TypeError,
610 "instance() second arg must be dictionary or None");
611 return NULL;
612 }
613 return PyInstance_NewRaw(klass, dict);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000614}
615
616
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000617static void
Fred Drake79912472000-07-09 04:06:11 +0000618instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000620 PyObject *error_type, *error_value, *error_traceback;
621 PyObject *del;
622 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000623
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000624 _PyObject_GC_UNTRACK(inst);
625 if (inst->in_weakreflist != NULL)
626 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000627
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000628 /* Temporarily resurrect the object. */
629 assert(inst->ob_type == &PyInstance_Type);
630 assert(inst->ob_refcnt == 0);
631 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000632
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000633 /* Save the current exception, if any. */
634 PyErr_Fetch(&error_type, &error_value, &error_traceback);
635 /* Execute __del__ method, if any. */
636 if (delstr == NULL) {
637 delstr = PyString_InternFromString("__del__");
638 if (delstr == NULL)
639 PyErr_WriteUnraisable((PyObject*)inst);
640 }
641 if (delstr && (del = instance_getattr2(inst, delstr)) != NULL) {
642 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
643 if (res == NULL)
644 PyErr_WriteUnraisable(del);
645 else
646 Py_DECREF(res);
647 Py_DECREF(del);
648 }
649 /* Restore the saved exception. */
650 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000651
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000652 /* Undo the temporary resurrection; can't use DECREF here, it would
653 * cause a recursive call.
654 */
655 assert(inst->ob_refcnt > 0);
656 if (--inst->ob_refcnt == 0) {
Guido van Rossum9ff1a442008-01-18 20:56:30 +0000657
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000658 /* New weakrefs could be created during the finalizer call.
659 If this occurs, clear them out without calling their
660 finalizers since they might rely on part of the object
661 being finalized that has already been destroyed. */
662 while (inst->in_weakreflist != NULL) {
663 _PyWeakref_ClearRef((PyWeakReference *)
664 (inst->in_weakreflist));
665 }
Guido van Rossum9ff1a442008-01-18 20:56:30 +0000666
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000667 Py_DECREF(inst->in_class);
668 Py_XDECREF(inst->in_dict);
669 PyObject_GC_Del(inst);
670 }
671 else {
672 Py_ssize_t refcnt = inst->ob_refcnt;
673 /* __del__ resurrected it! Make it look like the original
674 * Py_DECREF never happened.
675 */
676 _Py_NewReference((PyObject *)inst);
677 inst->ob_refcnt = refcnt;
678 _PyObject_GC_TRACK(inst);
679 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
680 * we need to undo that. */
681 _Py_DEC_REFTOTAL;
682 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
683 * object chain, so no more to do there.
684 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
685 * _Py_NewReference bumped tp_allocs: both of those need to be
686 * undone.
687 */
Tim Peters6b184912000-09-17 14:40:17 +0000688#ifdef COUNT_ALLOCS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000689 --inst->ob_type->tp_frees;
690 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000691#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000692 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000693}
694
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000696instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000697{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000698 register PyObject *v;
699 register char *sname = PyString_AsString(name);
700 if (sname[0] == '_' && sname[1] == '_') {
701 if (strcmp(sname, "__dict__") == 0) {
702 if (PyEval_GetRestricted()) {
703 PyErr_SetString(PyExc_RuntimeError,
704 "instance.__dict__ not accessible in restricted mode");
705 return NULL;
706 }
707 Py_INCREF(inst->in_dict);
708 return inst->in_dict;
709 }
710 if (strcmp(sname, "__class__") == 0) {
711 Py_INCREF(inst->in_class);
712 return (PyObject *)inst->in_class;
713 }
714 }
715 v = instance_getattr2(inst, name);
716 if (v == NULL && !PyErr_Occurred()) {
717 PyErr_Format(PyExc_AttributeError,
718 "%.50s instance has no attribute '%.400s'",
719 PyString_AS_STRING(inst->in_class->cl_name), sname);
720 }
721 return v;
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000722}
723
724static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000725instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000726{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000727 register PyObject *v;
728 PyClassObject *klass;
729 descrgetfunc f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000730
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000731 v = PyDict_GetItem(inst->in_dict, name);
732 if (v != NULL) {
733 Py_INCREF(v);
734 return v;
735 }
736 v = class_lookup(inst->in_class, name, &klass);
737 if (v != NULL) {
738 Py_INCREF(v);
739 f = TP_DESCR_GET(v->ob_type);
740 if (f != NULL) {
741 PyObject *w = f(v, (PyObject *)inst,
742 (PyObject *)(inst->in_class));
743 Py_DECREF(v);
744 v = w;
745 }
746 }
747 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000748}
749
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000751instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000752{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000753 register PyObject *func, *res;
754 res = instance_getattr1(inst, name);
755 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
756 PyObject *args;
757 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
758 return NULL;
759 PyErr_Clear();
760 args = PyTuple_Pack(2, inst, name);
761 if (args == NULL)
762 return NULL;
763 res = PyEval_CallObject(func, args);
764 Py_DECREF(args);
765 }
766 return res;
Guido van Rossume7737541994-09-05 07:31:41 +0000767}
768
Tim Petersdf875b92003-04-07 17:51:59 +0000769/* See classobject.h comments: this only does dict lookups, and is always
770 * safe to call.
771 */
772PyObject *
773_PyInstance_Lookup(PyObject *pinst, PyObject *name)
774{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000775 PyObject *v;
776 PyClassObject *klass;
777 PyInstanceObject *inst; /* pinst cast to the right type */
Tim Petersdf875b92003-04-07 17:51:59 +0000778
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000779 assert(PyInstance_Check(pinst));
780 inst = (PyInstanceObject *)pinst;
Tim Petersdf875b92003-04-07 17:51:59 +0000781
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000782 assert(PyString_Check(name));
Tim Petersdf875b92003-04-07 17:51:59 +0000783
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000784 v = PyDict_GetItem(inst->in_dict, name);
785 if (v == NULL)
786 v = class_lookup(inst->in_class, name, &klass);
787 return v;
Tim Petersdf875b92003-04-07 17:51:59 +0000788}
789
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000790static int
Fred Drake79912472000-07-09 04:06:11 +0000791instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000792{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000793 if (v == NULL) {
794 int rv = PyDict_DelItem(inst->in_dict, name);
795 if (rv < 0)
796 PyErr_Format(PyExc_AttributeError,
797 "%.50s instance has no attribute '%.400s'",
798 PyString_AS_STRING(inst->in_class->cl_name),
799 PyString_AS_STRING(name));
800 return rv;
801 }
802 else
803 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000804}
805
Guido van Rossume7737541994-09-05 07:31:41 +0000806static int
Fred Drake79912472000-07-09 04:06:11 +0000807instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000808{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000809 PyObject *func, *args, *res, *tmp;
810 char *sname = PyString_AsString(name);
811 if (sname[0] == '_' && sname[1] == '_') {
812 Py_ssize_t n = PyString_Size(name);
813 if (sname[n-1] == '_' && sname[n-2] == '_') {
814 if (strcmp(sname, "__dict__") == 0) {
815 if (PyEval_GetRestricted()) {
816 PyErr_SetString(PyExc_RuntimeError,
817 "__dict__ not accessible in restricted mode");
818 return -1;
819 }
820 if (v == NULL || !PyDict_Check(v)) {
821 PyErr_SetString(PyExc_TypeError,
822 "__dict__ must be set to a dictionary");
823 return -1;
824 }
825 tmp = inst->in_dict;
826 Py_INCREF(v);
827 inst->in_dict = v;
828 Py_DECREF(tmp);
829 return 0;
830 }
831 if (strcmp(sname, "__class__") == 0) {
832 if (PyEval_GetRestricted()) {
833 PyErr_SetString(PyExc_RuntimeError,
834 "__class__ not accessible in restricted mode");
835 return -1;
836 }
837 if (v == NULL || !PyClass_Check(v)) {
838 PyErr_SetString(PyExc_TypeError,
839 "__class__ must be set to a class");
840 return -1;
841 }
842 tmp = (PyObject *)(inst->in_class);
843 Py_INCREF(v);
844 inst->in_class = (PyClassObject *)v;
845 Py_DECREF(tmp);
846 return 0;
847 }
848 }
849 }
850 if (v == NULL)
851 func = inst->in_class->cl_delattr;
852 else
853 func = inst->in_class->cl_setattr;
854 if (func == NULL)
855 return instance_setattr1(inst, name, v);
856 if (v == NULL)
857 args = PyTuple_Pack(2, inst, name);
858 else
859 args = PyTuple_Pack(3, inst, name, v);
860 if (args == NULL)
861 return -1;
862 res = PyEval_CallObject(func, args);
863 Py_DECREF(args);
864 if (res == NULL)
865 return -1;
866 Py_DECREF(res);
867 return 0;
Guido van Rossume7737541994-09-05 07:31:41 +0000868}
869
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000871instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000872{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000873 PyObject *func;
874 PyObject *res;
875 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000876
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000877 if (reprstr == NULL) {
878 reprstr = PyString_InternFromString("__repr__");
879 if (reprstr == NULL)
880 return NULL;
881 }
882 func = instance_getattr(inst, reprstr);
883 if (func == NULL) {
884 PyObject *classname, *mod;
885 char *cname;
886 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
887 return NULL;
888 PyErr_Clear();
889 classname = inst->in_class->cl_name;
890 mod = PyDict_GetItemString(inst->in_class->cl_dict,
891 "__module__");
892 if (classname != NULL && PyString_Check(classname))
893 cname = PyString_AsString(classname);
894 else
895 cname = "?";
896 if (mod == NULL || !PyString_Check(mod))
897 return PyString_FromFormat("<?.%s instance at %p>",
898 cname, inst);
899 else
900 return PyString_FromFormat("<%s.%s instance at %p>",
901 PyString_AsString(mod),
902 cname, inst);
903 }
904 res = PyEval_CallObject(func, (PyObject *)NULL);
905 Py_DECREF(func);
906 return res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000907}
908
Guido van Rossum82c690f2001-04-30 14:39:18 +0000909static PyObject *
910instance_str(PyInstanceObject *inst)
911{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000912 PyObject *func;
913 PyObject *res;
914 static PyObject *strstr;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000915
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000916 if (strstr == NULL) {
917 strstr = PyString_InternFromString("__str__");
918 if (strstr == NULL)
919 return NULL;
920 }
921 func = instance_getattr(inst, strstr);
922 if (func == NULL) {
923 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
924 return NULL;
925 PyErr_Clear();
926 return instance_repr(inst);
927 }
928 res = PyEval_CallObject(func, (PyObject *)NULL);
929 Py_DECREF(func);
930 return res;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000931}
932
Guido van Rossum9bfef441993-03-29 10:43:31 +0000933static long
Fred Drake79912472000-07-09 04:06:11 +0000934instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000935{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000936 PyObject *func;
937 PyObject *res;
938 long outcome;
939 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000940
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000941 if (hashstr == NULL) {
942 hashstr = PyString_InternFromString("__hash__");
943 if (hashstr == NULL)
944 return -1;
945 }
946 func = instance_getattr(inst, hashstr);
947 if (func == NULL) {
948 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
949 return -1;
950 PyErr_Clear();
951 /* If there is no __eq__ and no __cmp__ method, we hash on the
952 address. If an __eq__ or __cmp__ method exists, there must
953 be a __hash__. */
954 if (eqstr == NULL) {
955 eqstr = PyString_InternFromString("__eq__");
956 if (eqstr == NULL)
957 return -1;
958 }
959 func = instance_getattr(inst, eqstr);
960 if (func == NULL) {
961 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
962 return -1;
963 PyErr_Clear();
964 if (cmpstr == NULL) {
965 cmpstr = PyString_InternFromString("__cmp__");
966 if (cmpstr == NULL)
967 return -1;
968 }
969 func = instance_getattr(inst, cmpstr);
970 if (func == NULL) {
971 if (!PyErr_ExceptionMatches(
972 PyExc_AttributeError))
973 return -1;
974 PyErr_Clear();
975 return _Py_HashPointer(inst);
976 }
977 }
978 Py_XDECREF(func);
979 PyErr_SetString(PyExc_TypeError, "unhashable instance");
980 return -1;
981 }
982 res = PyEval_CallObject(func, (PyObject *)NULL);
983 Py_DECREF(func);
984 if (res == NULL)
985 return -1;
986 if (PyInt_Check(res) || PyLong_Check(res))
987 /* This already converts a -1 result to -2. */
988 outcome = res->ob_type->tp_hash(res);
989 else {
990 PyErr_SetString(PyExc_TypeError,
991 "__hash__() should return an int");
992 outcome = -1;
993 }
994 Py_DECREF(res);
995 return outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000996}
997
Jeremy Hylton8caad492000-06-23 14:18:11 +0000998static int
999instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
1000{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001001 Py_VISIT(o->in_class);
1002 Py_VISIT(o->in_dict);
1003 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001004}
1005
Guido van Rossum213c7a62001-04-23 14:08:49 +00001006static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
1007static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001008
Martin v. Löwis18e16552006-02-15 17:27:45 +00001009static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001010instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001011{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001012 PyObject *func;
1013 PyObject *res;
1014 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001016 if (lenstr == NULL) {
1017 lenstr = PyString_InternFromString("__len__");
1018 if (lenstr == NULL)
1019 return -1;
1020 }
1021 func = instance_getattr(inst, lenstr);
1022 if (func == NULL)
1023 return -1;
1024 res = PyEval_CallObject(func, (PyObject *)NULL);
1025 Py_DECREF(func);
1026 if (res == NULL)
1027 return -1;
1028 if (PyInt_Check(res)) {
1029 outcome = PyInt_AsSsize_t(res);
1030 if (outcome == -1 && PyErr_Occurred()) {
1031 Py_DECREF(res);
1032 return -1;
1033 }
Neal Norwitz1872b1c2006-08-12 18:44:06 +00001034#if SIZEOF_SIZE_T < SIZEOF_INT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001035 /* Overflow check -- range of PyInt is more than C int */
1036 if (outcome != (int)outcome) {
1037 PyErr_SetString(PyExc_OverflowError,
1038 "__len__() should return 0 <= outcome < 2**31");
1039 outcome = -1;
1040 }
1041 else
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001042#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001043 if (outcome < 0) {
1044 PyErr_SetString(PyExc_ValueError,
1045 "__len__() should return >= 0");
1046 outcome = -1;
1047 }
1048 }
1049 else {
1050 PyErr_SetString(PyExc_TypeError,
1051 "__len__() should return an int");
1052 outcome = -1;
1053 }
1054 Py_DECREF(res);
1055 return outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056}
1057
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001059instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001060{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001061 PyObject *func;
1062 PyObject *arg;
1063 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001065 if (getitemstr == NULL) {
1066 getitemstr = PyString_InternFromString("__getitem__");
1067 if (getitemstr == NULL)
1068 return NULL;
1069 }
1070 func = instance_getattr(inst, getitemstr);
1071 if (func == NULL)
1072 return NULL;
1073 arg = PyTuple_Pack(1, key);
1074 if (arg == NULL) {
1075 Py_DECREF(func);
1076 return NULL;
1077 }
1078 res = PyEval_CallObject(func, arg);
1079 Py_DECREF(func);
1080 Py_DECREF(arg);
1081 return res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001082}
1083
Guido van Rossum9bfef441993-03-29 10:43:31 +00001084static int
Fred Drake79912472000-07-09 04:06:11 +00001085instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001087 PyObject *func;
1088 PyObject *arg;
1089 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001090
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001091 if (value == NULL) {
1092 if (delitemstr == NULL) {
1093 delitemstr = PyString_InternFromString("__delitem__");
1094 if (delitemstr == NULL)
1095 return -1;
1096 }
1097 func = instance_getattr(inst, delitemstr);
1098 }
1099 else {
1100 if (setitemstr == NULL) {
1101 setitemstr = PyString_InternFromString("__setitem__");
1102 if (setitemstr == NULL)
1103 return -1;
1104 }
1105 func = instance_getattr(inst, setitemstr);
1106 }
1107 if (func == NULL)
1108 return -1;
1109 if (value == NULL)
1110 arg = PyTuple_Pack(1, key);
1111 else
1112 arg = PyTuple_Pack(2, key, value);
1113 if (arg == NULL) {
1114 Py_DECREF(func);
1115 return -1;
1116 }
1117 res = PyEval_CallObject(func, arg);
1118 Py_DECREF(func);
1119 Py_DECREF(arg);
1120 if (res == NULL)
1121 return -1;
1122 Py_DECREF(res);
1123 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001124}
1125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126static PyMappingMethods instance_as_mapping = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001127 (lenfunc)instance_length, /* mp_length */
1128 (binaryfunc)instance_subscript, /* mp_subscript */
1129 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001130};
1131
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001133instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001135 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001137 if (getitemstr == NULL) {
1138 getitemstr = PyString_InternFromString("__getitem__");
1139 if (getitemstr == NULL)
1140 return NULL;
1141 }
1142 func = instance_getattr(inst, getitemstr);
1143 if (func == NULL)
1144 return NULL;
1145 res = PyObject_CallFunction(func, "n", i);
1146 Py_DECREF(func);
1147 return res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001148}
1149
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001151instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001152{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001153 PyObject *func, *arg, *res;
1154 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001155
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001156 if (getslicestr == NULL) {
1157 getslicestr = PyString_InternFromString("__getslice__");
1158 if (getslicestr == NULL)
1159 return NULL;
1160 }
1161 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001162
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001163 if (func == NULL) {
1164 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1165 return NULL;
1166 PyErr_Clear();
Thomas Wouters1d75a792000-08-17 22:37:32 +00001167
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001168 if (getitemstr == NULL) {
1169 getitemstr = PyString_InternFromString("__getitem__");
1170 if (getitemstr == NULL)
1171 return NULL;
1172 }
1173 func = instance_getattr(inst, getitemstr);
1174 if (func == NULL)
1175 return NULL;
1176 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
1177 }
1178 else {
1179 if (PyErr_WarnPy3k("in 3.x, __getslice__ has been removed; "
1180 "use __getitem__", 1) < 0) {
1181 Py_DECREF(func);
1182 return NULL;
1183 }
1184 arg = Py_BuildValue("(nn)", i, j);
1185 }
Tim Peters34592512002-07-11 06:23:50 +00001186
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001187 if (arg == NULL) {
1188 Py_DECREF(func);
1189 return NULL;
1190 }
1191 res = PyEval_CallObject(func, arg);
1192 Py_DECREF(func);
1193 Py_DECREF(arg);
1194 return res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001195}
1196
1197static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001198instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001199{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001200 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001201
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001202 if (item == NULL) {
1203 if (delitemstr == NULL) {
1204 delitemstr = PyString_InternFromString("__delitem__");
1205 if (delitemstr == NULL)
1206 return -1;
1207 }
1208 func = instance_getattr(inst, delitemstr);
1209 }
1210 else {
1211 if (setitemstr == NULL) {
1212 setitemstr = PyString_InternFromString("__setitem__");
1213 if (setitemstr == NULL)
1214 return -1;
1215 }
1216 func = instance_getattr(inst, setitemstr);
1217 }
1218 if (func == NULL)
1219 return -1;
1220 if (item == NULL)
1221 arg = PyInt_FromSsize_t(i);
1222 else
1223 arg = Py_BuildValue("(nO)", i, item);
1224 if (arg == NULL) {
1225 Py_DECREF(func);
1226 return -1;
1227 }
1228 res = PyEval_CallObject(func, arg);
1229 Py_DECREF(func);
1230 Py_DECREF(arg);
1231 if (res == NULL)
1232 return -1;
1233 Py_DECREF(res);
1234 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001235}
1236
1237static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001238instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001239{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001240 PyObject *func, *arg, *res;
1241 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001242
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001243 if (value == NULL) {
1244 if (delslicestr == NULL) {
1245 delslicestr =
1246 PyString_InternFromString("__delslice__");
1247 if (delslicestr == NULL)
1248 return -1;
1249 }
1250 func = instance_getattr(inst, delslicestr);
1251 if (func == NULL) {
1252 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1253 return -1;
1254 PyErr_Clear();
1255 if (delitemstr == NULL) {
1256 delitemstr =
1257 PyString_InternFromString("__delitem__");
1258 if (delitemstr == NULL)
1259 return -1;
1260 }
1261 func = instance_getattr(inst, delitemstr);
1262 if (func == NULL)
1263 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001264
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001265 arg = Py_BuildValue("(N)",
1266 _PySlice_FromIndices(i, j));
1267 }
1268 else {
1269 if (PyErr_WarnPy3k("in 3.x, __delslice__ has been "
1270 "removed; use __delitem__", 1) < 0) {
1271 Py_DECREF(func);
1272 return -1;
1273 }
1274 arg = Py_BuildValue("(nn)", i, j);
1275 }
1276 }
1277 else {
1278 if (setslicestr == NULL) {
1279 setslicestr =
1280 PyString_InternFromString("__setslice__");
1281 if (setslicestr == NULL)
1282 return -1;
1283 }
1284 func = instance_getattr(inst, setslicestr);
1285 if (func == NULL) {
1286 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1287 return -1;
1288 PyErr_Clear();
1289 if (setitemstr == NULL) {
1290 setitemstr =
1291 PyString_InternFromString("__setitem__");
1292 if (setitemstr == NULL)
1293 return -1;
1294 }
1295 func = instance_getattr(inst, setitemstr);
1296 if (func == NULL)
1297 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001298
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001299 arg = Py_BuildValue("(NO)",
1300 _PySlice_FromIndices(i, j), value);
1301 }
1302 else {
1303 if (PyErr_WarnPy3k("in 3.x, __setslice__ has been "
1304 "removed; use __setitem__", 1) < 0) {
1305 Py_DECREF(func);
1306 return -1;
1307 }
1308 arg = Py_BuildValue("(nnO)", i, j, value);
1309 }
1310 }
1311 if (arg == NULL) {
1312 Py_DECREF(func);
1313 return -1;
1314 }
1315 res = PyEval_CallObject(func, arg);
1316 Py_DECREF(func);
1317 Py_DECREF(arg);
1318 if (res == NULL)
1319 return -1;
1320 Py_DECREF(res);
1321 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001322}
1323
Tim Peterscb8d3682001-05-05 21:05:01 +00001324static int
1325instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001326{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001327 static PyObject *__contains__;
1328 PyObject *func;
Tim Peterscb8d3682001-05-05 21:05:01 +00001329
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001330 /* Try __contains__ first.
1331 * If that can't be done, try iterator-based searching.
1332 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001333
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001334 if(__contains__ == NULL) {
1335 __contains__ = PyString_InternFromString("__contains__");
1336 if(__contains__ == NULL)
1337 return -1;
1338 }
1339 func = instance_getattr(inst, __contains__);
1340 if (func) {
1341 PyObject *res;
1342 int ret;
1343 PyObject *arg = PyTuple_Pack(1, member);
1344 if(arg == NULL) {
1345 Py_DECREF(func);
1346 return -1;
1347 }
1348 res = PyEval_CallObject(func, arg);
1349 Py_DECREF(func);
1350 Py_DECREF(arg);
1351 if(res == NULL)
1352 return -1;
1353 ret = PyObject_IsTrue(res);
1354 Py_DECREF(res);
1355 return ret;
1356 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001357
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001358 /* Couldn't find __contains__. */
1359 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1360 Py_ssize_t rc;
1361 /* Assume the failure was simply due to that there is no
1362 * __contains__ attribute, and try iterating instead.
1363 */
1364 PyErr_Clear();
1365 rc = _PySequence_IterSearch((PyObject *)inst, member,
1366 PY_ITERSEARCH_CONTAINS);
1367 if (rc >= 0)
1368 return rc > 0;
1369 }
1370 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001371}
1372
Fred Drake79912472000-07-09 04:06:11 +00001373static PySequenceMethods
1374instance_as_sequence = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001375 (lenfunc)instance_length, /* sq_length */
1376 0, /* sq_concat */
1377 0, /* sq_repeat */
1378 (ssizeargfunc)instance_item, /* sq_item */
1379 (ssizessizeargfunc)instance_slice, /* sq_slice */
1380 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1381 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
1382 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001383};
1384
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001386generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001387{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001388 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001389
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001390 if ((func = instance_getattr(self, methodname)) == NULL)
1391 return NULL;
1392 res = PyEval_CallObject(func, (PyObject *)NULL);
1393 Py_DECREF(func);
1394 return res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001395}
1396
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001397static PyObject *
1398generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001399{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001400 PyObject *result;
1401 PyObject *args;
1402 PyObject *func = PyObject_GetAttrString(v, opname);
1403 if (func == NULL) {
1404 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1405 return NULL;
1406 PyErr_Clear();
1407 Py_INCREF(Py_NotImplemented);
1408 return Py_NotImplemented;
1409 }
1410 args = PyTuple_Pack(1, w);
1411 if (args == NULL) {
1412 Py_DECREF(func);
1413 return NULL;
1414 }
1415 result = PyEval_CallObject(func, args);
1416 Py_DECREF(args);
1417 Py_DECREF(func);
1418 return result;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001419}
1420
1421
1422static PyObject *coerce_obj;
1423
1424/* Try one half of a binary operator involving a class instance. */
1425static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001426half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001427 int swapped)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001428{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001429 PyObject *args;
1430 PyObject *coercefunc;
1431 PyObject *coerced = NULL;
1432 PyObject *v1;
1433 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001434
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001435 if (!PyInstance_Check(v)) {
1436 Py_INCREF(Py_NotImplemented);
1437 return Py_NotImplemented;
1438 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001439
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001440 if (coerce_obj == NULL) {
1441 coerce_obj = PyString_InternFromString("__coerce__");
1442 if (coerce_obj == NULL)
1443 return NULL;
1444 }
1445 coercefunc = PyObject_GetAttr(v, coerce_obj);
1446 if (coercefunc == NULL) {
1447 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1448 return NULL;
1449 PyErr_Clear();
1450 return generic_binary_op(v, w, opname);
1451 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001452
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001453 args = PyTuple_Pack(1, w);
1454 if (args == NULL) {
1455 Py_DECREF(coercefunc);
1456 return NULL;
1457 }
1458 coerced = PyEval_CallObject(coercefunc, args);
1459 Py_DECREF(args);
1460 Py_DECREF(coercefunc);
1461 if (coerced == NULL) {
1462 return NULL;
1463 }
1464 if (coerced == Py_None || coerced == Py_NotImplemented) {
1465 Py_DECREF(coerced);
1466 return generic_binary_op(v, w, opname);
1467 }
1468 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1469 Py_DECREF(coerced);
1470 PyErr_SetString(PyExc_TypeError,
1471 "coercion should return None or 2-tuple");
1472 return NULL;
1473 }
1474 v1 = PyTuple_GetItem(coerced, 0);
1475 w = PyTuple_GetItem(coerced, 1);
1476 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
1477 /* prevent recursion if __coerce__ returns self as the first
1478 * argument */
1479 result = generic_binary_op(v1, w, opname);
1480 } else {
1481 if (Py_EnterRecursiveCall(" after coercion"))
1482 return NULL;
1483 if (swapped)
1484 result = (thisfunc)(w, v1);
1485 else
1486 result = (thisfunc)(v1, w);
1487 Py_LeaveRecursiveCall();
1488 }
1489 Py_DECREF(coerced);
1490 return result;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001491}
1492
1493/* Implement a binary operator involving at least one class instance. */
1494static PyObject *
1495do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1496 binaryfunc thisfunc)
1497{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001498 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1499 if (result == Py_NotImplemented) {
1500 Py_DECREF(result);
1501 result = half_binop(w, v, ropname, thisfunc, 1);
1502 }
1503 return result;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001504}
1505
1506static PyObject *
1507do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001508 char *ropname, binaryfunc thisfunc)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001509{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001510 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1511 if (result == Py_NotImplemented) {
1512 Py_DECREF(result);
1513 result = do_binop(v, w, opname, ropname, thisfunc);
1514 }
1515 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001516}
1517
Guido van Rossum879c5811995-01-10 15:24:06 +00001518static int
Fred Drake79912472000-07-09 04:06:11 +00001519instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001520{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001521 PyObject *v = *pv;
1522 PyObject *w = *pw;
1523 PyObject *coercefunc;
1524 PyObject *args;
1525 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001526
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001527 if (coerce_obj == NULL) {
1528 coerce_obj = PyString_InternFromString("__coerce__");
1529 if (coerce_obj == NULL)
1530 return -1;
1531 }
1532 coercefunc = PyObject_GetAttr(v, coerce_obj);
1533 if (coercefunc == NULL) {
1534 /* No __coerce__ method */
1535 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1536 return -1;
1537 PyErr_Clear();
1538 return 1;
1539 }
1540 /* Has __coerce__ method: call it */
1541 args = PyTuple_Pack(1, w);
1542 if (args == NULL) {
1543 return -1;
1544 }
1545 coerced = PyEval_CallObject(coercefunc, args);
1546 Py_DECREF(args);
1547 Py_DECREF(coercefunc);
1548 if (coerced == NULL) {
1549 /* __coerce__ call raised an exception */
1550 return -1;
1551 }
1552 if (coerced == Py_None || coerced == Py_NotImplemented) {
1553 /* __coerce__ says "I can't do it" */
1554 Py_DECREF(coerced);
1555 return 1;
1556 }
1557 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1558 /* __coerce__ return value is malformed */
1559 Py_DECREF(coerced);
1560 PyErr_SetString(PyExc_TypeError,
1561 "coercion should return None or 2-tuple");
1562 return -1;
1563 }
1564 /* __coerce__ returned two new values */
1565 *pv = PyTuple_GetItem(coerced, 0);
1566 *pw = PyTuple_GetItem(coerced, 1);
1567 Py_INCREF(*pv);
1568 Py_INCREF(*pw);
1569 Py_DECREF(coerced);
1570 return 0;
Guido van Rossum879c5811995-01-10 15:24:06 +00001571}
1572
Guido van Rossum04691fc1992-08-12 15:35:34 +00001573#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001574static PyObject *funcname(PyInstanceObject *self) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001575 static PyObject *o; \
1576 if (o == NULL) { o = PyString_InternFromString(methodname); \
1577 if (o == NULL) return NULL; } \
1578 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001579}
1580
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001581/* unary function with a fallback */
1582#define UNARY_FB(funcname, methodname, funcname_fb) \
1583static PyObject *funcname(PyInstanceObject *self) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001584 static PyObject *o; \
1585 if (o == NULL) { o = PyString_InternFromString(methodname); \
1586 if (o == NULL) return NULL; } \
1587 if (PyObject_HasAttr((PyObject*)self, o)) \
1588 return generic_unary_op(self, o); \
1589 else \
1590 return funcname_fb(self); \
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001591}
1592
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001593#define BINARY(f, m, n) \
1594static PyObject *f(PyObject *v, PyObject *w) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001595 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001596}
1597
1598#define BINARY_INPLACE(f, m, n) \
1599static PyObject *f(PyObject *v, PyObject *w) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001600 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1601 "__r" m "__", n); \
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001602}
1603
Guido van Rossum04691fc1992-08-12 15:35:34 +00001604UNARY(instance_neg, "__neg__")
1605UNARY(instance_pos, "__pos__")
1606UNARY(instance_abs, "__abs__")
1607
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001608BINARY(instance_or, "or", PyNumber_Or)
1609BINARY(instance_and, "and", PyNumber_And)
1610BINARY(instance_xor, "xor", PyNumber_Xor)
1611BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1612BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1613BINARY(instance_add, "add", PyNumber_Add)
1614BINARY(instance_sub, "sub", PyNumber_Subtract)
1615BINARY(instance_mul, "mul", PyNumber_Multiply)
1616BINARY(instance_div, "div", PyNumber_Divide)
1617BINARY(instance_mod, "mod", PyNumber_Remainder)
1618BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001619BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1620BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001621
1622BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1623BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1624BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1625BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1626BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1627BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1628BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1629BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1630BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1631BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001632BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1633BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001634
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001635/* Try a 3-way comparison, returning an int; v is an instance. Return:
1636 -2 for an exception;
1637 -1 if v < w;
1638 0 if v == w;
1639 1 if v > w;
1640 2 if this particular 3-way comparison is not implemented or undefined.
1641*/
1642static int
1643half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001644{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001645 static PyObject *cmp_obj;
1646 PyObject *args;
1647 PyObject *cmp_func;
1648 PyObject *result;
1649 long l;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001650
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001651 assert(PyInstance_Check(v));
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001652
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001653 if (cmp_obj == NULL) {
1654 cmp_obj = PyString_InternFromString("__cmp__");
1655 if (cmp_obj == NULL)
1656 return -2;
1657 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001658
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001659 cmp_func = PyObject_GetAttr(v, cmp_obj);
1660 if (cmp_func == NULL) {
1661 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1662 return -2;
1663 PyErr_Clear();
1664 return 2;
1665 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001666
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001667 args = PyTuple_Pack(1, w);
1668 if (args == NULL) {
1669 Py_DECREF(cmp_func);
1670 return -2;
1671 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001672
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001673 result = PyEval_CallObject(cmp_func, args);
1674 Py_DECREF(args);
1675 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001676
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001677 if (result == NULL)
1678 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001679
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001680 if (result == Py_NotImplemented) {
1681 Py_DECREF(result);
1682 return 2;
1683 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001684
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001685 l = PyInt_AsLong(result);
1686 Py_DECREF(result);
1687 if (l == -1 && PyErr_Occurred()) {
1688 PyErr_SetString(PyExc_TypeError,
1689 "comparison did not return an int");
1690 return -2;
1691 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001692
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001693 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001694}
1695
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001696/* Try a 3-way comparison, returning an int; either v or w is an instance.
1697 We first try a coercion. Return:
1698 -2 for an exception;
1699 -1 if v < w;
1700 0 if v == w;
1701 1 if v > w;
1702 2 if this particular 3-way comparison is not implemented or undefined.
1703 THIS IS ONLY CALLED FROM object.c!
1704*/
1705static int
1706instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001707{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001708 int c;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001709
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001710 c = PyNumber_CoerceEx(&v, &w);
1711 if (c < 0)
1712 return -2;
1713 if (c == 0) {
1714 /* If neither is now an instance, use regular comparison */
1715 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1716 c = PyObject_Compare(v, w);
1717 Py_DECREF(v);
1718 Py_DECREF(w);
1719 if (PyErr_Occurred())
1720 return -2;
1721 return c < 0 ? -1 : c > 0 ? 1 : 0;
1722 }
1723 }
1724 else {
1725 /* The coercion didn't do anything.
1726 Treat this the same as returning v and w unchanged. */
1727 Py_INCREF(v);
1728 Py_INCREF(w);
1729 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001730
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001731 if (PyInstance_Check(v)) {
1732 c = half_cmp(v, w);
1733 if (c <= 1) {
1734 Py_DECREF(v);
1735 Py_DECREF(w);
1736 return c;
1737 }
1738 }
1739 if (PyInstance_Check(w)) {
1740 c = half_cmp(w, v);
1741 if (c <= 1) {
1742 Py_DECREF(v);
1743 Py_DECREF(w);
1744 if (c >= -1)
1745 c = -c;
1746 return c;
1747 }
1748 }
1749 Py_DECREF(v);
1750 Py_DECREF(w);
1751 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001752}
1753
Guido van Rossum9bfef441993-03-29 10:43:31 +00001754static int
Fred Drake79912472000-07-09 04:06:11 +00001755instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001756{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001757 PyObject *func, *res;
1758 long outcome;
1759 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001760
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001761 if (nonzerostr == NULL) {
1762 nonzerostr = PyString_InternFromString("__nonzero__");
1763 if (nonzerostr == NULL)
1764 return -1;
1765 }
1766 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
1767 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1768 return -1;
1769 PyErr_Clear();
1770 if (lenstr == NULL) {
1771 lenstr = PyString_InternFromString("__len__");
1772 if (lenstr == NULL)
1773 return -1;
1774 }
1775 if ((func = instance_getattr(self, lenstr)) == NULL) {
1776 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1777 return -1;
1778 PyErr_Clear();
1779 /* Fall back to the default behavior:
1780 all instances are nonzero */
1781 return 1;
1782 }
1783 }
1784 res = PyEval_CallObject(func, (PyObject *)NULL);
1785 Py_DECREF(func);
1786 if (res == NULL)
1787 return -1;
1788 if (!PyInt_Check(res)) {
1789 Py_DECREF(res);
1790 PyErr_SetString(PyExc_TypeError,
1791 "__nonzero__ should return an int");
1792 return -1;
1793 }
1794 outcome = PyInt_AsLong(res);
1795 Py_DECREF(res);
1796 if (outcome < 0) {
1797 PyErr_SetString(PyExc_ValueError,
1798 "__nonzero__ should return >= 0");
1799 return -1;
1800 }
1801 return outcome > 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001802}
1803
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001804static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001805instance_index(PyInstanceObject *self)
1806{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001807 PyObject *func, *res;
1808 static PyObject *indexstr = NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001809
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001810 if (indexstr == NULL) {
1811 indexstr = PyString_InternFromString("__index__");
1812 if (indexstr == NULL)
1813 return NULL;
1814 }
1815 if ((func = instance_getattr(self, indexstr)) == NULL) {
1816 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1817 return NULL;
1818 PyErr_Clear();
1819 PyErr_SetString(PyExc_TypeError,
1820 "object cannot be interpreted as an index");
1821 return NULL;
1822 }
1823 res = PyEval_CallObject(func, (PyObject *)NULL);
1824 Py_DECREF(func);
1825 return res;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001826}
1827
1828
Guido van Rossum04691fc1992-08-12 15:35:34 +00001829UNARY(instance_invert, "__invert__")
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001830UNARY(_instance_trunc, "__trunc__")
1831
1832static PyObject *
1833instance_int(PyInstanceObject *self)
1834{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001835 PyObject *truncated;
1836 static PyObject *int_name;
1837 if (int_name == NULL) {
1838 int_name = PyString_InternFromString("__int__");
1839 if (int_name == NULL)
1840 return NULL;
1841 }
1842 if (PyObject_HasAttr((PyObject*)self, int_name))
1843 return generic_unary_op(self, int_name);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001844
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001845 truncated = _instance_trunc(self);
1846 /* __trunc__ is specified to return an Integral type, but
1847 int() needs to return an int. */
1848 return _PyNumber_ConvertIntegralToInt(
1849 truncated,
1850 "__trunc__ returned non-Integral (type %.200s)");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001851}
1852
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +00001853UNARY_FB(instance_long, "__long__", instance_int)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001854UNARY(instance_float, "__float__")
1855UNARY(instance_oct, "__oct__")
1856UNARY(instance_hex, "__hex__")
1857
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001858static PyObject *
1859bin_power(PyObject *v, PyObject *w)
1860{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001861 return PyNumber_Power(v, w, Py_None);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001862}
1863
Guido van Rossum03093a21994-09-28 15:51:32 +00001864/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001865static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001866instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001867{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001868 if (z == Py_None) {
1869 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
1870 }
1871 else {
1872 PyObject *func;
1873 PyObject *args;
1874 PyObject *result;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001875
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001876 /* XXX Doesn't do coercions... */
1877 func = PyObject_GetAttrString(v, "__pow__");
1878 if (func == NULL)
1879 return NULL;
1880 args = PyTuple_Pack(2, w, z);
1881 if (args == NULL) {
1882 Py_DECREF(func);
1883 return NULL;
1884 }
1885 result = PyEval_CallObject(func, args);
1886 Py_DECREF(func);
1887 Py_DECREF(args);
1888 return result;
1889 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001890}
1891
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001892static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001893bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001894{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001895 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001896}
1897
1898
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001899static PyObject *
1900instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1901{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001902 if (z == Py_None) {
1903 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1904 "__rpow__", bin_inplace_power);
1905 }
1906 else {
1907 /* XXX Doesn't do coercions... */
1908 PyObject *func;
1909 PyObject *args;
1910 PyObject *result;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001911
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001912 func = PyObject_GetAttrString(v, "__ipow__");
1913 if (func == NULL) {
1914 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1915 return NULL;
1916 PyErr_Clear();
1917 return instance_pow(v, w, z);
1918 }
1919 args = PyTuple_Pack(2, w, z);
1920 if (args == NULL) {
1921 Py_DECREF(func);
1922 return NULL;
1923 }
1924 result = PyEval_CallObject(func, args);
1925 Py_DECREF(func);
1926 Py_DECREF(args);
1927 return result;
1928 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001929}
1930
1931
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001932/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001933#define NAME_OPS 6
1934static PyObject **name_op = NULL;
1935
Tim Peters34592512002-07-11 06:23:50 +00001936static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001937init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001938{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001939 int i;
1940 char *_name_op[] = {
1941 "__lt__",
1942 "__le__",
1943 "__eq__",
1944 "__ne__",
1945 "__gt__",
1946 "__ge__",
1947 };
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001948
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001949 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1950 if (name_op == NULL)
1951 return -1;
1952 for (i = 0; i < NAME_OPS; ++i) {
1953 name_op[i] = PyString_InternFromString(_name_op[i]);
1954 if (name_op[i] == NULL)
1955 return -1;
1956 }
1957 return 0;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001958}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001959
1960static PyObject *
1961half_richcompare(PyObject *v, PyObject *w, int op)
1962{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001963 PyObject *method;
1964 PyObject *args;
1965 PyObject *res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001966
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001967 assert(PyInstance_Check(v));
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001968
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001969 if (name_op == NULL) {
1970 if (init_name_op() < 0)
1971 return NULL;
1972 }
1973 /* If the instance doesn't define an __getattr__ method, use
1974 instance_getattr2 directly because it will not set an
1975 exception on failure. */
1976 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
1977 method = instance_getattr2((PyInstanceObject *)v,
1978 name_op[op]);
1979 else
1980 method = PyObject_GetAttr(v, name_op[op]);
1981 if (method == NULL) {
1982 if (PyErr_Occurred()) {
1983 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1984 return NULL;
1985 PyErr_Clear();
1986 }
1987 res = Py_NotImplemented;
1988 Py_INCREF(res);
1989 return res;
1990 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001991
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001992 args = PyTuple_Pack(1, w);
1993 if (args == NULL) {
1994 Py_DECREF(method);
1995 return NULL;
1996 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001997
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001998 res = PyEval_CallObject(method, args);
1999 Py_DECREF(args);
2000 Py_DECREF(method);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002001
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002002 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002003}
2004
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002005static PyObject *
2006instance_richcompare(PyObject *v, PyObject *w, int op)
2007{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002008 PyObject *res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002009
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002010 if (PyInstance_Check(v)) {
2011 res = half_richcompare(v, w, op);
2012 if (res != Py_NotImplemented)
2013 return res;
2014 Py_DECREF(res);
2015 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002016
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002017 if (PyInstance_Check(w)) {
2018 res = half_richcompare(w, v, _Py_SwappedOp[op]);
2019 if (res != Py_NotImplemented)
2020 return res;
2021 Py_DECREF(res);
2022 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002023
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002024 Py_INCREF(Py_NotImplemented);
2025 return Py_NotImplemented;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002026}
2027
Neil Schemenauer29bfc072001-01-04 01:43:46 +00002028
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002029/* Get the iterator */
2030static PyObject *
2031instance_getiter(PyInstanceObject *self)
2032{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002033 PyObject *func;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002034
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002035 if (iterstr == NULL) {
2036 iterstr = PyString_InternFromString("__iter__");
2037 if (iterstr == NULL)
2038 return NULL;
2039 }
2040 if (getitemstr == NULL) {
2041 getitemstr = PyString_InternFromString("__getitem__");
2042 if (getitemstr == NULL)
2043 return NULL;
2044 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002045
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002046 if ((func = instance_getattr(self, iterstr)) != NULL) {
2047 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2048 Py_DECREF(func);
2049 if (res != NULL && !PyIter_Check(res)) {
2050 PyErr_Format(PyExc_TypeError,
2051 "__iter__ returned non-iterator "
2052 "of type '%.100s'",
2053 res->ob_type->tp_name);
2054 Py_DECREF(res);
2055 res = NULL;
2056 }
2057 return res;
2058 }
2059 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2060 return NULL;
2061 PyErr_Clear();
2062 if ((func = instance_getattr(self, getitemstr)) == NULL) {
2063 PyErr_SetString(PyExc_TypeError,
2064 "iteration over non-sequence");
2065 return NULL;
2066 }
2067 Py_DECREF(func);
2068 return PySeqIter_New((PyObject *)self);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002069}
2070
2071
2072/* Call the iterator's next */
2073static PyObject *
2074instance_iternext(PyInstanceObject *self)
2075{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002076 PyObject *func;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002077
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002078 if (nextstr == NULL) {
2079 nextstr = PyString_InternFromString("next");
2080 if (nextstr == NULL)
2081 return NULL;
2082 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002083
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002084 if ((func = instance_getattr(self, nextstr)) != NULL) {
2085 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2086 Py_DECREF(func);
2087 if (res != NULL) {
2088 return res;
2089 }
2090 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
2091 PyErr_Clear();
2092 return NULL;
2093 }
2094 return NULL;
2095 }
2096 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
2097 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002098}
2099
Tim Peters6d6c1a32001-08-02 04:15:00 +00002100static PyObject *
2101instance_call(PyObject *func, PyObject *arg, PyObject *kw)
2102{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002103 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2104 if (call == NULL) {
2105 PyInstanceObject *inst = (PyInstanceObject*) func;
2106 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2107 return NULL;
2108 PyErr_Clear();
2109 PyErr_Format(PyExc_AttributeError,
2110 "%.200s instance has no __call__ method",
2111 PyString_AsString(inst->in_class->cl_name));
2112 return NULL;
2113 }
2114 /* We must check and increment the recursion depth here. Scenario:
2115 class A:
2116 pass
2117 A.__call__ = A() # that's right
2118 a = A() # ok
2119 a() # infinite recursion
2120 This bounces between instance_call() and PyObject_Call() without
2121 ever hitting eval_frame() (which has the main recursion check). */
2122 if (Py_EnterRecursiveCall(" in __call__")) {
2123 res = NULL;
2124 }
2125 else {
2126 res = PyObject_Call(call, arg, kw);
2127 Py_LeaveRecursiveCall();
2128 }
2129 Py_DECREF(call);
2130 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002131}
2132
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002133
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002134static PyNumberMethods instance_as_number = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002135 instance_add, /* nb_add */
2136 instance_sub, /* nb_subtract */
2137 instance_mul, /* nb_multiply */
2138 instance_div, /* nb_divide */
2139 instance_mod, /* nb_remainder */
2140 instance_divmod, /* nb_divmod */
2141 instance_pow, /* nb_power */
2142 (unaryfunc)instance_neg, /* nb_negative */
2143 (unaryfunc)instance_pos, /* nb_positive */
2144 (unaryfunc)instance_abs, /* nb_absolute */
2145 (inquiry)instance_nonzero, /* nb_nonzero */
2146 (unaryfunc)instance_invert, /* nb_invert */
2147 instance_lshift, /* nb_lshift */
2148 instance_rshift, /* nb_rshift */
2149 instance_and, /* nb_and */
2150 instance_xor, /* nb_xor */
2151 instance_or, /* nb_or */
2152 instance_coerce, /* nb_coerce */
2153 (unaryfunc)instance_int, /* nb_int */
2154 (unaryfunc)instance_long, /* nb_long */
2155 (unaryfunc)instance_float, /* nb_float */
2156 (unaryfunc)instance_oct, /* nb_oct */
2157 (unaryfunc)instance_hex, /* nb_hex */
2158 instance_iadd, /* nb_inplace_add */
2159 instance_isub, /* nb_inplace_subtract */
2160 instance_imul, /* nb_inplace_multiply */
2161 instance_idiv, /* nb_inplace_divide */
2162 instance_imod, /* nb_inplace_remainder */
2163 instance_ipow, /* nb_inplace_power */
2164 instance_ilshift, /* nb_inplace_lshift */
2165 instance_irshift, /* nb_inplace_rshift */
2166 instance_iand, /* nb_inplace_and */
2167 instance_ixor, /* nb_inplace_xor */
2168 instance_ior, /* nb_inplace_or */
2169 instance_floordiv, /* nb_floor_divide */
2170 instance_truediv, /* nb_true_divide */
2171 instance_ifloordiv, /* nb_inplace_floor_divide */
2172 instance_itruediv, /* nb_inplace_true_divide */
2173 (unaryfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002174};
2175
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002176PyTypeObject PyInstance_Type = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002177 PyObject_HEAD_INIT(&PyType_Type)
2178 0,
2179 "instance",
2180 sizeof(PyInstanceObject),
2181 0,
2182 (destructor)instance_dealloc, /* tp_dealloc */
2183 0, /* tp_print */
2184 0, /* tp_getattr */
2185 0, /* tp_setattr */
2186 instance_compare, /* tp_compare */
2187 (reprfunc)instance_repr, /* tp_repr */
2188 &instance_as_number, /* tp_as_number */
2189 &instance_as_sequence, /* tp_as_sequence */
2190 &instance_as_mapping, /* tp_as_mapping */
2191 (hashfunc)instance_hash, /* tp_hash */
2192 instance_call, /* tp_call */
2193 (reprfunc)instance_str, /* tp_str */
2194 (getattrofunc)instance_getattr, /* tp_getattro */
2195 (setattrofunc)instance_setattr, /* tp_setattro */
2196 0, /* tp_as_buffer */
2197 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
2198 instance_doc, /* tp_doc */
2199 (traverseproc)instance_traverse, /* tp_traverse */
2200 0, /* tp_clear */
2201 instance_richcompare, /* tp_richcompare */
2202 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2203 (getiterfunc)instance_getiter, /* tp_iter */
2204 (iternextfunc)instance_iternext, /* tp_iternext */
2205 0, /* tp_methods */
2206 0, /* tp_members */
2207 0, /* tp_getset */
2208 0, /* tp_base */
2209 0, /* tp_dict */
2210 0, /* tp_descr_get */
2211 0, /* tp_descr_set */
2212 0, /* tp_dictoffset */
2213 0, /* tp_init */
2214 0, /* tp_alloc */
2215 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002216};
2217
2218
Guido van Rossum81daa321993-05-20 14:24:46 +00002219/* Instance method objects are used for two purposes:
2220 (a) as bound instance methods (returned by instancename.methodname)
2221 (b) as unbound methods (returned by ClassName.methodname)
2222 In case (b), im_self is NULL
2223*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002224
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002225PyObject *
Anthony Baxter377be112006-04-11 06:54:30 +00002226PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002227{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002228 register PyMethodObject *im;
2229 if (!PyCallable_Check(func)) {
2230 PyErr_BadInternalCall();
2231 return NULL;
2232 }
2233 im = free_list;
2234 if (im != NULL) {
2235 free_list = (PyMethodObject *)(im->im_self);
2236 PyObject_INIT(im, &PyMethod_Type);
2237 numfree--;
2238 }
2239 else {
2240 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
2241 if (im == NULL)
2242 return NULL;
2243 }
2244 im->im_weakreflist = NULL;
2245 Py_INCREF(func);
2246 im->im_func = func;
2247 Py_XINCREF(self);
2248 im->im_self = self;
2249 Py_XINCREF(klass);
2250 im->im_class = klass;
2251 _PyObject_GC_TRACK(im);
2252 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002253}
2254
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002255/* Descriptors for PyMethod attributes */
2256
2257/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002258
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002259#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260
Guido van Rossum6f799372001-09-20 20:46:19 +00002261static PyMemberDef instancemethod_memberlist[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002262 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2263 "the class associated with a method"},
2264 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2265 "the function (or other callable) implementing a method"},
2266 {"__func__", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2267 "the function (or other callable) implementing a method"},
2268 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2269 "the instance to which a method is bound; None for unbound methods"},
2270 {"__self__", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2271 "the instance to which a method is bound; None for unbound methods"},
2272 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002273};
2274
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002275/* Christian Tismer argued convincingly that method attributes should
2276 (nearly) always override function attributes.
2277 The one exception is __doc__; there's a default __doc__ which
2278 should only be used for the class, not for instances */
2279
2280static PyObject *
2281instancemethod_get_doc(PyMethodObject *im, void *context)
2282{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002283 static PyObject *docstr;
2284 if (docstr == NULL) {
2285 docstr= PyString_InternFromString("__doc__");
2286 if (docstr == NULL)
2287 return NULL;
2288 }
2289 return PyObject_GetAttr(im->im_func, docstr);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002290}
2291
2292static PyGetSetDef instancemethod_getset[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002293 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2294 {0}
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002295};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002296
2297static PyObject *
2298instancemethod_getattro(PyObject *obj, PyObject *name)
2299{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002300 PyMethodObject *im = (PyMethodObject *)obj;
2301 PyTypeObject *tp = obj->ob_type;
2302 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002303
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002304 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2305 if (tp->tp_dict == NULL) {
2306 if (PyType_Ready(tp) < 0)
2307 return NULL;
2308 }
2309 descr = _PyType_Lookup(tp, name);
2310 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002311
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002312 if (descr != NULL) {
2313 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2314 if (f != NULL)
2315 return f(descr, obj, (PyObject *)obj->ob_type);
2316 else {
2317 Py_INCREF(descr);
2318 return descr;
2319 }
2320 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002321
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002322 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002323}
2324
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002325PyDoc_STRVAR(instancemethod_doc,
2326"instancemethod(function, instance, class)\n\
2327\n\
2328Create an instance method object.");
2329
2330static PyObject *
2331instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2332{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002333 PyObject *func;
2334 PyObject *self;
2335 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002336
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002337 if (!_PyArg_NoKeywords("instancemethod", kw))
2338 return NULL;
2339 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
2340 &func, &self, &classObj))
2341 return NULL;
2342 if (!PyCallable_Check(func)) {
2343 PyErr_SetString(PyExc_TypeError,
2344 "first argument must be callable");
2345 return NULL;
2346 }
2347 if (self == Py_None)
2348 self = NULL;
2349 if (self == NULL && classObj == NULL) {
2350 PyErr_SetString(PyExc_TypeError,
2351 "unbound methods must have non-NULL im_class");
2352 return NULL;
2353 }
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002354
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002355 return PyMethod_New(func, self, classObj);
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002356}
2357
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002358static void
Fred Drake79912472000-07-09 04:06:11 +00002359instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002360{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002361 _PyObject_GC_UNTRACK(im);
2362 if (im->im_weakreflist != NULL)
2363 PyObject_ClearWeakRefs((PyObject *)im);
2364 Py_DECREF(im->im_func);
2365 Py_XDECREF(im->im_self);
2366 Py_XDECREF(im->im_class);
2367 if (numfree < PyMethod_MAXFREELIST) {
2368 im->im_self = (PyObject *)free_list;
2369 free_list = im;
2370 numfree++;
2371 }
2372 else {
2373 PyObject_GC_Del(im);
2374 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002375}
2376
Guido van Rossumebc8c511992-09-03 20:39:51 +00002377static int
Fred Drake79912472000-07-09 04:06:11 +00002378instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002379{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002380 int cmp;
2381 cmp = PyObject_Compare(a->im_func, b->im_func);
2382 if (cmp)
2383 return cmp;
Armin Rigofd01d792006-06-08 10:56:24 +00002384
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002385 if (a->im_self == b->im_self)
2386 return 0;
2387 if (a->im_self == NULL || b->im_self == NULL)
2388 return (a->im_self < b->im_self) ? -1 : 1;
2389 else
2390 return PyObject_Compare(a->im_self, b->im_self);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002391}
2392
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002393static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002394instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002395{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002396 PyObject *self = a->im_self;
2397 PyObject *func = a->im_func;
2398 PyObject *klass = a->im_class;
2399 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2400 char *sfuncname = "?", *sklassname = "?";
Tim Peters6d6c1a32001-08-02 04:15:00 +00002401
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002402 funcname = PyObject_GetAttrString(func, "__name__");
2403 if (funcname == NULL) {
2404 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2405 return NULL;
2406 PyErr_Clear();
2407 }
2408 else if (!PyString_Check(funcname)) {
2409 Py_DECREF(funcname);
2410 funcname = NULL;
2411 }
2412 else
2413 sfuncname = PyString_AS_STRING(funcname);
2414 if (klass == NULL)
2415 klassname = NULL;
2416 else {
2417 klassname = PyObject_GetAttrString(klass, "__name__");
2418 if (klassname == NULL) {
2419 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2420 return NULL;
2421 PyErr_Clear();
2422 }
2423 else if (!PyString_Check(klassname)) {
2424 Py_DECREF(klassname);
2425 klassname = NULL;
2426 }
2427 else
2428 sklassname = PyString_AS_STRING(klassname);
2429 }
2430 if (self == NULL)
2431 result = PyString_FromFormat("<unbound method %s.%s>",
2432 sklassname, sfuncname);
2433 else {
2434 /* XXX Shouldn't use repr() here! */
2435 PyObject *selfrepr = PyObject_Repr(self);
2436 if (selfrepr == NULL)
2437 goto fail;
2438 if (!PyString_Check(selfrepr)) {
2439 Py_DECREF(selfrepr);
2440 goto fail;
2441 }
2442 result = PyString_FromFormat("<bound method %s.%s of %s>",
2443 sklassname, sfuncname,
2444 PyString_AS_STRING(selfrepr));
2445 Py_DECREF(selfrepr);
2446 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002447 fail:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002448 Py_XDECREF(funcname);
2449 Py_XDECREF(klassname);
2450 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002451}
2452
Guido van Rossum9bfef441993-03-29 10:43:31 +00002453static long
Fred Drake79912472000-07-09 04:06:11 +00002454instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002455{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002456 long x, y;
2457 if (a->im_self == NULL)
2458 x = PyObject_Hash(Py_None);
2459 else
2460 x = PyObject_Hash(a->im_self);
2461 if (x == -1)
2462 return -1;
2463 y = PyObject_Hash(a->im_func);
2464 if (y == -1)
2465 return -1;
2466 x = x ^ y;
2467 if (x == -1)
2468 x = -2;
2469 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002470}
2471
Jeremy Hylton8caad492000-06-23 14:18:11 +00002472static int
2473instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2474{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002475 Py_VISIT(im->im_func);
2476 Py_VISIT(im->im_self);
2477 Py_VISIT(im->im_class);
2478 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002479}
2480
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002481static void
Anthony Baxter377be112006-04-11 06:54:30 +00002482getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002483{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002484 PyObject *name;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002485
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002486 assert(bufsize > 1);
2487 strcpy(buf, "?"); /* Default outcome */
2488 if (klass == NULL)
2489 return;
2490 name = PyObject_GetAttrString(klass, "__name__");
2491 if (name == NULL) {
2492 /* This function cannot return an exception */
2493 PyErr_Clear();
2494 return;
2495 }
2496 if (PyString_Check(name)) {
2497 strncpy(buf, PyString_AS_STRING(name), bufsize);
2498 buf[bufsize-1] = '\0';
2499 }
2500 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002501}
2502
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002503static void
2504getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002505{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002506 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002507
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002508 if (inst == NULL) {
2509 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
2510 strcpy(buf, "nothing");
2511 return;
2512 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002513
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002514 klass = PyObject_GetAttrString(inst, "__class__");
2515 if (klass == NULL) {
2516 /* This function cannot return an exception */
2517 PyErr_Clear();
2518 klass = (PyObject *)(inst->ob_type);
2519 Py_INCREF(klass);
2520 }
2521 getclassname(klass, buf, bufsize);
2522 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002523}
2524
Tim Peters6d6c1a32001-08-02 04:15:00 +00002525static PyObject *
2526instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2527{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002528 PyObject *self = PyMethod_GET_SELF(func);
2529 PyObject *klass = PyMethod_GET_CLASS(func);
2530 PyObject *result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002531
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002532 func = PyMethod_GET_FUNCTION(func);
2533 if (self == NULL) {
2534 /* Unbound methods must be called with an instance of
2535 the class (or a derived class) as first argument */
2536 int ok;
2537 if (PyTuple_Size(arg) >= 1)
2538 self = PyTuple_GET_ITEM(arg, 0);
2539 if (self == NULL)
2540 ok = 0;
2541 else {
2542 ok = PyObject_IsInstance(self, klass);
2543 if (ok < 0)
2544 return NULL;
2545 }
2546 if (!ok) {
2547 char clsbuf[256];
2548 char instbuf[256];
2549 getclassname(klass, clsbuf, sizeof(clsbuf));
2550 getinstclassname(self, instbuf, sizeof(instbuf));
2551 PyErr_Format(PyExc_TypeError,
2552 "unbound method %s%s must be called with "
2553 "%s instance as first argument "
2554 "(got %s%s instead)",
2555 PyEval_GetFuncName(func),
2556 PyEval_GetFuncDesc(func),
2557 clsbuf,
2558 instbuf,
2559 self == NULL ? "" : " instance");
2560 return NULL;
2561 }
2562 Py_INCREF(arg);
2563 }
2564 else {
2565 Py_ssize_t argcount = PyTuple_Size(arg);
2566 PyObject *newarg = PyTuple_New(argcount + 1);
2567 int i;
2568 if (newarg == NULL)
2569 return NULL;
2570 Py_INCREF(self);
2571 PyTuple_SET_ITEM(newarg, 0, self);
2572 for (i = 0; i < argcount; i++) {
2573 PyObject *v = PyTuple_GET_ITEM(arg, i);
2574 Py_XINCREF(v);
2575 PyTuple_SET_ITEM(newarg, i+1, v);
2576 }
2577 arg = newarg;
2578 }
2579 result = PyObject_Call((PyObject *)func, arg, kw);
2580 Py_DECREF(arg);
2581 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002582}
2583
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002584static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002585instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002586{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002587 /* Don't rebind an already bound method, or an unbound method
2588 of a class that's not a base class of cls. */
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002589
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002590 if (PyMethod_GET_SELF(meth) != NULL) {
2591 /* Already bound */
2592 Py_INCREF(meth);
2593 return meth;
2594 }
2595 /* No, it is an unbound method */
2596 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2597 /* Do subclass test. If it fails, return meth unchanged. */
2598 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2599 if (ok < 0)
2600 return NULL;
2601 if (!ok) {
2602 Py_INCREF(meth);
2603 return meth;
2604 }
2605 }
2606 /* Bind it to obj */
2607 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002608}
2609
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002610PyTypeObject PyMethod_Type = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002611 PyObject_HEAD_INIT(&PyType_Type)
2612 0,
2613 "instancemethod",
2614 sizeof(PyMethodObject),
2615 0,
2616 (destructor)instancemethod_dealloc, /* tp_dealloc */
2617 0, /* tp_print */
2618 0, /* tp_getattr */
2619 0, /* tp_setattr */
2620 (cmpfunc)instancemethod_compare, /* tp_compare */
2621 (reprfunc)instancemethod_repr, /* tp_repr */
2622 0, /* tp_as_number */
2623 0, /* tp_as_sequence */
2624 0, /* tp_as_mapping */
2625 (hashfunc)instancemethod_hash, /* tp_hash */
2626 instancemethod_call, /* tp_call */
2627 0, /* tp_str */
2628 instancemethod_getattro, /* tp_getattro */
2629 PyObject_GenericSetAttr, /* tp_setattro */
2630 0, /* tp_as_buffer */
2631 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
2632 instancemethod_doc, /* tp_doc */
2633 (traverseproc)instancemethod_traverse, /* tp_traverse */
2634 0, /* tp_clear */
2635 0, /* tp_richcompare */
2636 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2637 0, /* tp_iter */
2638 0, /* tp_iternext */
2639 0, /* tp_methods */
2640 instancemethod_memberlist, /* tp_members */
2641 instancemethod_getset, /* tp_getset */
2642 0, /* tp_base */
2643 0, /* tp_dict */
2644 instancemethod_descr_get, /* tp_descr_get */
2645 0, /* tp_descr_set */
2646 0, /* tp_dictoffset */
2647 0, /* tp_init */
2648 0, /* tp_alloc */
2649 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002650};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002651
2652/* Clear out the free list */
2653
Christian Heimes3b718a72008-02-14 12:47:33 +00002654int
2655PyMethod_ClearFreeList(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002656{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002657 int freelist_size = numfree;
2658
2659 while (free_list) {
2660 PyMethodObject *im = free_list;
2661 free_list = (PyMethodObject *)(im->im_self);
2662 PyObject_GC_Del(im);
2663 numfree--;
2664 }
2665 assert(numfree == 0);
2666 return freelist_size;
Christian Heimes3b718a72008-02-14 12:47:33 +00002667}
2668
2669void
2670PyMethod_Fini(void)
2671{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002672 (void)PyMethod_ClearFreeList();
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002673}