blob: a1907f52d85dac5cec9d6cc4216b88b94f938ff8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Class object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +00006
Guido van Rossum915f0eb2001-10-17 20:26:38 +00007#define TP_DESCR_GET(t) \
8 (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
9
Neil Schemenauer29bfc072001-01-04 01:43:46 +000010
Guido van Rossum52ca98a1994-09-05 07:32:29 +000011/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000012static PyObject *class_lookup(PyClassObject *, PyObject *,
13 PyClassObject **);
14static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
15static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000016
Guido van Rossuma63eff61998-05-29 21:37:21 +000017static PyObject *getattrstr, *setattrstr, *delattrstr;
18
Fred Drake79912472000-07-09 04:06:11 +000019
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
22 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000025 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000026 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000027 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000028 if (docstr == NULL)
29 return NULL;
30 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000031 if (modstr == NULL) {
32 modstr= PyString_InternFromString("__module__");
33 if (modstr == NULL)
34 return NULL;
35 }
36 if (namestr == NULL) {
37 namestr= PyString_InternFromString("__name__");
38 if (namestr == NULL)
39 return NULL;
40 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000041 if (name == NULL || !PyString_Check(name)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000042 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000043 "PyClass_New: name must be a string");
44 return NULL;
45 }
46 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000047 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000048 "PyClass_New: dict must be a dictionary");
49 return NULL;
50 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 if (PyDict_GetItem(dict, docstr) == NULL) {
52 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000053 return NULL;
54 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000055 if (PyDict_GetItem(dict, modstr) == NULL) {
56 PyObject *globals = PyEval_GetGlobals();
57 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000058 PyObject *modname = PyDict_GetItem(globals, namestr);
59 if (modname != NULL) {
60 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000061 return NULL;
62 }
63 }
64 }
Guido van Rossume2966a61991-12-10 13:53:23 +000065 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000067 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000068 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000069 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000070 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +000071 Py_ssize_t i, n;
Guido van Rossum28d80b12001-09-07 21:08:32 +000072 PyObject *base;
Guido van Rossum04d73c41997-10-07 14:54:11 +000073 if (!PyTuple_Check(bases)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000074 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000075 "PyClass_New: bases must be a tuple");
76 return NULL;
77 }
Guido van Rossum28d80b12001-09-07 21:08:32 +000078 n = PyTuple_Size(bases);
79 for (i = 0; i < n; i++) {
80 base = PyTuple_GET_ITEM(bases, i);
81 if (!PyClass_Check(base)) {
82 if (PyCallable_Check(
83 (PyObject *) base->ob_type))
84 return PyObject_CallFunction(
85 (PyObject *) base->ob_type,
86 "OOO",
87 name,
88 bases,
89 dict);
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000091 "PyClass_New: base must be a class");
92 return NULL;
93 }
94 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000096 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000097 op = PyObject_GC_New(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000098 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000101 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000104 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000106 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000107 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000108 getattrstr = PyString_InternFromString("__getattr__");
109 setattrstr = PyString_InternFromString("__setattr__");
110 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000111 }
112 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
113 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
114 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_XINCREF(op->cl_getattr);
116 Py_XINCREF(op->cl_setattr);
117 Py_XINCREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000118 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120}
121
Guido van Rossumb479dc52001-09-05 22:52:50 +0000122PyObject *
123PyMethod_Function(PyObject *im)
124{
125 if (!PyMethod_Check(im)) {
126 PyErr_BadInternalCall();
127 return NULL;
128 }
129 return ((PyMethodObject *)im)->im_func;
130}
131
132PyObject *
133PyMethod_Self(PyObject *im)
134{
135 if (!PyMethod_Check(im)) {
136 PyErr_BadInternalCall();
137 return NULL;
138 }
139 return ((PyMethodObject *)im)->im_self;
140}
141
142PyObject *
143PyMethod_Class(PyObject *im)
144{
145 if (!PyMethod_Check(im)) {
146 PyErr_BadInternalCall();
147 return NULL;
148 }
149 return ((PyMethodObject *)im)->im_class;
150}
151
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000152PyDoc_STRVAR(class_doc,
153"classobj(name, bases, dict)\n\
154\n\
155Create a class object. The name must be a string; the second argument\n\
156a tuple of classes, and the third a dictionary.");
157
158static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000159class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
160{
161 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000162 static char *kwlist[] = {"name", "bases", "dict", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163
164 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
165 &name, &bases, &dict))
166 return NULL;
167 return PyClass_New(bases, dict, name);
168}
169
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170/* Class methods */
171
172static void
Fred Drake79912472000-07-09 04:06:11 +0000173class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000175 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 Py_DECREF(op->cl_bases);
177 Py_DECREF(op->cl_dict);
178 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000179 Py_XDECREF(op->cl_getattr);
180 Py_XDECREF(op->cl_setattr);
181 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000182 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183}
184
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000186class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000187{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000188 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000190 if (value != NULL) {
191 *pclass = cp;
192 return value;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000195 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000196 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 PyObject *v = class_lookup(
198 (PyClassObject *)
199 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000200 if (v != NULL)
201 return v;
202 }
203 return NULL;
204}
205
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000207class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 register PyObject *v;
210 register char *sname = PyString_AsString(name);
Anthony Baxter377be112006-04-11 06:54:30 +0000211 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 descrgetfunc f;
213
Guido van Rossum2878a691996-08-09 20:53:24 +0000214 if (sname[0] == '_' && sname[1] == '_') {
215 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 if (PyEval_GetRestricted()) {
217 PyErr_SetString(PyExc_RuntimeError,
218 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000219 return NULL;
220 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000222 return op->cl_dict;
223 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000224 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000226 return op->cl_bases;
227 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000228 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000229 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000231 else
232 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000234 return v;
235 }
Guido van Rossum94308391991-10-20 20:11:48 +0000236 }
Anthony Baxter377be112006-04-11 06:54:30 +0000237 v = class_lookup(op, name, &klass);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000238 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000239 PyErr_Format(PyExc_AttributeError,
240 "class %.50s has no attribute '%.400s'",
241 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000242 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000244 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000245 if (f == NULL)
246 Py_INCREF(v);
247 else
248 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000249 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250}
251
Guido van Rossuma63eff61998-05-29 21:37:21 +0000252static void
Fred Drake79912472000-07-09 04:06:11 +0000253set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000254{
255 PyObject *temp = *slot;
256 Py_XINCREF(v);
257 *slot = v;
258 Py_XDECREF(temp);
259}
260
Guido van Rossum7ba30431998-07-08 13:34:48 +0000261static void
Fred Drake79912472000-07-09 04:06:11 +0000262set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000263{
264 PyClassObject *dummy;
265
266 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
267 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
268 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
269}
270
Guido van Rossuma63eff61998-05-29 21:37:21 +0000271static char *
Fred Drake79912472000-07-09 04:06:11 +0000272set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000273{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000274 if (v == NULL || !PyDict_Check(v))
275 return "__dict__ must be a dictionary object";
276 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000277 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000278 return "";
279}
280
281static char *
Fred Drake79912472000-07-09 04:06:11 +0000282set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000283{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000284 Py_ssize_t i, n;
Guido van Rossuma63eff61998-05-29 21:37:21 +0000285
286 if (v == NULL || !PyTuple_Check(v))
287 return "__bases__ must be a tuple object";
288 n = PyTuple_Size(v);
289 for (i = 0; i < n; i++) {
290 PyObject *x = PyTuple_GET_ITEM(v, i);
291 if (!PyClass_Check(x))
292 return "__bases__ items must be classes";
293 if (PyClass_IsSubclass(x, (PyObject *)c))
294 return "a __bases__ item causes an inheritance cycle";
295 }
296 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000297 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000298 return "";
299}
300
301static char *
Fred Drake79912472000-07-09 04:06:11 +0000302set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000303{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000304 if (v == NULL || !PyString_Check(v))
305 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000306 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000307 return "__name__ must not contain null bytes";
308 set_slot(&c->cl_name, v);
309 return "";
310}
311
Guido van Rossum94308391991-10-20 20:11:48 +0000312static int
Fred Drake79912472000-07-09 04:06:11 +0000313class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000314{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000315 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 if (PyEval_GetRestricted()) {
317 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000318 "classes are read-only in restricted mode");
319 return -1;
320 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000321 sname = PyString_AsString(name);
322 if (sname[0] == '_' && sname[1] == '_') {
Martin v. Löwis66851282006-04-22 11:40:03 +0000323 Py_ssize_t n = PyString_Size(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000324 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000325 char *err = NULL;
326 if (strcmp(sname, "__dict__") == 0)
327 err = set_dict(op, v);
328 else if (strcmp(sname, "__bases__") == 0)
329 err = set_bases(op, v);
330 else if (strcmp(sname, "__name__") == 0)
331 err = set_name(op, v);
332 else if (strcmp(sname, "__getattr__") == 0)
333 set_slot(&op->cl_getattr, v);
334 else if (strcmp(sname, "__setattr__") == 0)
335 set_slot(&op->cl_setattr, v);
336 else if (strcmp(sname, "__delattr__") == 0)
337 set_slot(&op->cl_delattr, v);
338 /* For the last three, we fall through to update the
339 dictionary as well. */
340 if (err != NULL) {
341 if (*err == '\0')
342 return 0;
343 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000344 return -1;
345 }
346 }
347 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000348 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000350 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000351 PyErr_Format(PyExc_AttributeError,
352 "class %.50s has no attribute '%.400s'",
353 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000354 return rv;
355 }
Guido van Rossum94308391991-10-20 20:11:48 +0000356 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000358}
359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000361class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000362{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000363 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000364 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000366 name = "?";
367 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000369 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000370 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000371 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000372 return PyString_FromFormat("<class %s.%s at %p>",
373 PyString_AsString(mod),
374 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000375}
376
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000377static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000378class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000379{
380 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
381 PyObject *name = op->cl_name;
382 PyObject *res;
Martin v. Löwis66851282006-04-22 11:40:03 +0000383 Py_ssize_t m, n;
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000384
385 if (name == NULL || !PyString_Check(name))
386 return class_repr(op);
387 if (mod == NULL || !PyString_Check(mod)) {
388 Py_INCREF(name);
389 return name;
390 }
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000391 m = PyString_GET_SIZE(mod);
392 n = PyString_GET_SIZE(name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000393 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
394 if (res != NULL) {
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000395 char *s = PyString_AS_STRING(res);
396 memcpy(s, PyString_AS_STRING(mod), m);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000397 s += m;
398 *s++ = '.';
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000399 memcpy(s, PyString_AS_STRING(name), n);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000400 }
401 return res;
402}
403
Jeremy Hylton8caad492000-06-23 14:18:11 +0000404static int
405class_traverse(PyClassObject *o, visitproc visit, void *arg)
406{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000407 Py_VISIT(o->cl_bases);
408 Py_VISIT(o->cl_dict);
409 Py_VISIT(o->cl_name);
410 Py_VISIT(o->cl_getattr);
411 Py_VISIT(o->cl_setattr);
412 Py_VISIT(o->cl_delattr);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000413 return 0;
414}
415
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416PyTypeObject PyClass_Type = {
417 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000419 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000420 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000422 (destructor)class_dealloc, /* tp_dealloc */
423 0, /* tp_print */
424 0, /* tp_getattr */
425 0, /* tp_setattr */
426 0, /* tp_compare */
427 (reprfunc)class_repr, /* tp_repr */
428 0, /* tp_as_number */
429 0, /* tp_as_sequence */
430 0, /* tp_as_mapping */
431 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000432 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000433 (reprfunc)class_str, /* tp_str */
434 (getattrofunc)class_getattr, /* tp_getattro */
435 (setattrofunc)class_setattr, /* tp_setattro */
436 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000437 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000438 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000439 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000440 0, /* tp_clear */
441 0, /* tp_richcompare */
442 0, /* tp_weaklistoffset */
443 0, /* tp_iter */
444 0, /* tp_iternext */
445 0, /* tp_methods */
446 0, /* tp_members */
447 0, /* tp_getset */
448 0, /* tp_base */
449 0, /* tp_dict */
450 0, /* tp_descr_get */
451 0, /* tp_descr_set */
452 0, /* tp_dictoffset */
453 0, /* tp_init */
454 0, /* tp_alloc */
455 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456};
457
Guido van Rossum81daa321993-05-20 14:24:46 +0000458int
Anthony Baxter377be112006-04-11 06:54:30 +0000459PyClass_IsSubclass(PyObject *klass, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000460{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000461 Py_ssize_t i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 PyClassObject *cp;
Anthony Baxter377be112006-04-11 06:54:30 +0000463 if (klass == base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000464 return 1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000465 if (PyTuple_Check(base)) {
466 n = PyTuple_GET_SIZE(base);
467 for (i = 0; i < n; i++) {
Anthony Baxter377be112006-04-11 06:54:30 +0000468 if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000469 return 1;
470 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +0000471 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +0000472 }
Anthony Baxter377be112006-04-11 06:54:30 +0000473 if (klass == NULL || !PyClass_Check(klass))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000474 return 0;
Anthony Baxter377be112006-04-11 06:54:30 +0000475 cp = (PyClassObject *)klass;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000477 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000479 return 1;
480 }
481 return 0;
482}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483
Guido van Rossum81daa321993-05-20 14:24:46 +0000484
485/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000488PyInstance_NewRaw(PyObject *klass, PyObject *dict)
489{
490 PyInstanceObject *inst;
491
492 if (!PyClass_Check(klass)) {
493 PyErr_BadInternalCall();
494 return NULL;
495 }
496 if (dict == NULL) {
497 dict = PyDict_New();
498 if (dict == NULL)
499 return NULL;
500 }
501 else {
502 if (!PyDict_Check(dict)) {
503 PyErr_BadInternalCall();
504 return NULL;
505 }
506 Py_INCREF(dict);
507 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000508 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000509 if (inst == NULL) {
510 Py_DECREF(dict);
511 return NULL;
512 }
Fred Drake4e262a92001-03-22 18:26:47 +0000513 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000514 Py_INCREF(klass);
515 inst->in_class = (PyClassObject *)klass;
516 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000517 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000518 return (PyObject *)inst;
519}
520
521PyObject *
522PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000523{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 register PyInstanceObject *inst;
525 PyObject *init;
526 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000527
528 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000529 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000531 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000532 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000533 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000534 if (init == NULL) {
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000535 if (PyErr_Occurred()) {
536 Py_DECREF(inst);
537 return NULL;
538 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 if ((arg != NULL && (!PyTuple_Check(arg) ||
540 PyTuple_Size(arg) != 0))
541 || (kw != NULL && (!PyDict_Check(kw) ||
542 PyDict_Size(kw) != 0))) {
543 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000544 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000546 inst = NULL;
547 }
548 }
549 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
551 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000552 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000554 inst = NULL;
555 }
556 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 if (res != Py_None) {
558 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000559 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000561 inst = NULL;
562 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000564 }
565 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567}
568
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000569/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000571PyDoc_STRVAR(instance_doc,
572"instance(class[, dict])\n\
573\n\
574Create an instance without calling its __init__() method.\n\
575The class must be a classic class.\n\
576If present, dict must be a dictionary or None.");
577
578static PyObject *
579instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
580{
581 PyObject *klass;
582 PyObject *dict = Py_None;
583
584 if (!PyArg_ParseTuple(args, "O!|O:instance",
585 &PyClass_Type, &klass, &dict))
586 return NULL;
587
588 if (dict == Py_None)
589 dict = NULL;
590 else if (!PyDict_Check(dict)) {
591 PyErr_SetString(PyExc_TypeError,
592 "instance() second arg must be dictionary or None");
593 return NULL;
594 }
595 return PyInstance_NewRaw(klass, dict);
596}
597
598
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000599static void
Fred Drake79912472000-07-09 04:06:11 +0000600instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 PyObject *error_type, *error_value, *error_traceback;
603 PyObject *del;
604 static PyObject *delstr;
Tim Peters34592512002-07-11 06:23:50 +0000605
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000606 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000607 if (inst->in_weakreflist != NULL)
608 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000609
Tim Peters6b184912000-09-17 14:40:17 +0000610 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000611 assert(inst->ob_type == &PyInstance_Type);
612 assert(inst->ob_refcnt == 0);
613 inst->ob_refcnt = 1;
Tim Peters6b184912000-09-17 14:40:17 +0000614
615 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000617 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000618 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000619 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000620 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000622 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000623 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000624 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 Py_DECREF(res);
626 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000627 }
Tim Peters6b184912000-09-17 14:40:17 +0000628 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters34592512002-07-11 06:23:50 +0000630
Tim Peters6b184912000-09-17 14:40:17 +0000631 /* Undo the temporary resurrection; can't use DECREF here, it would
632 * cause a recursive call.
633 */
Tim Peters34592512002-07-11 06:23:50 +0000634 assert(inst->ob_refcnt > 0);
635 if (--inst->ob_refcnt == 0) {
636 Py_DECREF(inst->in_class);
637 Py_XDECREF(inst->in_dict);
638 PyObject_GC_Del(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000639 }
Tim Peters34592512002-07-11 06:23:50 +0000640 else {
Martin v. Löwis66851282006-04-22 11:40:03 +0000641 Py_ssize_t refcnt = inst->ob_refcnt;
Tim Peters34592512002-07-11 06:23:50 +0000642 /* __del__ resurrected it! Make it look like the original
643 * Py_DECREF never happened.
644 */
645 _Py_NewReference((PyObject *)inst);
646 inst->ob_refcnt = refcnt;
647 _PyObject_GC_TRACK(inst);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000648 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
649 * we need to undo that. */
650 _Py_DEC_REFTOTAL;
651 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
652 * object chain, so no more to do there.
Tim Peters34592512002-07-11 06:23:50 +0000653 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
Michael W. Hudson3f3b6682004-08-03 10:21:03 +0000654 * _Py_NewReference bumped tp_allocs: both of those need to be
655 * undone.
Tim Peters34592512002-07-11 06:23:50 +0000656 */
Tim Peters6b184912000-09-17 14:40:17 +0000657#ifdef COUNT_ALLOCS
Tim Peters34592512002-07-11 06:23:50 +0000658 --inst->ob_type->tp_frees;
659 --inst->ob_type->tp_allocs;
Tim Peters6b184912000-09-17 14:40:17 +0000660#endif
Tim Peters34592512002-07-11 06:23:50 +0000661 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662}
663
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000665instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000666{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 register PyObject *v;
668 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000669 if (sname[0] == '_' && sname[1] == '_') {
670 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 if (PyEval_GetRestricted()) {
672 PyErr_SetString(PyExc_RuntimeError,
673 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000674 return NULL;
675 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000677 return inst->in_dict;
678 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000679 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 Py_INCREF(inst->in_class);
681 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000682 }
Guido van Rossum94308391991-10-20 20:11:48 +0000683 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000684 v = instance_getattr2(inst, name);
Guido van Rossumf740bdf2002-10-29 18:36:40 +0000685 if (v == NULL && !PyErr_Occurred()) {
Fred Drake661ea262000-10-24 19:57:45 +0000686 PyErr_Format(PyExc_AttributeError,
687 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000688 PyString_AS_STRING(inst->in_class->cl_name), sname);
689 }
690 return v;
691}
692
693static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000694instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000695{
696 register PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000697 PyClassObject *klass;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000698 descrgetfunc f;
699
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000701 if (v != NULL) {
702 Py_INCREF(v);
703 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000704 }
Anthony Baxter377be112006-04-11 06:54:30 +0000705 v = class_lookup(inst->in_class, name, &klass);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000706 if (v != NULL) {
707 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000708 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000709 if (f != NULL) {
710 PyObject *w = f(v, (PyObject *)inst,
711 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000713 v = w;
714 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000715 }
716 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000717}
718
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000720instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000721{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000723 res = instance_getattr1(inst, name);
724 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000726 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
727 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 PyErr_Clear();
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000729 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000730 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000731 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 res = PyEval_CallObject(func, args);
733 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000734 }
735 return res;
736}
737
Tim Petersdf875b92003-04-07 17:51:59 +0000738/* See classobject.h comments: this only does dict lookups, and is always
739 * safe to call.
740 */
741PyObject *
742_PyInstance_Lookup(PyObject *pinst, PyObject *name)
743{
744 PyObject *v;
Anthony Baxter377be112006-04-11 06:54:30 +0000745 PyClassObject *klass;
Tim Petersdf875b92003-04-07 17:51:59 +0000746 PyInstanceObject *inst; /* pinst cast to the right type */
747
748 assert(PyInstance_Check(pinst));
749 inst = (PyInstanceObject *)pinst;
750
751 assert(PyString_Check(name));
752
753 v = PyDict_GetItem(inst->in_dict, name);
754 if (v == NULL)
Anthony Baxter377be112006-04-11 06:54:30 +0000755 v = class_lookup(inst->in_class, name, &klass);
Tim Petersdf875b92003-04-07 17:51:59 +0000756 return v;
757}
758
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000759static int
Fred Drake79912472000-07-09 04:06:11 +0000760instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000761{
Guido van Rossum94472a01992-09-04 09:45:18 +0000762 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000764 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000765 PyErr_Format(PyExc_AttributeError,
766 "%.50s instance has no attribute '%.400s'",
767 PyString_AS_STRING(inst->in_class->cl_name),
768 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000769 return rv;
770 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773}
774
Guido van Rossume7737541994-09-05 07:31:41 +0000775static int
Fred Drake79912472000-07-09 04:06:11 +0000776instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000777{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000778 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000780 if (sname[0] == '_' && sname[1] == '_') {
Martin v. Löwis66851282006-04-22 11:40:03 +0000781 Py_ssize_t n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000782 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000783 if (strcmp(sname, "__dict__") == 0) {
784 if (PyEval_GetRestricted()) {
785 PyErr_SetString(PyExc_RuntimeError,
786 "__dict__ not accessible in restricted mode");
787 return -1;
788 }
789 if (v == NULL || !PyDict_Check(v)) {
790 PyErr_SetString(PyExc_TypeError,
791 "__dict__ must be set to a dictionary");
792 return -1;
793 }
794 tmp = inst->in_dict;
795 Py_INCREF(v);
796 inst->in_dict = v;
797 Py_DECREF(tmp);
798 return 0;
799 }
800 if (strcmp(sname, "__class__") == 0) {
801 if (PyEval_GetRestricted()) {
802 PyErr_SetString(PyExc_RuntimeError,
803 "__class__ not accessible in restricted mode");
804 return -1;
805 }
806 if (v == NULL || !PyClass_Check(v)) {
807 PyErr_SetString(PyExc_TypeError,
808 "__class__ must be set to a class");
809 return -1;
810 }
811 tmp = (PyObject *)(inst->in_class);
812 Py_INCREF(v);
813 inst->in_class = (PyClassObject *)v;
814 Py_DECREF(tmp);
815 return 0;
816 }
Guido van Rossume7737541994-09-05 07:31:41 +0000817 }
Guido van Rossume7737541994-09-05 07:31:41 +0000818 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000819 if (v == NULL)
820 func = inst->in_class->cl_delattr;
821 else
822 func = inst->in_class->cl_setattr;
823 if (func == NULL)
824 return instance_setattr1(inst, name, v);
825 if (v == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000826 args = PyTuple_Pack(2, inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000827 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000828 args = PyTuple_Pack(3, inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000829 if (args == NULL)
830 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 res = PyEval_CallObject(func, args);
832 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000833 if (res == NULL)
834 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000836 return 0;
837}
838
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000840instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000841{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 PyObject *func;
843 PyObject *res;
844 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000845
Guido van Rossum2878a691996-08-09 20:53:24 +0000846 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000847 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000848 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000849 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000850 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000851 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000852 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
853 return NULL;
854 PyErr_Clear();
855 classname = inst->in_class->cl_name;
856 mod = PyDict_GetItemString(inst->in_class->cl_dict,
857 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 if (classname != NULL && PyString_Check(classname))
859 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000860 else
861 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000862 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000863 return PyString_FromFormat("<?.%s instance at %p>",
864 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000865 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000866 return PyString_FromFormat("<%s.%s instance at %p>",
867 PyString_AsString(mod),
868 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000869 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 res = PyEval_CallObject(func, (PyObject *)NULL);
871 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000872 return res;
873}
874
Guido van Rossum82c690f2001-04-30 14:39:18 +0000875static PyObject *
876instance_str(PyInstanceObject *inst)
877{
878 PyObject *func;
879 PyObject *res;
880 static PyObject *strstr;
881
882 if (strstr == NULL)
883 strstr = PyString_InternFromString("__str__");
884 func = instance_getattr(inst, strstr);
885 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000886 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
887 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000888 PyErr_Clear();
889 return instance_repr(inst);
890 }
891 res = PyEval_CallObject(func, (PyObject *)NULL);
892 Py_DECREF(func);
893 return res;
894}
895
Guido van Rossum9bfef441993-03-29 10:43:31 +0000896static long
Fred Drake79912472000-07-09 04:06:11 +0000897instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000898{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 PyObject *func;
900 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000901 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000902 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000903
Guido van Rossum2878a691996-08-09 20:53:24 +0000904 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000905 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000906 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000907 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000908 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
909 return -1;
910 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000911 /* If there is no __eq__ and no __cmp__ method, we hash on the
912 address. If an __eq__ or __cmp__ method exists, there must
913 be a __hash__. */
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000914 if (eqstr == NULL)
915 eqstr = PyString_InternFromString("__eq__");
916 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000917 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000918 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
919 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000921 if (cmpstr == NULL)
922 cmpstr = PyString_InternFromString("__cmp__");
923 func = instance_getattr(inst, cmpstr);
924 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000925 if (!PyErr_ExceptionMatches(
926 PyExc_AttributeError))
927 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000928 PyErr_Clear();
929 return _Py_HashPointer(inst);
930 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000931 }
Raymond Hettingera9e14b72003-09-16 07:11:46 +0000932 Py_XDECREF(func);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000934 return -1;
935 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 res = PyEval_CallObject(func, (PyObject *)NULL);
937 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000938 if (res == NULL)
939 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 if (PyInt_Check(res)) {
941 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000942 if (outcome == -1)
943 outcome = -2;
944 }
945 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyErr_SetString(PyExc_TypeError,
947 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000948 outcome = -1;
949 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000951 return outcome;
952}
953
Jeremy Hylton8caad492000-06-23 14:18:11 +0000954static int
955instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
956{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000957 Py_VISIT(o->in_class);
958 Py_VISIT(o->in_dict);
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000959 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000960}
961
Guido van Rossum213c7a62001-04-23 14:08:49 +0000962static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
963static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000964
Martin v. Löwis18e16552006-02-15 17:27:45 +0000965static Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +0000966instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 PyObject *func;
969 PyObject *res;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000970 Py_ssize_t outcome;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971
Guido van Rossum2878a691996-08-09 20:53:24 +0000972 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000973 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000974 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000975 if (func == NULL)
976 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 res = PyEval_CallObject(func, (PyObject *)NULL);
978 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000979 if (res == NULL)
980 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 if (PyInt_Check(res)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000982 Py_ssize_t temp = PyInt_AsSsize_t(res);
983 if (temp == -1 && PyErr_Occurred()) {
984 Py_DECREF(res);
985 return -1;
986 }
987 outcome = (Py_ssize_t)temp;
988#if SIZEOF_SIZE_T < SIZEOF_LONG
Guido van Rossumba3e6ec2005-09-19 22:42:41 +0000989 /* Overflow check -- range of PyInt is more than C int */
990 if (outcome != temp) {
991 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum630db602005-09-20 18:49:54 +0000992 "__len__() should return 0 <= outcome < 2**31");
Guido van Rossumba3e6ec2005-09-19 22:42:41 +0000993 outcome = -1;
994 }
995 else
996#endif
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 PyErr_SetString(PyExc_ValueError,
999 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 }
1001 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyErr_SetString(PyExc_TypeError,
1003 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001004 outcome = -1;
1005 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001007 return outcome;
1008}
1009
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001011instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyObject *func;
1014 PyObject *arg;
1015 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016
Guido van Rossum2878a691996-08-09 20:53:24 +00001017 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001018 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001019 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 if (func == NULL)
1021 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001022 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001023 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001025 return NULL;
1026 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 res = PyEval_CallObject(func, arg);
1028 Py_DECREF(func);
1029 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030 return res;
1031}
1032
Guido van Rossum9bfef441993-03-29 10:43:31 +00001033static int
Fred Drake79912472000-07-09 04:06:11 +00001034instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyObject *func;
1037 PyObject *arg;
1038 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001039
Guido van Rossum2878a691996-08-09 20:53:24 +00001040 if (value == NULL) {
1041 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001042 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001043 func = instance_getattr(inst, delitemstr);
1044 }
1045 else {
1046 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001047 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001048 func = instance_getattr(inst, setitemstr);
1049 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 if (func == NULL)
1051 return -1;
1052 if (value == NULL)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001053 arg = PyTuple_Pack(1, key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001055 arg = PyTuple_Pack(2, key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001058 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 res = PyEval_CallObject(func, arg);
1061 Py_DECREF(func);
1062 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063 if (res == NULL)
1064 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001066 return 0;
1067}
1068
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069static PyMappingMethods instance_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001070 (lenfunc)instance_length, /* mp_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001071 (binaryfunc)instance_subscript, /* mp_subscript */
1072 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073};
1074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001076instance_item(PyInstanceObject *inst, Py_ssize_t i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001077{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079
Guido van Rossum2878a691996-08-09 20:53:24 +00001080 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001081 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001082 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083 if (func == NULL)
1084 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001085 arg = Py_BuildValue("(n)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001088 return NULL;
1089 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 res = PyEval_CallObject(func, arg);
1091 Py_DECREF(func);
1092 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093 return res;
1094}
1095
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001097instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 PyObject *func, *arg, *res;
1100 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001101
Guido van Rossum2878a691996-08-09 20:53:24 +00001102 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001103 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001104 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001105
1106 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001107 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1108 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001109 PyErr_Clear();
1110
1111 if (getitemstr == NULL)
1112 getitemstr = PyString_InternFromString("__getitem__");
1113 func = instance_getattr(inst, getitemstr);
1114 if (func == NULL)
1115 return NULL;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001116 arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
Tim Peters34592512002-07-11 06:23:50 +00001117 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001118 arg = Py_BuildValue("(nn)", i, j);
Tim Peters34592512002-07-11 06:23:50 +00001119
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122 return NULL;
1123 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 res = PyEval_CallObject(func, arg);
1125 Py_DECREF(func);
1126 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001127 return res;
1128}
1129
1130static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001131instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001132{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134
Guido van Rossum2878a691996-08-09 20:53:24 +00001135 if (item == NULL) {
1136 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001137 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001138 func = instance_getattr(inst, delitemstr);
1139 }
1140 else {
1141 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001142 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001143 func = instance_getattr(inst, setitemstr);
1144 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001145 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001146 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001147 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001149 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001151 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001153 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001154 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 res = PyEval_CallObject(func, arg);
1156 Py_DECREF(func);
1157 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001158 if (res == NULL)
1159 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001161 return 0;
1162}
1163
1164static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001165instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001166{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 PyObject *func, *arg, *res;
1168 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001169
Guido van Rossum2878a691996-08-09 20:53:24 +00001170 if (value == NULL) {
1171 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 delslicestr =
1173 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001174 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001175 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001176 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1177 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001178 PyErr_Clear();
1179 if (delitemstr == NULL)
1180 delitemstr =
1181 PyString_InternFromString("__delitem__");
1182 func = instance_getattr(inst, delitemstr);
1183 if (func == NULL)
1184 return -1;
1185
1186 arg = Py_BuildValue("(N)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001187 _PySlice_FromIndices(i, j));
Thomas Wouters1d75a792000-08-17 22:37:32 +00001188 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001189 arg = Py_BuildValue("(nn)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001190 }
1191 else {
1192 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 setslicestr =
1194 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001195 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001196 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001197 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1198 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001199 PyErr_Clear();
1200 if (setitemstr == NULL)
1201 setitemstr =
1202 PyString_InternFromString("__setitem__");
1203 func = instance_getattr(inst, setitemstr);
1204 if (func == NULL)
1205 return -1;
1206
1207 arg = Py_BuildValue("(NO)",
Neal Norwitzbadc0862006-03-23 06:03:08 +00001208 _PySlice_FromIndices(i, j), value);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001209 } else
Martin v. Löwisdde99d22006-02-17 15:57:41 +00001210 arg = Py_BuildValue("(nnO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001211 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001212 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001214 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001215 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 res = PyEval_CallObject(func, arg);
1217 Py_DECREF(func);
1218 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001219 if (res == NULL)
1220 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001222 return 0;
1223}
1224
Tim Peterscb8d3682001-05-05 21:05:01 +00001225static int
1226instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001227{
1228 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001229 PyObject *func;
1230
1231 /* Try __contains__ first.
1232 * If that can't be done, try iterator-based searching.
1233 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001234
1235 if(__contains__ == NULL) {
1236 __contains__ = PyString_InternFromString("__contains__");
1237 if(__contains__ == NULL)
1238 return -1;
1239 }
1240 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001241 if (func) {
1242 PyObject *res;
1243 int ret;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001244 PyObject *arg = PyTuple_Pack(1, member);
Tim Peterscb8d3682001-05-05 21:05:01 +00001245 if(arg == NULL) {
1246 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001247 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001248 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001249 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001250 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001251 Py_DECREF(arg);
Tim Peters34592512002-07-11 06:23:50 +00001252 if(res == NULL)
Tim Peterscb8d3682001-05-05 21:05:01 +00001253 return -1;
1254 ret = PyObject_IsTrue(res);
1255 Py_DECREF(res);
1256 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001257 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001258
1259 /* Couldn't find __contains__. */
1260 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1261 /* Assume the failure was simply due to that there is no
1262 * __contains__ attribute, and try iterating instead.
1263 */
1264 PyErr_Clear();
Tim Peters16a77ad2001-09-08 04:00:12 +00001265 return _PySequence_IterSearch((PyObject *)inst, member,
Martin v. Löwis66851282006-04-22 11:40:03 +00001266 PY_ITERSEARCH_CONTAINS) > 0;
Tim Peterscb8d3682001-05-05 21:05:01 +00001267 }
1268 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001269 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001270}
1271
Fred Drake79912472000-07-09 04:06:11 +00001272static PySequenceMethods
1273instance_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001274 (lenfunc)instance_length, /* sq_length */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001275 0, /* sq_concat */
1276 0, /* sq_repeat */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001277 (ssizeargfunc)instance_item, /* sq_item */
1278 (ssizessizeargfunc)instance_slice, /* sq_slice */
1279 (ssizeobjargproc)instance_ass_item, /* sq_ass_item */
1280 (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001281 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001282};
1283
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001285generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001286{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001288
1289 if ((func = instance_getattr(self, methodname)) == NULL)
1290 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 res = PyEval_CallObject(func, (PyObject *)NULL);
1292 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001293 return res;
1294}
1295
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001296static PyObject *
1297generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001298{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001299 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001301 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001302 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001303 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001304 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001306 Py_INCREF(Py_NotImplemented);
1307 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001308 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001309 args = PyTuple_Pack(1, w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001310 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001312 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001313 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001314 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 Py_DECREF(args);
1316 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001317 return result;
1318}
1319
1320
1321static PyObject *coerce_obj;
1322
1323/* Try one half of a binary operator involving a class instance. */
1324static PyObject *
Tim Peters34592512002-07-11 06:23:50 +00001325half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001326 int swapped)
1327{
1328 PyObject *args;
1329 PyObject *coercefunc;
1330 PyObject *coerced = NULL;
1331 PyObject *v1;
1332 PyObject *result;
Tim Peters34592512002-07-11 06:23:50 +00001333
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001334 if (!PyInstance_Check(v)) {
1335 Py_INCREF(Py_NotImplemented);
1336 return Py_NotImplemented;
1337 }
1338
1339 if (coerce_obj == NULL) {
1340 coerce_obj = PyString_InternFromString("__coerce__");
1341 if (coerce_obj == NULL)
1342 return NULL;
1343 }
1344 coercefunc = PyObject_GetAttr(v, coerce_obj);
1345 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001346 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1347 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001348 PyErr_Clear();
1349 return generic_binary_op(v, w, opname);
1350 }
1351
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001352 args = PyTuple_Pack(1, w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001353 if (args == NULL) {
Guido van Rossum617080b2002-10-18 14:15:33 +00001354 Py_DECREF(coercefunc);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001355 return NULL;
1356 }
1357 coerced = PyEval_CallObject(coercefunc, args);
1358 Py_DECREF(args);
1359 Py_DECREF(coercefunc);
1360 if (coerced == NULL) {
1361 return NULL;
1362 }
1363 if (coerced == Py_None || coerced == Py_NotImplemented) {
1364 Py_DECREF(coerced);
1365 return generic_binary_op(v, w, opname);
1366 }
1367 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1368 Py_DECREF(coerced);
1369 PyErr_SetString(PyExc_TypeError,
1370 "coercion should return None or 2-tuple");
1371 return NULL;
1372 }
1373 v1 = PyTuple_GetItem(coerced, 0);
1374 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001375 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001376 /* prevent recursion if __coerce__ returns self as the first
1377 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001378 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001379 } else {
1380 if (swapped)
1381 result = (thisfunc)(w, v1);
1382 else
1383 result = (thisfunc)(v1, w);
1384 }
1385 Py_DECREF(coerced);
1386 return result;
1387}
1388
1389/* Implement a binary operator involving at least one class instance. */
1390static PyObject *
1391do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1392 binaryfunc thisfunc)
1393{
1394 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1395 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001396 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001397 result = half_binop(w, v, ropname, thisfunc, 1);
1398 }
1399 return result;
1400}
1401
1402static PyObject *
1403do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1404 char *ropname, binaryfunc thisfunc)
1405{
1406 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1407 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001408 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001409 result = do_binop(v, w, opname, ropname, thisfunc);
1410 }
1411 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001412}
1413
Guido van Rossum879c5811995-01-10 15:24:06 +00001414static int
Fred Drake79912472000-07-09 04:06:11 +00001415instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001416{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 PyObject *v = *pv;
1418 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001419 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 PyObject *args;
1421 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001422
Guido van Rossum2878a691996-08-09 20:53:24 +00001423 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001424 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001425 if (coerce_obj == NULL)
1426 return -1;
1427 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001428 coercefunc = PyObject_GetAttr(v, coerce_obj);
1429 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001430 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001431 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1432 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001434 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001435 }
1436 /* Has __coerce__ method: call it */
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001437 args = PyTuple_Pack(1, w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001438 if (args == NULL) {
1439 return -1;
1440 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001441 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001443 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001444 if (coerced == NULL) {
1445 /* __coerce__ call raised an exception */
1446 return -1;
1447 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001448 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001449 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001450 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001451 return 1;
1452 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001454 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 Py_DECREF(coerced);
1456 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001457 "coercion should return None or 2-tuple");
1458 return -1;
1459 }
1460 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 *pv = PyTuple_GetItem(coerced, 0);
1462 *pw = PyTuple_GetItem(coerced, 1);
1463 Py_INCREF(*pv);
1464 Py_INCREF(*pw);
1465 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001466 return 0;
1467}
1468
Guido van Rossum04691fc1992-08-12 15:35:34 +00001469#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001470static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001472 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001473 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001474}
1475
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001476#define BINARY(f, m, n) \
1477static PyObject *f(PyObject *v, PyObject *w) { \
1478 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1479}
1480
1481#define BINARY_INPLACE(f, m, n) \
1482static PyObject *f(PyObject *v, PyObject *w) { \
1483 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1484 "__r" m "__", n); \
1485}
1486
Guido van Rossum04691fc1992-08-12 15:35:34 +00001487UNARY(instance_neg, "__neg__")
1488UNARY(instance_pos, "__pos__")
1489UNARY(instance_abs, "__abs__")
1490
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001491BINARY(instance_or, "or", PyNumber_Or)
1492BINARY(instance_and, "and", PyNumber_And)
1493BINARY(instance_xor, "xor", PyNumber_Xor)
1494BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1495BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1496BINARY(instance_add, "add", PyNumber_Add)
1497BINARY(instance_sub, "sub", PyNumber_Subtract)
1498BINARY(instance_mul, "mul", PyNumber_Multiply)
1499BINARY(instance_div, "div", PyNumber_Divide)
1500BINARY(instance_mod, "mod", PyNumber_Remainder)
1501BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001502BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1503BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001504
1505BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1506BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1507BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1508BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1509BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1510BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1511BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1512BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1513BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1514BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001515BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1516BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001517
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001518/* Try a 3-way comparison, returning an int; v is an instance. Return:
1519 -2 for an exception;
1520 -1 if v < w;
1521 0 if v == w;
1522 1 if v > w;
1523 2 if this particular 3-way comparison is not implemented or undefined.
1524*/
1525static int
1526half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001527{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001528 static PyObject *cmp_obj;
1529 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001530 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001531 PyObject *result;
1532 long l;
1533
1534 assert(PyInstance_Check(v));
1535
1536 if (cmp_obj == NULL) {
1537 cmp_obj = PyString_InternFromString("__cmp__");
1538 if (cmp_obj == NULL)
1539 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001540 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001541
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001542 cmp_func = PyObject_GetAttr(v, cmp_obj);
1543 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001544 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1545 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001546 PyErr_Clear();
1547 return 2;
1548 }
1549
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001550 args = PyTuple_Pack(1, w);
Guido van Rossum617080b2002-10-18 14:15:33 +00001551 if (args == NULL) {
1552 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001553 return -2;
Guido van Rossum617080b2002-10-18 14:15:33 +00001554 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001555
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001556 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001557 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001558 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001559
1560 if (result == NULL)
1561 return -2;
1562
1563 if (result == Py_NotImplemented) {
1564 Py_DECREF(result);
1565 return 2;
1566 }
1567
1568 l = PyInt_AsLong(result);
1569 Py_DECREF(result);
1570 if (l == -1 && PyErr_Occurred()) {
1571 PyErr_SetString(PyExc_TypeError,
1572 "comparison did not return an int");
1573 return -2;
1574 }
1575
1576 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001577}
1578
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001579/* Try a 3-way comparison, returning an int; either v or w is an instance.
1580 We first try a coercion. Return:
1581 -2 for an exception;
1582 -1 if v < w;
1583 0 if v == w;
1584 1 if v > w;
1585 2 if this particular 3-way comparison is not implemented or undefined.
1586 THIS IS ONLY CALLED FROM object.c!
1587*/
1588static int
1589instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001590{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001591 int c;
1592
1593 c = PyNumber_CoerceEx(&v, &w);
1594 if (c < 0)
1595 return -2;
1596 if (c == 0) {
1597 /* If neither is now an instance, use regular comparison */
1598 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1599 c = PyObject_Compare(v, w);
1600 Py_DECREF(v);
1601 Py_DECREF(w);
1602 if (PyErr_Occurred())
1603 return -2;
1604 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001605 }
1606 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001607 else {
1608 /* The coercion didn't do anything.
1609 Treat this the same as returning v and w unchanged. */
1610 Py_INCREF(v);
1611 Py_INCREF(w);
1612 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001613
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001614 if (PyInstance_Check(v)) {
1615 c = half_cmp(v, w);
1616 if (c <= 1) {
1617 Py_DECREF(v);
1618 Py_DECREF(w);
1619 return c;
1620 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001621 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001622 if (PyInstance_Check(w)) {
1623 c = half_cmp(w, v);
1624 if (c <= 1) {
1625 Py_DECREF(v);
1626 Py_DECREF(w);
1627 if (c >= -1)
1628 c = -c;
1629 return c;
1630 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001631 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001632 Py_DECREF(v);
1633 Py_DECREF(w);
1634 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001635}
1636
Guido van Rossum9bfef441993-03-29 10:43:31 +00001637static int
Fred Drake79912472000-07-09 04:06:11 +00001638instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001639{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001640 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001641 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001643
Guido van Rossum2878a691996-08-09 20:53:24 +00001644 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001645 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001646 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001647 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1648 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001650 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001651 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001652 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001653 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1654 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001656 /* Fall back to the default behavior:
1657 all instances are nonzero */
1658 return 1;
1659 }
1660 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001661 res = PyEval_CallObject(func, (PyObject *)NULL);
1662 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001663 if (res == NULL)
1664 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665 if (!PyInt_Check(res)) {
1666 Py_DECREF(res);
1667 PyErr_SetString(PyExc_TypeError,
1668 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001669 return -1;
1670 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001671 outcome = PyInt_AsLong(res);
1672 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001673 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001674 PyErr_SetString(PyExc_ValueError,
1675 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001676 return -1;
1677 }
1678 return outcome > 0;
1679}
1680
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001681static Py_ssize_t
1682instance_index(PyInstanceObject *self)
1683{
1684 PyObject *func, *res;
1685 Py_ssize_t outcome;
1686 static PyObject *indexstr = NULL;
1687
1688 if (indexstr == NULL) {
1689 indexstr = PyString_InternFromString("__index__");
1690 if (indexstr == NULL)
1691 return -1;
1692 }
1693 if ((func = instance_getattr(self, indexstr)) == NULL) {
1694 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1695 return -1;
1696 PyErr_Clear();
1697 PyErr_SetString(PyExc_TypeError,
1698 "object cannot be interpreted as an index");
1699 return -1;
1700 }
1701 res = PyEval_CallObject(func, (PyObject *)NULL);
1702 Py_DECREF(func);
1703 if (res == NULL)
1704 return -1;
1705 if (PyInt_Check(res) || PyLong_Check(res)) {
1706 outcome = res->ob_type->tp_as_number->nb_index(res);
1707 }
1708 else {
1709 PyErr_SetString(PyExc_TypeError,
1710 "__index__ must return an int or a long");
1711 outcome = -1;
1712 }
1713 Py_DECREF(res);
1714 return outcome;
1715}
1716
1717
Guido van Rossum04691fc1992-08-12 15:35:34 +00001718UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001719UNARY(instance_int, "__int__")
1720UNARY(instance_long, "__long__")
1721UNARY(instance_float, "__float__")
1722UNARY(instance_oct, "__oct__")
1723UNARY(instance_hex, "__hex__")
1724
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001725static PyObject *
1726bin_power(PyObject *v, PyObject *w)
1727{
1728 return PyNumber_Power(v, w, Py_None);
1729}
1730
Guido van Rossum03093a21994-09-28 15:51:32 +00001731/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001733instance_pow(PyObject *v, PyObject *w, PyObject *z)
Tim Peters34592512002-07-11 06:23:50 +00001734{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001735 if (z == Py_None) {
1736 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001737 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001738 else {
1739 PyObject *func;
1740 PyObject *args;
1741 PyObject *result;
1742
1743 /* XXX Doesn't do coercions... */
1744 func = PyObject_GetAttrString(v, "__pow__");
1745 if (func == NULL)
1746 return NULL;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001747 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001748 if (args == NULL) {
1749 Py_DECREF(func);
1750 return NULL;
1751 }
1752 result = PyEval_CallObject(func, args);
1753 Py_DECREF(func);
1754 Py_DECREF(args);
1755 return result;
1756 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001757}
1758
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001759static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001760bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001761{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001762 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001763}
1764
1765
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001766static PyObject *
1767instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1768{
1769 if (z == Py_None) {
1770 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1771 "__rpow__", bin_inplace_power);
1772 }
1773 else {
1774 /* XXX Doesn't do coercions... */
1775 PyObject *func;
1776 PyObject *args;
1777 PyObject *result;
1778
1779 func = PyObject_GetAttrString(v, "__ipow__");
1780 if (func == NULL) {
1781 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1782 return NULL;
1783 PyErr_Clear();
1784 return instance_pow(v, w, z);
1785 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001786 args = PyTuple_Pack(2, w, z);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001787 if (args == NULL) {
1788 Py_DECREF(func);
1789 return NULL;
1790 }
1791 result = PyEval_CallObject(func, args);
1792 Py_DECREF(func);
1793 Py_DECREF(args);
1794 return result;
1795 }
1796}
1797
1798
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001799/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001800#define NAME_OPS 6
1801static PyObject **name_op = NULL;
1802
Tim Peters34592512002-07-11 06:23:50 +00001803static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001804init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001805{
1806 int i;
1807 char *_name_op[] = {
1808 "__lt__",
1809 "__le__",
1810 "__eq__",
1811 "__ne__",
1812 "__gt__",
1813 "__ge__",
1814 };
1815
1816 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1817 if (name_op == NULL)
1818 return -1;
1819 for (i = 0; i < NAME_OPS; ++i) {
1820 name_op[i] = PyString_InternFromString(_name_op[i]);
1821 if (name_op[i] == NULL)
1822 return -1;
1823 }
1824 return 0;
1825}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001826
1827static PyObject *
1828half_richcompare(PyObject *v, PyObject *w, int op)
1829{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001830 PyObject *method;
1831 PyObject *args;
1832 PyObject *res;
1833
1834 assert(PyInstance_Check(v));
1835
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001836 if (name_op == NULL) {
1837 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001838 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001839 }
1840 /* If the instance doesn't define an __getattr__ method, use
1841 instance_getattr2 directly because it will not set an
1842 exception on failure. */
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001843 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
Tim Peters34592512002-07-11 06:23:50 +00001844 method = instance_getattr2((PyInstanceObject *)v,
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001845 name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001846 else
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001847 method = PyObject_GetAttr(v, name_op[op]);
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001848 if (method == NULL) {
1849 if (PyErr_Occurred()) {
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001850 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1851 return NULL;
1852 PyErr_Clear();
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001853 }
Guido van Rossumf740bdf2002-10-29 18:36:40 +00001854 res = Py_NotImplemented;
1855 Py_INCREF(res);
1856 return res;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001857 }
1858
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001859 args = PyTuple_Pack(1, w);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001860 if (args == NULL) {
1861 Py_DECREF(method);
1862 return NULL;
1863 }
1864
1865 res = PyEval_CallObject(method, args);
1866 Py_DECREF(args);
1867 Py_DECREF(method);
1868
1869 return res;
1870}
1871
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001872static PyObject *
1873instance_richcompare(PyObject *v, PyObject *w, int op)
1874{
1875 PyObject *res;
1876
1877 if (PyInstance_Check(v)) {
1878 res = half_richcompare(v, w, op);
1879 if (res != Py_NotImplemented)
1880 return res;
1881 Py_DECREF(res);
1882 }
1883
1884 if (PyInstance_Check(w)) {
Tim Petersf4aca752004-09-23 02:39:37 +00001885 res = half_richcompare(w, v, _Py_SwappedOp[op]);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001886 if (res != Py_NotImplemented)
1887 return res;
1888 Py_DECREF(res);
1889 }
1890
1891 Py_INCREF(Py_NotImplemented);
1892 return Py_NotImplemented;
1893}
1894
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001895
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001896/* Get the iterator */
1897static PyObject *
1898instance_getiter(PyInstanceObject *self)
1899{
1900 PyObject *func;
1901
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001902 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001903 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001904 if (iterstr == NULL)
1905 return NULL;
1906 }
1907 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001908 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001909 if (getitemstr == NULL)
1910 return NULL;
1911 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001912
1913 if ((func = instance_getattr(self, iterstr)) != NULL) {
1914 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1915 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001916 if (res != NULL && !PyIter_Check(res)) {
1917 PyErr_Format(PyExc_TypeError,
1918 "__iter__ returned non-iterator "
1919 "of type '%.100s'",
1920 res->ob_type->tp_name);
1921 Py_DECREF(res);
1922 res = NULL;
1923 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001924 return res;
1925 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001926 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1927 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001928 PyErr_Clear();
1929 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001930 PyErr_SetString(PyExc_TypeError,
1931 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001932 return NULL;
1933 }
1934 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001935 return PySeqIter_New((PyObject *)self);
1936}
1937
1938
1939/* Call the iterator's next */
1940static PyObject *
1941instance_iternext(PyInstanceObject *self)
1942{
1943 PyObject *func;
1944
1945 if (nextstr == NULL)
1946 nextstr = PyString_InternFromString("next");
1947
1948 if ((func = instance_getattr(self, nextstr)) != NULL) {
1949 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1950 Py_DECREF(func);
1951 if (res != NULL) {
1952 return res;
1953 }
1954 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1955 PyErr_Clear();
1956 return NULL;
1957 }
1958 return NULL;
1959 }
1960 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1961 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001962}
1963
Tim Peters6d6c1a32001-08-02 04:15:00 +00001964static PyObject *
1965instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1966{
1967 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1968 if (call == NULL) {
1969 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001970 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1971 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001972 PyErr_Clear();
1973 PyErr_Format(PyExc_AttributeError,
1974 "%.200s instance has no __call__ method",
1975 PyString_AsString(inst->in_class->cl_name));
1976 return NULL;
1977 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00001978 /* We must check and increment the recursion depth here. Scenario:
1979 class A:
1980 pass
1981 A.__call__ = A() # that's right
1982 a = A() # ok
1983 a() # infinite recursion
1984 This bounces between instance_call() and PyObject_Call() without
1985 ever hitting eval_frame() (which has the main recursion check). */
Armin Rigo2b3eb402003-10-28 12:05:48 +00001986 if (Py_EnterRecursiveCall(" in __call__")) {
Guido van Rossum16b93b32002-06-13 21:32:51 +00001987 res = NULL;
1988 }
Armin Rigo2b3eb402003-10-28 12:05:48 +00001989 else {
Guido van Rossum16b93b32002-06-13 21:32:51 +00001990 res = PyObject_Call(call, arg, kw);
Armin Rigo2b3eb402003-10-28 12:05:48 +00001991 Py_LeaveRecursiveCall();
1992 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001993 Py_DECREF(call);
1994 return res;
1995}
1996
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001997
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001998static PyNumberMethods instance_as_number = {
Georg Brandl347b3002006-03-30 11:57:00 +00001999 instance_add, /* nb_add */
2000 instance_sub, /* nb_subtract */
2001 instance_mul, /* nb_multiply */
2002 instance_div, /* nb_divide */
2003 instance_mod, /* nb_remainder */
2004 instance_divmod, /* nb_divmod */
2005 instance_pow, /* nb_power */
2006 (unaryfunc)instance_neg, /* nb_negative */
2007 (unaryfunc)instance_pos, /* nb_positive */
2008 (unaryfunc)instance_abs, /* nb_absolute */
2009 (inquiry)instance_nonzero, /* nb_nonzero */
2010 (unaryfunc)instance_invert, /* nb_invert */
2011 instance_lshift, /* nb_lshift */
2012 instance_rshift, /* nb_rshift */
2013 instance_and, /* nb_and */
2014 instance_xor, /* nb_xor */
2015 instance_or, /* nb_or */
2016 instance_coerce, /* nb_coerce */
2017 (unaryfunc)instance_int, /* nb_int */
2018 (unaryfunc)instance_long, /* nb_long */
2019 (unaryfunc)instance_float, /* nb_float */
2020 (unaryfunc)instance_oct, /* nb_oct */
2021 (unaryfunc)instance_hex, /* nb_hex */
2022 instance_iadd, /* nb_inplace_add */
2023 instance_isub, /* nb_inplace_subtract */
2024 instance_imul, /* nb_inplace_multiply */
2025 instance_idiv, /* nb_inplace_divide */
2026 instance_imod, /* nb_inplace_remainder */
2027 instance_ipow, /* nb_inplace_power */
2028 instance_ilshift, /* nb_inplace_lshift */
2029 instance_irshift, /* nb_inplace_rshift */
2030 instance_iand, /* nb_inplace_and */
2031 instance_ixor, /* nb_inplace_xor */
2032 instance_ior, /* nb_inplace_or */
2033 instance_floordiv, /* nb_floor_divide */
2034 instance_truediv, /* nb_true_divide */
2035 instance_ifloordiv, /* nb_inplace_floor_divide */
2036 instance_itruediv, /* nb_inplace_true_divide */
2037 (lenfunc)instance_index, /* nb_index */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002038};
2039
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002040PyTypeObject PyInstance_Type = {
2041 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002042 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002043 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002044 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002045 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002046 (destructor)instance_dealloc, /* tp_dealloc */
2047 0, /* tp_print */
2048 0, /* tp_getattr */
2049 0, /* tp_setattr */
2050 instance_compare, /* tp_compare */
2051 (reprfunc)instance_repr, /* tp_repr */
2052 &instance_as_number, /* tp_as_number */
2053 &instance_as_sequence, /* tp_as_sequence */
2054 &instance_as_mapping, /* tp_as_mapping */
2055 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002056 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002057 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002058 (getattrofunc)instance_getattr, /* tp_getattro */
2059 (setattrofunc)instance_setattr, /* tp_setattro */
2060 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002061 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002062 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002063 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002064 0, /* tp_clear */
2065 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002066 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2067 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002068 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002069 0, /* tp_methods */
2070 0, /* tp_members */
2071 0, /* tp_getset */
2072 0, /* tp_base */
2073 0, /* tp_dict */
2074 0, /* tp_descr_get */
2075 0, /* tp_descr_set */
2076 0, /* tp_dictoffset */
2077 0, /* tp_init */
2078 0, /* tp_alloc */
2079 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002080};
2081
2082
Guido van Rossum81daa321993-05-20 14:24:46 +00002083/* Instance method objects are used for two purposes:
2084 (a) as bound instance methods (returned by instancename.methodname)
2085 (b) as unbound methods (returned by ClassName.methodname)
2086 In case (b), im_self is NULL
2087*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002088
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002089static PyMethodObject *free_list;
2090
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002091PyObject *
Anthony Baxter377be112006-04-11 06:54:30 +00002092PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002093{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002094 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002095 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002096 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002097 return NULL;
2098 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002099 im = free_list;
2100 if (im != NULL) {
2101 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002102 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002103 }
2104 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002105 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002106 if (im == NULL)
2107 return NULL;
2108 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002109 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002110 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002111 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002112 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002113 im->im_self = self;
Anthony Baxter377be112006-04-11 06:54:30 +00002114 Py_XINCREF(klass);
2115 im->im_class = klass;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002116 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002117 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002118}
2119
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002120/* Descriptors for PyMethod attributes */
2121
2122/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002123
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002124#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002125
Guido van Rossum6f799372001-09-20 20:46:19 +00002126static PyMemberDef instancemethod_memberlist[] = {
2127 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2128 "the class associated with a method"},
2129 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2130 "the function (or other callable) implementing a method"},
2131 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2132 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002133 {NULL} /* Sentinel */
2134};
2135
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002136/* Christian Tismer argued convincingly that method attributes should
2137 (nearly) always override function attributes.
2138 The one exception is __doc__; there's a default __doc__ which
2139 should only be used for the class, not for instances */
2140
2141static PyObject *
2142instancemethod_get_doc(PyMethodObject *im, void *context)
2143{
2144 static PyObject *docstr;
2145 if (docstr == NULL) {
2146 docstr= PyString_InternFromString("__doc__");
2147 if (docstr == NULL)
2148 return NULL;
2149 }
2150 return PyObject_GetAttr(im->im_func, docstr);
2151}
2152
2153static PyGetSetDef instancemethod_getset[] = {
2154 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2155 {0}
2156};
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002157
2158static PyObject *
2159instancemethod_getattro(PyObject *obj, PyObject *name)
2160{
2161 PyMethodObject *im = (PyMethodObject *)obj;
2162 PyTypeObject *tp = obj->ob_type;
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002163 PyObject *descr = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002164
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002165 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2166 if (tp->tp_dict == NULL) {
2167 if (PyType_Ready(tp) < 0)
2168 return NULL;
2169 }
2170 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002171 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002172
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002173 if (descr != NULL) {
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002174 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2175 if (f != NULL)
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002176 return f(descr, obj, (PyObject *)obj->ob_type);
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002177 else {
2178 Py_INCREF(descr);
2179 return descr;
2180 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002181 }
2182
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002183 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002184}
2185
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002186PyDoc_STRVAR(instancemethod_doc,
2187"instancemethod(function, instance, class)\n\
2188\n\
2189Create an instance method object.");
2190
2191static PyObject *
2192instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2193{
2194 PyObject *func;
2195 PyObject *self;
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002196 PyObject *classObj = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002197
Guido van Rossum2fb9fdc2003-04-09 19:35:08 +00002198 if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002199 &func, &self, &classObj))
2200 return NULL;
2201 if (!PyCallable_Check(func)) {
2202 PyErr_SetString(PyExc_TypeError,
2203 "first argument must be callable");
2204 return NULL;
2205 }
2206 if (self == Py_None)
2207 self = NULL;
Michael W. Hudsone2749cb2005-03-30 16:32:10 +00002208 if (self == NULL && classObj == NULL) {
2209 PyErr_SetString(PyExc_TypeError,
2210 "unbound methods must have non-NULL im_class");
2211 return NULL;
2212 }
2213
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002214 return PyMethod_New(func, self, classObj);
2215}
2216
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002217static void
Fred Drake79912472000-07-09 04:06:11 +00002218instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002219{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002220 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002221 if (im->im_weakreflist != NULL)
2222 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002223 Py_DECREF(im->im_func);
2224 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002225 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002226 im->im_self = (PyObject *)free_list;
2227 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002228}
2229
Guido van Rossumebc8c511992-09-03 20:39:51 +00002230static int
Fred Drake79912472000-07-09 04:06:11 +00002231instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002232{
Guido van Rossume9df7271995-04-06 14:46:51 +00002233 if (a->im_self != b->im_self)
2234 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002235 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002236}
2237
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002239instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002240{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002241 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002242 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002243 PyObject *klass = a->im_class;
2244 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2245 char *sfuncname = "?", *sklassname = "?";
2246
2247 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002248 if (funcname == NULL) {
2249 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2250 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002251 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002252 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002253 else if (!PyString_Check(funcname)) {
2254 Py_DECREF(funcname);
2255 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002256 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002257 else
2258 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002259 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002260 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002261 else {
2262 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002263 if (klassname == NULL) {
2264 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2265 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002266 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002267 }
Guido van Rossum40667692001-08-17 13:59:27 +00002268 else if (!PyString_Check(klassname)) {
2269 Py_DECREF(klassname);
2270 klassname = NULL;
2271 }
2272 else
2273 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002274 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002275 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002276 result = PyString_FromFormat("<unbound method %s.%s>",
2277 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002278 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002279 /* XXX Shouldn't use repr() here! */
2280 PyObject *selfrepr = PyObject_Repr(self);
2281 if (selfrepr == NULL)
2282 goto fail;
2283 if (!PyString_Check(selfrepr)) {
2284 Py_DECREF(selfrepr);
2285 goto fail;
2286 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002287 result = PyString_FromFormat("<bound method %s.%s of %s>",
2288 sklassname, sfuncname,
2289 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002290 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002291 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002292 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002293 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002294 Py_XDECREF(klassname);
2295 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002296}
2297
Guido van Rossum9bfef441993-03-29 10:43:31 +00002298static long
Fred Drake79912472000-07-09 04:06:11 +00002299instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002300{
2301 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002302 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002303 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002304 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002305 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002306 if (x == -1)
2307 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002308 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002309 if (y == -1)
2310 return -1;
2311 return x ^ y;
2312}
2313
Jeremy Hylton8caad492000-06-23 14:18:11 +00002314static int
2315instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2316{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002317 Py_VISIT(im->im_func);
2318 Py_VISIT(im->im_self);
2319 Py_VISIT(im->im_class);
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002320 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002321}
2322
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002323static void
Anthony Baxter377be112006-04-11 06:54:30 +00002324getclassname(PyObject *klass, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002325{
2326 PyObject *name;
2327
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002328 assert(bufsize > 1);
2329 strcpy(buf, "?"); /* Default outcome */
Anthony Baxter377be112006-04-11 06:54:30 +00002330 if (klass == NULL)
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002331 return;
Anthony Baxter377be112006-04-11 06:54:30 +00002332 name = PyObject_GetAttrString(klass, "__name__");
Guido van Rossuma15dece2001-08-24 18:48:27 +00002333 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002334 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002335 PyErr_Clear();
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002336 return;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002337 }
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002338 if (PyString_Check(name)) {
2339 strncpy(buf, PyString_AS_STRING(name), bufsize);
2340 buf[bufsize-1] = '\0';
Guido van Rossuma15dece2001-08-24 18:48:27 +00002341 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002342 Py_DECREF(name);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002343}
2344
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002345static void
2346getinstclassname(PyObject *inst, char *buf, int bufsize)
Guido van Rossuma15dece2001-08-24 18:48:27 +00002347{
Anthony Baxter377be112006-04-11 06:54:30 +00002348 PyObject *klass;
Guido van Rossuma15dece2001-08-24 18:48:27 +00002349
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002350 if (inst == NULL) {
Tim Peters75585d42002-08-20 14:31:35 +00002351 assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002352 strcpy(buf, "nothing");
2353 return;
2354 }
Guido van Rossuma15dece2001-08-24 18:48:27 +00002355
Anthony Baxter377be112006-04-11 06:54:30 +00002356 klass = PyObject_GetAttrString(inst, "__class__");
2357 if (klass == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002358 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002359 PyErr_Clear();
Anthony Baxter377be112006-04-11 06:54:30 +00002360 klass = (PyObject *)(inst->ob_type);
2361 Py_INCREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002362 }
Anthony Baxter377be112006-04-11 06:54:30 +00002363 getclassname(klass, buf, bufsize);
2364 Py_XDECREF(klass);
Guido van Rossuma15dece2001-08-24 18:48:27 +00002365}
2366
Tim Peters6d6c1a32001-08-02 04:15:00 +00002367static PyObject *
2368instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2369{
2370 PyObject *self = PyMethod_GET_SELF(func);
Anthony Baxter377be112006-04-11 06:54:30 +00002371 PyObject *klass = PyMethod_GET_CLASS(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002372 PyObject *result;
2373
2374 func = PyMethod_GET_FUNCTION(func);
2375 if (self == NULL) {
2376 /* Unbound methods must be called with an instance of
2377 the class (or a derived class) as first argument */
2378 int ok;
2379 if (PyTuple_Size(arg) >= 1)
2380 self = PyTuple_GET_ITEM(arg, 0);
2381 if (self == NULL)
2382 ok = 0;
2383 else {
Anthony Baxter377be112006-04-11 06:54:30 +00002384 ok = PyObject_IsInstance(self, klass);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002385 if (ok < 0)
2386 return NULL;
2387 }
2388 if (!ok) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002389 char clsbuf[256];
2390 char instbuf[256];
Anthony Baxter377be112006-04-11 06:54:30 +00002391 getclassname(klass, clsbuf, sizeof(clsbuf));
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002392 getinstclassname(self, instbuf, sizeof(instbuf));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002393 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002394 "unbound method %s%s must be called with "
2395 "%s instance as first argument "
2396 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002397 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002398 PyEval_GetFuncDesc(func),
Guido van Rossum45ec02a2002-08-19 21:43:18 +00002399 clsbuf,
2400 instbuf,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002401 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002402 return NULL;
2403 }
2404 Py_INCREF(arg);
2405 }
2406 else {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002407 Py_ssize_t argcount = PyTuple_Size(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002408 PyObject *newarg = PyTuple_New(argcount + 1);
2409 int i;
2410 if (newarg == NULL)
2411 return NULL;
2412 Py_INCREF(self);
2413 PyTuple_SET_ITEM(newarg, 0, self);
2414 for (i = 0; i < argcount; i++) {
2415 PyObject *v = PyTuple_GET_ITEM(arg, i);
2416 Py_XINCREF(v);
2417 PyTuple_SET_ITEM(newarg, i+1, v);
2418 }
2419 arg = newarg;
2420 }
2421 result = PyObject_Call((PyObject *)func, arg, kw);
2422 Py_DECREF(arg);
2423 return result;
2424}
2425
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002426static PyObject *
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002427instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002428{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002429 /* Don't rebind an already bound method, or an unbound method
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002430 of a class that's not a base class of cls. */
2431
2432 if (PyMethod_GET_SELF(meth) != NULL) {
2433 /* Already bound */
Guido van Rossum501c7c72001-08-16 20:41:56 +00002434 Py_INCREF(meth);
2435 return meth;
2436 }
Guido van Rossum6bae46d2003-02-11 18:43:00 +00002437 /* No, it is an unbound method */
2438 if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2439 /* Do subclass test. If it fails, return meth unchanged. */
2440 int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2441 if (ok < 0)
2442 return NULL;
2443 if (!ok) {
2444 Py_INCREF(meth);
2445 return meth;
2446 }
2447 }
2448 /* Bind it to obj */
2449 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002450}
2451
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002452PyTypeObject PyMethod_Type = {
2453 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002454 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002455 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002456 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002457 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002458 (destructor)instancemethod_dealloc, /* tp_dealloc */
2459 0, /* tp_print */
2460 0, /* tp_getattr */
2461 0, /* tp_setattr */
2462 (cmpfunc)instancemethod_compare, /* tp_compare */
2463 (reprfunc)instancemethod_repr, /* tp_repr */
2464 0, /* tp_as_number */
2465 0, /* tp_as_sequence */
2466 0, /* tp_as_mapping */
2467 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002468 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002469 0, /* tp_str */
Georg Brandl347b3002006-03-30 11:57:00 +00002470 instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002471 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002472 0, /* tp_as_buffer */
Raymond Hettingerbff60ae2005-06-19 08:42:20 +00002473 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002474 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002475 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002476 0, /* tp_clear */
2477 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002478 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2479 0, /* tp_iter */
2480 0, /* tp_iternext */
2481 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002482 instancemethod_memberlist, /* tp_members */
Guido van Rossumbaf0f8f2003-11-22 23:55:50 +00002483 instancemethod_getset, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002484 0, /* tp_base */
2485 0, /* tp_dict */
2486 instancemethod_descr_get, /* tp_descr_get */
2487 0, /* tp_descr_set */
2488 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002489 0, /* tp_init */
2490 0, /* tp_alloc */
2491 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002492};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002493
2494/* Clear out the free list */
2495
2496void
Fred Drake79912472000-07-09 04:06:11 +00002497PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002498{
2499 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002500 PyMethodObject *im = free_list;
2501 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002502 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002503 }
2504}