blob: fa8a3a985076c90cc9c9d9542f3c53c7cdd86258 [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 Rossum3cf5b1e2006-07-27 21:53:35 +00007#define TP_DESCR_GET(t) ((t)->tp_descr_get)
Guido van Rossum915f0eb2001-10-17 20:26:38 +00008
Neil Schemenauer29bfc072001-01-04 01:43:46 +00009
Guido van Rossum52ca98a1994-09-05 07:32:29 +000010/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000011static PyObject *class_lookup(PyClassObject *, PyObject *,
12 PyClassObject **);
13static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
14static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000015
Guido van Rossuma63eff61998-05-29 21:37:21 +000016static PyObject *getattrstr, *setattrstr, *delattrstr;
17
Fred Drake79912472000-07-09 04:06:11 +000018
Guido van Rossumc0b618a1997-05-02 03:12:38 +000019PyObject *
Fred Drake79912472000-07-09 04:06:11 +000020PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
21 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000024 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000025 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000026 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000027 if (docstr == NULL)
28 return NULL;
29 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000030 if (modstr == NULL) {
31 modstr= PyString_InternFromString("__module__");
32 if (modstr == NULL)
33 return NULL;
34 }
35 if (namestr == NULL) {
36 namestr= PyString_InternFromString("__name__");
37 if (namestr == NULL)
38 return NULL;
39 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000040 if (name == NULL || !PyString_Check(name)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000041 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000042 "PyClass_New: name must be a string");
43 return NULL;
44 }
45 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000047 "PyClass_New: dict must be a dictionary");
48 return NULL;
49 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 if (PyDict_GetItem(dict, docstr) == NULL) {
51 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000052 return NULL;
53 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000054 if (PyDict_GetItem(dict, modstr) == NULL) {
55 PyObject *globals = PyEval_GetGlobals();
56 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000057 PyObject *modname = PyDict_GetItem(globals, namestr);
58 if (modname != NULL) {
59 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000060 return NULL;
61 }
62 }
63 }
Guido van Rossume2966a61991-12-10 13:53:23 +000064 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000066 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000067 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000068 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000069 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +000070 Py_ssize_t i, n;
Guido van Rossum28d80b12001-09-07 21:08:32 +000071 PyObject *base;
Guido van Rossum04d73c41997-10-07 14:54:11 +000072 if (!PyTuple_Check(bases)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000073 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000074 "PyClass_New: bases must be a tuple");
75 return NULL;
76 }
Guido van Rossum28d80b12001-09-07 21:08:32 +000077 n = PyTuple_Size(bases);
78 for (i = 0; i < n; i++) {
79 base = PyTuple_GET_ITEM(bases, i);
80 if (!PyClass_Check(base)) {
81 if (PyCallable_Check(
82 (PyObject *) base->ob_type))
Thomas Wouters477c8d52006-05-27 19:21:47 +000083 return PyObject_CallFunctionObjArgs(
Guido van Rossum28d80b12001-09-07 21:08:32 +000084 (PyObject *) base->ob_type,
Thomas Wouters477c8d52006-05-27 19:21:47 +000085 name, bases, dict, NULL);
Tim Peters6d6c1a32001-08-02 04:15:00 +000086 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000087 "PyClass_New: base must be a class");
88 return NULL;
89 }
90 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000092 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000093 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000094 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000097 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000100 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000102 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000103 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000104 getattrstr = PyString_InternFromString("__getattr__");
105 setattrstr = PyString_InternFromString("__setattr__");
106 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000107 }
108 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
109 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
110 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 Py_XINCREF(op->cl_getattr);
112 Py_XINCREF(op->cl_setattr);
113 Py_XINCREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000114 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116}
117
Guido van Rossumb479dc52001-09-05 22:52:50 +0000118PyObject *
119PyMethod_Function(PyObject *im)
120{
121 if (!PyMethod_Check(im)) {
122 PyErr_BadInternalCall();
123 return NULL;
124 }
125 return ((PyMethodObject *)im)->im_func;
126}
127
128PyObject *
129PyMethod_Self(PyObject *im)
130{
131 if (!PyMethod_Check(im)) {
132 PyErr_BadInternalCall();
133 return NULL;
134 }
135 return ((PyMethodObject *)im)->im_self;
136}
137
138PyObject *
139PyMethod_Class(PyObject *im)
140{
141 if (!PyMethod_Check(im)) {
142 PyErr_BadInternalCall();
143 return NULL;
144 }
145 return ((PyMethodObject *)im)->im_class;
146}
147
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000148PyDoc_STRVAR(class_doc,
149"classobj(name, bases, dict)\n\
150\n\
151Create a class object. The name must be a string; the second argument\n\
152a tuple of classes, and the third a dictionary.");
153
154static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000155class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
156{
157 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000158 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000159
160 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
161 &name, &bases, &dict))
162 return NULL;
163 return PyClass_New(bases, dict, name);
164}
165
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166/* Class methods */
167
168static void
Fred Drake79912472000-07-09 04:06:11 +0000169class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000171 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000172 Py_DECREF(op->cl_bases);
173 Py_DECREF(op->cl_dict);
174 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000175 Py_XDECREF(op->cl_getattr);
176 Py_XDECREF(op->cl_setattr);
177 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000178 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179}
180
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000182class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000183{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000184 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000186 if (value != NULL) {
187 *pclass = cp;
188 return value;
189 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000191 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000192 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 PyObject *v = class_lookup(
194 (PyClassObject *)
195 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000196 if (v != NULL)
197 return v;
198 }
199 return NULL;
200}
201
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000203class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 register PyObject *v;
206 register char *sname = PyString_AsString(name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000207 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000208 descrgetfunc f;
209
Guido van Rossum2878a691996-08-09 20:53:24 +0000210 if (sname[0] == '_' && sname[1] == '_') {
211 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 if (PyEval_GetRestricted()) {
213 PyErr_SetString(PyExc_RuntimeError,
214 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000215 return NULL;
216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000218 return op->cl_dict;
219 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000220 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000222 return op->cl_bases;
223 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000224 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000225 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000227 else
228 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000230 return v;
231 }
Guido van Rossum94308391991-10-20 20:11:48 +0000232 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000233 v = class_lookup(op, name, &klass);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000234 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000235 PyErr_Format(PyExc_AttributeError,
236 "class %.50s has no attribute '%.400s'",
237 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000238 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000240 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000241 if (f == NULL)
242 Py_INCREF(v);
243 else
244 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000245 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246}
247
Guido van Rossuma63eff61998-05-29 21:37:21 +0000248static void
Fred Drake79912472000-07-09 04:06:11 +0000249set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000250{
251 PyObject *temp = *slot;
252 Py_XINCREF(v);
253 *slot = v;
254 Py_XDECREF(temp);
255}
256
Guido van Rossum7ba30431998-07-08 13:34:48 +0000257static void
Fred Drake79912472000-07-09 04:06:11 +0000258set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000259{
260 PyClassObject *dummy;
261
262 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
263 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
264 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
265}
266
Guido van Rossuma63eff61998-05-29 21:37:21 +0000267static char *
Fred Drake79912472000-07-09 04:06:11 +0000268set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000269{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000270 if (v == NULL || !PyDict_Check(v))
271 return "__dict__ must be a dictionary object";
272 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000273 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000274 return "";
275}
276
277static char *
Fred Drake79912472000-07-09 04:06:11 +0000278set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000279{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000280 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000281
282 if (v == NULL || !PyTuple_Check(v))
283 return "__bases__ must be a tuple object";
284 n = PyTuple_Size(v);
285 for (i = 0; i < n; i++) {
286 PyObject *x = PyTuple_GET_ITEM(v, i);
287 if (!PyClass_Check(x))
288 return "__bases__ items must be classes";
289 if (PyClass_IsSubclass(x, (PyObject *)c))
290 return "a __bases__ item causes an inheritance cycle";
291 }
292 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000293 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000294 return "";
295}
296
297static char *
Fred Drake79912472000-07-09 04:06:11 +0000298set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000299{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000300 if (v == NULL || !PyString_Check(v))
301 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000302 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000303 return "__name__ must not contain null bytes";
304 set_slot(&c->cl_name, v);
305 return "";
306}
307
Guido van Rossum94308391991-10-20 20:11:48 +0000308static int
Fred Drake79912472000-07-09 04:06:11 +0000309class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000310{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000311 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 if (PyEval_GetRestricted()) {
313 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000314 "classes are read-only in restricted mode");
315 return -1;
316 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000317 sname = PyString_AsString(name);
318 if (sname[0] == '_' && sname[1] == '_') {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000319 Py_ssize_t n = PyString_Size(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000320 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000321 char *err = NULL;
322 if (strcmp(sname, "__dict__") == 0)
323 err = set_dict(op, v);
324 else if (strcmp(sname, "__bases__") == 0)
325 err = set_bases(op, v);
326 else if (strcmp(sname, "__name__") == 0)
327 err = set_name(op, v);
328 else if (strcmp(sname, "__getattr__") == 0)
329 set_slot(&op->cl_getattr, v);
330 else if (strcmp(sname, "__setattr__") == 0)
331 set_slot(&op->cl_setattr, v);
332 else if (strcmp(sname, "__delattr__") == 0)
333 set_slot(&op->cl_delattr, v);
334 /* For the last three, we fall through to update the
335 dictionary as well. */
336 if (err != NULL) {
337 if (*err == '\0')
338 return 0;
339 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000340 return -1;
341 }
342 }
343 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000344 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000346 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000347 PyErr_Format(PyExc_AttributeError,
348 "class %.50s has no attribute '%.400s'",
349 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000350 return rv;
351 }
Guido van Rossum94308391991-10-20 20:11:48 +0000352 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000354}
355
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000357class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000358{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000359 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000360 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000362 name = "?";
363 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000365 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000366 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000367 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000368 return PyString_FromFormat("<class %s.%s at %p>",
369 PyString_AsString(mod),
370 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000371}
372
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000373static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000374class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000375{
376 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
377 PyObject *name = op->cl_name;
378 PyObject *res;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000379 Py_ssize_t m, n;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000380
381 if (name == NULL || !PyString_Check(name))
382 return class_repr(op);
383 if (mod == NULL || !PyString_Check(mod)) {
384 Py_INCREF(name);
385 return name;
386 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000387 m = PyString_GET_SIZE(mod);
388 n = PyString_GET_SIZE(name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000389 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
390 if (res != NULL) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000391 char *s = PyString_AS_STRING(res);
392 memcpy(s, PyString_AS_STRING(mod), m);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000393 s += m;
394 *s++ = '.';
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000395 memcpy(s, PyString_AS_STRING(name), n);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000396 }
397 return res;
398}
399
Jeremy Hylton8caad492000-06-23 14:18:11 +0000400static int
401class_traverse(PyClassObject *o, visitproc visit, void *arg)
402{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000403 Py_VISIT(o->cl_bases);
404 Py_VISIT(o->cl_dict);
405 Py_VISIT(o->cl_name);
406 Py_VISIT(o->cl_getattr);
407 Py_VISIT(o->cl_setattr);
408 Py_VISIT(o->cl_delattr);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000409 return 0;
410}
411
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412PyTypeObject PyClass_Type = {
413 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000415 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000416 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000418 (destructor)class_dealloc, /* tp_dealloc */
419 0, /* tp_print */
420 0, /* tp_getattr */
421 0, /* tp_setattr */
422 0, /* tp_compare */
423 (reprfunc)class_repr, /* tp_repr */
424 0, /* tp_as_number */
425 0, /* tp_as_sequence */
426 0, /* tp_as_mapping */
427 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000428 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000429 (reprfunc)class_str, /* tp_str */
430 (getattrofunc)class_getattr, /* tp_getattro */
431 (setattrofunc)class_setattr, /* tp_setattro */
432 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000433 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000434 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000435 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000436 0, /* tp_clear */
437 0, /* tp_richcompare */
438 0, /* tp_weaklistoffset */
439 0, /* tp_iter */
440 0, /* tp_iternext */
441 0, /* tp_methods */
442 0, /* tp_members */
443 0, /* tp_getset */
444 0, /* tp_base */
445 0, /* tp_dict */
446 0, /* tp_descr_get */
447 0, /* tp_descr_set */
448 0, /* tp_dictoffset */
449 0, /* tp_init */
450 0, /* tp_alloc */
451 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452};
453
Guido van Rossum81daa321993-05-20 14:24:46 +0000454int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000455PyClass_IsSubclass(PyObject *klass, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000456{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000457 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 PyClassObject *cp;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000459 if (klass == base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000460 return 1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000461 if (PyTuple_Check(base)) {
462 n = PyTuple_GET_SIZE(base);
463 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000464 if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000465 return 1;
466 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000467 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000468 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000469 if (klass == NULL || !PyClass_Check(klass))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000470 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000471 cp = (PyClassObject *)klass;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000473 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000475 return 1;
476 }
477 return 0;
478}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479
Guido van Rossum81daa321993-05-20 14:24:46 +0000480
481/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000484PyInstance_NewRaw(PyObject *klass, PyObject *dict)
485{
486 PyInstanceObject *inst;
487
488 if (!PyClass_Check(klass)) {
489 PyErr_BadInternalCall();
490 return NULL;
491 }
492 if (dict == NULL) {
493 dict = PyDict_New();
494 if (dict == NULL)
495 return NULL;
496 }
497 else {
498 if (!PyDict_Check(dict)) {
499 PyErr_BadInternalCall();
500 return NULL;
501 }
502 Py_INCREF(dict);
503 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000504 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000505 if (inst == NULL) {
506 Py_DECREF(dict);
507 return NULL;
508 }
Fred Drake4e262a92001-03-22 18:26:47 +0000509 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000510 Py_INCREF(klass);
511 inst->in_class = (PyClassObject *)klass;
512 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000513 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000514 return (PyObject *)inst;
515}
516
517PyObject *
518PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 register PyInstanceObject *inst;
521 PyObject *init;
522 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000523
524 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000525 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000527 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000528 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000529 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000530 if (init == NULL) {
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000531 if (PyErr_Occurred()) {
532 Py_DECREF(inst);
533 return NULL;
534 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 if ((arg != NULL && (!PyTuple_Check(arg) ||
536 PyTuple_Size(arg) != 0))
537 || (kw != NULL && (!PyDict_Check(kw) ||
538 PyDict_Size(kw) != 0))) {
539 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000540 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000542 inst = NULL;
543 }
544 }
545 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
547 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000548 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000550 inst = NULL;
551 }
552 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 if (res != Py_None) {
554 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000555 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000557 inst = NULL;
558 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000560 }
561 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563}
564
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000565/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000567PyDoc_STRVAR(instance_doc,
568"instance(class[, dict])\n\
569\n\
570Create an instance without calling its __init__() method.\n\
571The class must be a classic class.\n\
572If present, dict must be a dictionary or None.");
573
574static PyObject *
575instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
576{
577 PyObject *klass;
578 PyObject *dict = Py_None;
579
580 if (!PyArg_ParseTuple(args, "O!|O:instance",
581 &PyClass_Type, &klass, &dict))
582 return NULL;
583
584 if (dict == Py_None)
585 dict = NULL;
586 else if (!PyDict_Check(dict)) {
587 PyErr_SetString(PyExc_TypeError,
588 "instance() second arg must be dictionary or None");
589 return NULL;
590 }
591 return PyInstance_NewRaw(klass, dict);
592}
593
594
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595static void
Fred Drake79912472000-07-09 04:06:11 +0000596instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 PyObject *error_type, *error_value, *error_traceback;
599 PyObject *del;
600 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000601
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000602 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000603 if (inst->in_weakreflist != NULL)
604 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000605
Tim Peters6b184912000-09-17 14:40:17 +0000606 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000607 assert(inst->ob_type == &PyInstance_Type);
608 assert(inst->ob_refcnt == 0);
609 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000610
611 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000613 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000614 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000615 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000616 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000618 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000619 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000620 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 Py_DECREF(res);
622 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000623 }
Tim Peters6b184912000-09-17 14:40:17 +0000624 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000626
Tim Peters6b184912000-09-17 14:40:17 +0000627 /* Undo the temporary resurrection; can't use DECREF here, it would
628 * cause a recursive call.
629 */
Tim Peters34592512002-07-11 06:23:50 +0000630 assert(inst->ob_refcnt > 0);
631 if (--inst->ob_refcnt == 0) {
632 Py_DECREF(inst->in_class);
633 Py_XDECREF(inst->in_dict);
634 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000635 }
Tim Peters34592512002-07-11 06:23:50 +0000636 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000637 Py_ssize_t refcnt = inst->ob_refcnt;
Tim Peters34592512002-07-11 06:23:50 +0000638 /* __del__ resurrected it! Make it look like the original
639 * Py_DECREF never happened.
640 */
641 _Py_NewReference((PyObject *)inst);
642 inst->ob_refcnt = refcnt;
643 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000644 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
645 * we need to undo that. */
646 _Py_DEC_REFTOTAL;
647 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
648 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000649 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000650 * _Py_NewReference bumped tp_allocs: both of those need to be
651 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000652 */
Tim Peters6b184912000-09-17 14:40:17 +0000653#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000654 --inst->ob_type->tp_frees;
655 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000656#endif
Tim Peters34592512002-07-11 06:23:50 +0000657 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658}
659
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000661instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 register PyObject *v;
664 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000665 if (sname[0] == '_' && sname[1] == '_') {
666 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 if (PyEval_GetRestricted()) {
668 PyErr_SetString(PyExc_RuntimeError,
669 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000670 return NULL;
671 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000673 return inst->in_dict;
674 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000675 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 Py_INCREF(inst->in_class);
677 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000678 }
Guido van Rossum94308391991-10-20 20:11:48 +0000679 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000680 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000681 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000682 PyErr_Format(PyExc_AttributeError,
683 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000684 PyString_AS_STRING(inst->in_class->cl_name), sname);
685 }
686 return v;
687}
688
689static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000690instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000691{
692 register PyObject *v;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000693 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000694 descrgetfunc f;
695
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000697 if (v != NULL) {
698 Py_INCREF(v);
699 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000700 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000701 v = class_lookup(inst->in_class, name, &klass);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000702 if (v != NULL) {
703 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000704 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000705 if (f != NULL) {
706 PyObject *w = f(v, (PyObject *)inst,
707 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000709 v = w;
710 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000711 }
712 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000713}
714
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000716instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000717{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000719 res = instance_getattr1(inst, name);
720 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000722 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
723 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000725 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000726 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000727 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 res = PyEval_CallObject(func, args);
729 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000730 }
731 return res;
732}
733
Tim Petersdf875b92003-04-07 17:51:59 +0000734/* See classobject.h comments: this only does dict lookups, and is always
735 * safe to call.
736 */
737PyObject *
738_PyInstance_Lookup(PyObject *pinst, PyObject *name)
739{
740 PyObject *v;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000741 PyClassObject *klass;
Tim Petersdf875b92003-04-07 17:51:59 +0000742 PyInstanceObject *inst; /* pinst cast to the right type */
743
744 assert(PyInstance_Check(pinst));
745 inst = (PyInstanceObject *)pinst;
746
747 assert(PyString_Check(name));
748
749 v = PyDict_GetItem(inst->in_dict, name);
750 if (v == NULL)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000751 v = class_lookup(inst->in_class, name, &klass);
Tim Petersdf875b92003-04-07 17:51:59 +0000752 return v;
753}
754
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000755static int
Fred Drake79912472000-07-09 04:06:11 +0000756instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000757{
Guido van Rossum94472a01992-09-04 09:45:18 +0000758 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000760 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000761 PyErr_Format(PyExc_AttributeError,
762 "%.50s instance has no attribute '%.400s'",
763 PyString_AS_STRING(inst->in_class->cl_name),
764 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000765 return rv;
766 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000767 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769}
770
Guido van Rossume7737541994-09-05 07:31:41 +0000771static int
Fred Drake79912472000-07-09 04:06:11 +0000772instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000773{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000774 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000776 if (sname[0] == '_' && sname[1] == '_') {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000777 Py_ssize_t n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000778 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000779 if (strcmp(sname, "__dict__") == 0) {
780 if (PyEval_GetRestricted()) {
781 PyErr_SetString(PyExc_RuntimeError,
782 "__dict__ not accessible in restricted mode");
783 return -1;
784 }
785 if (v == NULL || !PyDict_Check(v)) {
786 PyErr_SetString(PyExc_TypeError,
787 "__dict__ must be set to a dictionary");
788 return -1;
789 }
790 tmp = inst->in_dict;
791 Py_INCREF(v);
792 inst->in_dict = v;
793 Py_DECREF(tmp);
794 return 0;
795 }
796 if (strcmp(sname, "__class__") == 0) {
797 if (PyEval_GetRestricted()) {
798 PyErr_SetString(PyExc_RuntimeError,
799 "__class__ not accessible in restricted mode");
800 return -1;
801 }
802 if (v == NULL || !PyClass_Check(v)) {
803 PyErr_SetString(PyExc_TypeError,
804 "__class__ must be set to a class");
805 return -1;
806 }
807 tmp = (PyObject *)(inst->in_class);
808 Py_INCREF(v);
809 inst->in_class = (PyClassObject *)v;
810 Py_DECREF(tmp);
811 return 0;
812 }
Guido van Rossume7737541994-09-05 07:31:41 +0000813 }
Guido van Rossume7737541994-09-05 07:31:41 +0000814 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000815 if (v == NULL)
816 func = inst->in_class->cl_delattr;
817 else
818 func = inst->in_class->cl_setattr;
819 if (func == NULL)
820 return instance_setattr1(inst, name, v);
821 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000822 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000823 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000824 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000825 if (args == NULL)
826 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 res = PyEval_CallObject(func, args);
828 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000829 if (res == NULL)
830 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000832 return 0;
833}
834
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000836instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000837{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 PyObject *func;
839 PyObject *res;
840 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000841
Guido van Rossum2878a691996-08-09 20:53:24 +0000842 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000843 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000844 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000845 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000846 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000847 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000848 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
849 return NULL;
850 PyErr_Clear();
851 classname = inst->in_class->cl_name;
852 mod = PyDict_GetItemString(inst->in_class->cl_dict,
853 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 if (classname != NULL && PyString_Check(classname))
855 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000856 else
857 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000858 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000859 return PyString_FromFormat("<?.%s instance at %p>",
860 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000861 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000862 return PyString_FromFormat("<%s.%s instance at %p>",
863 PyString_AsString(mod),
864 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 res = PyEval_CallObject(func, (PyObject *)NULL);
867 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000868 return res;
869}
870
Guido van Rossum82c690f2001-04-30 14:39:18 +0000871static PyObject *
872instance_str(PyInstanceObject *inst)
873{
874 PyObject *func;
875 PyObject *res;
876 static PyObject *strstr;
877
878 if (strstr == NULL)
879 strstr = PyString_InternFromString("__str__");
880 func = instance_getattr(inst, strstr);
881 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000882 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
883 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000884 PyErr_Clear();
885 return instance_repr(inst);
886 }
887 res = PyEval_CallObject(func, (PyObject *)NULL);
888 Py_DECREF(func);
889 return res;
890}
891
Guido van Rossum9bfef441993-03-29 10:43:31 +0000892static long
Fred Drake79912472000-07-09 04:06:11 +0000893instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000894{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 PyObject *func;
896 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000897 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000898 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000899
Guido van Rossum2878a691996-08-09 20:53:24 +0000900 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000901 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000902 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000903 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000904 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
905 return -1;
906 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000907 /* If there is no __eq__ and no __cmp__ method, we hash on the
908 address. If an __eq__ or __cmp__ method exists, there must
909 be a __hash__. */
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000910 if (eqstr == NULL)
911 eqstr = PyString_InternFromString("__eq__");
912 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000913 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000914 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
915 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000917 if (cmpstr == NULL)
918 cmpstr = PyString_InternFromString("__cmp__");
919 func = instance_getattr(inst, cmpstr);
920 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000921 if (!PyErr_ExceptionMatches(
922 PyExc_AttributeError))
923 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000924 PyErr_Clear();
925 return _Py_HashPointer(inst);
926 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000927 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000928 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000930 return -1;
931 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 res = PyEval_CallObject(func, (PyObject *)NULL);
933 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000934 if (res == NULL)
935 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 if (PyInt_Check(res)) {
937 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000938 if (outcome == -1)
939 outcome = -2;
940 }
941 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 PyErr_SetString(PyExc_TypeError,
943 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000944 outcome = -1;
945 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000947 return outcome;
948}
949
Jeremy Hylton8caad492000-06-23 14:18:11 +0000950static int
951instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
952{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000953 Py_VISIT(o->in_class);
954 Py_VISIT(o->in_dict);
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000955 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000956}
957
Guido van Rossum213c7a62001-04-23 14:08:49 +0000958static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
959static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000960
Martin v. Löwis18e16552006-02-15 17:27:45 +0000961static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +0000962instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000963{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 PyObject *func;
965 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000966 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967
Guido van Rossum2878a691996-08-09 20:53:24 +0000968 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000969 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000970 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971 if (func == NULL)
972 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 res = PyEval_CallObject(func, (PyObject *)NULL);
974 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000975 if (res == NULL)
976 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 if (PyInt_Check(res)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000978 Py_ssize_t temp = PyInt_AsSsize_t(res);
979 if (temp == -1 && PyErr_Occurred()) {
980 Py_DECREF(res);
981 return -1;
982 }
983 outcome = (Py_ssize_t)temp;
984#if SIZEOF_SIZE_T < SIZEOF_LONG
Guido van Rossumba3e6ec2005-09-19 22:42:41 +0000985 /* Overflow check -- range of PyInt is more than C int */
986 if (outcome != temp) {
987 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +0000988 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +0000989 outcome = -1;
990 }
991 else
992#endif
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyErr_SetString(PyExc_ValueError,
995 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000996 }
997 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 PyErr_SetString(PyExc_TypeError,
999 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 outcome = -1;
1001 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003 return outcome;
1004}
1005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001007instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001008{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyObject *func;
1010 PyObject *arg;
1011 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012
Guido van Rossum2878a691996-08-09 20:53:24 +00001013 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001014 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001015 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016 if (func == NULL)
1017 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001018 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021 return NULL;
1022 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 res = PyEval_CallObject(func, arg);
1024 Py_DECREF(func);
1025 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026 return res;
1027}
1028
Guido van Rossum9bfef441993-03-29 10:43:31 +00001029static int
Fred Drake79912472000-07-09 04:06:11 +00001030instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyObject *func;
1033 PyObject *arg;
1034 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035
Guido van Rossum2878a691996-08-09 20:53:24 +00001036 if (value == NULL) {
1037 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001038 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001039 func = instance_getattr(inst, delitemstr);
1040 }
1041 else {
1042 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001043 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001044 func = instance_getattr(inst, setitemstr);
1045 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046 if (func == NULL)
1047 return -1;
1048 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001049 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001051 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001054 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 res = PyEval_CallObject(func, arg);
1057 Py_DECREF(func);
1058 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 if (res == NULL)
1060 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062 return 0;
1063}
1064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001066 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001067 (binaryfunc)instance_subscript, /* mp_subscript */
1068 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001069};
1070
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001072instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073{
Thomas Wouters477c8d52006-05-27 19:21:47 +00001074 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075
Guido van Rossum2878a691996-08-09 20:53:24 +00001076 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001077 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001078 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 if (func == NULL)
1080 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081 res = PyObject_CallFunction(func, "n", i);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083 return res;
1084}
1085
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001087instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001088{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089 PyObject *func, *arg, *res;
1090 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001091
Guido van Rossum2878a691996-08-09 20:53:24 +00001092 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001093 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001094 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001095
1096 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001097 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1098 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001099 PyErr_Clear();
1100
1101 if (getitemstr == NULL)
1102 getitemstr = PyString_InternFromString("__getitem__");
1103 func = instance_getattr(inst, getitemstr);
1104 if (func == NULL)
1105 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001106 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
Tim Peters34592512002-07-11 06:23:50 +00001107 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001108 arg = Py_BuildValue("(nn)", i, j);
Tim Peters34592512002-07-11 06:23:50 +00001109
Guido van Rossum04691fc1992-08-12 15:35:34 +00001110 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112 return NULL;
1113 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 res = PyEval_CallObject(func, arg);
1115 Py_DECREF(func);
1116 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001117 return res;
1118}
1119
1120static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001121instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001124
Guido van Rossum2878a691996-08-09 20:53:24 +00001125 if (item == NULL) {
1126 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001127 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001128 func = instance_getattr(inst, delitemstr);
1129 }
1130 else {
1131 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001132 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001133 func = instance_getattr(inst, setitemstr);
1134 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001135 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001136 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137 if (item == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001138 arg = PyInt_FromSsize_t(i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139 else
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001140 arg = Py_BuildValue("(nO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001141 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001142 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001143 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001144 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001145 res = PyEval_CallObject(func, arg);
1146 Py_DECREF(func);
1147 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001148 if (res == NULL)
1149 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001151 return 0;
1152}
1153
1154static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001155instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 PyObject *func, *arg, *res;
1158 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001159
Guido van Rossum2878a691996-08-09 20:53:24 +00001160 if (value == NULL) {
1161 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001162 delslicestr =
1163 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001164 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001165 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001166 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1167 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001168 PyErr_Clear();
1169 if (delitemstr == NULL)
1170 delitemstr =
1171 PyString_InternFromString("__delitem__");
1172 func = instance_getattr(inst, delitemstr);
1173 if (func == NULL)
1174 return -1;
1175
1176 arg = Py_BuildValue("(N)",
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001177 _PySlice_FromIndices(i, j));
Thomas Wouters1d75a792000-08-17 22:37:32 +00001178 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001179 arg = Py_BuildValue("(nn)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001180 }
1181 else {
1182 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 setslicestr =
1184 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001185 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001186 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001187 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1188 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001189 PyErr_Clear();
1190 if (setitemstr == NULL)
1191 setitemstr =
1192 PyString_InternFromString("__setitem__");
1193 func = instance_getattr(inst, setitemstr);
1194 if (func == NULL)
1195 return -1;
1196
1197 arg = Py_BuildValue("(NO)",
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001198 _PySlice_FromIndices(i, j), value);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001199 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001200 arg = Py_BuildValue("(nnO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001201 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001202 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001204 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001205 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 res = PyEval_CallObject(func, arg);
1207 Py_DECREF(func);
1208 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209 if (res == NULL)
1210 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001212 return 0;
1213}
1214
Tim Peterscb8d3682001-05-05 21:05:01 +00001215static int
1216instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001217{
1218 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001219 PyObject *func;
1220
1221 /* Try __contains__ first.
1222 * If that can't be done, try iterator-based searching.
1223 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001224
1225 if(__contains__ == NULL) {
1226 __contains__ = PyString_InternFromString("__contains__");
1227 if(__contains__ == NULL)
1228 return -1;
1229 }
1230 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001231 if (func) {
1232 PyObject *res;
1233 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001234 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001235 if(arg == NULL) {
1236 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001237 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001238 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001239 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001240 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001241 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001242 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001243 return -1;
1244 ret = PyObject_IsTrue(res);
1245 Py_DECREF(res);
1246 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001247 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001248
1249 /* Couldn't find __contains__. */
1250 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1251 /* Assume the failure was simply due to that there is no
1252 * __contains__ attribute, and try iterating instead.
1253 */
1254 PyErr_Clear();
Tim Peters16a77ad2001-09-08 04:00:12 +00001255 return _PySequence_IterSearch((PyObject *)inst, member,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001256 PY_ITERSEARCH_CONTAINS) > 0;
Tim Peterscb8d3682001-05-05 21:05:01 +00001257 }
1258 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001259 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001260}
1261
Fred Drake79912472000-07-09 04:06:11 +00001262static PySequenceMethods
1263instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001264 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001265 0, /* sq_concat */
1266 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001267 (ssizeargfunc)instance_item, /* sq_item */
1268 (ssizessizeargfunc)instance_slice, /* sq_slice */
1269 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1270 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001271 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001272};
1273
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001275generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001276{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001278
1279 if ((func = instance_getattr(self, methodname)) == NULL)
1280 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 res = PyEval_CallObject(func, (PyObject *)NULL);
1282 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001283 return res;
1284}
1285
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001286static PyObject *
1287generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001288{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001289 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001291 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001292 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001293 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001294 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001296 Py_INCREF(Py_NotImplemented);
1297 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001298 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001299 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001300 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001302 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001303 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001304 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 Py_DECREF(args);
1306 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001307 return result;
1308}
1309
1310
1311static PyObject *coerce_obj;
1312
1313/* Try one half of a binary operator involving a class instance. */
1314static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001315half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001316 int swapped)
1317{
1318 PyObject *args;
1319 PyObject *coercefunc;
1320 PyObject *coerced = NULL;
1321 PyObject *v1;
1322 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001323
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001324 if (!PyInstance_Check(v)) {
1325 Py_INCREF(Py_NotImplemented);
1326 return Py_NotImplemented;
1327 }
1328
1329 if (coerce_obj == NULL) {
1330 coerce_obj = PyString_InternFromString("__coerce__");
1331 if (coerce_obj == NULL)
1332 return NULL;
1333 }
1334 coercefunc = PyObject_GetAttr(v, coerce_obj);
1335 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001336 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1337 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001338 PyErr_Clear();
1339 return generic_binary_op(v, w, opname);
1340 }
1341
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001342 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001343 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001344 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001345 return NULL;
1346 }
1347 coerced = PyEval_CallObject(coercefunc, args);
1348 Py_DECREF(args);
1349 Py_DECREF(coercefunc);
1350 if (coerced == NULL) {
1351 return NULL;
1352 }
1353 if (coerced == Py_None || coerced == Py_NotImplemented) {
1354 Py_DECREF(coerced);
1355 return generic_binary_op(v, w, opname);
1356 }
1357 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1358 Py_DECREF(coerced);
1359 PyErr_SetString(PyExc_TypeError,
1360 "coercion should return None or 2-tuple");
1361 return NULL;
1362 }
1363 v1 = PyTuple_GetItem(coerced, 0);
1364 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001365 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001366 /* prevent recursion if __coerce__ returns self as the first
1367 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001368 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001369 } else {
1370 if (swapped)
1371 result = (thisfunc)(w, v1);
1372 else
1373 result = (thisfunc)(v1, w);
1374 }
1375 Py_DECREF(coerced);
1376 return result;
1377}
1378
1379/* Implement a binary operator involving at least one class instance. */
1380static PyObject *
1381do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1382 binaryfunc thisfunc)
1383{
1384 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1385 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001386 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001387 result = half_binop(w, v, ropname, thisfunc, 1);
1388 }
1389 return result;
1390}
1391
1392static PyObject *
1393do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1394 char *ropname, binaryfunc thisfunc)
1395{
1396 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1397 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001398 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001399 result = do_binop(v, w, opname, ropname, thisfunc);
1400 }
1401 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001402}
1403
Guido van Rossum879c5811995-01-10 15:24:06 +00001404static int
Fred Drake79912472000-07-09 04:06:11 +00001405instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001406{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 PyObject *v = *pv;
1408 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001409 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 PyObject *args;
1411 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001412
Guido van Rossum2878a691996-08-09 20:53:24 +00001413 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001414 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001415 if (coerce_obj == NULL)
1416 return -1;
1417 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001418 coercefunc = PyObject_GetAttr(v, coerce_obj);
1419 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001420 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001421 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1422 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001424 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001425 }
1426 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001427 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001428 if (args == NULL) {
1429 return -1;
1430 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001431 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001433 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001434 if (coerced == NULL) {
1435 /* __coerce__ call raised an exception */
1436 return -1;
1437 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001438 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001439 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001441 return 1;
1442 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001444 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 Py_DECREF(coerced);
1446 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001447 "coercion should return None or 2-tuple");
1448 return -1;
1449 }
1450 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 *pv = PyTuple_GetItem(coerced, 0);
1452 *pw = PyTuple_GetItem(coerced, 1);
1453 Py_INCREF(*pv);
1454 Py_INCREF(*pw);
1455 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001456 return 0;
1457}
1458
Guido van Rossum04691fc1992-08-12 15:35:34 +00001459#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001460static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001462 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001463 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001464}
1465
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001466#define BINARY(f, m, n) \
1467static PyObject *f(PyObject *v, PyObject *w) { \
1468 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1469}
1470
1471#define BINARY_INPLACE(f, m, n) \
1472static PyObject *f(PyObject *v, PyObject *w) { \
1473 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1474 "__r" m "__", n); \
1475}
1476
Guido van Rossum04691fc1992-08-12 15:35:34 +00001477UNARY(instance_neg, "__neg__")
1478UNARY(instance_pos, "__pos__")
1479UNARY(instance_abs, "__abs__")
1480
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001481BINARY(instance_or, "or", PyNumber_Or)
1482BINARY(instance_and, "and", PyNumber_And)
1483BINARY(instance_xor, "xor", PyNumber_Xor)
1484BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1485BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1486BINARY(instance_add, "add", PyNumber_Add)
1487BINARY(instance_sub, "sub", PyNumber_Subtract)
1488BINARY(instance_mul, "mul", PyNumber_Multiply)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001489BINARY(instance_mod, "mod", PyNumber_Remainder)
1490BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001491BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1492BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001493
1494BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1495BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1496BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1497BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1498BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1499BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1500BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1501BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001502BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001503BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1504BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001505
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001506/* Try a 3-way comparison, returning an int; v is an instance. Return:
1507 -2 for an exception;
1508 -1 if v < w;
1509 0 if v == w;
1510 1 if v > w;
1511 2 if this particular 3-way comparison is not implemented or undefined.
1512*/
1513static int
1514half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001515{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001516 static PyObject *cmp_obj;
1517 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001518 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001519 PyObject *result;
1520 long l;
1521
1522 assert(PyInstance_Check(v));
1523
1524 if (cmp_obj == NULL) {
1525 cmp_obj = PyString_InternFromString("__cmp__");
1526 if (cmp_obj == NULL)
1527 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001528 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001529
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001530 cmp_func = PyObject_GetAttr(v, cmp_obj);
1531 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001532 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1533 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001534 PyErr_Clear();
1535 return 2;
1536 }
1537
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001538 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001539 if (args == NULL) {
1540 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001541 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001542 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001543
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001544 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001545 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001546 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001547
1548 if (result == NULL)
1549 return -2;
1550
1551 if (result == Py_NotImplemented) {
1552 Py_DECREF(result);
1553 return 2;
1554 }
1555
1556 l = PyInt_AsLong(result);
1557 Py_DECREF(result);
1558 if (l == -1 && PyErr_Occurred()) {
1559 PyErr_SetString(PyExc_TypeError,
1560 "comparison did not return an int");
1561 return -2;
1562 }
1563
1564 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001565}
1566
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001567/* Try a 3-way comparison, returning an int; either v or w is an instance.
1568 We first try a coercion. Return:
1569 -2 for an exception;
1570 -1 if v < w;
1571 0 if v == w;
1572 1 if v > w;
1573 2 if this particular 3-way comparison is not implemented or undefined.
1574 THIS IS ONLY CALLED FROM object.c!
1575*/
1576static int
1577instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001578{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001579 int c;
1580
1581 c = PyNumber_CoerceEx(&v, &w);
1582 if (c < 0)
1583 return -2;
1584 if (c == 0) {
1585 /* If neither is now an instance, use regular comparison */
1586 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1587 c = PyObject_Compare(v, w);
1588 Py_DECREF(v);
1589 Py_DECREF(w);
1590 if (PyErr_Occurred())
1591 return -2;
1592 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001593 }
1594 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001595 else {
1596 /* The coercion didn't do anything.
1597 Treat this the same as returning v and w unchanged. */
1598 Py_INCREF(v);
1599 Py_INCREF(w);
1600 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001601
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001602 if (PyInstance_Check(v)) {
1603 c = half_cmp(v, w);
1604 if (c <= 1) {
1605 Py_DECREF(v);
1606 Py_DECREF(w);
1607 return c;
1608 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001609 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001610 if (PyInstance_Check(w)) {
1611 c = half_cmp(w, v);
1612 if (c <= 1) {
1613 Py_DECREF(v);
1614 Py_DECREF(w);
1615 if (c >= -1)
1616 c = -c;
1617 return c;
1618 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001619 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001620 Py_DECREF(v);
1621 Py_DECREF(w);
1622 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001623}
1624
Guido van Rossum9bfef441993-03-29 10:43:31 +00001625static int
Fred Drake79912472000-07-09 04:06:11 +00001626instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001627{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001629 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001631
Guido van Rossum2878a691996-08-09 20:53:24 +00001632 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001633 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001634 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001635 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1636 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001638 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001639 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001640 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001641 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1642 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001644 /* Fall back to the default behavior:
1645 all instances are nonzero */
1646 return 1;
1647 }
1648 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 res = PyEval_CallObject(func, (PyObject *)NULL);
1650 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001651 if (res == NULL)
1652 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001653 if (!PyInt_Check(res)) {
1654 Py_DECREF(res);
1655 PyErr_SetString(PyExc_TypeError,
1656 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001657 return -1;
1658 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 outcome = PyInt_AsLong(res);
1660 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001661 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 PyErr_SetString(PyExc_ValueError,
1663 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001664 return -1;
1665 }
1666 return outcome > 0;
1667}
1668
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001669static Py_ssize_t
1670instance_index(PyInstanceObject *self)
1671{
1672 PyObject *func, *res;
1673 Py_ssize_t outcome;
1674 static PyObject *indexstr = NULL;
1675
1676 if (indexstr == NULL) {
1677 indexstr = PyString_InternFromString("__index__");
1678 if (indexstr == NULL)
1679 return -1;
1680 }
1681 if ((func = instance_getattr(self, indexstr)) == NULL) {
1682 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1683 return -1;
1684 PyErr_Clear();
1685 PyErr_SetString(PyExc_TypeError,
1686 "object cannot be interpreted as an index");
1687 return -1;
1688 }
1689 res = PyEval_CallObject(func, (PyObject *)NULL);
1690 Py_DECREF(func);
1691 if (res == NULL)
1692 return -1;
1693 if (PyInt_Check(res) || PyLong_Check(res)) {
1694 outcome = res->ob_type->tp_as_number->nb_index(res);
1695 }
1696 else {
1697 PyErr_SetString(PyExc_TypeError,
1698 "__index__ must return an int or a long");
1699 outcome = -1;
1700 }
1701 Py_DECREF(res);
1702 return outcome;
1703}
1704
1705
Guido van Rossum04691fc1992-08-12 15:35:34 +00001706UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001707UNARY(instance_int, "__int__")
1708UNARY(instance_long, "__long__")
1709UNARY(instance_float, "__float__")
1710UNARY(instance_oct, "__oct__")
1711UNARY(instance_hex, "__hex__")
1712
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001713static PyObject *
1714bin_power(PyObject *v, PyObject *w)
1715{
1716 return PyNumber_Power(v, w, Py_None);
1717}
1718
Guido van Rossum03093a21994-09-28 15:51:32 +00001719/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001721instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001722{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001723 if (z == Py_None) {
1724 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001725 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001726 else {
1727 PyObject *func;
1728 PyObject *args;
1729 PyObject *result;
1730
1731 /* XXX Doesn't do coercions... */
1732 func = PyObject_GetAttrString(v, "__pow__");
1733 if (func == NULL)
1734 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001735 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001736 if (args == NULL) {
1737 Py_DECREF(func);
1738 return NULL;
1739 }
1740 result = PyEval_CallObject(func, args);
1741 Py_DECREF(func);
1742 Py_DECREF(args);
1743 return result;
1744 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001745}
1746
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001747static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001748bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001749{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001750 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001751}
1752
1753
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001754static PyObject *
1755instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1756{
1757 if (z == Py_None) {
1758 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1759 "__rpow__", bin_inplace_power);
1760 }
1761 else {
1762 /* XXX Doesn't do coercions... */
1763 PyObject *func;
1764 PyObject *args;
1765 PyObject *result;
1766
1767 func = PyObject_GetAttrString(v, "__ipow__");
1768 if (func == NULL) {
1769 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1770 return NULL;
1771 PyErr_Clear();
1772 return instance_pow(v, w, z);
1773 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001774 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001775 if (args == NULL) {
1776 Py_DECREF(func);
1777 return NULL;
1778 }
1779 result = PyEval_CallObject(func, args);
1780 Py_DECREF(func);
1781 Py_DECREF(args);
1782 return result;
1783 }
1784}
1785
1786
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001787/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001788#define NAME_OPS 6
1789static PyObject **name_op = NULL;
1790
Tim Peters34592512002-07-11 06:23:50 +00001791static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001792init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001793{
1794 int i;
1795 char *_name_op[] = {
1796 "__lt__",
1797 "__le__",
1798 "__eq__",
1799 "__ne__",
1800 "__gt__",
1801 "__ge__",
1802 };
1803
1804 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1805 if (name_op == NULL)
1806 return -1;
1807 for (i = 0; i < NAME_OPS; ++i) {
1808 name_op[i] = PyString_InternFromString(_name_op[i]);
1809 if (name_op[i] == NULL)
1810 return -1;
1811 }
1812 return 0;
1813}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001814
1815static PyObject *
1816half_richcompare(PyObject *v, PyObject *w, int op)
1817{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001818 PyObject *method;
1819 PyObject *args;
1820 PyObject *res;
1821
1822 assert(PyInstance_Check(v));
1823
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001824 if (name_op == NULL) {
1825 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001826 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001827 }
1828 /* If the instance doesn't define an __getattr__ method, use
1829 instance_getattr2 directly because it will not set an
1830 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001831 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001832 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001833 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001834 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001835 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001836 if (method == NULL) {
1837 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001838 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1839 return NULL;
1840 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001841 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001842 res = Py_NotImplemented;
1843 Py_INCREF(res);
1844 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001845 }
1846
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001847 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001848 if (args == NULL) {
1849 Py_DECREF(method);
1850 return NULL;
1851 }
1852
1853 res = PyEval_CallObject(method, args);
1854 Py_DECREF(args);
1855 Py_DECREF(method);
1856
1857 return res;
1858}
1859
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001860static PyObject *
1861instance_richcompare(PyObject *v, PyObject *w, int op)
1862{
1863 PyObject *res;
1864
1865 if (PyInstance_Check(v)) {
1866 res = half_richcompare(v, w, op);
1867 if (res != Py_NotImplemented)
1868 return res;
1869 Py_DECREF(res);
1870 }
1871
1872 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00001873 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001874 if (res != Py_NotImplemented)
1875 return res;
1876 Py_DECREF(res);
1877 }
1878
1879 Py_INCREF(Py_NotImplemented);
1880 return Py_NotImplemented;
1881}
1882
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001883
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001884/* Get the iterator */
1885static PyObject *
1886instance_getiter(PyInstanceObject *self)
1887{
1888 PyObject *func;
1889
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001890 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001891 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001892 if (iterstr == NULL)
1893 return NULL;
1894 }
1895 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001896 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001897 if (getitemstr == NULL)
1898 return NULL;
1899 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001900
1901 if ((func = instance_getattr(self, iterstr)) != NULL) {
1902 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1903 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001904 if (res != NULL && !PyIter_Check(res)) {
1905 PyErr_Format(PyExc_TypeError,
1906 "__iter__ returned non-iterator "
1907 "of type '%.100s'",
1908 res->ob_type->tp_name);
1909 Py_DECREF(res);
1910 res = NULL;
1911 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001912 return res;
1913 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001914 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1915 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001916 PyErr_Clear();
1917 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001918 PyErr_SetString(PyExc_TypeError,
1919 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001920 return NULL;
1921 }
1922 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001923 return PySeqIter_New((PyObject *)self);
1924}
1925
1926
1927/* Call the iterator's next */
1928static PyObject *
1929instance_iternext(PyInstanceObject *self)
1930{
1931 PyObject *func;
1932
1933 if (nextstr == NULL)
1934 nextstr = PyString_InternFromString("next");
1935
1936 if ((func = instance_getattr(self, nextstr)) != NULL) {
1937 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1938 Py_DECREF(func);
1939 if (res != NULL) {
1940 return res;
1941 }
1942 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1943 PyErr_Clear();
1944 return NULL;
1945 }
1946 return NULL;
1947 }
1948 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1949 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001950}
1951
Tim Peters6d6c1a32001-08-02 04:15:00 +00001952static PyObject *
1953instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1954{
1955 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1956 if (call == NULL) {
1957 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001958 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1959 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001960 PyErr_Clear();
1961 PyErr_Format(PyExc_AttributeError,
1962 "%.200s instance has no __call__ method",
1963 PyString_AsString(inst->in_class->cl_name));
1964 return NULL;
1965 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00001966 /* We must check and increment the recursion depth here. Scenario:
1967 class A:
1968 pass
1969 A.__call__ = A() # that's right
1970 a = A() # ok
1971 a() # infinite recursion
1972 This bounces between instance_call() and PyObject_Call() without
1973 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00001974 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00001975 res = NULL;
1976 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00001977 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00001978 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00001979 Py_LeaveRecursiveCall();
1980 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001981 Py_DECREF(call);
1982 return res;
1983}
1984
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001985
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986static PyNumberMethods instance_as_number = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001987 instance_add, /* nb_add */
1988 instance_sub, /* nb_subtract */
1989 instance_mul, /* nb_multiply */
1990 instance_mod, /* nb_remainder */
1991 instance_divmod, /* nb_divmod */
1992 instance_pow, /* nb_power */
1993 (unaryfunc)instance_neg, /* nb_negative */
1994 (unaryfunc)instance_pos, /* nb_positive */
1995 (unaryfunc)instance_abs, /* nb_absolute */
1996 (inquiry)instance_nonzero, /* nb_nonzero */
1997 (unaryfunc)instance_invert, /* nb_invert */
1998 instance_lshift, /* nb_lshift */
1999 instance_rshift, /* nb_rshift */
2000 instance_and, /* nb_and */
2001 instance_xor, /* nb_xor */
2002 instance_or, /* nb_or */
2003 instance_coerce, /* nb_coerce */
2004 (unaryfunc)instance_int, /* nb_int */
2005 (unaryfunc)instance_long, /* nb_long */
2006 (unaryfunc)instance_float, /* nb_float */
2007 (unaryfunc)instance_oct, /* nb_oct */
2008 (unaryfunc)instance_hex, /* nb_hex */
2009 instance_iadd, /* nb_inplace_add */
2010 instance_isub, /* nb_inplace_subtract */
2011 instance_imul, /* nb_inplace_multiply */
2012 instance_imod, /* nb_inplace_remainder */
2013 instance_ipow, /* nb_inplace_power */
2014 instance_ilshift, /* nb_inplace_lshift */
2015 instance_irshift, /* nb_inplace_rshift */
2016 instance_iand, /* nb_inplace_and */
2017 instance_ixor, /* nb_inplace_xor */
2018 instance_ior, /* nb_inplace_or */
2019 instance_floordiv, /* nb_floor_divide */
2020 instance_truediv, /* nb_true_divide */
2021 instance_ifloordiv, /* nb_inplace_floor_divide */
2022 instance_itruediv, /* nb_inplace_true_divide */
2023 (lenfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002024};
2025
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002026PyTypeObject PyInstance_Type = {
2027 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002028 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002029 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002030 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002031 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002032 (destructor)instance_dealloc, /* tp_dealloc */
2033 0, /* tp_print */
2034 0, /* tp_getattr */
2035 0, /* tp_setattr */
2036 instance_compare, /* tp_compare */
2037 (reprfunc)instance_repr, /* tp_repr */
2038 &instance_as_number, /* tp_as_number */
2039 &instance_as_sequence, /* tp_as_sequence */
2040 &instance_as_mapping, /* tp_as_mapping */
2041 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002042 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002043 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002044 (getattrofunc)instance_getattr, /* tp_getattro */
2045 (setattrofunc)instance_setattr, /* tp_setattro */
2046 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002047 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002048 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002049 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002050 0, /* tp_clear */
2051 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002052 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2053 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002054 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002055 0, /* tp_methods */
2056 0, /* tp_members */
2057 0, /* tp_getset */
2058 0, /* tp_base */
2059 0, /* tp_dict */
2060 0, /* tp_descr_get */
2061 0, /* tp_descr_set */
2062 0, /* tp_dictoffset */
2063 0, /* tp_init */
2064 0, /* tp_alloc */
2065 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002066};
2067
2068
Guido van Rossum81daa321993-05-20 14:24:46 +00002069/* Instance method objects are used for two purposes:
2070 (a) as bound instance methods (returned by instancename.methodname)
2071 (b) as unbound methods (returned by ClassName.methodname)
2072 In case (b), im_self is NULL
2073*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002074
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002075static PyMethodObject *free_list;
2076
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002077PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002078PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002079{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002080 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002081 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002082 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002083 return NULL;
2084 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002085 im = free_list;
2086 if (im != NULL) {
2087 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002088 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002089 }
2090 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002091 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002092 if (im == NULL)
2093 return NULL;
2094 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002095 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002096 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002097 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002098 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002099 im->im_self = self;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002100 Py_XINCREF(klass);
2101 im->im_class = klass;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002102 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002103 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002104}
2105
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002106/* Descriptors for PyMethod attributes */
2107
2108/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002109
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002110#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111
Guido van Rossum6f799372001-09-20 20:46:19 +00002112static PyMemberDef instancemethod_memberlist[] = {
2113 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2114 "the class associated with a method"},
2115 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2116 "the function (or other callable) implementing a method"},
2117 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2118 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 {NULL} /* Sentinel */
2120};
2121
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002122/* Christian Tismer argued convincingly that method attributes should
2123 (nearly) always override function attributes.
2124 The one exception is __doc__; there's a default __doc__ which
2125 should only be used for the class, not for instances */
2126
2127static PyObject *
2128instancemethod_get_doc(PyMethodObject *im, void *context)
2129{
2130 static PyObject *docstr;
2131 if (docstr == NULL) {
2132 docstr= PyString_InternFromString("__doc__");
2133 if (docstr == NULL)
2134 return NULL;
2135 }
2136 return PyObject_GetAttr(im->im_func, docstr);
2137}
2138
2139static PyGetSetDef instancemethod_getset[] = {
2140 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2141 {0}
2142};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002143
2144static PyObject *
2145instancemethod_getattro(PyObject *obj, PyObject *name)
2146{
2147 PyMethodObject *im = (PyMethodObject *)obj;
2148 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002149 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002150
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002151 {
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002152 if (tp->tp_dict == NULL) {
2153 if (PyType_Ready(tp) < 0)
2154 return NULL;
2155 }
2156 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002157 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002158
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002159 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002160 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2161 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002162 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002163 else {
2164 Py_INCREF(descr);
2165 return descr;
2166 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002167 }
2168
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002169 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002170}
2171
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002172PyDoc_STRVAR(instancemethod_doc,
2173"instancemethod(function, instance, class)\n\
2174\n\
2175Create an instance method object.");
2176
2177static PyObject *
2178instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2179{
2180 PyObject *func;
2181 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002182 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002183
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002184 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002185 &func, &self, &classObj))
2186 return NULL;
2187 if (!PyCallable_Check(func)) {
2188 PyErr_SetString(PyExc_TypeError,
2189 "first argument must be callable");
2190 return NULL;
2191 }
2192 if (self == Py_None)
2193 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002194 if (self == NULL && classObj == NULL) {
2195 PyErr_SetString(PyExc_TypeError,
2196 "unbound methods must have non-NULL im_class");
2197 return NULL;
2198 }
2199
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002200 return PyMethod_New(func, self, classObj);
2201}
2202
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002203static void
Fred Drake79912472000-07-09 04:06:11 +00002204instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002205{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002206 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002207 if (im->im_weakreflist != NULL)
2208 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002209 Py_DECREF(im->im_func);
2210 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002211 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002212 im->im_self = (PyObject *)free_list;
2213 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002214}
2215
Guido van Rossumebc8c511992-09-03 20:39:51 +00002216static int
Fred Drake79912472000-07-09 04:06:11 +00002217instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002218{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002219 int cmp;
2220 cmp = PyObject_Compare(a->im_func, b->im_func);
2221 if (cmp)
2222 return cmp;
2223
2224 if (a->im_self == b->im_self)
2225 return 0;
2226 if (a->im_self == NULL || b->im_self == NULL)
Guido van Rossume9df7271995-04-06 14:46:51 +00002227 return (a->im_self < b->im_self) ? -1 : 1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002228 else
2229 return PyObject_Compare(a->im_self, b->im_self);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002230}
2231
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002232static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002233instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002234{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002235 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002236 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002237 PyObject *klass = a->im_class;
2238 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2239 char *sfuncname = "?", *sklassname = "?";
2240
2241 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002242 if (funcname == NULL) {
2243 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2244 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002245 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002246 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002247 else if (!PyString_Check(funcname)) {
2248 Py_DECREF(funcname);
2249 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002250 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002251 else
2252 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002253 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002254 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002255 else {
2256 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002257 if (klassname == NULL) {
2258 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2259 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002260 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002261 }
Guido van Rossum40667692001-08-17 13:59:27 +00002262 else if (!PyString_Check(klassname)) {
2263 Py_DECREF(klassname);
2264 klassname = NULL;
2265 }
2266 else
2267 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002268 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002269 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002270 result = PyString_FromFormat("<unbound method %s.%s>",
2271 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002272 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002273 /* XXX Shouldn't use repr() here! */
2274 PyObject *selfrepr = PyObject_Repr(self);
2275 if (selfrepr == NULL)
2276 goto fail;
2277 if (!PyString_Check(selfrepr)) {
2278 Py_DECREF(selfrepr);
2279 goto fail;
2280 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002281 result = PyString_FromFormat("<bound method %s.%s of %s>",
2282 sklassname, sfuncname,
2283 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002284 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002285 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002286 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002287 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002288 Py_XDECREF(klassname);
2289 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002290}
2291
Guido van Rossum9bfef441993-03-29 10:43:31 +00002292static long
Fred Drake79912472000-07-09 04:06:11 +00002293instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002294{
2295 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002296 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002297 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002298 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002299 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002300 if (x == -1)
2301 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002302 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002303 if (y == -1)
2304 return -1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002305 x = x ^ y;
2306 if (x == -1)
2307 x = -2;
2308 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002309}
2310
Jeremy Hylton8caad492000-06-23 14:18:11 +00002311static int
2312instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2313{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002314 Py_VISIT(im->im_func);
2315 Py_VISIT(im->im_self);
2316 Py_VISIT(im->im_class);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002317 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002318}
2319
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002320static void
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002321getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002322{
2323 PyObject *name;
2324
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002325 assert(bufsize > 1);
2326 strcpy(buf, "?"); /* Default outcome */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002327 if (klass == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002328 return;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002329 name = PyObject_GetAttrString(klass, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002330 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002331 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002332 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002333 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002334 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002335 if (PyString_Check(name)) {
2336 strncpy(buf, PyString_AS_STRING(name), bufsize);
2337 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002338 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002339 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002340}
2341
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002342static void
2343getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002344{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002346
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002347 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002348 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002349 strcpy(buf, "nothing");
2350 return;
2351 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002352
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002353 klass = PyObject_GetAttrString(inst, "__class__");
2354 if (klass == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002355 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002356 PyErr_Clear();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002357 klass = (PyObject *)(inst->ob_type);
2358 Py_INCREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002359 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002360 getclassname(klass, buf, bufsize);
2361 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002362}
2363
Tim Peters6d6c1a32001-08-02 04:15:00 +00002364static PyObject *
2365instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2366{
2367 PyObject *self = PyMethod_GET_SELF(func);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002368 PyObject *klass = PyMethod_GET_CLASS(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002369 PyObject *result;
2370
2371 func = PyMethod_GET_FUNCTION(func);
2372 if (self == NULL) {
2373 /* Unbound methods must be called with an instance of
2374 the class (or a derived class) as first argument */
2375 int ok;
2376 if (PyTuple_Size(arg) >= 1)
2377 self = PyTuple_GET_ITEM(arg, 0);
2378 if (self == NULL)
2379 ok = 0;
2380 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002381 ok = PyObject_IsInstance(self, klass);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002382 if (ok < 0)
2383 return NULL;
2384 }
2385 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002386 char clsbuf[256];
2387 char instbuf[256];
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002388 getclassname(klass, clsbuf, sizeof(clsbuf));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002389 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002390 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002391 "unbound method %s%s must be called with "
2392 "%s instance as first argument "
2393 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002394 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002395 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002396 clsbuf,
2397 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002398 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002399 return NULL;
2400 }
2401 Py_INCREF(arg);
2402 }
2403 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002404 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002405 PyObject *newarg = PyTuple_New(argcount + 1);
2406 int i;
2407 if (newarg == NULL)
2408 return NULL;
2409 Py_INCREF(self);
2410 PyTuple_SET_ITEM(newarg, 0, self);
2411 for (i = 0; i < argcount; i++) {
2412 PyObject *v = PyTuple_GET_ITEM(arg, i);
2413 Py_XINCREF(v);
2414 PyTuple_SET_ITEM(newarg, i+1, v);
2415 }
2416 arg = newarg;
2417 }
2418 result = PyObject_Call((PyObject *)func, arg, kw);
2419 Py_DECREF(arg);
2420 return result;
2421}
2422
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002423static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002424instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002425{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002426 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002427 of a class that's not a base class of cls. */
2428
2429 if (PyMethod_GET_SELF(meth) != NULL) {
2430 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002431 Py_INCREF(meth);
2432 return meth;
2433 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002434 /* No, it is an unbound method */
2435 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2436 /* Do subclass test. If it fails, return meth unchanged. */
2437 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2438 if (ok < 0)
2439 return NULL;
2440 if (!ok) {
2441 Py_INCREF(meth);
2442 return meth;
2443 }
2444 }
2445 /* Bind it to obj */
2446 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002447}
2448
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002449PyTypeObject PyMethod_Type = {
2450 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002451 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002452 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002453 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002454 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002455 (destructor)instancemethod_dealloc, /* tp_dealloc */
2456 0, /* tp_print */
2457 0, /* tp_getattr */
2458 0, /* tp_setattr */
2459 (cmpfunc)instancemethod_compare, /* tp_compare */
2460 (reprfunc)instancemethod_repr, /* tp_repr */
2461 0, /* tp_as_number */
2462 0, /* tp_as_sequence */
2463 0, /* tp_as_mapping */
2464 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002465 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002466 0, /* tp_str */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002467 instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002468 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002469 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002470 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002471 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002472 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002473 0, /* tp_clear */
2474 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002475 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2476 0, /* tp_iter */
2477 0, /* tp_iternext */
2478 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002479 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002480 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002481 0, /* tp_base */
2482 0, /* tp_dict */
2483 instancemethod_descr_get, /* tp_descr_get */
2484 0, /* tp_descr_set */
2485 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002486 0, /* tp_init */
2487 0, /* tp_alloc */
2488 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002489};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002490
2491/* Clear out the free list */
2492
2493void
Fred Drake79912472000-07-09 04:06:11 +00002494PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002495{
2496 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002497 PyMethodObject *im = free_list;
2498 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002499 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002500 }
2501}