blob: aab35c75deab0feafc056b79faafbacdfcc5f0c5 [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))
Thomas Wouters477c8d52006-05-27 19:21:47 +000084 return PyObject_CallFunctionObjArgs(
Guido van Rossum28d80b12001-09-07 21:08:32 +000085 (PyObject *) base->ob_type,
Thomas Wouters477c8d52006-05-27 19:21:47 +000086 name, bases, dict, NULL);
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000088 "PyClass_New: base must be a class");
89 return NULL;
90 }
91 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000093 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000094 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000095 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000098 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000101 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000103 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000104 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000105 getattrstr = PyString_InternFromString("__getattr__");
106 setattrstr = PyString_InternFromString("__setattr__");
107 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000108 }
109 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
110 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
111 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 Py_XINCREF(op->cl_getattr);
113 Py_XINCREF(op->cl_setattr);
114 Py_XINCREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000115 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117}
118
Guido van Rossumb479dc52001-09-05 22:52:50 +0000119PyObject *
120PyMethod_Function(PyObject *im)
121{
122 if (!PyMethod_Check(im)) {
123 PyErr_BadInternalCall();
124 return NULL;
125 }
126 return ((PyMethodObject *)im)->im_func;
127}
128
129PyObject *
130PyMethod_Self(PyObject *im)
131{
132 if (!PyMethod_Check(im)) {
133 PyErr_BadInternalCall();
134 return NULL;
135 }
136 return ((PyMethodObject *)im)->im_self;
137}
138
139PyObject *
140PyMethod_Class(PyObject *im)
141{
142 if (!PyMethod_Check(im)) {
143 PyErr_BadInternalCall();
144 return NULL;
145 }
146 return ((PyMethodObject *)im)->im_class;
147}
148
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149PyDoc_STRVAR(class_doc,
150"classobj(name, bases, dict)\n\
151\n\
152Create a class object. The name must be a string; the second argument\n\
153a tuple of classes, and the third a dictionary.");
154
155static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000156class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
157{
158 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000159 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000160
161 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
162 &name, &bases, &dict))
163 return NULL;
164 return PyClass_New(bases, dict, name);
165}
166
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167/* Class methods */
168
169static void
Fred Drake79912472000-07-09 04:06:11 +0000170class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000172 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_DECREF(op->cl_bases);
174 Py_DECREF(op->cl_dict);
175 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000176 Py_XDECREF(op->cl_getattr);
177 Py_XDECREF(op->cl_setattr);
178 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000179 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180}
181
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000183class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000184{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000185 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000187 if (value != NULL) {
188 *pclass = cp;
189 return value;
190 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000192 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000193 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 PyObject *v = class_lookup(
195 (PyClassObject *)
196 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000197 if (v != NULL)
198 return v;
199 }
200 return NULL;
201}
202
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000204class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 register PyObject *v;
207 register char *sname = PyString_AsString(name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000208 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000209 descrgetfunc f;
210
Guido van Rossum2878a691996-08-09 20:53:24 +0000211 if (sname[0] == '_' && sname[1] == '_') {
212 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 if (PyEval_GetRestricted()) {
214 PyErr_SetString(PyExc_RuntimeError,
215 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000216 return NULL;
217 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000219 return op->cl_dict;
220 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000221 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000223 return op->cl_bases;
224 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000225 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000226 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000228 else
229 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000231 return v;
232 }
Guido van Rossum94308391991-10-20 20:11:48 +0000233 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000234 v = class_lookup(op, name, &klass);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000235 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000236 PyErr_Format(PyExc_AttributeError,
237 "class %.50s has no attribute '%.400s'",
238 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000239 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000241 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000242 if (f == NULL)
243 Py_INCREF(v);
244 else
245 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000246 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
Guido van Rossuma63eff61998-05-29 21:37:21 +0000249static void
Fred Drake79912472000-07-09 04:06:11 +0000250set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000251{
252 PyObject *temp = *slot;
253 Py_XINCREF(v);
254 *slot = v;
255 Py_XDECREF(temp);
256}
257
Guido van Rossum7ba30431998-07-08 13:34:48 +0000258static void
Fred Drake79912472000-07-09 04:06:11 +0000259set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000260{
261 PyClassObject *dummy;
262
263 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
264 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
265 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
266}
267
Guido van Rossuma63eff61998-05-29 21:37:21 +0000268static char *
Fred Drake79912472000-07-09 04:06:11 +0000269set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000270{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000271 if (v == NULL || !PyDict_Check(v))
272 return "__dict__ must be a dictionary object";
273 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000274 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000275 return "";
276}
277
278static char *
Fred Drake79912472000-07-09 04:06:11 +0000279set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000280{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000281 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000282
283 if (v == NULL || !PyTuple_Check(v))
284 return "__bases__ must be a tuple object";
285 n = PyTuple_Size(v);
286 for (i = 0; i < n; i++) {
287 PyObject *x = PyTuple_GET_ITEM(v, i);
288 if (!PyClass_Check(x))
289 return "__bases__ items must be classes";
290 if (PyClass_IsSubclass(x, (PyObject *)c))
291 return "a __bases__ item causes an inheritance cycle";
292 }
293 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000294 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000295 return "";
296}
297
298static char *
Fred Drake79912472000-07-09 04:06:11 +0000299set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000300{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000301 if (v == NULL || !PyString_Check(v))
302 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000303 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000304 return "__name__ must not contain null bytes";
305 set_slot(&c->cl_name, v);
306 return "";
307}
308
Guido van Rossum94308391991-10-20 20:11:48 +0000309static int
Fred Drake79912472000-07-09 04:06:11 +0000310class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000311{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000312 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313 if (PyEval_GetRestricted()) {
314 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000315 "classes are read-only in restricted mode");
316 return -1;
317 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000318 sname = PyString_AsString(name);
319 if (sname[0] == '_' && sname[1] == '_') {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000320 Py_ssize_t n = PyString_Size(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000321 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000322 char *err = NULL;
323 if (strcmp(sname, "__dict__") == 0)
324 err = set_dict(op, v);
325 else if (strcmp(sname, "__bases__") == 0)
326 err = set_bases(op, v);
327 else if (strcmp(sname, "__name__") == 0)
328 err = set_name(op, v);
329 else if (strcmp(sname, "__getattr__") == 0)
330 set_slot(&op->cl_getattr, v);
331 else if (strcmp(sname, "__setattr__") == 0)
332 set_slot(&op->cl_setattr, v);
333 else if (strcmp(sname, "__delattr__") == 0)
334 set_slot(&op->cl_delattr, v);
335 /* For the last three, we fall through to update the
336 dictionary as well. */
337 if (err != NULL) {
338 if (*err == '\0')
339 return 0;
340 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000341 return -1;
342 }
343 }
344 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000345 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000347 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000348 PyErr_Format(PyExc_AttributeError,
349 "class %.50s has no attribute '%.400s'",
350 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000351 return rv;
352 }
Guido van Rossum94308391991-10-20 20:11:48 +0000353 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000355}
356
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000358class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000359{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000360 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000361 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000363 name = "?";
364 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000366 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000367 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000368 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000369 return PyString_FromFormat("<class %s.%s at %p>",
370 PyString_AsString(mod),
371 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000372}
373
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000374static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000375class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000376{
377 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
378 PyObject *name = op->cl_name;
379 PyObject *res;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000380 Py_ssize_t m, n;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000381
382 if (name == NULL || !PyString_Check(name))
383 return class_repr(op);
384 if (mod == NULL || !PyString_Check(mod)) {
385 Py_INCREF(name);
386 return name;
387 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000388 m = PyString_GET_SIZE(mod);
389 n = PyString_GET_SIZE(name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000390 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
391 if (res != NULL) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000392 char *s = PyString_AS_STRING(res);
393 memcpy(s, PyString_AS_STRING(mod), m);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000394 s += m;
395 *s++ = '.';
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000396 memcpy(s, PyString_AS_STRING(name), n);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000397 }
398 return res;
399}
400
Jeremy Hylton8caad492000-06-23 14:18:11 +0000401static int
402class_traverse(PyClassObject *o, visitproc visit, void *arg)
403{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000404 Py_VISIT(o->cl_bases);
405 Py_VISIT(o->cl_dict);
406 Py_VISIT(o->cl_name);
407 Py_VISIT(o->cl_getattr);
408 Py_VISIT(o->cl_setattr);
409 Py_VISIT(o->cl_delattr);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000410 return 0;
411}
412
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413PyTypeObject PyClass_Type = {
414 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000416 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000417 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000419 (destructor)class_dealloc, /* tp_dealloc */
420 0, /* tp_print */
421 0, /* tp_getattr */
422 0, /* tp_setattr */
423 0, /* tp_compare */
424 (reprfunc)class_repr, /* tp_repr */
425 0, /* tp_as_number */
426 0, /* tp_as_sequence */
427 0, /* tp_as_mapping */
428 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000429 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000430 (reprfunc)class_str, /* tp_str */
431 (getattrofunc)class_getattr, /* tp_getattro */
432 (setattrofunc)class_setattr, /* tp_setattro */
433 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000434 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000435 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000436 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000437 0, /* tp_clear */
438 0, /* tp_richcompare */
439 0, /* tp_weaklistoffset */
440 0, /* tp_iter */
441 0, /* tp_iternext */
442 0, /* tp_methods */
443 0, /* tp_members */
444 0, /* tp_getset */
445 0, /* tp_base */
446 0, /* tp_dict */
447 0, /* tp_descr_get */
448 0, /* tp_descr_set */
449 0, /* tp_dictoffset */
450 0, /* tp_init */
451 0, /* tp_alloc */
452 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453};
454
Guido van Rossum81daa321993-05-20 14:24:46 +0000455int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000456PyClass_IsSubclass(PyObject *klass, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000457{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000458 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 PyClassObject *cp;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000460 if (klass == base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000461 return 1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000462 if (PyTuple_Check(base)) {
463 n = PyTuple_GET_SIZE(base);
464 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000465 if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000466 return 1;
467 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000468 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000469 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000470 if (klass == NULL || !PyClass_Check(klass))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000471 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000472 cp = (PyClassObject *)klass;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000474 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000476 return 1;
477 }
478 return 0;
479}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480
Guido van Rossum81daa321993-05-20 14:24:46 +0000481
482/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000485PyInstance_NewRaw(PyObject *klass, PyObject *dict)
486{
487 PyInstanceObject *inst;
488
489 if (!PyClass_Check(klass)) {
490 PyErr_BadInternalCall();
491 return NULL;
492 }
493 if (dict == NULL) {
494 dict = PyDict_New();
495 if (dict == NULL)
496 return NULL;
497 }
498 else {
499 if (!PyDict_Check(dict)) {
500 PyErr_BadInternalCall();
501 return NULL;
502 }
503 Py_INCREF(dict);
504 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000505 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000506 if (inst == NULL) {
507 Py_DECREF(dict);
508 return NULL;
509 }
Fred Drake4e262a92001-03-22 18:26:47 +0000510 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000511 Py_INCREF(klass);
512 inst->in_class = (PyClassObject *)klass;
513 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000514 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000515 return (PyObject *)inst;
516}
517
518PyObject *
519PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 register PyInstanceObject *inst;
522 PyObject *init;
523 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000524
525 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000526 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000527 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000528 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000529 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000530 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000531 if (init == NULL) {
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000532 if (PyErr_Occurred()) {
533 Py_DECREF(inst);
534 return NULL;
535 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536 if ((arg != NULL && (!PyTuple_Check(arg) ||
537 PyTuple_Size(arg) != 0))
538 || (kw != NULL && (!PyDict_Check(kw) ||
539 PyDict_Size(kw) != 0))) {
540 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000541 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000543 inst = NULL;
544 }
545 }
546 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
548 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000549 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000551 inst = NULL;
552 }
553 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 if (res != Py_None) {
555 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000556 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000558 inst = NULL;
559 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000561 }
562 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564}
565
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000566/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000568PyDoc_STRVAR(instance_doc,
569"instance(class[, dict])\n\
570\n\
571Create an instance without calling its __init__() method.\n\
572The class must be a classic class.\n\
573If present, dict must be a dictionary or None.");
574
575static PyObject *
576instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
577{
578 PyObject *klass;
579 PyObject *dict = Py_None;
580
581 if (!PyArg_ParseTuple(args, "O!|O:instance",
582 &PyClass_Type, &klass, &dict))
583 return NULL;
584
585 if (dict == Py_None)
586 dict = NULL;
587 else if (!PyDict_Check(dict)) {
588 PyErr_SetString(PyExc_TypeError,
589 "instance() second arg must be dictionary or None");
590 return NULL;
591 }
592 return PyInstance_NewRaw(klass, dict);
593}
594
595
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596static void
Fred Drake79912472000-07-09 04:06:11 +0000597instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000598{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 PyObject *error_type, *error_value, *error_traceback;
600 PyObject *del;
601 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000602
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000603 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000604 if (inst->in_weakreflist != NULL)
605 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000606
Tim Peters6b184912000-09-17 14:40:17 +0000607 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000608 assert(inst->ob_type == &PyInstance_Type);
609 assert(inst->ob_refcnt == 0);
610 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000611
612 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000614 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000615 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000616 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000617 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000619 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000620 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000621 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 Py_DECREF(res);
623 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000624 }
Tim Peters6b184912000-09-17 14:40:17 +0000625 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000627
Tim Peters6b184912000-09-17 14:40:17 +0000628 /* Undo the temporary resurrection; can't use DECREF here, it would
629 * cause a recursive call.
630 */
Tim Peters34592512002-07-11 06:23:50 +0000631 assert(inst->ob_refcnt > 0);
632 if (--inst->ob_refcnt == 0) {
633 Py_DECREF(inst->in_class);
634 Py_XDECREF(inst->in_dict);
635 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000636 }
Tim Peters34592512002-07-11 06:23:50 +0000637 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000638 Py_ssize_t refcnt = inst->ob_refcnt;
Tim Peters34592512002-07-11 06:23:50 +0000639 /* __del__ resurrected it! Make it look like the original
640 * Py_DECREF never happened.
641 */
642 _Py_NewReference((PyObject *)inst);
643 inst->ob_refcnt = refcnt;
644 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000645 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
646 * we need to undo that. */
647 _Py_DEC_REFTOTAL;
648 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
649 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000650 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000651 * _Py_NewReference bumped tp_allocs: both of those need to be
652 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000653 */
Tim Peters6b184912000-09-17 14:40:17 +0000654#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000655 --inst->ob_type->tp_frees;
656 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000657#endif
Tim Peters34592512002-07-11 06:23:50 +0000658 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659}
660
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000662instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000663{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 register PyObject *v;
665 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000666 if (sname[0] == '_' && sname[1] == '_') {
667 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 if (PyEval_GetRestricted()) {
669 PyErr_SetString(PyExc_RuntimeError,
670 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000671 return NULL;
672 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000674 return inst->in_dict;
675 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000676 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 Py_INCREF(inst->in_class);
678 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000679 }
Guido van Rossum94308391991-10-20 20:11:48 +0000680 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000681 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000682 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000683 PyErr_Format(PyExc_AttributeError,
684 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000685 PyString_AS_STRING(inst->in_class->cl_name), sname);
686 }
687 return v;
688}
689
690static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000691instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000692{
693 register PyObject *v;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000694 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000695 descrgetfunc f;
696
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000698 if (v != NULL) {
699 Py_INCREF(v);
700 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000701 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000702 v = class_lookup(inst->in_class, name, &klass);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000703 if (v != NULL) {
704 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000705 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000706 if (f != NULL) {
707 PyObject *w = f(v, (PyObject *)inst,
708 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000710 v = w;
711 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000712 }
713 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000714}
715
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000717instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000718{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000720 res = instance_getattr1(inst, name);
721 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000723 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
724 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000726 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000727 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000728 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 res = PyEval_CallObject(func, args);
730 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000731 }
732 return res;
733}
734
Tim Petersdf875b92003-04-07 17:51:59 +0000735/* See classobject.h comments: this only does dict lookups, and is always
736 * safe to call.
737 */
738PyObject *
739_PyInstance_Lookup(PyObject *pinst, PyObject *name)
740{
741 PyObject *v;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000742 PyClassObject *klass;
Tim Petersdf875b92003-04-07 17:51:59 +0000743 PyInstanceObject *inst; /* pinst cast to the right type */
744
745 assert(PyInstance_Check(pinst));
746 inst = (PyInstanceObject *)pinst;
747
748 assert(PyString_Check(name));
749
750 v = PyDict_GetItem(inst->in_dict, name);
751 if (v == NULL)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000752 v = class_lookup(inst->in_class, name, &klass);
Tim Petersdf875b92003-04-07 17:51:59 +0000753 return v;
754}
755
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000756static int
Fred Drake79912472000-07-09 04:06:11 +0000757instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758{
Guido van Rossum94472a01992-09-04 09:45:18 +0000759 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000761 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000762 PyErr_Format(PyExc_AttributeError,
763 "%.50s instance has no attribute '%.400s'",
764 PyString_AS_STRING(inst->in_class->cl_name),
765 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000766 return rv;
767 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000770}
771
Guido van Rossume7737541994-09-05 07:31:41 +0000772static int
Fred Drake79912472000-07-09 04:06:11 +0000773instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000774{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000775 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000777 if (sname[0] == '_' && sname[1] == '_') {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000778 Py_ssize_t n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000779 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000780 if (strcmp(sname, "__dict__") == 0) {
781 if (PyEval_GetRestricted()) {
782 PyErr_SetString(PyExc_RuntimeError,
783 "__dict__ not accessible in restricted mode");
784 return -1;
785 }
786 if (v == NULL || !PyDict_Check(v)) {
787 PyErr_SetString(PyExc_TypeError,
788 "__dict__ must be set to a dictionary");
789 return -1;
790 }
791 tmp = inst->in_dict;
792 Py_INCREF(v);
793 inst->in_dict = v;
794 Py_DECREF(tmp);
795 return 0;
796 }
797 if (strcmp(sname, "__class__") == 0) {
798 if (PyEval_GetRestricted()) {
799 PyErr_SetString(PyExc_RuntimeError,
800 "__class__ not accessible in restricted mode");
801 return -1;
802 }
803 if (v == NULL || !PyClass_Check(v)) {
804 PyErr_SetString(PyExc_TypeError,
805 "__class__ must be set to a class");
806 return -1;
807 }
808 tmp = (PyObject *)(inst->in_class);
809 Py_INCREF(v);
810 inst->in_class = (PyClassObject *)v;
811 Py_DECREF(tmp);
812 return 0;
813 }
Guido van Rossume7737541994-09-05 07:31:41 +0000814 }
Guido van Rossume7737541994-09-05 07:31:41 +0000815 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000816 if (v == NULL)
817 func = inst->in_class->cl_delattr;
818 else
819 func = inst->in_class->cl_setattr;
820 if (func == NULL)
821 return instance_setattr1(inst, name, v);
822 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000823 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000824 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000825 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000826 if (args == NULL)
827 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828 res = PyEval_CallObject(func, args);
829 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000830 if (res == NULL)
831 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000833 return 0;
834}
835
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000837instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000838{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 PyObject *func;
840 PyObject *res;
841 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842
Guido van Rossum2878a691996-08-09 20:53:24 +0000843 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000844 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000845 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000847 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000848 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000849 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
850 return NULL;
851 PyErr_Clear();
852 classname = inst->in_class->cl_name;
853 mod = PyDict_GetItemString(inst->in_class->cl_dict,
854 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 if (classname != NULL && PyString_Check(classname))
856 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000857 else
858 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000859 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000860 return PyString_FromFormat("<?.%s instance at %p>",
861 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000862 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000863 return PyString_FromFormat("<%s.%s instance at %p>",
864 PyString_AsString(mod),
865 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000866 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 res = PyEval_CallObject(func, (PyObject *)NULL);
868 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000869 return res;
870}
871
Guido van Rossum82c690f2001-04-30 14:39:18 +0000872static PyObject *
873instance_str(PyInstanceObject *inst)
874{
875 PyObject *func;
876 PyObject *res;
877 static PyObject *strstr;
878
879 if (strstr == NULL)
880 strstr = PyString_InternFromString("__str__");
881 func = instance_getattr(inst, strstr);
882 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000883 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
884 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000885 PyErr_Clear();
886 return instance_repr(inst);
887 }
888 res = PyEval_CallObject(func, (PyObject *)NULL);
889 Py_DECREF(func);
890 return res;
891}
892
Guido van Rossum9bfef441993-03-29 10:43:31 +0000893static long
Fred Drake79912472000-07-09 04:06:11 +0000894instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000895{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 PyObject *func;
897 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000898 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000899 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000900
Guido van Rossum2878a691996-08-09 20:53:24 +0000901 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000902 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000903 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000904 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000905 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
906 return -1;
907 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000908 /* If there is no __eq__ and no __cmp__ method, we hash on the
909 address. If an __eq__ or __cmp__ method exists, there must
910 be a __hash__. */
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000911 if (eqstr == NULL)
912 eqstr = PyString_InternFromString("__eq__");
913 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000914 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000915 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
916 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000918 if (cmpstr == NULL)
919 cmpstr = PyString_InternFromString("__cmp__");
920 func = instance_getattr(inst, cmpstr);
921 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000922 if (!PyErr_ExceptionMatches(
923 PyExc_AttributeError))
924 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000925 PyErr_Clear();
926 return _Py_HashPointer(inst);
927 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000928 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000929 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000931 return -1;
932 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 res = PyEval_CallObject(func, (PyObject *)NULL);
934 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000935 if (res == NULL)
936 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 if (PyInt_Check(res)) {
938 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000939 if (outcome == -1)
940 outcome = -2;
941 }
942 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 PyErr_SetString(PyExc_TypeError,
944 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000945 outcome = -1;
946 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000948 return outcome;
949}
950
Jeremy Hylton8caad492000-06-23 14:18:11 +0000951static int
952instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
953{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000954 Py_VISIT(o->in_class);
955 Py_VISIT(o->in_dict);
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000956 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000957}
958
Guido van Rossum213c7a62001-04-23 14:08:49 +0000959static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
960static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000961
Martin v. Löwis18e16552006-02-15 17:27:45 +0000962static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +0000963instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 PyObject *func;
966 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000967 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000968
Guido van Rossum2878a691996-08-09 20:53:24 +0000969 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000970 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000971 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000972 if (func == NULL)
973 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 res = PyEval_CallObject(func, (PyObject *)NULL);
975 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000976 if (res == NULL)
977 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 if (PyInt_Check(res)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000979 Py_ssize_t temp = PyInt_AsSsize_t(res);
980 if (temp == -1 && PyErr_Occurred()) {
981 Py_DECREF(res);
982 return -1;
983 }
984 outcome = (Py_ssize_t)temp;
985#if SIZEOF_SIZE_T < SIZEOF_LONG
Guido van Rossumba3e6ec2005-09-19 22:42:41 +0000986 /* Overflow check -- range of PyInt is more than C int */
987 if (outcome != temp) {
988 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +0000989 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +0000990 outcome = -1;
991 }
992 else
993#endif
Guido van Rossum04691fc1992-08-12 15:35:34 +0000994 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995 PyErr_SetString(PyExc_ValueError,
996 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997 }
998 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 PyErr_SetString(PyExc_TypeError,
1000 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001001 outcome = -1;
1002 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001004 return outcome;
1005}
1006
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001008instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 PyObject *func;
1011 PyObject *arg;
1012 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013
Guido van Rossum2878a691996-08-09 20:53:24 +00001014 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001015 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001016 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017 if (func == NULL)
1018 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001019 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 return NULL;
1023 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 res = PyEval_CallObject(func, arg);
1025 Py_DECREF(func);
1026 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027 return res;
1028}
1029
Guido van Rossum9bfef441993-03-29 10:43:31 +00001030static int
Fred Drake79912472000-07-09 04:06:11 +00001031instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001032{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 PyObject *func;
1034 PyObject *arg;
1035 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001036
Guido van Rossum2878a691996-08-09 20:53:24 +00001037 if (value == NULL) {
1038 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001039 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001040 func = instance_getattr(inst, delitemstr);
1041 }
1042 else {
1043 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001044 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001045 func = instance_getattr(inst, setitemstr);
1046 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001047 if (func == NULL)
1048 return -1;
1049 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001050 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001052 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001055 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 res = PyEval_CallObject(func, arg);
1058 Py_DECREF(func);
1059 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001060 if (res == NULL)
1061 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063 return 0;
1064}
1065
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001067 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001068 (binaryfunc)instance_subscript, /* mp_subscript */
1069 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070};
1071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001073instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074{
Thomas Wouters477c8d52006-05-27 19:21:47 +00001075 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076
Guido van Rossum2878a691996-08-09 20:53:24 +00001077 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001078 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001079 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080 if (func == NULL)
1081 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001082 res = PyObject_CallFunction(func, "n", i);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001084 return res;
1085}
1086
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001088instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 PyObject *func, *arg, *res;
1091 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092
Guido van Rossum2878a691996-08-09 20:53:24 +00001093 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001094 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001095 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001096
1097 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001098 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1099 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001100 PyErr_Clear();
1101
1102 if (getitemstr == NULL)
1103 getitemstr = PyString_InternFromString("__getitem__");
1104 func = instance_getattr(inst, getitemstr);
1105 if (func == NULL)
1106 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001107 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
Tim Peters34592512002-07-11 06:23:50 +00001108 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001109 arg = Py_BuildValue("(nn)", i, j);
Tim Peters34592512002-07-11 06:23:50 +00001110
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001113 return NULL;
1114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 res = PyEval_CallObject(func, arg);
1116 Py_DECREF(func);
1117 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118 return res;
1119}
1120
1121static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001122instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001123{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125
Guido van Rossum2878a691996-08-09 20:53:24 +00001126 if (item == NULL) {
1127 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001128 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001129 func = instance_getattr(inst, delitemstr);
1130 }
1131 else {
1132 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001133 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001134 func = instance_getattr(inst, setitemstr);
1135 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001137 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001138 if (item == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001139 arg = PyInt_FromSsize_t(i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001140 else
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001141 arg = Py_BuildValue("(nO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001142 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001144 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001145 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146 res = PyEval_CallObject(func, arg);
1147 Py_DECREF(func);
1148 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001149 if (res == NULL)
1150 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001152 return 0;
1153}
1154
1155static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001156instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001157{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 PyObject *func, *arg, *res;
1159 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001160
Guido van Rossum2878a691996-08-09 20:53:24 +00001161 if (value == NULL) {
1162 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 delslicestr =
1164 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001165 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001166 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001167 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1168 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001169 PyErr_Clear();
1170 if (delitemstr == NULL)
1171 delitemstr =
1172 PyString_InternFromString("__delitem__");
1173 func = instance_getattr(inst, delitemstr);
1174 if (func == NULL)
1175 return -1;
1176
1177 arg = Py_BuildValue("(N)",
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001178 _PySlice_FromIndices(i, j));
Thomas Wouters1d75a792000-08-17 22:37:32 +00001179 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001180 arg = Py_BuildValue("(nn)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001181 }
1182 else {
1183 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 setslicestr =
1185 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001186 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001187 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001188 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1189 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001190 PyErr_Clear();
1191 if (setitemstr == NULL)
1192 setitemstr =
1193 PyString_InternFromString("__setitem__");
1194 func = instance_getattr(inst, setitemstr);
1195 if (func == NULL)
1196 return -1;
1197
1198 arg = Py_BuildValue("(NO)",
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001199 _PySlice_FromIndices(i, j), value);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001200 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001201 arg = Py_BuildValue("(nnO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001202 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001203 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001205 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001206 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 res = PyEval_CallObject(func, arg);
1208 Py_DECREF(func);
1209 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001210 if (res == NULL)
1211 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001213 return 0;
1214}
1215
Tim Peterscb8d3682001-05-05 21:05:01 +00001216static int
1217instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001218{
1219 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001220 PyObject *func;
1221
1222 /* Try __contains__ first.
1223 * If that can't be done, try iterator-based searching.
1224 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001225
1226 if(__contains__ == NULL) {
1227 __contains__ = PyString_InternFromString("__contains__");
1228 if(__contains__ == NULL)
1229 return -1;
1230 }
1231 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001232 if (func) {
1233 PyObject *res;
1234 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001235 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001236 if(arg == NULL) {
1237 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001238 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001239 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001240 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001241 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001242 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001243 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001244 return -1;
1245 ret = PyObject_IsTrue(res);
1246 Py_DECREF(res);
1247 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001248 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001249
1250 /* Couldn't find __contains__. */
1251 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1252 /* Assume the failure was simply due to that there is no
1253 * __contains__ attribute, and try iterating instead.
1254 */
1255 PyErr_Clear();
Tim Peters16a77ad2001-09-08 04:00:12 +00001256 return _PySequence_IterSearch((PyObject *)inst, member,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001257 PY_ITERSEARCH_CONTAINS) > 0;
Tim Peterscb8d3682001-05-05 21:05:01 +00001258 }
1259 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001260 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001261}
1262
Fred Drake79912472000-07-09 04:06:11 +00001263static PySequenceMethods
1264instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001265 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001266 0, /* sq_concat */
1267 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001268 (ssizeargfunc)instance_item, /* sq_item */
1269 (ssizessizeargfunc)instance_slice, /* sq_slice */
1270 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1271 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001272 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001273};
1274
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001276generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001277{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001279
1280 if ((func = instance_getattr(self, methodname)) == NULL)
1281 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 res = PyEval_CallObject(func, (PyObject *)NULL);
1283 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001284 return res;
1285}
1286
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001287static PyObject *
1288generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001289{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001290 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001292 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001293 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001294 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001295 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001297 Py_INCREF(Py_NotImplemented);
1298 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001299 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001300 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001301 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001303 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001304 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001305 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 Py_DECREF(args);
1307 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001308 return result;
1309}
1310
1311
1312static PyObject *coerce_obj;
1313
1314/* Try one half of a binary operator involving a class instance. */
1315static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001316half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001317 int swapped)
1318{
1319 PyObject *args;
1320 PyObject *coercefunc;
1321 PyObject *coerced = NULL;
1322 PyObject *v1;
1323 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001324
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001325 if (!PyInstance_Check(v)) {
1326 Py_INCREF(Py_NotImplemented);
1327 return Py_NotImplemented;
1328 }
1329
1330 if (coerce_obj == NULL) {
1331 coerce_obj = PyString_InternFromString("__coerce__");
1332 if (coerce_obj == NULL)
1333 return NULL;
1334 }
1335 coercefunc = PyObject_GetAttr(v, coerce_obj);
1336 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001337 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1338 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001339 PyErr_Clear();
1340 return generic_binary_op(v, w, opname);
1341 }
1342
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001343 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001344 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001345 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001346 return NULL;
1347 }
1348 coerced = PyEval_CallObject(coercefunc, args);
1349 Py_DECREF(args);
1350 Py_DECREF(coercefunc);
1351 if (coerced == NULL) {
1352 return NULL;
1353 }
1354 if (coerced == Py_None || coerced == Py_NotImplemented) {
1355 Py_DECREF(coerced);
1356 return generic_binary_op(v, w, opname);
1357 }
1358 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1359 Py_DECREF(coerced);
1360 PyErr_SetString(PyExc_TypeError,
1361 "coercion should return None or 2-tuple");
1362 return NULL;
1363 }
1364 v1 = PyTuple_GetItem(coerced, 0);
1365 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001366 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001367 /* prevent recursion if __coerce__ returns self as the first
1368 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001369 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001370 } else {
1371 if (swapped)
1372 result = (thisfunc)(w, v1);
1373 else
1374 result = (thisfunc)(v1, w);
1375 }
1376 Py_DECREF(coerced);
1377 return result;
1378}
1379
1380/* Implement a binary operator involving at least one class instance. */
1381static PyObject *
1382do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1383 binaryfunc thisfunc)
1384{
1385 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1386 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001387 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001388 result = half_binop(w, v, ropname, thisfunc, 1);
1389 }
1390 return result;
1391}
1392
1393static PyObject *
1394do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1395 char *ropname, binaryfunc thisfunc)
1396{
1397 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1398 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001399 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001400 result = do_binop(v, w, opname, ropname, thisfunc);
1401 }
1402 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001403}
1404
Guido van Rossum879c5811995-01-10 15:24:06 +00001405static int
Fred Drake79912472000-07-09 04:06:11 +00001406instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001407{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyObject *v = *pv;
1409 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001410 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 PyObject *args;
1412 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001413
Guido van Rossum2878a691996-08-09 20:53:24 +00001414 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001415 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001416 if (coerce_obj == NULL)
1417 return -1;
1418 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001419 coercefunc = PyObject_GetAttr(v, coerce_obj);
1420 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001421 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001422 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1423 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001425 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001426 }
1427 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001428 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001429 if (args == NULL) {
1430 return -1;
1431 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001432 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001434 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001435 if (coerced == NULL) {
1436 /* __coerce__ call raised an exception */
1437 return -1;
1438 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001439 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001440 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001442 return 1;
1443 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001445 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 Py_DECREF(coerced);
1447 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001448 "coercion should return None or 2-tuple");
1449 return -1;
1450 }
1451 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 *pv = PyTuple_GetItem(coerced, 0);
1453 *pw = PyTuple_GetItem(coerced, 1);
1454 Py_INCREF(*pv);
1455 Py_INCREF(*pw);
1456 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001457 return 0;
1458}
1459
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001461static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001463 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001464 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001465}
1466
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001467#define BINARY(f, m, n) \
1468static PyObject *f(PyObject *v, PyObject *w) { \
1469 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1470}
1471
1472#define BINARY_INPLACE(f, m, n) \
1473static PyObject *f(PyObject *v, PyObject *w) { \
1474 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1475 "__r" m "__", n); \
1476}
1477
Guido van Rossum04691fc1992-08-12 15:35:34 +00001478UNARY(instance_neg, "__neg__")
1479UNARY(instance_pos, "__pos__")
1480UNARY(instance_abs, "__abs__")
1481
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001482BINARY(instance_or, "or", PyNumber_Or)
1483BINARY(instance_and, "and", PyNumber_And)
1484BINARY(instance_xor, "xor", PyNumber_Xor)
1485BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1486BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1487BINARY(instance_add, "add", PyNumber_Add)
1488BINARY(instance_sub, "sub", PyNumber_Subtract)
1489BINARY(instance_mul, "mul", PyNumber_Multiply)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001490BINARY(instance_mod, "mod", PyNumber_Remainder)
1491BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001492BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1493BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001494
1495BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1496BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1497BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1498BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1499BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1500BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1501BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1502BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001503BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001504BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1505BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001506
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001507/* Try a 3-way comparison, returning an int; v is an instance. Return:
1508 -2 for an exception;
1509 -1 if v < w;
1510 0 if v == w;
1511 1 if v > w;
1512 2 if this particular 3-way comparison is not implemented or undefined.
1513*/
1514static int
1515half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001516{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001517 static PyObject *cmp_obj;
1518 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001519 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001520 PyObject *result;
1521 long l;
1522
1523 assert(PyInstance_Check(v));
1524
1525 if (cmp_obj == NULL) {
1526 cmp_obj = PyString_InternFromString("__cmp__");
1527 if (cmp_obj == NULL)
1528 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001529 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001530
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001531 cmp_func = PyObject_GetAttr(v, cmp_obj);
1532 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001533 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1534 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001535 PyErr_Clear();
1536 return 2;
1537 }
1538
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001539 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001540 if (args == NULL) {
1541 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001542 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001543 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001544
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001545 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001546 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001547 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001548
1549 if (result == NULL)
1550 return -2;
1551
1552 if (result == Py_NotImplemented) {
1553 Py_DECREF(result);
1554 return 2;
1555 }
1556
1557 l = PyInt_AsLong(result);
1558 Py_DECREF(result);
1559 if (l == -1 && PyErr_Occurred()) {
1560 PyErr_SetString(PyExc_TypeError,
1561 "comparison did not return an int");
1562 return -2;
1563 }
1564
1565 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001566}
1567
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001568/* Try a 3-way comparison, returning an int; either v or w is an instance.
1569 We first try a coercion. Return:
1570 -2 for an exception;
1571 -1 if v < w;
1572 0 if v == w;
1573 1 if v > w;
1574 2 if this particular 3-way comparison is not implemented or undefined.
1575 THIS IS ONLY CALLED FROM object.c!
1576*/
1577static int
1578instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001579{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001580 int c;
1581
1582 c = PyNumber_CoerceEx(&v, &w);
1583 if (c < 0)
1584 return -2;
1585 if (c == 0) {
1586 /* If neither is now an instance, use regular comparison */
1587 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1588 c = PyObject_Compare(v, w);
1589 Py_DECREF(v);
1590 Py_DECREF(w);
1591 if (PyErr_Occurred())
1592 return -2;
1593 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001594 }
1595 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001596 else {
1597 /* The coercion didn't do anything.
1598 Treat this the same as returning v and w unchanged. */
1599 Py_INCREF(v);
1600 Py_INCREF(w);
1601 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001602
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001603 if (PyInstance_Check(v)) {
1604 c = half_cmp(v, w);
1605 if (c <= 1) {
1606 Py_DECREF(v);
1607 Py_DECREF(w);
1608 return c;
1609 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001610 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001611 if (PyInstance_Check(w)) {
1612 c = half_cmp(w, v);
1613 if (c <= 1) {
1614 Py_DECREF(v);
1615 Py_DECREF(w);
1616 if (c >= -1)
1617 c = -c;
1618 return c;
1619 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001620 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001621 Py_DECREF(v);
1622 Py_DECREF(w);
1623 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001624}
1625
Guido van Rossum9bfef441993-03-29 10:43:31 +00001626static int
Fred Drake79912472000-07-09 04:06:11 +00001627instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001628{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001630 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001632
Guido van Rossum2878a691996-08-09 20:53:24 +00001633 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001634 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001635 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001636 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1637 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001639 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001640 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001641 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001642 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1643 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001645 /* Fall back to the default behavior:
1646 all instances are nonzero */
1647 return 1;
1648 }
1649 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650 res = PyEval_CallObject(func, (PyObject *)NULL);
1651 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001652 if (res == NULL)
1653 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654 if (!PyInt_Check(res)) {
1655 Py_DECREF(res);
1656 PyErr_SetString(PyExc_TypeError,
1657 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001658 return -1;
1659 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001660 outcome = PyInt_AsLong(res);
1661 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001662 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001663 PyErr_SetString(PyExc_ValueError,
1664 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001665 return -1;
1666 }
1667 return outcome > 0;
1668}
1669
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001670static Py_ssize_t
1671instance_index(PyInstanceObject *self)
1672{
1673 PyObject *func, *res;
1674 Py_ssize_t outcome;
1675 static PyObject *indexstr = NULL;
1676
1677 if (indexstr == NULL) {
1678 indexstr = PyString_InternFromString("__index__");
1679 if (indexstr == NULL)
1680 return -1;
1681 }
1682 if ((func = instance_getattr(self, indexstr)) == NULL) {
1683 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1684 return -1;
1685 PyErr_Clear();
1686 PyErr_SetString(PyExc_TypeError,
1687 "object cannot be interpreted as an index");
1688 return -1;
1689 }
1690 res = PyEval_CallObject(func, (PyObject *)NULL);
1691 Py_DECREF(func);
1692 if (res == NULL)
1693 return -1;
1694 if (PyInt_Check(res) || PyLong_Check(res)) {
1695 outcome = res->ob_type->tp_as_number->nb_index(res);
1696 }
1697 else {
1698 PyErr_SetString(PyExc_TypeError,
1699 "__index__ must return an int or a long");
1700 outcome = -1;
1701 }
1702 Py_DECREF(res);
1703 return outcome;
1704}
1705
1706
Guido van Rossum04691fc1992-08-12 15:35:34 +00001707UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001708UNARY(instance_int, "__int__")
1709UNARY(instance_long, "__long__")
1710UNARY(instance_float, "__float__")
1711UNARY(instance_oct, "__oct__")
1712UNARY(instance_hex, "__hex__")
1713
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001714static PyObject *
1715bin_power(PyObject *v, PyObject *w)
1716{
1717 return PyNumber_Power(v, w, Py_None);
1718}
1719
Guido van Rossum03093a21994-09-28 15:51:32 +00001720/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001722instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001723{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001724 if (z == Py_None) {
1725 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001726 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001727 else {
1728 PyObject *func;
1729 PyObject *args;
1730 PyObject *result;
1731
1732 /* XXX Doesn't do coercions... */
1733 func = PyObject_GetAttrString(v, "__pow__");
1734 if (func == NULL)
1735 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001736 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001737 if (args == NULL) {
1738 Py_DECREF(func);
1739 return NULL;
1740 }
1741 result = PyEval_CallObject(func, args);
1742 Py_DECREF(func);
1743 Py_DECREF(args);
1744 return result;
1745 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001746}
1747
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001748static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001749bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001750{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001751 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001752}
1753
1754
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001755static PyObject *
1756instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1757{
1758 if (z == Py_None) {
1759 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1760 "__rpow__", bin_inplace_power);
1761 }
1762 else {
1763 /* XXX Doesn't do coercions... */
1764 PyObject *func;
1765 PyObject *args;
1766 PyObject *result;
1767
1768 func = PyObject_GetAttrString(v, "__ipow__");
1769 if (func == NULL) {
1770 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1771 return NULL;
1772 PyErr_Clear();
1773 return instance_pow(v, w, z);
1774 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001775 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001776 if (args == NULL) {
1777 Py_DECREF(func);
1778 return NULL;
1779 }
1780 result = PyEval_CallObject(func, args);
1781 Py_DECREF(func);
1782 Py_DECREF(args);
1783 return result;
1784 }
1785}
1786
1787
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001788/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001789#define NAME_OPS 6
1790static PyObject **name_op = NULL;
1791
Tim Peters34592512002-07-11 06:23:50 +00001792static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001793init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001794{
1795 int i;
1796 char *_name_op[] = {
1797 "__lt__",
1798 "__le__",
1799 "__eq__",
1800 "__ne__",
1801 "__gt__",
1802 "__ge__",
1803 };
1804
1805 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1806 if (name_op == NULL)
1807 return -1;
1808 for (i = 0; i < NAME_OPS; ++i) {
1809 name_op[i] = PyString_InternFromString(_name_op[i]);
1810 if (name_op[i] == NULL)
1811 return -1;
1812 }
1813 return 0;
1814}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001815
1816static PyObject *
1817half_richcompare(PyObject *v, PyObject *w, int op)
1818{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001819 PyObject *method;
1820 PyObject *args;
1821 PyObject *res;
1822
1823 assert(PyInstance_Check(v));
1824
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001825 if (name_op == NULL) {
1826 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001827 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001828 }
1829 /* If the instance doesn't define an __getattr__ method, use
1830 instance_getattr2 directly because it will not set an
1831 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001832 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001833 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001834 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001835 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001836 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001837 if (method == NULL) {
1838 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001839 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1840 return NULL;
1841 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001842 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001843 res = Py_NotImplemented;
1844 Py_INCREF(res);
1845 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001846 }
1847
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001848 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001849 if (args == NULL) {
1850 Py_DECREF(method);
1851 return NULL;
1852 }
1853
1854 res = PyEval_CallObject(method, args);
1855 Py_DECREF(args);
1856 Py_DECREF(method);
1857
1858 return res;
1859}
1860
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001861static PyObject *
1862instance_richcompare(PyObject *v, PyObject *w, int op)
1863{
1864 PyObject *res;
1865
1866 if (PyInstance_Check(v)) {
1867 res = half_richcompare(v, w, op);
1868 if (res != Py_NotImplemented)
1869 return res;
1870 Py_DECREF(res);
1871 }
1872
1873 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00001874 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001875 if (res != Py_NotImplemented)
1876 return res;
1877 Py_DECREF(res);
1878 }
1879
1880 Py_INCREF(Py_NotImplemented);
1881 return Py_NotImplemented;
1882}
1883
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001884
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001885/* Get the iterator */
1886static PyObject *
1887instance_getiter(PyInstanceObject *self)
1888{
1889 PyObject *func;
1890
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001891 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001892 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001893 if (iterstr == NULL)
1894 return NULL;
1895 }
1896 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001897 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001898 if (getitemstr == NULL)
1899 return NULL;
1900 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001901
1902 if ((func = instance_getattr(self, iterstr)) != NULL) {
1903 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1904 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001905 if (res != NULL && !PyIter_Check(res)) {
1906 PyErr_Format(PyExc_TypeError,
1907 "__iter__ returned non-iterator "
1908 "of type '%.100s'",
1909 res->ob_type->tp_name);
1910 Py_DECREF(res);
1911 res = NULL;
1912 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001913 return res;
1914 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001915 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1916 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001917 PyErr_Clear();
1918 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001919 PyErr_SetString(PyExc_TypeError,
1920 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001921 return NULL;
1922 }
1923 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001924 return PySeqIter_New((PyObject *)self);
1925}
1926
1927
1928/* Call the iterator's next */
1929static PyObject *
1930instance_iternext(PyInstanceObject *self)
1931{
1932 PyObject *func;
1933
1934 if (nextstr == NULL)
1935 nextstr = PyString_InternFromString("next");
1936
1937 if ((func = instance_getattr(self, nextstr)) != NULL) {
1938 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1939 Py_DECREF(func);
1940 if (res != NULL) {
1941 return res;
1942 }
1943 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1944 PyErr_Clear();
1945 return NULL;
1946 }
1947 return NULL;
1948 }
1949 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1950 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001951}
1952
Tim Peters6d6c1a32001-08-02 04:15:00 +00001953static PyObject *
1954instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1955{
1956 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1957 if (call == NULL) {
1958 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001959 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1960 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001961 PyErr_Clear();
1962 PyErr_Format(PyExc_AttributeError,
1963 "%.200s instance has no __call__ method",
1964 PyString_AsString(inst->in_class->cl_name));
1965 return NULL;
1966 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00001967 /* We must check and increment the recursion depth here. Scenario:
1968 class A:
1969 pass
1970 A.__call__ = A() # that's right
1971 a = A() # ok
1972 a() # infinite recursion
1973 This bounces between instance_call() and PyObject_Call() without
1974 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00001975 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00001976 res = NULL;
1977 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00001978 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00001979 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00001980 Py_LeaveRecursiveCall();
1981 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001982 Py_DECREF(call);
1983 return res;
1984}
1985
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001986
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001987static PyNumberMethods instance_as_number = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001988 instance_add, /* nb_add */
1989 instance_sub, /* nb_subtract */
1990 instance_mul, /* nb_multiply */
1991 instance_mod, /* nb_remainder */
1992 instance_divmod, /* nb_divmod */
1993 instance_pow, /* nb_power */
1994 (unaryfunc)instance_neg, /* nb_negative */
1995 (unaryfunc)instance_pos, /* nb_positive */
1996 (unaryfunc)instance_abs, /* nb_absolute */
1997 (inquiry)instance_nonzero, /* nb_nonzero */
1998 (unaryfunc)instance_invert, /* nb_invert */
1999 instance_lshift, /* nb_lshift */
2000 instance_rshift, /* nb_rshift */
2001 instance_and, /* nb_and */
2002 instance_xor, /* nb_xor */
2003 instance_or, /* nb_or */
2004 instance_coerce, /* nb_coerce */
2005 (unaryfunc)instance_int, /* nb_int */
2006 (unaryfunc)instance_long, /* nb_long */
2007 (unaryfunc)instance_float, /* nb_float */
2008 (unaryfunc)instance_oct, /* nb_oct */
2009 (unaryfunc)instance_hex, /* nb_hex */
2010 instance_iadd, /* nb_inplace_add */
2011 instance_isub, /* nb_inplace_subtract */
2012 instance_imul, /* nb_inplace_multiply */
2013 instance_imod, /* nb_inplace_remainder */
2014 instance_ipow, /* nb_inplace_power */
2015 instance_ilshift, /* nb_inplace_lshift */
2016 instance_irshift, /* nb_inplace_rshift */
2017 instance_iand, /* nb_inplace_and */
2018 instance_ixor, /* nb_inplace_xor */
2019 instance_ior, /* nb_inplace_or */
2020 instance_floordiv, /* nb_floor_divide */
2021 instance_truediv, /* nb_true_divide */
2022 instance_ifloordiv, /* nb_inplace_floor_divide */
2023 instance_itruediv, /* nb_inplace_true_divide */
2024 (lenfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002025};
2026
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027PyTypeObject PyInstance_Type = {
2028 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002029 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002030 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002031 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002032 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002033 (destructor)instance_dealloc, /* tp_dealloc */
2034 0, /* tp_print */
2035 0, /* tp_getattr */
2036 0, /* tp_setattr */
2037 instance_compare, /* tp_compare */
2038 (reprfunc)instance_repr, /* tp_repr */
2039 &instance_as_number, /* tp_as_number */
2040 &instance_as_sequence, /* tp_as_sequence */
2041 &instance_as_mapping, /* tp_as_mapping */
2042 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002043 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002044 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002045 (getattrofunc)instance_getattr, /* tp_getattro */
2046 (setattrofunc)instance_setattr, /* tp_setattro */
2047 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002048 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002049 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002050 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002051 0, /* tp_clear */
2052 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002053 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2054 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002055 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002056 0, /* tp_methods */
2057 0, /* tp_members */
2058 0, /* tp_getset */
2059 0, /* tp_base */
2060 0, /* tp_dict */
2061 0, /* tp_descr_get */
2062 0, /* tp_descr_set */
2063 0, /* tp_dictoffset */
2064 0, /* tp_init */
2065 0, /* tp_alloc */
2066 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002067};
2068
2069
Guido van Rossum81daa321993-05-20 14:24:46 +00002070/* Instance method objects are used for two purposes:
2071 (a) as bound instance methods (returned by instancename.methodname)
2072 (b) as unbound methods (returned by ClassName.methodname)
2073 In case (b), im_self is NULL
2074*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002075
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002076static PyMethodObject *free_list;
2077
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002078PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002079PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002080{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002081 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002082 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002083 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002084 return NULL;
2085 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002086 im = free_list;
2087 if (im != NULL) {
2088 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002089 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002090 }
2091 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002092 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002093 if (im == NULL)
2094 return NULL;
2095 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002096 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002098 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002099 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002100 im->im_self = self;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002101 Py_XINCREF(klass);
2102 im->im_class = klass;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002103 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002104 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002105}
2106
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002107/* Descriptors for PyMethod attributes */
2108
2109/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002110
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002111#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002112
Guido van Rossum6f799372001-09-20 20:46:19 +00002113static PyMemberDef instancemethod_memberlist[] = {
2114 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2115 "the class associated with a method"},
2116 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2117 "the function (or other callable) implementing a method"},
2118 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2119 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002120 {NULL} /* Sentinel */
2121};
2122
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002123/* Christian Tismer argued convincingly that method attributes should
2124 (nearly) always override function attributes.
2125 The one exception is __doc__; there's a default __doc__ which
2126 should only be used for the class, not for instances */
2127
2128static PyObject *
2129instancemethod_get_doc(PyMethodObject *im, void *context)
2130{
2131 static PyObject *docstr;
2132 if (docstr == NULL) {
2133 docstr= PyString_InternFromString("__doc__");
2134 if (docstr == NULL)
2135 return NULL;
2136 }
2137 return PyObject_GetAttr(im->im_func, docstr);
2138}
2139
2140static PyGetSetDef instancemethod_getset[] = {
2141 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2142 {0}
2143};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002144
2145static PyObject *
2146instancemethod_getattro(PyObject *obj, PyObject *name)
2147{
2148 PyMethodObject *im = (PyMethodObject *)obj;
2149 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002150 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002151
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002152 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2153 if (tp->tp_dict == NULL) {
2154 if (PyType_Ready(tp) < 0)
2155 return NULL;
2156 }
2157 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002158 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002159
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002160 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002161 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2162 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002163 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002164 else {
2165 Py_INCREF(descr);
2166 return descr;
2167 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002168 }
2169
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002170 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002171}
2172
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002173PyDoc_STRVAR(instancemethod_doc,
2174"instancemethod(function, instance, class)\n\
2175\n\
2176Create an instance method object.");
2177
2178static PyObject *
2179instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2180{
2181 PyObject *func;
2182 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002183 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002184
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002185 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002186 &func, &self, &classObj))
2187 return NULL;
2188 if (!PyCallable_Check(func)) {
2189 PyErr_SetString(PyExc_TypeError,
2190 "first argument must be callable");
2191 return NULL;
2192 }
2193 if (self == Py_None)
2194 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002195 if (self == NULL && classObj == NULL) {
2196 PyErr_SetString(PyExc_TypeError,
2197 "unbound methods must have non-NULL im_class");
2198 return NULL;
2199 }
2200
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002201 return PyMethod_New(func, self, classObj);
2202}
2203
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002204static void
Fred Drake79912472000-07-09 04:06:11 +00002205instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002206{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002207 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002208 if (im->im_weakreflist != NULL)
2209 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002210 Py_DECREF(im->im_func);
2211 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002212 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002213 im->im_self = (PyObject *)free_list;
2214 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002215}
2216
Guido van Rossumebc8c511992-09-03 20:39:51 +00002217static int
Fred Drake79912472000-07-09 04:06:11 +00002218instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002219{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002220 int cmp;
2221 cmp = PyObject_Compare(a->im_func, b->im_func);
2222 if (cmp)
2223 return cmp;
2224
2225 if (a->im_self == b->im_self)
2226 return 0;
2227 if (a->im_self == NULL || b->im_self == NULL)
Guido van Rossume9df7271995-04-06 14:46:51 +00002228 return (a->im_self < b->im_self) ? -1 : 1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002229 else
2230 return PyObject_Compare(a->im_self, b->im_self);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002231}
2232
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002233static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002234instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002235{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002236 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002237 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002238 PyObject *klass = a->im_class;
2239 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2240 char *sfuncname = "?", *sklassname = "?";
2241
2242 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002243 if (funcname == NULL) {
2244 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2245 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002246 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002247 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002248 else if (!PyString_Check(funcname)) {
2249 Py_DECREF(funcname);
2250 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002251 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002252 else
2253 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002254 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002255 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002256 else {
2257 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002258 if (klassname == NULL) {
2259 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2260 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002261 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002262 }
Guido van Rossum40667692001-08-17 13:59:27 +00002263 else if (!PyString_Check(klassname)) {
2264 Py_DECREF(klassname);
2265 klassname = NULL;
2266 }
2267 else
2268 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002269 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002270 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002271 result = PyString_FromFormat("<unbound method %s.%s>",
2272 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002273 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002274 /* XXX Shouldn't use repr() here! */
2275 PyObject *selfrepr = PyObject_Repr(self);
2276 if (selfrepr == NULL)
2277 goto fail;
2278 if (!PyString_Check(selfrepr)) {
2279 Py_DECREF(selfrepr);
2280 goto fail;
2281 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002282 result = PyString_FromFormat("<bound method %s.%s of %s>",
2283 sklassname, sfuncname,
2284 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002285 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002286 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002287 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002288 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002289 Py_XDECREF(klassname);
2290 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002291}
2292
Guido van Rossum9bfef441993-03-29 10:43:31 +00002293static long
Fred Drake79912472000-07-09 04:06:11 +00002294instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002295{
2296 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002297 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002298 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002299 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002300 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002301 if (x == -1)
2302 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002303 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002304 if (y == -1)
2305 return -1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002306 x = x ^ y;
2307 if (x == -1)
2308 x = -2;
2309 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002310}
2311
Jeremy Hylton8caad492000-06-23 14:18:11 +00002312static int
2313instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2314{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002315 Py_VISIT(im->im_func);
2316 Py_VISIT(im->im_self);
2317 Py_VISIT(im->im_class);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002318 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002319}
2320
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002321static void
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002322getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002323{
2324 PyObject *name;
2325
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002326 assert(bufsize > 1);
2327 strcpy(buf, "?"); /* Default outcome */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002328 if (klass == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002329 return;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002330 name = PyObject_GetAttrString(klass, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002331 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002332 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002333 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002334 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002335 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002336 if (PyString_Check(name)) {
2337 strncpy(buf, PyString_AS_STRING(name), bufsize);
2338 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002339 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002340 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002341}
2342
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002343static void
2344getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002345{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002346 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002347
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002348 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002349 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002350 strcpy(buf, "nothing");
2351 return;
2352 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002353
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002354 klass = PyObject_GetAttrString(inst, "__class__");
2355 if (klass == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002356 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002357 PyErr_Clear();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002358 klass = (PyObject *)(inst->ob_type);
2359 Py_INCREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002360 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002361 getclassname(klass, buf, bufsize);
2362 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002363}
2364
Tim Peters6d6c1a32001-08-02 04:15:00 +00002365static PyObject *
2366instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2367{
2368 PyObject *self = PyMethod_GET_SELF(func);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002369 PyObject *klass = PyMethod_GET_CLASS(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002370 PyObject *result;
2371
2372 func = PyMethod_GET_FUNCTION(func);
2373 if (self == NULL) {
2374 /* Unbound methods must be called with an instance of
2375 the class (or a derived class) as first argument */
2376 int ok;
2377 if (PyTuple_Size(arg) >= 1)
2378 self = PyTuple_GET_ITEM(arg, 0);
2379 if (self == NULL)
2380 ok = 0;
2381 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002382 ok = PyObject_IsInstance(self, klass);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002383 if (ok < 0)
2384 return NULL;
2385 }
2386 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002387 char clsbuf[256];
2388 char instbuf[256];
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002389 getclassname(klass, clsbuf, sizeof(clsbuf));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002390 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002391 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002392 "unbound method %s%s must be called with "
2393 "%s instance as first argument "
2394 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002395 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002396 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002397 clsbuf,
2398 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002399 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002400 return NULL;
2401 }
2402 Py_INCREF(arg);
2403 }
2404 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002405 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002406 PyObject *newarg = PyTuple_New(argcount + 1);
2407 int i;
2408 if (newarg == NULL)
2409 return NULL;
2410 Py_INCREF(self);
2411 PyTuple_SET_ITEM(newarg, 0, self);
2412 for (i = 0; i < argcount; i++) {
2413 PyObject *v = PyTuple_GET_ITEM(arg, i);
2414 Py_XINCREF(v);
2415 PyTuple_SET_ITEM(newarg, i+1, v);
2416 }
2417 arg = newarg;
2418 }
2419 result = PyObject_Call((PyObject *)func, arg, kw);
2420 Py_DECREF(arg);
2421 return result;
2422}
2423
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002424static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002425instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002426{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002427 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002428 of a class that's not a base class of cls. */
2429
2430 if (PyMethod_GET_SELF(meth) != NULL) {
2431 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002432 Py_INCREF(meth);
2433 return meth;
2434 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002435 /* No, it is an unbound method */
2436 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2437 /* Do subclass test. If it fails, return meth unchanged. */
2438 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2439 if (ok < 0)
2440 return NULL;
2441 if (!ok) {
2442 Py_INCREF(meth);
2443 return meth;
2444 }
2445 }
2446 /* Bind it to obj */
2447 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002448}
2449
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002450PyTypeObject PyMethod_Type = {
2451 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002452 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002453 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002454 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002455 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002456 (destructor)instancemethod_dealloc, /* tp_dealloc */
2457 0, /* tp_print */
2458 0, /* tp_getattr */
2459 0, /* tp_setattr */
2460 (cmpfunc)instancemethod_compare, /* tp_compare */
2461 (reprfunc)instancemethod_repr, /* tp_repr */
2462 0, /* tp_as_number */
2463 0, /* tp_as_sequence */
2464 0, /* tp_as_mapping */
2465 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002466 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002467 0, /* tp_str */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002468 instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002469 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002470 0, /* tp_as_buffer */
Raymond Hettingerbff60ae2005-06-19 08:42:20 +00002471 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002472 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002473 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002474 0, /* tp_clear */
2475 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002476 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2477 0, /* tp_iter */
2478 0, /* tp_iternext */
2479 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002480 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002481 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002482 0, /* tp_base */
2483 0, /* tp_dict */
2484 instancemethod_descr_get, /* tp_descr_get */
2485 0, /* tp_descr_set */
2486 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002487 0, /* tp_init */
2488 0, /* tp_alloc */
2489 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002490};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002491
2492/* Clear out the free list */
2493
2494void
Fred Drake79912472000-07-09 04:06:11 +00002495PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002496{
2497 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002498 PyMethodObject *im = free_list;
2499 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002500 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002501 }
2502}