blob: 037252d06a4ba187bcec2a90c6da76fe80f9038c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Class object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +00006
Guido van Rossum915f0eb2001-10-17 20:26:38 +00007#define TP_DESCR_GET(t) \
8 (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
9
Neil Schemenauer29bfc072001-01-04 01:43:46 +000010
Guido van Rossum52ca98a1994-09-05 07:32:29 +000011/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000012static PyObject *class_lookup(PyClassObject *, PyObject *,
13 PyClassObject **);
14static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
15static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000016
Guido van Rossuma63eff61998-05-29 21:37:21 +000017static PyObject *getattrstr, *setattrstr, *delattrstr;
18
Fred Drake79912472000-07-09 04:06:11 +000019
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
22 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000025 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000026 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000027 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000028 if (docstr == NULL)
29 return NULL;
30 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000031 if (modstr == NULL) {
32 modstr= PyString_InternFromString("__module__");
33 if (modstr == NULL)
34 return NULL;
35 }
36 if (namestr == NULL) {
37 namestr= PyString_InternFromString("__name__");
38 if (namestr == NULL)
39 return NULL;
40 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000041 if (name == NULL || !PyString_Check(name)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000042 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000043 "PyClass_New: name must be a string");
44 return NULL;
45 }
46 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000047 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000048 "PyClass_New: dict must be a dictionary");
49 return NULL;
50 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 if (PyDict_GetItem(dict, docstr) == NULL) {
52 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000053 return NULL;
54 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000055 if (PyDict_GetItem(dict, modstr) == NULL) {
56 PyObject *globals = PyEval_GetGlobals();
57 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000058 PyObject *modname = PyDict_GetItem(globals, namestr);
59 if (modname != NULL) {
60 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000061 return NULL;
62 }
63 }
64 }
Guido van Rossume2966a61991-12-10 13:53:23 +000065 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000067 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000068 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000069 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000070 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +000071 Py_ssize_t i, n;
Guido van Rossum28d80b12001-09-07 21:08:32 +000072 PyObject *base;
Guido van Rossum04d73c41997-10-07 14:54:11 +000073 if (!PyTuple_Check(bases)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000074 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000075 "PyClass_New: bases must be a tuple");
76 return NULL;
77 }
Guido van Rossum28d80b12001-09-07 21:08:32 +000078 n = PyTuple_Size(bases);
79 for (i = 0; i < n; i++) {
80 base = PyTuple_GET_ITEM(bases, i);
81 if (!PyClass_Check(base)) {
82 if (PyCallable_Check(
83 (PyObject *) base->ob_type))
84 return PyObject_CallFunction(
85 (PyObject *) base->ob_type,
86 "OOO",
87 name,
88 bases,
89 dict);
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000091 "PyClass_New: base must be a class");
92 return NULL;
93 }
94 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000096 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000097 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000098 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000101 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000104 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000106 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000107 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000108 getattrstr = PyString_InternFromString("__getattr__");
109 setattrstr = PyString_InternFromString("__setattr__");
110 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000111 }
112 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
113 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
114 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_XINCREF(op->cl_getattr);
116 Py_XINCREF(op->cl_setattr);
117 Py_XINCREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000118 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120}
121
Guido van Rossumb479dc52001-09-05 22:52:50 +0000122PyObject *
123PyMethod_Function(PyObject *im)
124{
125 if (!PyMethod_Check(im)) {
126 PyErr_BadInternalCall();
127 return NULL;
128 }
129 return ((PyMethodObject *)im)->im_func;
130}
131
132PyObject *
133PyMethod_Self(PyObject *im)
134{
135 if (!PyMethod_Check(im)) {
136 PyErr_BadInternalCall();
137 return NULL;
138 }
139 return ((PyMethodObject *)im)->im_self;
140}
141
142PyObject *
143PyMethod_Class(PyObject *im)
144{
145 if (!PyMethod_Check(im)) {
146 PyErr_BadInternalCall();
147 return NULL;
148 }
149 return ((PyMethodObject *)im)->im_class;
150}
151
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000152PyDoc_STRVAR(class_doc,
153"classobj(name, bases, dict)\n\
154\n\
155Create a class object. The name must be a string; the second argument\n\
156a tuple of classes, and the third a dictionary.");
157
158static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000159class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
160{
161 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000162 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163
164 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
165 &name, &bases, &dict))
166 return NULL;
167 return PyClass_New(bases, dict, name);
168}
169
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170/* Class methods */
171
172static void
Fred Drake79912472000-07-09 04:06:11 +0000173class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000175 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 Py_DECREF(op->cl_bases);
177 Py_DECREF(op->cl_dict);
178 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000179 Py_XDECREF(op->cl_getattr);
180 Py_XDECREF(op->cl_setattr);
181 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000182 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183}
184
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000186class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000187{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000188 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000190 if (value != NULL) {
191 *pclass = cp;
192 return value;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000195 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000196 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 PyObject *v = class_lookup(
198 (PyClassObject *)
199 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000200 if (v != NULL)
201 return v;
202 }
203 return NULL;
204}
205
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000207class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 register PyObject *v;
210 register char *sname = PyString_AsString(name);
211 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 descrgetfunc f;
213
Guido van Rossum2878a691996-08-09 20:53:24 +0000214 if (sname[0] == '_' && sname[1] == '_') {
215 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 if (PyEval_GetRestricted()) {
217 PyErr_SetString(PyExc_RuntimeError,
218 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000219 return NULL;
220 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000222 return op->cl_dict;
223 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000224 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000226 return op->cl_bases;
227 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000228 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000229 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000231 else
232 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000234 return v;
235 }
Guido van Rossum94308391991-10-20 20:11:48 +0000236 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000237 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000238 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000239 PyErr_Format(PyExc_AttributeError,
240 "class %.50s has no attribute '%.400s'",
241 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000242 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000244 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000245 if (f == NULL)
246 Py_INCREF(v);
247 else
248 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000249 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250}
251
Guido van Rossuma63eff61998-05-29 21:37:21 +0000252static void
Fred Drake79912472000-07-09 04:06:11 +0000253set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000254{
255 PyObject *temp = *slot;
256 Py_XINCREF(v);
257 *slot = v;
258 Py_XDECREF(temp);
259}
260
Guido van Rossum7ba30431998-07-08 13:34:48 +0000261static void
Fred Drake79912472000-07-09 04:06:11 +0000262set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000263{
264 PyClassObject *dummy;
265
266 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
267 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
268 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
269}
270
Guido van Rossuma63eff61998-05-29 21:37:21 +0000271static char *
Fred Drake79912472000-07-09 04:06:11 +0000272set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000273{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000274 if (v == NULL || !PyDict_Check(v))
275 return "__dict__ must be a dictionary object";
276 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000277 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000278 return "";
279}
280
281static char *
Fred Drake79912472000-07-09 04:06:11 +0000282set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000283{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000284 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000285
286 if (v == NULL || !PyTuple_Check(v))
287 return "__bases__ must be a tuple object";
288 n = PyTuple_Size(v);
289 for (i = 0; i < n; i++) {
290 PyObject *x = PyTuple_GET_ITEM(v, i);
291 if (!PyClass_Check(x))
292 return "__bases__ items must be classes";
293 if (PyClass_IsSubclass(x, (PyObject *)c))
294 return "a __bases__ item causes an inheritance cycle";
295 }
296 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000297 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000298 return "";
299}
300
301static char *
Fred Drake79912472000-07-09 04:06:11 +0000302set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000303{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000304 if (v == NULL || !PyString_Check(v))
305 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000306 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000307 return "__name__ must not contain null bytes";
308 set_slot(&c->cl_name, v);
309 return "";
310}
311
Guido van Rossum94308391991-10-20 20:11:48 +0000312static int
Fred Drake79912472000-07-09 04:06:11 +0000313class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000314{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000315 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 if (PyEval_GetRestricted()) {
317 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000318 "classes are read-only in restricted mode");
319 return -1;
320 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000321 sname = PyString_AsString(name);
322 if (sname[0] == '_' && sname[1] == '_') {
323 int n = PyString_Size(name);
324 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000325 char *err = NULL;
326 if (strcmp(sname, "__dict__") == 0)
327 err = set_dict(op, v);
328 else if (strcmp(sname, "__bases__") == 0)
329 err = set_bases(op, v);
330 else if (strcmp(sname, "__name__") == 0)
331 err = set_name(op, v);
332 else if (strcmp(sname, "__getattr__") == 0)
333 set_slot(&op->cl_getattr, v);
334 else if (strcmp(sname, "__setattr__") == 0)
335 set_slot(&op->cl_setattr, v);
336 else if (strcmp(sname, "__delattr__") == 0)
337 set_slot(&op->cl_delattr, v);
338 /* For the last three, we fall through to update the
339 dictionary as well. */
340 if (err != NULL) {
341 if (*err == '\0')
342 return 0;
343 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000344 return -1;
345 }
346 }
347 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000348 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000350 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000351 PyErr_Format(PyExc_AttributeError,
352 "class %.50s has no attribute '%.400s'",
353 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000354 return rv;
355 }
Guido van Rossum94308391991-10-20 20:11:48 +0000356 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000358}
359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000361class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000362{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000363 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000364 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000366 name = "?";
367 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000369 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000370 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000371 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000372 return PyString_FromFormat("<class %s.%s at %p>",
373 PyString_AsString(mod),
374 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000375}
376
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000377static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000378class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000379{
380 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
381 PyObject *name = op->cl_name;
382 PyObject *res;
383 int m, n;
384
385 if (name == NULL || !PyString_Check(name))
386 return class_repr(op);
387 if (mod == NULL || !PyString_Check(mod)) {
388 Py_INCREF(name);
389 return name;
390 }
391 m = PyString_Size(mod);
392 n = PyString_Size(name);
393 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
394 if (res != NULL) {
395 char *s = PyString_AsString(res);
396 memcpy(s, PyString_AsString(mod), m);
397 s += m;
398 *s++ = '.';
399 memcpy(s, PyString_AsString(name), n);
400 }
401 return res;
402}
403
Jeremy Hylton8caad492000-06-23 14:18:11 +0000404static int
405class_traverse(PyClassObject *o, visitproc visit, void *arg)
406{
407 int err;
408 if (o->cl_bases) {
409 err = visit(o->cl_bases, arg);
410 if (err)
411 return err;
412 }
413 if (o->cl_dict) {
414 err = visit(o->cl_dict, arg);
415 if (err)
416 return err;
417 }
418 if (o->cl_name) {
419 err = visit(o->cl_name, arg);
420 if (err)
421 return err;
422 }
423 if (o->cl_getattr) {
424 err = visit(o->cl_getattr, arg);
425 if (err)
426 return err;
427 }
428 if (o->cl_setattr) {
429 err = visit(o->cl_setattr, arg);
430 if (err)
431 return err;
432 }
433 if (o->cl_delattr) {
434 err = visit(o->cl_delattr, arg);
435 if (err)
436 return err;
437 }
438 return 0;
439}
440
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441PyTypeObject PyClass_Type = {
442 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000444 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000445 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000447 (destructor)class_dealloc, /* tp_dealloc */
448 0, /* tp_print */
449 0, /* tp_getattr */
450 0, /* tp_setattr */
451 0, /* tp_compare */
452 (reprfunc)class_repr, /* tp_repr */
453 0, /* tp_as_number */
454 0, /* tp_as_sequence */
455 0, /* tp_as_mapping */
456 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000457 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000458 (reprfunc)class_str, /* tp_str */
459 (getattrofunc)class_getattr, /* tp_getattro */
460 (setattrofunc)class_setattr, /* tp_setattro */
461 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000462 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000463 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000464 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000465 0, /* tp_clear */
466 0, /* tp_richcompare */
467 0, /* tp_weaklistoffset */
468 0, /* tp_iter */
469 0, /* tp_iternext */
470 0, /* tp_methods */
471 0, /* tp_members */
472 0, /* tp_getset */
473 0, /* tp_base */
474 0, /* tp_dict */
475 0, /* tp_descr_get */
476 0, /* tp_descr_set */
477 0, /* tp_dictoffset */
478 0, /* tp_init */
479 0, /* tp_alloc */
480 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481};
482
Guido van Rossum81daa321993-05-20 14:24:46 +0000483int
Fred Drake79912472000-07-09 04:06:11 +0000484PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000485{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000486 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000488 if (class == base)
489 return 1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000490 if (PyTuple_Check(base)) {
491 n = PyTuple_GET_SIZE(base);
492 for (i = 0; i < n; i++) {
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000493 if (PyClass_IsSubclass(class, PyTuple_GET_ITEM(base, i)))
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000494 return 1;
495 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000496 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000497 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000499 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500 cp = (PyClassObject *)class;
501 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000502 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000504 return 1;
505 }
506 return 0;
507}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508
Guido van Rossum81daa321993-05-20 14:24:46 +0000509
510/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000511
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000513PyInstance_NewRaw(PyObject *klass, PyObject *dict)
514{
515 PyInstanceObject *inst;
516
517 if (!PyClass_Check(klass)) {
518 PyErr_BadInternalCall();
519 return NULL;
520 }
521 if (dict == NULL) {
522 dict = PyDict_New();
523 if (dict == NULL)
524 return NULL;
525 }
526 else {
527 if (!PyDict_Check(dict)) {
528 PyErr_BadInternalCall();
529 return NULL;
530 }
531 Py_INCREF(dict);
532 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000533 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000534 if (inst == NULL) {
535 Py_DECREF(dict);
536 return NULL;
537 }
Fred Drake4e262a92001-03-22 18:26:47 +0000538 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000539 Py_INCREF(klass);
540 inst->in_class = (PyClassObject *)klass;
541 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000542 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000543 return (PyObject *)inst;
544}
545
546PyObject *
547PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 register PyInstanceObject *inst;
550 PyObject *init;
551 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000552
553 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000554 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000556 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000557 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000558 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000559 if (init == NULL) {
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000560 if (PyErr_Occurred()) {
561 Py_DECREF(inst);
562 return NULL;
563 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 if ((arg != NULL && (!PyTuple_Check(arg) ||
565 PyTuple_Size(arg) != 0))
566 || (kw != NULL && (!PyDict_Check(kw) ||
567 PyDict_Size(kw) != 0))) {
568 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000569 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000571 inst = NULL;
572 }
573 }
574 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
576 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000577 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000579 inst = NULL;
580 }
581 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 if (res != Py_None) {
583 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000584 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000586 inst = NULL;
587 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000589 }
590 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592}
593
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000594/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000596PyDoc_STRVAR(instance_doc,
597"instance(class[, dict])\n\
598\n\
599Create an instance without calling its __init__() method.\n\
600The class must be a classic class.\n\
601If present, dict must be a dictionary or None.");
602
603static PyObject *
604instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
605{
606 PyObject *klass;
607 PyObject *dict = Py_None;
608
609 if (!PyArg_ParseTuple(args, "O!|O:instance",
610 &PyClass_Type, &klass, &dict))
611 return NULL;
612
613 if (dict == Py_None)
614 dict = NULL;
615 else if (!PyDict_Check(dict)) {
616 PyErr_SetString(PyExc_TypeError,
617 "instance() second arg must be dictionary or None");
618 return NULL;
619 }
620 return PyInstance_NewRaw(klass, dict);
621}
622
623
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624static void
Fred Drake79912472000-07-09 04:06:11 +0000625instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000626{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 PyObject *error_type, *error_value, *error_traceback;
628 PyObject *del;
629 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000630
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000631 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000632 if (inst->in_weakreflist != NULL)
633 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000634
Tim Peters6b184912000-09-17 14:40:17 +0000635 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000636 assert(inst->ob_type == &PyInstance_Type);
637 assert(inst->ob_refcnt == 0);
638 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000639
640 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000642 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000643 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000644 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000645 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000647 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000648 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000649 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 Py_DECREF(res);
651 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000652 }
Tim Peters6b184912000-09-17 14:40:17 +0000653 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000655
Tim Peters6b184912000-09-17 14:40:17 +0000656 /* Undo the temporary resurrection; can't use DECREF here, it would
657 * cause a recursive call.
658 */
Tim Peters34592512002-07-11 06:23:50 +0000659 assert(inst->ob_refcnt > 0);
660 if (--inst->ob_refcnt == 0) {
661 Py_DECREF(inst->in_class);
662 Py_XDECREF(inst->in_dict);
663 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000664 }
Tim Peters34592512002-07-11 06:23:50 +0000665 else {
666 int refcnt = inst->ob_refcnt;
667 /* __del__ resurrected it! Make it look like the original
668 * Py_DECREF never happened.
669 */
670 _Py_NewReference((PyObject *)inst);
671 inst->ob_refcnt = refcnt;
672 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000673 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
674 * we need to undo that. */
675 _Py_DEC_REFTOTAL;
676 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
677 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000678 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000679 * _Py_NewReference bumped tp_allocs: both of those need to be
680 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000681 */
Tim Peters6b184912000-09-17 14:40:17 +0000682#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000683 --inst->ob_type->tp_frees;
684 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000685#endif
Tim Peters34592512002-07-11 06:23:50 +0000686 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000687}
688
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000690instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000691{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 register PyObject *v;
693 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000694 if (sname[0] == '_' && sname[1] == '_') {
695 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 if (PyEval_GetRestricted()) {
697 PyErr_SetString(PyExc_RuntimeError,
698 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000699 return NULL;
700 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000702 return inst->in_dict;
703 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000704 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 Py_INCREF(inst->in_class);
706 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000707 }
Guido van Rossum94308391991-10-20 20:11:48 +0000708 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000709 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000710 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000711 PyErr_Format(PyExc_AttributeError,
712 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000713 PyString_AS_STRING(inst->in_class->cl_name), sname);
714 }
715 return v;
716}
717
718static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000719instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000720{
721 register PyObject *v;
722 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000723 descrgetfunc f;
724
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000726 if (v != NULL) {
727 Py_INCREF(v);
728 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000729 }
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000730 v = class_lookup(inst->in_class, name, &class);
731 if (v != NULL) {
732 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000733 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000734 if (f != NULL) {
735 PyObject *w = f(v, (PyObject *)inst,
736 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000738 v = w;
739 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000740 }
741 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000742}
743
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000745instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000746{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000748 res = instance_getattr1(inst, name);
749 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000751 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
752 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000754 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000755 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000756 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 res = PyEval_CallObject(func, args);
758 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000759 }
760 return res;
761}
762
Tim Petersdf875b92003-04-07 17:51:59 +0000763/* See classobject.h comments: this only does dict lookups, and is always
764 * safe to call.
765 */
766PyObject *
767_PyInstance_Lookup(PyObject *pinst, PyObject *name)
768{
769 PyObject *v;
770 PyClassObject *class;
771 PyInstanceObject *inst; /* pinst cast to the right type */
772
773 assert(PyInstance_Check(pinst));
774 inst = (PyInstanceObject *)pinst;
775
776 assert(PyString_Check(name));
777
778 v = PyDict_GetItem(inst->in_dict, name);
779 if (v == NULL)
780 v = class_lookup(inst->in_class, name, &class);
781 return v;
782}
783
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784static int
Fred Drake79912472000-07-09 04:06:11 +0000785instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000786{
Guido van Rossum94472a01992-09-04 09:45:18 +0000787 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000789 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000790 PyErr_Format(PyExc_AttributeError,
791 "%.50s instance has no attribute '%.400s'",
792 PyString_AS_STRING(inst->in_class->cl_name),
793 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000794 return rv;
795 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000796 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000798}
799
Guido van Rossume7737541994-09-05 07:31:41 +0000800static int
Fred Drake79912472000-07-09 04:06:11 +0000801instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000802{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000803 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000805 if (sname[0] == '_' && sname[1] == '_') {
806 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000807 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000808 if (strcmp(sname, "__dict__") == 0) {
809 if (PyEval_GetRestricted()) {
810 PyErr_SetString(PyExc_RuntimeError,
811 "__dict__ not accessible in restricted mode");
812 return -1;
813 }
814 if (v == NULL || !PyDict_Check(v)) {
815 PyErr_SetString(PyExc_TypeError,
816 "__dict__ must be set to a dictionary");
817 return -1;
818 }
819 tmp = inst->in_dict;
820 Py_INCREF(v);
821 inst->in_dict = v;
822 Py_DECREF(tmp);
823 return 0;
824 }
825 if (strcmp(sname, "__class__") == 0) {
826 if (PyEval_GetRestricted()) {
827 PyErr_SetString(PyExc_RuntimeError,
828 "__class__ not accessible in restricted mode");
829 return -1;
830 }
831 if (v == NULL || !PyClass_Check(v)) {
832 PyErr_SetString(PyExc_TypeError,
833 "__class__ must be set to a class");
834 return -1;
835 }
836 tmp = (PyObject *)(inst->in_class);
837 Py_INCREF(v);
838 inst->in_class = (PyClassObject *)v;
839 Py_DECREF(tmp);
840 return 0;
841 }
Guido van Rossume7737541994-09-05 07:31:41 +0000842 }
Guido van Rossume7737541994-09-05 07:31:41 +0000843 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000844 if (v == NULL)
845 func = inst->in_class->cl_delattr;
846 else
847 func = inst->in_class->cl_setattr;
848 if (func == NULL)
849 return instance_setattr1(inst, name, v);
850 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000851 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000852 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000853 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000854 if (args == NULL)
855 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 res = PyEval_CallObject(func, args);
857 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000858 if (res == NULL)
859 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000861 return 0;
862}
863
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000865instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000866{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 PyObject *func;
868 PyObject *res;
869 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000870
Guido van Rossum2878a691996-08-09 20:53:24 +0000871 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000872 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000873 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000874 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000875 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000876 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000877 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
878 return NULL;
879 PyErr_Clear();
880 classname = inst->in_class->cl_name;
881 mod = PyDict_GetItemString(inst->in_class->cl_dict,
882 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 if (classname != NULL && PyString_Check(classname))
884 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000885 else
886 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000887 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000888 return PyString_FromFormat("<?.%s instance at %p>",
889 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000890 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000891 return PyString_FromFormat("<%s.%s instance at %p>",
892 PyString_AsString(mod),
893 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 res = PyEval_CallObject(func, (PyObject *)NULL);
896 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000897 return res;
898}
899
Guido van Rossum82c690f2001-04-30 14:39:18 +0000900static PyObject *
901instance_str(PyInstanceObject *inst)
902{
903 PyObject *func;
904 PyObject *res;
905 static PyObject *strstr;
906
907 if (strstr == NULL)
908 strstr = PyString_InternFromString("__str__");
909 func = instance_getattr(inst, strstr);
910 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000911 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
912 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000913 PyErr_Clear();
914 return instance_repr(inst);
915 }
916 res = PyEval_CallObject(func, (PyObject *)NULL);
917 Py_DECREF(func);
918 return res;
919}
920
Guido van Rossum9bfef441993-03-29 10:43:31 +0000921static long
Fred Drake79912472000-07-09 04:06:11 +0000922instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000923{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924 PyObject *func;
925 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000926 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000927 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000928
Guido van Rossum2878a691996-08-09 20:53:24 +0000929 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000930 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000931 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000932 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000933 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
934 return -1;
935 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000936 /* If there is no __eq__ and no __cmp__ method, we hash on the
937 address. If an __eq__ or __cmp__ method exists, there must
938 be a __hash__. */
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000939 if (eqstr == NULL)
940 eqstr = PyString_InternFromString("__eq__");
941 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000942 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000943 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
944 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000946 if (cmpstr == NULL)
947 cmpstr = PyString_InternFromString("__cmp__");
948 func = instance_getattr(inst, cmpstr);
949 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000950 if (!PyErr_ExceptionMatches(
951 PyExc_AttributeError))
952 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000953 PyErr_Clear();
954 return _Py_HashPointer(inst);
955 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000956 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000957 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000959 return -1;
960 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 res = PyEval_CallObject(func, (PyObject *)NULL);
962 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000963 if (res == NULL)
964 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 if (PyInt_Check(res)) {
966 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000967 if (outcome == -1)
968 outcome = -2;
969 }
970 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 PyErr_SetString(PyExc_TypeError,
972 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000973 outcome = -1;
974 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000976 return outcome;
977}
978
Jeremy Hylton8caad492000-06-23 14:18:11 +0000979static int
980instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
981{
982 int err;
983 if (o->in_class) {
984 err = visit((PyObject *)(o->in_class), arg);
985 if (err)
986 return err;
987 }
988 if (o->in_dict) {
989 err = visit(o->in_dict, arg);
990 if (err)
991 return err;
992 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000993 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000994}
995
Guido van Rossum213c7a62001-04-23 14:08:49 +0000996static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
997static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000998
Martin v. Löwis18e16552006-02-15 17:27:45 +0000999static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001000instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001001{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyObject *func;
1003 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001004 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001005
Guido van Rossum2878a691996-08-09 20:53:24 +00001006 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001007 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001008 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009 if (func == NULL)
1010 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 res = PyEval_CallObject(func, (PyObject *)NULL);
1012 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001013 if (res == NULL)
1014 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 if (PyInt_Check(res)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001016 Py_ssize_t temp = PyInt_AsSsize_t(res);
1017 if (temp == -1 && PyErr_Occurred()) {
1018 Py_DECREF(res);
1019 return -1;
1020 }
1021 outcome = (Py_ssize_t)temp;
1022#if SIZEOF_SIZE_T < SIZEOF_LONG
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001023 /* Overflow check -- range of PyInt is more than C int */
1024 if (outcome != temp) {
1025 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +00001026 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +00001027 outcome = -1;
1028 }
1029 else
1030#endif
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyErr_SetString(PyExc_ValueError,
1033 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 }
1035 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyErr_SetString(PyExc_TypeError,
1037 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001038 outcome = -1;
1039 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001041 return outcome;
1042}
1043
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001045instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 PyObject *func;
1048 PyObject *arg;
1049 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050
Guido van Rossum2878a691996-08-09 20:53:24 +00001051 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001052 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001053 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054 if (func == NULL)
1055 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001056 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001057 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 return NULL;
1060 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 res = PyEval_CallObject(func, arg);
1062 Py_DECREF(func);
1063 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064 return res;
1065}
1066
Guido van Rossum9bfef441993-03-29 10:43:31 +00001067static int
Fred Drake79912472000-07-09 04:06:11 +00001068instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001069{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 PyObject *func;
1071 PyObject *arg;
1072 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073
Guido van Rossum2878a691996-08-09 20:53:24 +00001074 if (value == NULL) {
1075 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001076 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001077 func = instance_getattr(inst, delitemstr);
1078 }
1079 else {
1080 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001081 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001082 func = instance_getattr(inst, setitemstr);
1083 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001084 if (func == NULL)
1085 return -1;
1086 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001087 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001088 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001089 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001090 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001092 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 res = PyEval_CallObject(func, arg);
1095 Py_DECREF(func);
1096 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001097 if (res == NULL)
1098 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001100 return 0;
1101}
1102
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001104 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001105 (binaryfunc)instance_subscript, /* mp_subscript */
1106 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001107};
1108
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001110instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001113
Guido van Rossum2878a691996-08-09 20:53:24 +00001114 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001115 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001116 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001117 if (func == NULL)
1118 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001119 arg = Py_BuildValue("(n)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122 return NULL;
1123 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 res = PyEval_CallObject(func, arg);
1125 Py_DECREF(func);
1126 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001127 return res;
1128}
1129
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001131sliceobj_from_intint(Py_ssize_t i, Py_ssize_t j)
Thomas Wouters1d75a792000-08-17 22:37:32 +00001132{
1133 PyObject *start, *end, *res;
1134
1135 start = PyInt_FromLong((long)i);
1136 if (!start)
1137 return NULL;
Tim Peters34592512002-07-11 06:23:50 +00001138
Thomas Wouters1d75a792000-08-17 22:37:32 +00001139 end = PyInt_FromLong((long)j);
1140 if (!end) {
1141 Py_DECREF(start);
1142 return NULL;
1143 }
1144 res = PySlice_New(start, end, NULL);
1145 Py_DECREF(start);
1146 Py_DECREF(end);
1147 return res;
1148}
1149
1150
1151static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001152instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001153{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001154 PyObject *func, *arg, *res;
1155 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001156
Guido van Rossum2878a691996-08-09 20:53:24 +00001157 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001158 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001159 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001160
1161 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001162 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1163 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001164 PyErr_Clear();
1165
1166 if (getitemstr == NULL)
1167 getitemstr = PyString_InternFromString("__getitem__");
1168 func = instance_getattr(inst, getitemstr);
1169 if (func == NULL)
1170 return NULL;
1171 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
Tim Peters34592512002-07-11 06:23:50 +00001172 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001173 arg = Py_BuildValue("(nn)", i, j);
Tim Peters34592512002-07-11 06:23:50 +00001174
Guido van Rossum04691fc1992-08-12 15:35:34 +00001175 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001177 return NULL;
1178 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179 res = PyEval_CallObject(func, arg);
1180 Py_DECREF(func);
1181 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001182 return res;
1183}
1184
1185static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001186instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001187{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001189
Guido van Rossum2878a691996-08-09 20:53:24 +00001190 if (item == NULL) {
1191 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001192 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001193 func = instance_getattr(inst, delitemstr);
1194 }
1195 else {
1196 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001197 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001198 func = instance_getattr(inst, setitemstr);
1199 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001200 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001201 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001202 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001204 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001206 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001208 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 res = PyEval_CallObject(func, arg);
1211 Py_DECREF(func);
1212 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001213 if (res == NULL)
1214 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001216 return 0;
1217}
1218
1219static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001220instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001221{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 PyObject *func, *arg, *res;
1223 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001224
Guido van Rossum2878a691996-08-09 20:53:24 +00001225 if (value == NULL) {
1226 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227 delslicestr =
1228 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001229 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001230 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001231 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1232 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001233 PyErr_Clear();
1234 if (delitemstr == NULL)
1235 delitemstr =
1236 PyString_InternFromString("__delitem__");
1237 func = instance_getattr(inst, delitemstr);
1238 if (func == NULL)
1239 return -1;
1240
1241 arg = Py_BuildValue("(N)",
1242 sliceobj_from_intint(i, j));
1243 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001244 arg = Py_BuildValue("(nn)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001245 }
1246 else {
1247 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 setslicestr =
1249 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001250 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001251 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001252 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1253 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001254 PyErr_Clear();
1255 if (setitemstr == NULL)
1256 setitemstr =
1257 PyString_InternFromString("__setitem__");
1258 func = instance_getattr(inst, setitemstr);
1259 if (func == NULL)
1260 return -1;
1261
1262 arg = Py_BuildValue("(NO)",
1263 sliceobj_from_intint(i, j), value);
1264 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001265 arg = Py_BuildValue("(nnO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001266 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001267 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001269 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001270 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 res = PyEval_CallObject(func, arg);
1272 Py_DECREF(func);
1273 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001274 if (res == NULL)
1275 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001276 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001277 return 0;
1278}
1279
Tim Peterscb8d3682001-05-05 21:05:01 +00001280static int
1281instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001282{
1283 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001284 PyObject *func;
1285
1286 /* Try __contains__ first.
1287 * If that can't be done, try iterator-based searching.
1288 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001289
1290 if(__contains__ == NULL) {
1291 __contains__ = PyString_InternFromString("__contains__");
1292 if(__contains__ == NULL)
1293 return -1;
1294 }
1295 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001296 if (func) {
1297 PyObject *res;
1298 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001299 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001300 if(arg == NULL) {
1301 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001302 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001303 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001304 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001305 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001306 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001307 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001308 return -1;
1309 ret = PyObject_IsTrue(res);
1310 Py_DECREF(res);
1311 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001312 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001313
1314 /* Couldn't find __contains__. */
1315 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1316 /* Assume the failure was simply due to that there is no
1317 * __contains__ attribute, and try iterating instead.
1318 */
1319 PyErr_Clear();
Tim Peters16a77ad2001-09-08 04:00:12 +00001320 return _PySequence_IterSearch((PyObject *)inst, member,
1321 PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001322 }
1323 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001324 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001325}
1326
Fred Drake79912472000-07-09 04:06:11 +00001327static PySequenceMethods
1328instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001329 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001330 0, /* sq_concat */
1331 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001332 (ssizeargfunc)instance_item, /* sq_item */
1333 (ssizessizeargfunc)instance_slice, /* sq_slice */
1334 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1335 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001336 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001337};
1338
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001340generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001341{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001343
1344 if ((func = instance_getattr(self, methodname)) == NULL)
1345 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 res = PyEval_CallObject(func, (PyObject *)NULL);
1347 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001348 return res;
1349}
1350
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001351static PyObject *
1352generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001353{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001354 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001356 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001357 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001358 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001359 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001361 Py_INCREF(Py_NotImplemented);
1362 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001363 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001364 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001365 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001367 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001368 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001369 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 Py_DECREF(args);
1371 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001372 return result;
1373}
1374
1375
1376static PyObject *coerce_obj;
1377
1378/* Try one half of a binary operator involving a class instance. */
1379static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001380half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001381 int swapped)
1382{
1383 PyObject *args;
1384 PyObject *coercefunc;
1385 PyObject *coerced = NULL;
1386 PyObject *v1;
1387 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001388
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001389 if (!PyInstance_Check(v)) {
1390 Py_INCREF(Py_NotImplemented);
1391 return Py_NotImplemented;
1392 }
1393
1394 if (coerce_obj == NULL) {
1395 coerce_obj = PyString_InternFromString("__coerce__");
1396 if (coerce_obj == NULL)
1397 return NULL;
1398 }
1399 coercefunc = PyObject_GetAttr(v, coerce_obj);
1400 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001401 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1402 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001403 PyErr_Clear();
1404 return generic_binary_op(v, w, opname);
1405 }
1406
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001407 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001408 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001409 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001410 return NULL;
1411 }
1412 coerced = PyEval_CallObject(coercefunc, args);
1413 Py_DECREF(args);
1414 Py_DECREF(coercefunc);
1415 if (coerced == NULL) {
1416 return NULL;
1417 }
1418 if (coerced == Py_None || coerced == Py_NotImplemented) {
1419 Py_DECREF(coerced);
1420 return generic_binary_op(v, w, opname);
1421 }
1422 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1423 Py_DECREF(coerced);
1424 PyErr_SetString(PyExc_TypeError,
1425 "coercion should return None or 2-tuple");
1426 return NULL;
1427 }
1428 v1 = PyTuple_GetItem(coerced, 0);
1429 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001430 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001431 /* prevent recursion if __coerce__ returns self as the first
1432 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001433 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001434 } else {
1435 if (swapped)
1436 result = (thisfunc)(w, v1);
1437 else
1438 result = (thisfunc)(v1, w);
1439 }
1440 Py_DECREF(coerced);
1441 return result;
1442}
1443
1444/* Implement a binary operator involving at least one class instance. */
1445static PyObject *
1446do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1447 binaryfunc thisfunc)
1448{
1449 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1450 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001451 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001452 result = half_binop(w, v, ropname, thisfunc, 1);
1453 }
1454 return result;
1455}
1456
1457static PyObject *
1458do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1459 char *ropname, binaryfunc thisfunc)
1460{
1461 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1462 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001463 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001464 result = do_binop(v, w, opname, ropname, thisfunc);
1465 }
1466 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001467}
1468
Guido van Rossum879c5811995-01-10 15:24:06 +00001469static int
Fred Drake79912472000-07-09 04:06:11 +00001470instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001471{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 PyObject *v = *pv;
1473 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001474 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 PyObject *args;
1476 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001477
Guido van Rossum2878a691996-08-09 20:53:24 +00001478 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001479 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001480 if (coerce_obj == NULL)
1481 return -1;
1482 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001483 coercefunc = PyObject_GetAttr(v, coerce_obj);
1484 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001485 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001486 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1487 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001488 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001489 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001490 }
1491 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001492 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001493 if (args == NULL) {
1494 return -1;
1495 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001496 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001498 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001499 if (coerced == NULL) {
1500 /* __coerce__ call raised an exception */
1501 return -1;
1502 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001503 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001504 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001506 return 1;
1507 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001509 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 Py_DECREF(coerced);
1511 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001512 "coercion should return None or 2-tuple");
1513 return -1;
1514 }
1515 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516 *pv = PyTuple_GetItem(coerced, 0);
1517 *pw = PyTuple_GetItem(coerced, 1);
1518 Py_INCREF(*pv);
1519 Py_INCREF(*pw);
1520 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001521 return 0;
1522}
1523
Guido van Rossum04691fc1992-08-12 15:35:34 +00001524#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001525static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001527 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001528 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001529}
1530
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001531#define BINARY(f, m, n) \
1532static PyObject *f(PyObject *v, PyObject *w) { \
1533 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1534}
1535
1536#define BINARY_INPLACE(f, m, n) \
1537static PyObject *f(PyObject *v, PyObject *w) { \
1538 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1539 "__r" m "__", n); \
1540}
1541
Guido van Rossum04691fc1992-08-12 15:35:34 +00001542UNARY(instance_neg, "__neg__")
1543UNARY(instance_pos, "__pos__")
1544UNARY(instance_abs, "__abs__")
1545
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001546BINARY(instance_or, "or", PyNumber_Or)
1547BINARY(instance_and, "and", PyNumber_And)
1548BINARY(instance_xor, "xor", PyNumber_Xor)
1549BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1550BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1551BINARY(instance_add, "add", PyNumber_Add)
1552BINARY(instance_sub, "sub", PyNumber_Subtract)
1553BINARY(instance_mul, "mul", PyNumber_Multiply)
1554BINARY(instance_div, "div", PyNumber_Divide)
1555BINARY(instance_mod, "mod", PyNumber_Remainder)
1556BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001557BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1558BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001559
1560BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1561BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1562BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1563BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1564BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1565BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1566BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1567BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1568BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1569BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001570BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1571BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001572
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001573/* Try a 3-way comparison, returning an int; v is an instance. Return:
1574 -2 for an exception;
1575 -1 if v < w;
1576 0 if v == w;
1577 1 if v > w;
1578 2 if this particular 3-way comparison is not implemented or undefined.
1579*/
1580static int
1581half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001582{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001583 static PyObject *cmp_obj;
1584 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001585 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001586 PyObject *result;
1587 long l;
1588
1589 assert(PyInstance_Check(v));
1590
1591 if (cmp_obj == NULL) {
1592 cmp_obj = PyString_InternFromString("__cmp__");
1593 if (cmp_obj == NULL)
1594 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001595 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001596
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001597 cmp_func = PyObject_GetAttr(v, cmp_obj);
1598 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001599 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1600 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001601 PyErr_Clear();
1602 return 2;
1603 }
1604
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001605 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001606 if (args == NULL) {
1607 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001608 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001609 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001610
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001611 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001612 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001613 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001614
1615 if (result == NULL)
1616 return -2;
1617
1618 if (result == Py_NotImplemented) {
1619 Py_DECREF(result);
1620 return 2;
1621 }
1622
1623 l = PyInt_AsLong(result);
1624 Py_DECREF(result);
1625 if (l == -1 && PyErr_Occurred()) {
1626 PyErr_SetString(PyExc_TypeError,
1627 "comparison did not return an int");
1628 return -2;
1629 }
1630
1631 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001632}
1633
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001634/* Try a 3-way comparison, returning an int; either v or w is an instance.
1635 We first try a coercion. 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 THIS IS ONLY CALLED FROM object.c!
1642*/
1643static int
1644instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001645{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001646 int c;
1647
1648 c = PyNumber_CoerceEx(&v, &w);
1649 if (c < 0)
1650 return -2;
1651 if (c == 0) {
1652 /* If neither is now an instance, use regular comparison */
1653 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1654 c = PyObject_Compare(v, w);
1655 Py_DECREF(v);
1656 Py_DECREF(w);
1657 if (PyErr_Occurred())
1658 return -2;
1659 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001660 }
1661 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001662 else {
1663 /* The coercion didn't do anything.
1664 Treat this the same as returning v and w unchanged. */
1665 Py_INCREF(v);
1666 Py_INCREF(w);
1667 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001668
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001669 if (PyInstance_Check(v)) {
1670 c = half_cmp(v, w);
1671 if (c <= 1) {
1672 Py_DECREF(v);
1673 Py_DECREF(w);
1674 return c;
1675 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001676 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001677 if (PyInstance_Check(w)) {
1678 c = half_cmp(w, v);
1679 if (c <= 1) {
1680 Py_DECREF(v);
1681 Py_DECREF(w);
1682 if (c >= -1)
1683 c = -c;
1684 return c;
1685 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001686 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001687 Py_DECREF(v);
1688 Py_DECREF(w);
1689 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001690}
1691
Guido van Rossum9bfef441993-03-29 10:43:31 +00001692static int
Fred Drake79912472000-07-09 04:06:11 +00001693instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001694{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001696 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001697 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001698
Guido van Rossum2878a691996-08-09 20:53:24 +00001699 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001700 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001701 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001702 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1703 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001705 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001706 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001707 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001708 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1709 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001711 /* Fall back to the default behavior:
1712 all instances are nonzero */
1713 return 1;
1714 }
1715 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001716 res = PyEval_CallObject(func, (PyObject *)NULL);
1717 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001718 if (res == NULL)
1719 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720 if (!PyInt_Check(res)) {
1721 Py_DECREF(res);
1722 PyErr_SetString(PyExc_TypeError,
1723 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001724 return -1;
1725 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001726 outcome = PyInt_AsLong(res);
1727 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001728 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001729 PyErr_SetString(PyExc_ValueError,
1730 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001731 return -1;
1732 }
1733 return outcome > 0;
1734}
1735
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001736static Py_ssize_t
1737instance_index(PyInstanceObject *self)
1738{
1739 PyObject *func, *res;
1740 Py_ssize_t outcome;
1741 static PyObject *indexstr = NULL;
1742
1743 if (indexstr == NULL) {
1744 indexstr = PyString_InternFromString("__index__");
1745 if (indexstr == NULL)
1746 return -1;
1747 }
1748 if ((func = instance_getattr(self, indexstr)) == NULL) {
1749 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1750 return -1;
1751 PyErr_Clear();
1752 PyErr_SetString(PyExc_TypeError,
1753 "object cannot be interpreted as an index");
1754 return -1;
1755 }
1756 res = PyEval_CallObject(func, (PyObject *)NULL);
1757 Py_DECREF(func);
1758 if (res == NULL)
1759 return -1;
1760 if (PyInt_Check(res) || PyLong_Check(res)) {
1761 outcome = res->ob_type->tp_as_number->nb_index(res);
1762 }
1763 else {
1764 PyErr_SetString(PyExc_TypeError,
1765 "__index__ must return an int or a long");
1766 outcome = -1;
1767 }
1768 Py_DECREF(res);
1769 return outcome;
1770}
1771
1772
Guido van Rossum04691fc1992-08-12 15:35:34 +00001773UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001774UNARY(instance_int, "__int__")
1775UNARY(instance_long, "__long__")
1776UNARY(instance_float, "__float__")
1777UNARY(instance_oct, "__oct__")
1778UNARY(instance_hex, "__hex__")
1779
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001780static PyObject *
1781bin_power(PyObject *v, PyObject *w)
1782{
1783 return PyNumber_Power(v, w, Py_None);
1784}
1785
Guido van Rossum03093a21994-09-28 15:51:32 +00001786/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001788instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001789{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001790 if (z == Py_None) {
1791 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001792 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001793 else {
1794 PyObject *func;
1795 PyObject *args;
1796 PyObject *result;
1797
1798 /* XXX Doesn't do coercions... */
1799 func = PyObject_GetAttrString(v, "__pow__");
1800 if (func == NULL)
1801 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001802 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001803 if (args == NULL) {
1804 Py_DECREF(func);
1805 return NULL;
1806 }
1807 result = PyEval_CallObject(func, args);
1808 Py_DECREF(func);
1809 Py_DECREF(args);
1810 return result;
1811 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001812}
1813
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001814static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001815bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001816{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001817 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001818}
1819
1820
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001821static PyObject *
1822instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1823{
1824 if (z == Py_None) {
1825 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1826 "__rpow__", bin_inplace_power);
1827 }
1828 else {
1829 /* XXX Doesn't do coercions... */
1830 PyObject *func;
1831 PyObject *args;
1832 PyObject *result;
1833
1834 func = PyObject_GetAttrString(v, "__ipow__");
1835 if (func == NULL) {
1836 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1837 return NULL;
1838 PyErr_Clear();
1839 return instance_pow(v, w, z);
1840 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001841 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001842 if (args == NULL) {
1843 Py_DECREF(func);
1844 return NULL;
1845 }
1846 result = PyEval_CallObject(func, args);
1847 Py_DECREF(func);
1848 Py_DECREF(args);
1849 return result;
1850 }
1851}
1852
1853
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001854/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001855#define NAME_OPS 6
1856static PyObject **name_op = NULL;
1857
Tim Peters34592512002-07-11 06:23:50 +00001858static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001859init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001860{
1861 int i;
1862 char *_name_op[] = {
1863 "__lt__",
1864 "__le__",
1865 "__eq__",
1866 "__ne__",
1867 "__gt__",
1868 "__ge__",
1869 };
1870
1871 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1872 if (name_op == NULL)
1873 return -1;
1874 for (i = 0; i < NAME_OPS; ++i) {
1875 name_op[i] = PyString_InternFromString(_name_op[i]);
1876 if (name_op[i] == NULL)
1877 return -1;
1878 }
1879 return 0;
1880}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001881
1882static PyObject *
1883half_richcompare(PyObject *v, PyObject *w, int op)
1884{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001885 PyObject *method;
1886 PyObject *args;
1887 PyObject *res;
1888
1889 assert(PyInstance_Check(v));
1890
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001891 if (name_op == NULL) {
1892 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001893 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001894 }
1895 /* If the instance doesn't define an __getattr__ method, use
1896 instance_getattr2 directly because it will not set an
1897 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001898 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001899 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001900 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001901 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001902 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001903 if (method == NULL) {
1904 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001905 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1906 return NULL;
1907 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001908 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001909 res = Py_NotImplemented;
1910 Py_INCREF(res);
1911 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001912 }
1913
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001914 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001915 if (args == NULL) {
1916 Py_DECREF(method);
1917 return NULL;
1918 }
1919
1920 res = PyEval_CallObject(method, args);
1921 Py_DECREF(args);
1922 Py_DECREF(method);
1923
1924 return res;
1925}
1926
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001927static PyObject *
1928instance_richcompare(PyObject *v, PyObject *w, int op)
1929{
1930 PyObject *res;
1931
1932 if (PyInstance_Check(v)) {
1933 res = half_richcompare(v, w, op);
1934 if (res != Py_NotImplemented)
1935 return res;
1936 Py_DECREF(res);
1937 }
1938
1939 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00001940 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001941 if (res != Py_NotImplemented)
1942 return res;
1943 Py_DECREF(res);
1944 }
1945
1946 Py_INCREF(Py_NotImplemented);
1947 return Py_NotImplemented;
1948}
1949
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001950
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001951/* Get the iterator */
1952static PyObject *
1953instance_getiter(PyInstanceObject *self)
1954{
1955 PyObject *func;
1956
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001957 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001958 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001959 if (iterstr == NULL)
1960 return NULL;
1961 }
1962 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001963 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001964 if (getitemstr == NULL)
1965 return NULL;
1966 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001967
1968 if ((func = instance_getattr(self, iterstr)) != NULL) {
1969 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1970 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001971 if (res != NULL && !PyIter_Check(res)) {
1972 PyErr_Format(PyExc_TypeError,
1973 "__iter__ returned non-iterator "
1974 "of type '%.100s'",
1975 res->ob_type->tp_name);
1976 Py_DECREF(res);
1977 res = NULL;
1978 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001979 return res;
1980 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001981 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1982 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001983 PyErr_Clear();
1984 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001985 PyErr_SetString(PyExc_TypeError,
1986 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001987 return NULL;
1988 }
1989 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001990 return PySeqIter_New((PyObject *)self);
1991}
1992
1993
1994/* Call the iterator's next */
1995static PyObject *
1996instance_iternext(PyInstanceObject *self)
1997{
1998 PyObject *func;
1999
2000 if (nextstr == NULL)
2001 nextstr = PyString_InternFromString("next");
2002
2003 if ((func = instance_getattr(self, nextstr)) != NULL) {
2004 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2005 Py_DECREF(func);
2006 if (res != NULL) {
2007 return res;
2008 }
2009 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
2010 PyErr_Clear();
2011 return NULL;
2012 }
2013 return NULL;
2014 }
2015 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
2016 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002017}
2018
Tim Peters6d6c1a32001-08-02 04:15:00 +00002019static PyObject *
2020instance_call(PyObject *func, PyObject *arg, PyObject *kw)
2021{
2022 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2023 if (call == NULL) {
2024 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002025 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2026 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002027 PyErr_Clear();
2028 PyErr_Format(PyExc_AttributeError,
2029 "%.200s instance has no __call__ method",
2030 PyString_AsString(inst->in_class->cl_name));
2031 return NULL;
2032 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00002033 /* We must check and increment the recursion depth here. Scenario:
2034 class A:
2035 pass
2036 A.__call__ = A() # that's right
2037 a = A() # ok
2038 a() # infinite recursion
2039 This bounces between instance_call() and PyObject_Call() without
2040 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002041 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002042 res = NULL;
2043 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00002044 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00002045 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00002046 Py_LeaveRecursiveCall();
2047 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002048 Py_DECREF(call);
2049 return res;
2050}
2051
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002053static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002054 (binaryfunc)instance_add, /* nb_add */
2055 (binaryfunc)instance_sub, /* nb_subtract */
2056 (binaryfunc)instance_mul, /* nb_multiply */
2057 (binaryfunc)instance_div, /* nb_divide */
2058 (binaryfunc)instance_mod, /* nb_remainder */
2059 (binaryfunc)instance_divmod, /* nb_divmod */
2060 (ternaryfunc)instance_pow, /* nb_power */
2061 (unaryfunc)instance_neg, /* nb_negative */
2062 (unaryfunc)instance_pos, /* nb_positive */
2063 (unaryfunc)instance_abs, /* nb_absolute */
2064 (inquiry)instance_nonzero, /* nb_nonzero */
2065 (unaryfunc)instance_invert, /* nb_invert */
2066 (binaryfunc)instance_lshift, /* nb_lshift */
2067 (binaryfunc)instance_rshift, /* nb_rshift */
2068 (binaryfunc)instance_and, /* nb_and */
2069 (binaryfunc)instance_xor, /* nb_xor */
2070 (binaryfunc)instance_or, /* nb_or */
2071 (coercion)instance_coerce, /* nb_coerce */
2072 (unaryfunc)instance_int, /* nb_int */
2073 (unaryfunc)instance_long, /* nb_long */
2074 (unaryfunc)instance_float, /* nb_float */
2075 (unaryfunc)instance_oct, /* nb_oct */
2076 (unaryfunc)instance_hex, /* nb_hex */
2077 (binaryfunc)instance_iadd, /* nb_inplace_add */
2078 (binaryfunc)instance_isub, /* nb_inplace_subtract */
2079 (binaryfunc)instance_imul, /* nb_inplace_multiply */
2080 (binaryfunc)instance_idiv, /* nb_inplace_divide */
2081 (binaryfunc)instance_imod, /* nb_inplace_remainder */
2082 (ternaryfunc)instance_ipow, /* nb_inplace_power */
2083 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
2084 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
2085 (binaryfunc)instance_iand, /* nb_inplace_and */
2086 (binaryfunc)instance_ixor, /* nb_inplace_xor */
2087 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum4668b002001-08-08 05:00:18 +00002088 (binaryfunc)instance_floordiv, /* nb_floor_divide */
2089 (binaryfunc)instance_truediv, /* nb_true_divide */
2090 (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
2091 (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002092 (lenfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002093};
2094
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002095PyTypeObject PyInstance_Type = {
2096 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002097 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002098 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002099 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002100 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002101 (destructor)instance_dealloc, /* tp_dealloc */
2102 0, /* tp_print */
2103 0, /* tp_getattr */
2104 0, /* tp_setattr */
2105 instance_compare, /* tp_compare */
2106 (reprfunc)instance_repr, /* tp_repr */
2107 &instance_as_number, /* tp_as_number */
2108 &instance_as_sequence, /* tp_as_sequence */
2109 &instance_as_mapping, /* tp_as_mapping */
2110 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002111 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002112 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002113 (getattrofunc)instance_getattr, /* tp_getattro */
2114 (setattrofunc)instance_setattr, /* tp_setattro */
2115 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002116 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002117 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002118 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002119 0, /* tp_clear */
2120 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002121 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2122 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002123 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002124 0, /* tp_methods */
2125 0, /* tp_members */
2126 0, /* tp_getset */
2127 0, /* tp_base */
2128 0, /* tp_dict */
2129 0, /* tp_descr_get */
2130 0, /* tp_descr_set */
2131 0, /* tp_dictoffset */
2132 0, /* tp_init */
2133 0, /* tp_alloc */
2134 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002135};
2136
2137
Guido van Rossum81daa321993-05-20 14:24:46 +00002138/* Instance method objects are used for two purposes:
2139 (a) as bound instance methods (returned by instancename.methodname)
2140 (b) as unbound methods (returned by ClassName.methodname)
2141 In case (b), im_self is NULL
2142*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002143
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002144static PyMethodObject *free_list;
2145
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002146PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002147PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002149 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002150 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002151 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002152 return NULL;
2153 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002154 im = free_list;
2155 if (im != NULL) {
2156 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002157 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002158 }
2159 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002160 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002161 if (im == NULL)
2162 return NULL;
2163 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002164 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002165 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002166 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002167 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002168 im->im_self = self;
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002169 Py_XINCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00002170 im->im_class = class;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002171 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002172 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002173}
2174
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002175/* Descriptors for PyMethod attributes */
2176
2177/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002178
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002179#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002180
Guido van Rossum6f799372001-09-20 20:46:19 +00002181static PyMemberDef instancemethod_memberlist[] = {
2182 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2183 "the class associated with a method"},
2184 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2185 "the function (or other callable) implementing a method"},
2186 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2187 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002188 {NULL} /* Sentinel */
2189};
2190
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002191/* Christian Tismer argued convincingly that method attributes should
2192 (nearly) always override function attributes.
2193 The one exception is __doc__; there's a default __doc__ which
2194 should only be used for the class, not for instances */
2195
2196static PyObject *
2197instancemethod_get_doc(PyMethodObject *im, void *context)
2198{
2199 static PyObject *docstr;
2200 if (docstr == NULL) {
2201 docstr= PyString_InternFromString("__doc__");
2202 if (docstr == NULL)
2203 return NULL;
2204 }
2205 return PyObject_GetAttr(im->im_func, docstr);
2206}
2207
2208static PyGetSetDef instancemethod_getset[] = {
2209 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2210 {0}
2211};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002212
2213static PyObject *
2214instancemethod_getattro(PyObject *obj, PyObject *name)
2215{
2216 PyMethodObject *im = (PyMethodObject *)obj;
2217 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002218 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002219
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002220 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2221 if (tp->tp_dict == NULL) {
2222 if (PyType_Ready(tp) < 0)
2223 return NULL;
2224 }
2225 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002226 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002227
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002228 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002229 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2230 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002231 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002232 else {
2233 Py_INCREF(descr);
2234 return descr;
2235 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002236 }
2237
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002238 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002239}
2240
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002241PyDoc_STRVAR(instancemethod_doc,
2242"instancemethod(function, instance, class)\n\
2243\n\
2244Create an instance method object.");
2245
2246static PyObject *
2247instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2248{
2249 PyObject *func;
2250 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002251 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002252
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002253 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002254 &func, &self, &classObj))
2255 return NULL;
2256 if (!PyCallable_Check(func)) {
2257 PyErr_SetString(PyExc_TypeError,
2258 "first argument must be callable");
2259 return NULL;
2260 }
2261 if (self == Py_None)
2262 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002263 if (self == NULL && classObj == NULL) {
2264 PyErr_SetString(PyExc_TypeError,
2265 "unbound methods must have non-NULL im_class");
2266 return NULL;
2267 }
2268
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002269 return PyMethod_New(func, self, classObj);
2270}
2271
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002272static void
Fred Drake79912472000-07-09 04:06:11 +00002273instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002274{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002275 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002276 if (im->im_weakreflist != NULL)
2277 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002278 Py_DECREF(im->im_func);
2279 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002280 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002281 im->im_self = (PyObject *)free_list;
2282 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002283}
2284
Guido van Rossumebc8c511992-09-03 20:39:51 +00002285static int
Fred Drake79912472000-07-09 04:06:11 +00002286instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002287{
Guido van Rossume9df7271995-04-06 14:46:51 +00002288 if (a->im_self != b->im_self)
2289 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002290 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002291}
2292
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002293static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002294instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002295{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002296 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002297 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002298 PyObject *klass = a->im_class;
2299 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2300 char *sfuncname = "?", *sklassname = "?";
2301
2302 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002303 if (funcname == NULL) {
2304 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2305 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002306 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002307 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002308 else if (!PyString_Check(funcname)) {
2309 Py_DECREF(funcname);
2310 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002311 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002312 else
2313 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002314 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002315 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002316 else {
2317 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002318 if (klassname == NULL) {
2319 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2320 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002321 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002322 }
Guido van Rossum40667692001-08-17 13:59:27 +00002323 else if (!PyString_Check(klassname)) {
2324 Py_DECREF(klassname);
2325 klassname = NULL;
2326 }
2327 else
2328 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002329 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002330 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002331 result = PyString_FromFormat("<unbound method %s.%s>",
2332 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002333 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002334 /* XXX Shouldn't use repr() here! */
2335 PyObject *selfrepr = PyObject_Repr(self);
2336 if (selfrepr == NULL)
2337 goto fail;
2338 if (!PyString_Check(selfrepr)) {
2339 Py_DECREF(selfrepr);
2340 goto fail;
2341 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002342 result = PyString_FromFormat("<bound method %s.%s of %s>",
2343 sklassname, sfuncname,
2344 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002345 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002346 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002347 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002348 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002349 Py_XDECREF(klassname);
2350 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002351}
2352
Guido van Rossum9bfef441993-03-29 10:43:31 +00002353static long
Fred Drake79912472000-07-09 04:06:11 +00002354instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002355{
2356 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002357 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002358 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002359 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002360 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002361 if (x == -1)
2362 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002363 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002364 if (y == -1)
2365 return -1;
2366 return x ^ y;
2367}
2368
Jeremy Hylton8caad492000-06-23 14:18:11 +00002369static int
2370instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2371{
2372 int err;
2373 if (im->im_func) {
2374 err = visit(im->im_func, arg);
2375 if (err)
2376 return err;
2377 }
2378 if (im->im_self) {
2379 err = visit(im->im_self, arg);
2380 if (err)
2381 return err;
2382 }
2383 if (im->im_class) {
2384 err = visit(im->im_class, arg);
2385 if (err)
2386 return err;
2387 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002388 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002389}
2390
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002391static void
2392getclassname(PyObject *class, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002393{
2394 PyObject *name;
2395
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002396 assert(bufsize > 1);
2397 strcpy(buf, "?"); /* Default outcome */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002398 if (class == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002399 return;
2400 name = PyObject_GetAttrString(class, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002401 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002402 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002403 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002404 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002405 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002406 if (PyString_Check(name)) {
2407 strncpy(buf, PyString_AS_STRING(name), bufsize);
2408 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002409 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002410 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002411}
2412
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002413static void
2414getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002415{
2416 PyObject *class;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002417
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002418 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002419 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002420 strcpy(buf, "nothing");
2421 return;
2422 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002423
2424 class = PyObject_GetAttrString(inst, "__class__");
2425 if (class == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002426 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002427 PyErr_Clear();
2428 class = (PyObject *)(inst->ob_type);
2429 Py_INCREF(class);
2430 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002431 getclassname(class, buf, bufsize);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002432 Py_XDECREF(class);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002433}
2434
Tim Peters6d6c1a32001-08-02 04:15:00 +00002435static PyObject *
2436instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2437{
2438 PyObject *self = PyMethod_GET_SELF(func);
2439 PyObject *class = PyMethod_GET_CLASS(func);
2440 PyObject *result;
2441
2442 func = PyMethod_GET_FUNCTION(func);
2443 if (self == NULL) {
2444 /* Unbound methods must be called with an instance of
2445 the class (or a derived class) as first argument */
2446 int ok;
2447 if (PyTuple_Size(arg) >= 1)
2448 self = PyTuple_GET_ITEM(arg, 0);
2449 if (self == NULL)
2450 ok = 0;
2451 else {
2452 ok = PyObject_IsInstance(self, class);
2453 if (ok < 0)
2454 return NULL;
2455 }
2456 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002457 char clsbuf[256];
2458 char instbuf[256];
2459 getclassname(class, clsbuf, sizeof(clsbuf));
2460 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002461 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002462 "unbound method %s%s must be called with "
2463 "%s instance as first argument "
2464 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002465 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002466 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002467 clsbuf,
2468 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002469 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002470 return NULL;
2471 }
2472 Py_INCREF(arg);
2473 }
2474 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002475 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002476 PyObject *newarg = PyTuple_New(argcount + 1);
2477 int i;
2478 if (newarg == NULL)
2479 return NULL;
2480 Py_INCREF(self);
2481 PyTuple_SET_ITEM(newarg, 0, self);
2482 for (i = 0; i < argcount; i++) {
2483 PyObject *v = PyTuple_GET_ITEM(arg, i);
2484 Py_XINCREF(v);
2485 PyTuple_SET_ITEM(newarg, i+1, v);
2486 }
2487 arg = newarg;
2488 }
2489 result = PyObject_Call((PyObject *)func, arg, kw);
2490 Py_DECREF(arg);
2491 return result;
2492}
2493
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002494static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002495instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002496{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002497 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002498 of a class that's not a base class of cls. */
2499
2500 if (PyMethod_GET_SELF(meth) != NULL) {
2501 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002502 Py_INCREF(meth);
2503 return meth;
2504 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002505 /* No, it is an unbound method */
2506 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2507 /* Do subclass test. If it fails, return meth unchanged. */
2508 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2509 if (ok < 0)
2510 return NULL;
2511 if (!ok) {
2512 Py_INCREF(meth);
2513 return meth;
2514 }
2515 }
2516 /* Bind it to obj */
2517 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002518}
2519
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002520PyTypeObject PyMethod_Type = {
2521 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002522 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002523 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002524 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002525 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002526 (destructor)instancemethod_dealloc, /* tp_dealloc */
2527 0, /* tp_print */
2528 0, /* tp_getattr */
2529 0, /* tp_setattr */
2530 (cmpfunc)instancemethod_compare, /* tp_compare */
2531 (reprfunc)instancemethod_repr, /* tp_repr */
2532 0, /* tp_as_number */
2533 0, /* tp_as_sequence */
2534 0, /* tp_as_mapping */
2535 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002536 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002537 0, /* tp_str */
2538 (getattrofunc)instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002539 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002540 0, /* tp_as_buffer */
Raymond Hettingerbff60ae2005-06-19 08:42:20 +00002541 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002542 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002543 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002544 0, /* tp_clear */
2545 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002546 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2547 0, /* tp_iter */
2548 0, /* tp_iternext */
2549 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002550 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002551 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002552 0, /* tp_base */
2553 0, /* tp_dict */
2554 instancemethod_descr_get, /* tp_descr_get */
2555 0, /* tp_descr_set */
2556 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002557 0, /* tp_init */
2558 0, /* tp_alloc */
2559 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002560};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002561
2562/* Clear out the free list */
2563
2564void
Fred Drake79912472000-07-09 04:06:11 +00002565PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002566{
2567 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002568 PyMethodObject *im = free_list;
2569 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002570 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002571 }
2572}