blob: 90a0e22dd46fbd011801628cf7df574a49c831a0 [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 {
Guido van Rossum28d80b12001-09-07 21:08:32 +000071 int i, n;
72 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;
162 static char *kwlist[] = {"name", "bases", "dict", 0};
163
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{
188 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000190 if (value != NULL) {
191 *pclass = cp;
192 return value;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000195 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000196 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 PyObject *v = class_lookup(
198 (PyClassObject *)
199 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000200 if (v != NULL)
201 return v;
202 }
203 return NULL;
204}
205
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000207class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 register PyObject *v;
210 register char *sname = PyString_AsString(name);
211 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 descrgetfunc f;
213
Guido van Rossum2878a691996-08-09 20:53:24 +0000214 if (sname[0] == '_' && sname[1] == '_') {
215 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 if (PyEval_GetRestricted()) {
217 PyErr_SetString(PyExc_RuntimeError,
218 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000219 return NULL;
220 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000222 return op->cl_dict;
223 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000224 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000226 return op->cl_bases;
227 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000228 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000229 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000231 else
232 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000234 return v;
235 }
Guido van Rossum94308391991-10-20 20:11:48 +0000236 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000237 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000238 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000239 PyErr_Format(PyExc_AttributeError,
240 "class %.50s has no attribute '%.400s'",
241 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000242 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000244 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000245 if (f == NULL)
246 Py_INCREF(v);
247 else
248 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000249 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250}
251
Guido van Rossuma63eff61998-05-29 21:37:21 +0000252static void
Fred Drake79912472000-07-09 04:06:11 +0000253set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000254{
255 PyObject *temp = *slot;
256 Py_XINCREF(v);
257 *slot = v;
258 Py_XDECREF(temp);
259}
260
Guido van Rossum7ba30431998-07-08 13:34:48 +0000261static void
Fred Drake79912472000-07-09 04:06:11 +0000262set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000263{
264 PyClassObject *dummy;
265
266 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
267 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
268 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
269}
270
Guido van Rossuma63eff61998-05-29 21:37:21 +0000271static char *
Fred Drake79912472000-07-09 04:06:11 +0000272set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000273{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000274 if (v == NULL || !PyDict_Check(v))
275 return "__dict__ must be a dictionary object";
276 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000277 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000278 return "";
279}
280
281static char *
Fred Drake79912472000-07-09 04:06:11 +0000282set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000283{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000284 int i, n;
285
286 if (v == NULL || !PyTuple_Check(v))
287 return "__bases__ must be a tuple object";
288 n = PyTuple_Size(v);
289 for (i = 0; i < n; i++) {
290 PyObject *x = PyTuple_GET_ITEM(v, i);
291 if (!PyClass_Check(x))
292 return "__bases__ items must be classes";
293 if (PyClass_IsSubclass(x, (PyObject *)c))
294 return "a __bases__ item causes an inheritance cycle";
295 }
296 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000297 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000298 return "";
299}
300
301static char *
Fred Drake79912472000-07-09 04:06:11 +0000302set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000303{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000304 if (v == NULL || !PyString_Check(v))
305 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000306 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000307 return "__name__ must not contain null bytes";
308 set_slot(&c->cl_name, v);
309 return "";
310}
311
Guido van Rossum94308391991-10-20 20:11:48 +0000312static int
Fred Drake79912472000-07-09 04:06:11 +0000313class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000314{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000315 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 if (PyEval_GetRestricted()) {
317 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000318 "classes are read-only in restricted mode");
319 return -1;
320 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000321 sname = PyString_AsString(name);
322 if (sname[0] == '_' && sname[1] == '_') {
323 int n = PyString_Size(name);
324 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000325 char *err = NULL;
326 if (strcmp(sname, "__dict__") == 0)
327 err = set_dict(op, v);
328 else if (strcmp(sname, "__bases__") == 0)
329 err = set_bases(op, v);
330 else if (strcmp(sname, "__name__") == 0)
331 err = set_name(op, v);
332 else if (strcmp(sname, "__getattr__") == 0)
333 set_slot(&op->cl_getattr, v);
334 else if (strcmp(sname, "__setattr__") == 0)
335 set_slot(&op->cl_setattr, v);
336 else if (strcmp(sname, "__delattr__") == 0)
337 set_slot(&op->cl_delattr, v);
338 /* For the last three, we fall through to update the
339 dictionary as well. */
340 if (err != NULL) {
341 if (*err == '\0')
342 return 0;
343 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000344 return -1;
345 }
346 }
347 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000348 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000350 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000351 PyErr_Format(PyExc_AttributeError,
352 "class %.50s has no attribute '%.400s'",
353 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000354 return rv;
355 }
Guido van Rossum94308391991-10-20 20:11:48 +0000356 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000358}
359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000361class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000362{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000363 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000364 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000366 name = "?";
367 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000369 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000370 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000371 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000372 return PyString_FromFormat("<class %s.%s at %p>",
373 PyString_AsString(mod),
374 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000375}
376
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000377static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000378class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000379{
380 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
381 PyObject *name = op->cl_name;
382 PyObject *res;
383 int m, n;
384
385 if (name == NULL || !PyString_Check(name))
386 return class_repr(op);
387 if (mod == NULL || !PyString_Check(mod)) {
388 Py_INCREF(name);
389 return name;
390 }
391 m = PyString_Size(mod);
392 n = PyString_Size(name);
393 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
394 if (res != NULL) {
395 char *s = PyString_AsString(res);
396 memcpy(s, PyString_AsString(mod), m);
397 s += m;
398 *s++ = '.';
399 memcpy(s, PyString_AsString(name), n);
400 }
401 return res;
402}
403
Jeremy Hylton8caad492000-06-23 14:18:11 +0000404static int
405class_traverse(PyClassObject *o, visitproc visit, void *arg)
406{
407 int err;
408 if (o->cl_bases) {
409 err = visit(o->cl_bases, arg);
410 if (err)
411 return err;
412 }
413 if (o->cl_dict) {
414 err = visit(o->cl_dict, arg);
415 if (err)
416 return err;
417 }
418 if (o->cl_name) {
419 err = visit(o->cl_name, arg);
420 if (err)
421 return err;
422 }
423 if (o->cl_getattr) {
424 err = visit(o->cl_getattr, arg);
425 if (err)
426 return err;
427 }
428 if (o->cl_setattr) {
429 err = visit(o->cl_setattr, arg);
430 if (err)
431 return err;
432 }
433 if (o->cl_delattr) {
434 err = visit(o->cl_delattr, arg);
435 if (err)
436 return err;
437 }
438 return 0;
439}
440
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441PyTypeObject PyClass_Type = {
442 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000444 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000445 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000447 (destructor)class_dealloc, /* tp_dealloc */
448 0, /* tp_print */
449 0, /* tp_getattr */
450 0, /* tp_setattr */
451 0, /* tp_compare */
452 (reprfunc)class_repr, /* tp_repr */
453 0, /* tp_as_number */
454 0, /* tp_as_sequence */
455 0, /* tp_as_mapping */
456 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000457 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000458 (reprfunc)class_str, /* tp_str */
459 (getattrofunc)class_getattr, /* tp_getattro */
460 (setattrofunc)class_setattr, /* tp_setattro */
461 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000462 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000463 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000464 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000465 0, /* tp_clear */
466 0, /* tp_richcompare */
467 0, /* tp_weaklistoffset */
468 0, /* tp_iter */
469 0, /* tp_iternext */
470 0, /* tp_methods */
471 0, /* tp_members */
472 0, /* tp_getset */
473 0, /* tp_base */
474 0, /* tp_dict */
475 0, /* tp_descr_get */
476 0, /* tp_descr_set */
477 0, /* tp_dictoffset */
478 0, /* tp_init */
479 0, /* tp_alloc */
480 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481};
482
Guido van Rossum81daa321993-05-20 14:24:46 +0000483int
Fred Drake79912472000-07-09 04:06:11 +0000484PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000485{
486 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000488 if (class == base)
489 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000491 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 cp = (PyClassObject *)class;
493 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000494 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000496 return 1;
497 }
498 return 0;
499}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500
Guido van Rossum81daa321993-05-20 14:24:46 +0000501
502/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000503
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000505PyInstance_NewRaw(PyObject *klass, PyObject *dict)
506{
507 PyInstanceObject *inst;
508
509 if (!PyClass_Check(klass)) {
510 PyErr_BadInternalCall();
511 return NULL;
512 }
513 if (dict == NULL) {
514 dict = PyDict_New();
515 if (dict == NULL)
516 return NULL;
517 }
518 else {
519 if (!PyDict_Check(dict)) {
520 PyErr_BadInternalCall();
521 return NULL;
522 }
523 Py_INCREF(dict);
524 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000525 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000526 if (inst == NULL) {
527 Py_DECREF(dict);
528 return NULL;
529 }
Fred Drake4e262a92001-03-22 18:26:47 +0000530 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000531 Py_INCREF(klass);
532 inst->in_class = (PyClassObject *)klass;
533 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000534 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000535 return (PyObject *)inst;
536}
537
538PyObject *
539PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 register PyInstanceObject *inst;
542 PyObject *init;
543 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000544
545 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000546 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000547 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000548 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000549 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000550 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000551 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 if ((arg != NULL && (!PyTuple_Check(arg) ||
553 PyTuple_Size(arg) != 0))
554 || (kw != NULL && (!PyDict_Check(kw) ||
555 PyDict_Size(kw) != 0))) {
556 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000557 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000559 inst = NULL;
560 }
561 }
562 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
564 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000565 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000567 inst = NULL;
568 }
569 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 if (res != Py_None) {
571 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000572 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000574 inst = NULL;
575 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000577 }
578 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000580}
581
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000582/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000583
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000584PyDoc_STRVAR(instance_doc,
585"instance(class[, dict])\n\
586\n\
587Create an instance without calling its __init__() method.\n\
588The class must be a classic class.\n\
589If present, dict must be a dictionary or None.");
590
591static PyObject *
592instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
593{
594 PyObject *klass;
595 PyObject *dict = Py_None;
596
597 if (!PyArg_ParseTuple(args, "O!|O:instance",
598 &PyClass_Type, &klass, &dict))
599 return NULL;
600
601 if (dict == Py_None)
602 dict = NULL;
603 else if (!PyDict_Check(dict)) {
604 PyErr_SetString(PyExc_TypeError,
605 "instance() second arg must be dictionary or None");
606 return NULL;
607 }
608 return PyInstance_NewRaw(klass, dict);
609}
610
611
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612static void
Fred Drake79912472000-07-09 04:06:11 +0000613instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 PyObject *error_type, *error_value, *error_traceback;
616 PyObject *del;
617 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000618#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000619 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000620#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000621 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000622 if (inst->in_weakreflist != NULL)
623 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000624
Tim Peters6b184912000-09-17 14:40:17 +0000625 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000626#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000627#ifndef Py_REF_DEBUG
628# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
629#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000630 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000632 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000633#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000634 /* compensate for boost in _Py_NewReference; note that
635 * _Py_RefTotal was also boosted; we'll knock that down later.
636 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 inst->ob_type->tp_allocs--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000638#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000639#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000640 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000642#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000643
644 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000646 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000647 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000648 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000649 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000651 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000652 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000653 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 Py_DECREF(res);
655 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000656 }
Tim Peters6b184912000-09-17 14:40:17 +0000657 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000659 /* Undo the temporary resurrection; can't use DECREF here, it would
660 * cause a recursive call.
661 */
662#ifdef Py_REF_DEBUG
663 /* _Py_RefTotal was boosted either by _Py_NewReference or
664 * Py_INCREF above.
665 */
666 _Py_RefTotal--;
667#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000668 if (--inst->ob_refcnt > 0) {
669#ifdef COUNT_ALLOCS
Tim Peters6d6c1a32001-08-02 04:15:00 +0000670 inst->ob_type->tp_frees--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000671#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000672 _PyObject_GC_TRACK(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000673 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000674 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000675#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000676 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000677#ifdef COUNT_ALLOCS
678 /* compensate for increment in _Py_ForgetReference */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000679 inst->ob_type->tp_frees--;
Tim Peters6b184912000-09-17 14:40:17 +0000680#endif
Tim Peters6b184912000-09-17 14:40:17 +0000681#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 Py_DECREF(inst->in_class);
683 Py_XDECREF(inst->in_dict);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000684 PyObject_GC_Del(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000685}
686
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000688instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000689{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 register PyObject *v;
691 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000692 if (sname[0] == '_' && sname[1] == '_') {
693 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 if (PyEval_GetRestricted()) {
695 PyErr_SetString(PyExc_RuntimeError,
696 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000697 return NULL;
698 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000700 return inst->in_dict;
701 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000702 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 Py_INCREF(inst->in_class);
704 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000705 }
Guido van Rossum94308391991-10-20 20:11:48 +0000706 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000707 v = instance_getattr2(inst, name);
708 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000709 PyErr_Format(PyExc_AttributeError,
710 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000711 PyString_AS_STRING(inst->in_class->cl_name), sname);
712 }
713 return v;
714}
715
716static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000717instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000718{
719 register PyObject *v;
720 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721 descrgetfunc f;
722
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000724 if (v != NULL) {
725 Py_INCREF(v);
726 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000727 }
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000728 v = class_lookup(inst->in_class, name, &class);
729 if (v != NULL) {
730 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000731 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000732 if (f != NULL) {
733 PyObject *w = f(v, (PyObject *)inst,
734 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000736 v = w;
737 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000738 }
739 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000740}
741
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000743instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000744{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000746 res = instance_getattr1(inst, name);
747 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000749 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
750 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 PyErr_Clear();
752 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000753 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000754 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 res = PyEval_CallObject(func, args);
756 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000757 }
758 return res;
759}
760
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000761static int
Fred Drake79912472000-07-09 04:06:11 +0000762instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000763{
Guido van Rossum94472a01992-09-04 09:45:18 +0000764 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000766 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000767 PyErr_Format(PyExc_AttributeError,
768 "%.50s instance has no attribute '%.400s'",
769 PyString_AS_STRING(inst->in_class->cl_name),
770 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000771 return rv;
772 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000775}
776
Guido van Rossume7737541994-09-05 07:31:41 +0000777static int
Fred Drake79912472000-07-09 04:06:11 +0000778instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000779{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000780 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000782 if (sname[0] == '_' && sname[1] == '_') {
783 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000784 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000785 if (strcmp(sname, "__dict__") == 0) {
786 if (PyEval_GetRestricted()) {
787 PyErr_SetString(PyExc_RuntimeError,
788 "__dict__ not accessible in restricted mode");
789 return -1;
790 }
791 if (v == NULL || !PyDict_Check(v)) {
792 PyErr_SetString(PyExc_TypeError,
793 "__dict__ must be set to a dictionary");
794 return -1;
795 }
796 tmp = inst->in_dict;
797 Py_INCREF(v);
798 inst->in_dict = v;
799 Py_DECREF(tmp);
800 return 0;
801 }
802 if (strcmp(sname, "__class__") == 0) {
803 if (PyEval_GetRestricted()) {
804 PyErr_SetString(PyExc_RuntimeError,
805 "__class__ not accessible in restricted mode");
806 return -1;
807 }
808 if (v == NULL || !PyClass_Check(v)) {
809 PyErr_SetString(PyExc_TypeError,
810 "__class__ must be set to a class");
811 return -1;
812 }
813 tmp = (PyObject *)(inst->in_class);
814 Py_INCREF(v);
815 inst->in_class = (PyClassObject *)v;
816 Py_DECREF(tmp);
817 return 0;
818 }
Guido van Rossume7737541994-09-05 07:31:41 +0000819 }
Guido van Rossume7737541994-09-05 07:31:41 +0000820 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000821 if (v == NULL)
822 func = inst->in_class->cl_delattr;
823 else
824 func = inst->in_class->cl_setattr;
825 if (func == NULL)
826 return instance_setattr1(inst, name, v);
827 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000829 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000831 if (args == NULL)
832 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 res = PyEval_CallObject(func, args);
834 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000835 if (res == NULL)
836 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000838 return 0;
839}
840
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000842instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000843{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyObject *func;
845 PyObject *res;
846 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000847
Guido van Rossum2878a691996-08-09 20:53:24 +0000848 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000849 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000850 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000851 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000852 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000853 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000854 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
855 return NULL;
856 PyErr_Clear();
857 classname = inst->in_class->cl_name;
858 mod = PyDict_GetItemString(inst->in_class->cl_dict,
859 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 if (classname != NULL && PyString_Check(classname))
861 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000862 else
863 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000864 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000865 return PyString_FromFormat("<?.%s instance at %p>",
866 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000867 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000868 return PyString_FromFormat("<%s.%s instance at %p>",
869 PyString_AsString(mod),
870 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000871 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 res = PyEval_CallObject(func, (PyObject *)NULL);
873 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000874 return res;
875}
876
Guido van Rossum82c690f2001-04-30 14:39:18 +0000877static PyObject *
878instance_str(PyInstanceObject *inst)
879{
880 PyObject *func;
881 PyObject *res;
882 static PyObject *strstr;
883
884 if (strstr == NULL)
885 strstr = PyString_InternFromString("__str__");
886 func = instance_getattr(inst, strstr);
887 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000888 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
889 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000890 PyErr_Clear();
891 return instance_repr(inst);
892 }
893 res = PyEval_CallObject(func, (PyObject *)NULL);
894 Py_DECREF(func);
895 return res;
896}
897
Guido van Rossum9bfef441993-03-29 10:43:31 +0000898static long
Fred Drake79912472000-07-09 04:06:11 +0000899instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000900{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901 PyObject *func;
902 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000903 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000904 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000905
Guido van Rossum2878a691996-08-09 20:53:24 +0000906 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000907 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000908 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000909 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000910 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
911 return -1;
912 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000913 /* If there is no __eq__ and no __cmp__ method, we hash on the
914 address. If an __eq__ or __cmp__ method exists, there must
915 be a __hash__. */
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000916 if (eqstr == NULL)
917 eqstr = PyString_InternFromString("__eq__");
918 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000919 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000920 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
921 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000923 if (cmpstr == NULL)
924 cmpstr = PyString_InternFromString("__cmp__");
925 func = instance_getattr(inst, cmpstr);
926 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000927 if (!PyErr_ExceptionMatches(
928 PyExc_AttributeError))
929 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000930 PyErr_Clear();
931 return _Py_HashPointer(inst);
932 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000933 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000935 return -1;
936 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 res = PyEval_CallObject(func, (PyObject *)NULL);
938 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000939 if (res == NULL)
940 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 if (PyInt_Check(res)) {
942 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000943 if (outcome == -1)
944 outcome = -2;
945 }
946 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 PyErr_SetString(PyExc_TypeError,
948 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000949 outcome = -1;
950 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000952 return outcome;
953}
954
Jeremy Hylton8caad492000-06-23 14:18:11 +0000955static int
956instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
957{
958 int err;
959 if (o->in_class) {
960 err = visit((PyObject *)(o->in_class), arg);
961 if (err)
962 return err;
963 }
964 if (o->in_dict) {
965 err = visit(o->in_dict, arg);
966 if (err)
967 return err;
968 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000969 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000970}
971
Guido van Rossum213c7a62001-04-23 14:08:49 +0000972static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
973static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000974
Guido van Rossum9bfef441993-03-29 10:43:31 +0000975static int
Fred Drake79912472000-07-09 04:06:11 +0000976instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000977{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 PyObject *func;
979 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980 int outcome;
981
Guido van Rossum2878a691996-08-09 20:53:24 +0000982 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000983 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000984 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000985 if (func == NULL)
986 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 res = PyEval_CallObject(func, (PyObject *)NULL);
988 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000989 if (res == NULL)
990 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 if (PyInt_Check(res)) {
992 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyErr_SetString(PyExc_ValueError,
995 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000996 }
997 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 PyErr_SetString(PyExc_TypeError,
999 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 outcome = -1;
1001 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003 return outcome;
1004}
1005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001007instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001008{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyObject *func;
1010 PyObject *arg;
1011 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012
Guido van Rossum2878a691996-08-09 20:53:24 +00001013 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001014 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001015 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016 if (func == NULL)
1017 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021 return NULL;
1022 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 res = PyEval_CallObject(func, arg);
1024 Py_DECREF(func);
1025 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026 return res;
1027}
1028
Guido van Rossum9bfef441993-03-29 10:43:31 +00001029static int
Fred Drake79912472000-07-09 04:06:11 +00001030instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyObject *func;
1033 PyObject *arg;
1034 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035
Guido van Rossum2878a691996-08-09 20:53:24 +00001036 if (value == NULL) {
1037 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001038 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001039 func = instance_getattr(inst, delitemstr);
1040 }
1041 else {
1042 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001043 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001044 func = instance_getattr(inst, setitemstr);
1045 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046 if (func == NULL)
1047 return -1;
1048 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001054 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 res = PyEval_CallObject(func, arg);
1057 Py_DECREF(func);
1058 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 if (res == NULL)
1060 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062 return 0;
1063}
1064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001066 (inquiry)instance_length, /* mp_length */
1067 (binaryfunc)instance_subscript, /* mp_subscript */
1068 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001069};
1070
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001072instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075
Guido van Rossum2878a691996-08-09 20:53:24 +00001076 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001077 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001078 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 if (func == NULL)
1080 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001082 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001084 return NULL;
1085 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 res = PyEval_CallObject(func, arg);
1087 Py_DECREF(func);
1088 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 return res;
1090}
1091
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +00001093sliceobj_from_intint(int i, int j)
1094{
1095 PyObject *start, *end, *res;
1096
1097 start = PyInt_FromLong((long)i);
1098 if (!start)
1099 return NULL;
1100
1101 end = PyInt_FromLong((long)j);
1102 if (!end) {
1103 Py_DECREF(start);
1104 return NULL;
1105 }
1106 res = PySlice_New(start, end, NULL);
1107 Py_DECREF(start);
1108 Py_DECREF(end);
1109 return res;
1110}
1111
1112
1113static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001114instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001115{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001116 PyObject *func, *arg, *res;
1117 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118
Guido van Rossum2878a691996-08-09 20:53:24 +00001119 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001120 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001121 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001122
1123 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001124 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1125 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001126 PyErr_Clear();
1127
1128 if (getitemstr == NULL)
1129 getitemstr = PyString_InternFromString("__getitem__");
1130 func = instance_getattr(inst, getitemstr);
1131 if (func == NULL)
1132 return NULL;
1133 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1134 } else
1135 arg = Py_BuildValue("(ii)", i, j);
1136
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139 return NULL;
1140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 res = PyEval_CallObject(func, arg);
1142 Py_DECREF(func);
1143 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001144 return res;
1145}
1146
1147static int
Fred Drake79912472000-07-09 04:06:11 +00001148instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001149{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001151
Guido van Rossum2878a691996-08-09 20:53:24 +00001152 if (item == NULL) {
1153 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001154 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001155 func = instance_getattr(inst, delitemstr);
1156 }
1157 else {
1158 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001159 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001160 func = instance_getattr(inst, setitemstr);
1161 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001162 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001163 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001164 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001165 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001166 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001168 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001170 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001171 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 res = PyEval_CallObject(func, arg);
1173 Py_DECREF(func);
1174 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001175 if (res == NULL)
1176 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001178 return 0;
1179}
1180
1181static int
Fred Drake79912472000-07-09 04:06:11 +00001182instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001183{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 PyObject *func, *arg, *res;
1185 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186
Guido van Rossum2878a691996-08-09 20:53:24 +00001187 if (value == NULL) {
1188 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 delslicestr =
1190 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001191 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001192 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001193 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1194 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001195 PyErr_Clear();
1196 if (delitemstr == NULL)
1197 delitemstr =
1198 PyString_InternFromString("__delitem__");
1199 func = instance_getattr(inst, delitemstr);
1200 if (func == NULL)
1201 return -1;
1202
1203 arg = Py_BuildValue("(N)",
1204 sliceobj_from_intint(i, j));
1205 } else
1206 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001207 }
1208 else {
1209 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 setslicestr =
1211 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001212 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001213 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001214 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1215 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001216 PyErr_Clear();
1217 if (setitemstr == NULL)
1218 setitemstr =
1219 PyString_InternFromString("__setitem__");
1220 func = instance_getattr(inst, setitemstr);
1221 if (func == NULL)
1222 return -1;
1223
1224 arg = Py_BuildValue("(NO)",
1225 sliceobj_from_intint(i, j), value);
1226 } else
1227 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001228 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001229 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001231 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001232 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233 res = PyEval_CallObject(func, arg);
1234 Py_DECREF(func);
1235 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001236 if (res == NULL)
1237 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001239 return 0;
1240}
1241
Tim Peterscb8d3682001-05-05 21:05:01 +00001242static int
1243instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001244{
1245 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001246 PyObject *func;
1247
1248 /* Try __contains__ first.
1249 * If that can't be done, try iterator-based searching.
1250 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001251
1252 if(__contains__ == NULL) {
1253 __contains__ = PyString_InternFromString("__contains__");
1254 if(__contains__ == NULL)
1255 return -1;
1256 }
1257 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001258 if (func) {
1259 PyObject *res;
1260 int ret;
1261 PyObject *arg = Py_BuildValue("(O)", member);
1262 if(arg == NULL) {
1263 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001264 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001265 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001266 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001267 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001268 Py_DECREF(arg);
1269 if(res == NULL)
1270 return -1;
1271 ret = PyObject_IsTrue(res);
1272 Py_DECREF(res);
1273 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001274 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001275
1276 /* Couldn't find __contains__. */
1277 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1278 /* Assume the failure was simply due to that there is no
1279 * __contains__ attribute, and try iterating instead.
1280 */
1281 PyErr_Clear();
Tim Peters16a77ad2001-09-08 04:00:12 +00001282 return _PySequence_IterSearch((PyObject *)inst, member,
1283 PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001284 }
1285 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001286 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001287}
1288
Fred Drake79912472000-07-09 04:06:11 +00001289static PySequenceMethods
1290instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001291 (inquiry)instance_length, /* sq_length */
1292 0, /* sq_concat */
1293 0, /* sq_repeat */
1294 (intargfunc)instance_item, /* sq_item */
1295 (intintargfunc)instance_slice, /* sq_slice */
1296 (intobjargproc)instance_ass_item, /* sq_ass_item */
1297 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1298 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001299};
1300
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001302generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001303{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001305
1306 if ((func = instance_getattr(self, methodname)) == NULL)
1307 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 res = PyEval_CallObject(func, (PyObject *)NULL);
1309 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001310 return res;
1311}
1312
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001313static PyObject *
1314generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001315{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001316 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001318 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001319 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001320 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001321 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001323 Py_INCREF(Py_NotImplemented);
1324 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001325 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001327 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001329 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001330 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001331 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 Py_DECREF(args);
1333 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001334 return result;
1335}
1336
1337
1338static PyObject *coerce_obj;
1339
1340/* Try one half of a binary operator involving a class instance. */
1341static PyObject *
1342half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1343 int swapped)
1344{
1345 PyObject *args;
1346 PyObject *coercefunc;
1347 PyObject *coerced = NULL;
1348 PyObject *v1;
1349 PyObject *result;
1350
1351 if (!PyInstance_Check(v)) {
1352 Py_INCREF(Py_NotImplemented);
1353 return Py_NotImplemented;
1354 }
1355
1356 if (coerce_obj == NULL) {
1357 coerce_obj = PyString_InternFromString("__coerce__");
1358 if (coerce_obj == NULL)
1359 return NULL;
1360 }
1361 coercefunc = PyObject_GetAttr(v, coerce_obj);
1362 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001363 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1364 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001365 PyErr_Clear();
1366 return generic_binary_op(v, w, opname);
1367 }
1368
1369 args = Py_BuildValue("(O)", w);
1370 if (args == NULL) {
1371 return NULL;
1372 }
1373 coerced = PyEval_CallObject(coercefunc, args);
1374 Py_DECREF(args);
1375 Py_DECREF(coercefunc);
1376 if (coerced == NULL) {
1377 return NULL;
1378 }
1379 if (coerced == Py_None || coerced == Py_NotImplemented) {
1380 Py_DECREF(coerced);
1381 return generic_binary_op(v, w, opname);
1382 }
1383 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1384 Py_DECREF(coerced);
1385 PyErr_SetString(PyExc_TypeError,
1386 "coercion should return None or 2-tuple");
1387 return NULL;
1388 }
1389 v1 = PyTuple_GetItem(coerced, 0);
1390 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001391 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001392 /* prevent recursion if __coerce__ returns self as the first
1393 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001394 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001395 } else {
1396 if (swapped)
1397 result = (thisfunc)(w, v1);
1398 else
1399 result = (thisfunc)(v1, w);
1400 }
1401 Py_DECREF(coerced);
1402 return result;
1403}
1404
1405/* Implement a binary operator involving at least one class instance. */
1406static PyObject *
1407do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1408 binaryfunc thisfunc)
1409{
1410 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1411 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001412 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001413 result = half_binop(w, v, ropname, thisfunc, 1);
1414 }
1415 return result;
1416}
1417
1418static PyObject *
1419do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1420 char *ropname, binaryfunc thisfunc)
1421{
1422 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1423 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001424 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001425 result = do_binop(v, w, opname, ropname, thisfunc);
1426 }
1427 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001428}
1429
Guido van Rossum879c5811995-01-10 15:24:06 +00001430static int
Fred Drake79912472000-07-09 04:06:11 +00001431instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001432{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 PyObject *v = *pv;
1434 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001435 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 PyObject *args;
1437 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001438
Guido van Rossum2878a691996-08-09 20:53:24 +00001439 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001440 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001441 if (coerce_obj == NULL)
1442 return -1;
1443 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001444 coercefunc = PyObject_GetAttr(v, coerce_obj);
1445 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001446 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001447 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1448 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001450 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001451 }
1452 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001454 if (args == NULL) {
1455 return -1;
1456 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001457 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001459 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001460 if (coerced == NULL) {
1461 /* __coerce__ call raised an exception */
1462 return -1;
1463 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001464 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001465 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001467 return 1;
1468 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001470 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 Py_DECREF(coerced);
1472 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001473 "coercion should return None or 2-tuple");
1474 return -1;
1475 }
1476 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477 *pv = PyTuple_GetItem(coerced, 0);
1478 *pw = PyTuple_GetItem(coerced, 1);
1479 Py_INCREF(*pv);
1480 Py_INCREF(*pw);
1481 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001482 return 0;
1483}
1484
Guido van Rossum04691fc1992-08-12 15:35:34 +00001485#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001486static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001488 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001489 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001490}
1491
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001492#define BINARY(f, m, n) \
1493static PyObject *f(PyObject *v, PyObject *w) { \
1494 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1495}
1496
1497#define BINARY_INPLACE(f, m, n) \
1498static PyObject *f(PyObject *v, PyObject *w) { \
1499 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1500 "__r" m "__", n); \
1501}
1502
Guido van Rossum04691fc1992-08-12 15:35:34 +00001503UNARY(instance_neg, "__neg__")
1504UNARY(instance_pos, "__pos__")
1505UNARY(instance_abs, "__abs__")
1506
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001507BINARY(instance_or, "or", PyNumber_Or)
1508BINARY(instance_and, "and", PyNumber_And)
1509BINARY(instance_xor, "xor", PyNumber_Xor)
1510BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1511BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1512BINARY(instance_add, "add", PyNumber_Add)
1513BINARY(instance_sub, "sub", PyNumber_Subtract)
1514BINARY(instance_mul, "mul", PyNumber_Multiply)
1515BINARY(instance_div, "div", PyNumber_Divide)
1516BINARY(instance_mod, "mod", PyNumber_Remainder)
1517BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001518BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1519BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001520
1521BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1522BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1523BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1524BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1525BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1526BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1527BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1528BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1529BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1530BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001531BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1532BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001533
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001534/* Try a 3-way comparison, returning an int; v is an instance. Return:
1535 -2 for an exception;
1536 -1 if v < w;
1537 0 if v == w;
1538 1 if v > w;
1539 2 if this particular 3-way comparison is not implemented or undefined.
1540*/
1541static int
1542half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001543{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001544 static PyObject *cmp_obj;
1545 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001546 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001547 PyObject *result;
1548 long l;
1549
1550 assert(PyInstance_Check(v));
1551
1552 if (cmp_obj == NULL) {
1553 cmp_obj = PyString_InternFromString("__cmp__");
1554 if (cmp_obj == NULL)
1555 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001556 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001557
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001558 cmp_func = PyObject_GetAttr(v, cmp_obj);
1559 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001560 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1561 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001562 PyErr_Clear();
1563 return 2;
1564 }
1565
1566 args = Py_BuildValue("(O)", w);
1567 if (args == NULL)
1568 return -2;
1569
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001570 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001571 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001572 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001573
1574 if (result == NULL)
1575 return -2;
1576
1577 if (result == Py_NotImplemented) {
1578 Py_DECREF(result);
1579 return 2;
1580 }
1581
1582 l = PyInt_AsLong(result);
1583 Py_DECREF(result);
1584 if (l == -1 && PyErr_Occurred()) {
1585 PyErr_SetString(PyExc_TypeError,
1586 "comparison did not return an int");
1587 return -2;
1588 }
1589
1590 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001591}
1592
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001593/* Try a 3-way comparison, returning an int; either v or w is an instance.
1594 We first try a coercion. Return:
1595 -2 for an exception;
1596 -1 if v < w;
1597 0 if v == w;
1598 1 if v > w;
1599 2 if this particular 3-way comparison is not implemented or undefined.
1600 THIS IS ONLY CALLED FROM object.c!
1601*/
1602static int
1603instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001604{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001605 int c;
1606
1607 c = PyNumber_CoerceEx(&v, &w);
1608 if (c < 0)
1609 return -2;
1610 if (c == 0) {
1611 /* If neither is now an instance, use regular comparison */
1612 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1613 c = PyObject_Compare(v, w);
1614 Py_DECREF(v);
1615 Py_DECREF(w);
1616 if (PyErr_Occurred())
1617 return -2;
1618 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001619 }
1620 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001621 else {
1622 /* The coercion didn't do anything.
1623 Treat this the same as returning v and w unchanged. */
1624 Py_INCREF(v);
1625 Py_INCREF(w);
1626 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001627
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001628 if (PyInstance_Check(v)) {
1629 c = half_cmp(v, w);
1630 if (c <= 1) {
1631 Py_DECREF(v);
1632 Py_DECREF(w);
1633 return c;
1634 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001635 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001636 if (PyInstance_Check(w)) {
1637 c = half_cmp(w, v);
1638 if (c <= 1) {
1639 Py_DECREF(v);
1640 Py_DECREF(w);
1641 if (c >= -1)
1642 c = -c;
1643 return c;
1644 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001645 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001646 Py_DECREF(v);
1647 Py_DECREF(w);
1648 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001649}
1650
Guido van Rossum9bfef441993-03-29 10:43:31 +00001651static int
Fred Drake79912472000-07-09 04:06:11 +00001652instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001653{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001655 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001657
Guido van Rossum2878a691996-08-09 20:53:24 +00001658 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001659 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001660 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001661 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1662 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001663 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001664 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001665 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001666 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001667 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1668 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001670 /* Fall back to the default behavior:
1671 all instances are nonzero */
1672 return 1;
1673 }
1674 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675 res = PyEval_CallObject(func, (PyObject *)NULL);
1676 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001677 if (res == NULL)
1678 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001679 if (!PyInt_Check(res)) {
1680 Py_DECREF(res);
1681 PyErr_SetString(PyExc_TypeError,
1682 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001683 return -1;
1684 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685 outcome = PyInt_AsLong(res);
1686 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001687 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688 PyErr_SetString(PyExc_ValueError,
1689 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001690 return -1;
1691 }
1692 return outcome > 0;
1693}
1694
1695UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001696UNARY(instance_int, "__int__")
1697UNARY(instance_long, "__long__")
1698UNARY(instance_float, "__float__")
1699UNARY(instance_oct, "__oct__")
1700UNARY(instance_hex, "__hex__")
1701
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001702static PyObject *
1703bin_power(PyObject *v, PyObject *w)
1704{
1705 return PyNumber_Power(v, w, Py_None);
1706}
1707
Guido van Rossum03093a21994-09-28 15:51:32 +00001708/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001709static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001710instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001711{
1712 if (z == Py_None) {
1713 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001714 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001715 else {
1716 PyObject *func;
1717 PyObject *args;
1718 PyObject *result;
1719
1720 /* XXX Doesn't do coercions... */
1721 func = PyObject_GetAttrString(v, "__pow__");
1722 if (func == NULL)
1723 return NULL;
1724 args = Py_BuildValue("(OO)", w, z);
1725 if (args == NULL) {
1726 Py_DECREF(func);
1727 return NULL;
1728 }
1729 result = PyEval_CallObject(func, args);
1730 Py_DECREF(func);
1731 Py_DECREF(args);
1732 return result;
1733 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001734}
1735
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001736static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001737bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001738{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001739 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001740}
1741
1742
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001743static PyObject *
1744instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1745{
1746 if (z == Py_None) {
1747 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1748 "__rpow__", bin_inplace_power);
1749 }
1750 else {
1751 /* XXX Doesn't do coercions... */
1752 PyObject *func;
1753 PyObject *args;
1754 PyObject *result;
1755
1756 func = PyObject_GetAttrString(v, "__ipow__");
1757 if (func == NULL) {
1758 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1759 return NULL;
1760 PyErr_Clear();
1761 return instance_pow(v, w, z);
1762 }
1763 args = Py_BuildValue("(OO)", w, z);
1764 if (args == NULL) {
1765 Py_DECREF(func);
1766 return NULL;
1767 }
1768 result = PyEval_CallObject(func, args);
1769 Py_DECREF(func);
1770 Py_DECREF(args);
1771 return result;
1772 }
1773}
1774
1775
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001776/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001777#define NAME_OPS 6
1778static PyObject **name_op = NULL;
1779
1780static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001781init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001782{
1783 int i;
1784 char *_name_op[] = {
1785 "__lt__",
1786 "__le__",
1787 "__eq__",
1788 "__ne__",
1789 "__gt__",
1790 "__ge__",
1791 };
1792
1793 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1794 if (name_op == NULL)
1795 return -1;
1796 for (i = 0; i < NAME_OPS; ++i) {
1797 name_op[i] = PyString_InternFromString(_name_op[i]);
1798 if (name_op[i] == NULL)
1799 return -1;
1800 }
1801 return 0;
1802}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001803
1804static PyObject *
1805half_richcompare(PyObject *v, PyObject *w, int op)
1806{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001807 PyObject *method;
1808 PyObject *args;
1809 PyObject *res;
1810
1811 assert(PyInstance_Check(v));
1812
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001813 if (name_op == NULL) {
1814 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001815 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001816 }
1817 /* If the instance doesn't define an __getattr__ method, use
1818 instance_getattr2 directly because it will not set an
1819 exception on failure. */
1820 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
1821 method = instance_getattr2((PyInstanceObject *)v,
1822 name_op[op]);
1823 if (method == NULL) {
1824 assert(!PyErr_Occurred());
1825 res = Py_NotImplemented;
1826 Py_INCREF(res);
1827 return res;
1828 }
1829 } else {
1830 method = PyObject_GetAttr(v, name_op[op]);
1831 if (method == NULL) {
1832 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1833 return NULL;
1834 PyErr_Clear();
1835 res = Py_NotImplemented;
1836 Py_INCREF(res);
1837 return res;
1838 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001839 }
1840
1841 args = Py_BuildValue("(O)", w);
1842 if (args == NULL) {
1843 Py_DECREF(method);
1844 return NULL;
1845 }
1846
1847 res = PyEval_CallObject(method, args);
1848 Py_DECREF(args);
1849 Py_DECREF(method);
1850
1851 return res;
1852}
1853
1854/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1855static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1856
1857static PyObject *
1858instance_richcompare(PyObject *v, PyObject *w, int op)
1859{
1860 PyObject *res;
1861
1862 if (PyInstance_Check(v)) {
1863 res = half_richcompare(v, w, op);
1864 if (res != Py_NotImplemented)
1865 return res;
1866 Py_DECREF(res);
1867 }
1868
1869 if (PyInstance_Check(w)) {
1870 res = half_richcompare(w, v, swapped_op[op]);
1871 if (res != Py_NotImplemented)
1872 return res;
1873 Py_DECREF(res);
1874 }
1875
1876 Py_INCREF(Py_NotImplemented);
1877 return Py_NotImplemented;
1878}
1879
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001880
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001881/* Get the iterator */
1882static PyObject *
1883instance_getiter(PyInstanceObject *self)
1884{
1885 PyObject *func;
1886
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001887 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001888 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001889 if (iterstr == NULL)
1890 return NULL;
1891 }
1892 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001893 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001894 if (getitemstr == NULL)
1895 return NULL;
1896 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001897
1898 if ((func = instance_getattr(self, iterstr)) != NULL) {
1899 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1900 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001901 if (res != NULL && !PyIter_Check(res)) {
1902 PyErr_Format(PyExc_TypeError,
1903 "__iter__ returned non-iterator "
1904 "of type '%.100s'",
1905 res->ob_type->tp_name);
1906 Py_DECREF(res);
1907 res = NULL;
1908 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001909 return res;
1910 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001911 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1912 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001913 PyErr_Clear();
1914 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001915 PyErr_SetString(PyExc_TypeError,
1916 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001917 return NULL;
1918 }
1919 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001920 return PySeqIter_New((PyObject *)self);
1921}
1922
1923
1924/* Call the iterator's next */
1925static PyObject *
1926instance_iternext(PyInstanceObject *self)
1927{
1928 PyObject *func;
1929
1930 if (nextstr == NULL)
1931 nextstr = PyString_InternFromString("next");
1932
1933 if ((func = instance_getattr(self, nextstr)) != NULL) {
1934 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1935 Py_DECREF(func);
1936 if (res != NULL) {
1937 return res;
1938 }
1939 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1940 PyErr_Clear();
1941 return NULL;
1942 }
1943 return NULL;
1944 }
1945 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1946 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001947}
1948
Tim Peters6d6c1a32001-08-02 04:15:00 +00001949static PyObject *
1950instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1951{
Guido van Rossum16b93b32002-06-13 21:32:51 +00001952 PyThreadState *tstate = PyThreadState_GET();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001953 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1954 if (call == NULL) {
1955 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001956 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1957 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001958 PyErr_Clear();
1959 PyErr_Format(PyExc_AttributeError,
1960 "%.200s instance has no __call__ method",
1961 PyString_AsString(inst->in_class->cl_name));
1962 return NULL;
1963 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00001964 /* We must check and increment the recursion depth here. Scenario:
1965 class A:
1966 pass
1967 A.__call__ = A() # that's right
1968 a = A() # ok
1969 a() # infinite recursion
1970 This bounces between instance_call() and PyObject_Call() without
1971 ever hitting eval_frame() (which has the main recursion check). */
1972 if (tstate->recursion_depth++ > Py_GetRecursionLimit()) {
1973 PyErr_SetString(PyExc_RuntimeError,
1974 "maximum __call__ recursion depth exceeded");
1975 res = NULL;
1976 }
1977 else
1978 res = PyObject_Call(call, arg, kw);
1979 tstate->recursion_depth--;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001980 Py_DECREF(call);
1981 return res;
1982}
1983
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001984
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001985static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001986 (binaryfunc)instance_add, /* nb_add */
1987 (binaryfunc)instance_sub, /* nb_subtract */
1988 (binaryfunc)instance_mul, /* nb_multiply */
1989 (binaryfunc)instance_div, /* nb_divide */
1990 (binaryfunc)instance_mod, /* nb_remainder */
1991 (binaryfunc)instance_divmod, /* nb_divmod */
1992 (ternaryfunc)instance_pow, /* nb_power */
1993 (unaryfunc)instance_neg, /* nb_negative */
1994 (unaryfunc)instance_pos, /* nb_positive */
1995 (unaryfunc)instance_abs, /* nb_absolute */
1996 (inquiry)instance_nonzero, /* nb_nonzero */
1997 (unaryfunc)instance_invert, /* nb_invert */
1998 (binaryfunc)instance_lshift, /* nb_lshift */
1999 (binaryfunc)instance_rshift, /* nb_rshift */
2000 (binaryfunc)instance_and, /* nb_and */
2001 (binaryfunc)instance_xor, /* nb_xor */
2002 (binaryfunc)instance_or, /* nb_or */
2003 (coercion)instance_coerce, /* nb_coerce */
2004 (unaryfunc)instance_int, /* nb_int */
2005 (unaryfunc)instance_long, /* nb_long */
2006 (unaryfunc)instance_float, /* nb_float */
2007 (unaryfunc)instance_oct, /* nb_oct */
2008 (unaryfunc)instance_hex, /* nb_hex */
2009 (binaryfunc)instance_iadd, /* nb_inplace_add */
2010 (binaryfunc)instance_isub, /* nb_inplace_subtract */
2011 (binaryfunc)instance_imul, /* nb_inplace_multiply */
2012 (binaryfunc)instance_idiv, /* nb_inplace_divide */
2013 (binaryfunc)instance_imod, /* nb_inplace_remainder */
2014 (ternaryfunc)instance_ipow, /* nb_inplace_power */
2015 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
2016 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
2017 (binaryfunc)instance_iand, /* nb_inplace_and */
2018 (binaryfunc)instance_ixor, /* nb_inplace_xor */
2019 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum4668b002001-08-08 05:00:18 +00002020 (binaryfunc)instance_floordiv, /* nb_floor_divide */
2021 (binaryfunc)instance_truediv, /* nb_true_divide */
2022 (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
2023 (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002024};
2025
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002026PyTypeObject PyInstance_Type = {
2027 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002028 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002029 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002030 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002031 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002032 (destructor)instance_dealloc, /* tp_dealloc */
2033 0, /* tp_print */
2034 0, /* tp_getattr */
2035 0, /* tp_setattr */
2036 instance_compare, /* tp_compare */
2037 (reprfunc)instance_repr, /* tp_repr */
2038 &instance_as_number, /* tp_as_number */
2039 &instance_as_sequence, /* tp_as_sequence */
2040 &instance_as_mapping, /* tp_as_mapping */
2041 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002042 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002043 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002044 (getattrofunc)instance_getattr, /* tp_getattro */
2045 (setattrofunc)instance_setattr, /* tp_setattro */
2046 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002047 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002048 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002049 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002050 0, /* tp_clear */
2051 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002052 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2053 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002054 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002055 0, /* tp_methods */
2056 0, /* tp_members */
2057 0, /* tp_getset */
2058 0, /* tp_base */
2059 0, /* tp_dict */
2060 0, /* tp_descr_get */
2061 0, /* tp_descr_set */
2062 0, /* tp_dictoffset */
2063 0, /* tp_init */
2064 0, /* tp_alloc */
2065 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002066};
2067
2068
Guido van Rossum81daa321993-05-20 14:24:46 +00002069/* Instance method objects are used for two purposes:
2070 (a) as bound instance methods (returned by instancename.methodname)
2071 (b) as unbound methods (returned by ClassName.methodname)
2072 In case (b), im_self is NULL
2073*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002074
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002075static PyMethodObject *free_list;
2076
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002077PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002078PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002079{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002080 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002081 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002082 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002083 return NULL;
2084 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002085 im = free_list;
2086 if (im != NULL) {
2087 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002088 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002089 }
2090 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002091 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002092 if (im == NULL)
2093 return NULL;
2094 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002095 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002096 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002097 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002098 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002099 im->im_self = self;
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002100 Py_XINCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00002101 im->im_class = class;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002102 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002103 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002104}
2105
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002106/* Descriptors for PyMethod attributes */
2107
2108/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002109
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002110#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111
Guido van Rossum6f799372001-09-20 20:46:19 +00002112static PyMemberDef instancemethod_memberlist[] = {
2113 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2114 "the class associated with a method"},
2115 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2116 "the function (or other callable) implementing a method"},
2117 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2118 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 {NULL} /* Sentinel */
2120};
2121
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002122/* The getattr() implementation for PyMethod objects is similar to
2123 PyObject_GenericGetAttr(), but instead of looking in __dict__ it
2124 asks im_self for the attribute. Then the error handling is a bit
2125 different because we want to preserve the exception raised by the
2126 delegate, unless we have an alternative from our class. */
2127
2128static PyObject *
2129instancemethod_getattro(PyObject *obj, PyObject *name)
2130{
2131 PyMethodObject *im = (PyMethodObject *)obj;
2132 PyTypeObject *tp = obj->ob_type;
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002133 PyObject *descr = NULL, *res;
2134 descrgetfunc f = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002135
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002136 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2137 if (tp->tp_dict == NULL) {
2138 if (PyType_Ready(tp) < 0)
2139 return NULL;
2140 }
2141 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002142 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002143
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002144 f = NULL;
2145 if (descr != NULL) {
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002146 f = TP_DESCR_GET(descr->ob_type);
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002147 if (f != NULL && PyDescr_IsData(descr))
2148 return f(descr, obj, (PyObject *)obj->ob_type);
2149 }
2150
2151 res = PyObject_GetAttr(im->im_func, name);
2152 if (res != NULL || !PyErr_ExceptionMatches(PyExc_AttributeError))
2153 return res;
2154
2155 if (f != NULL) {
2156 PyErr_Clear();
2157 return f(descr, obj, (PyObject *)obj->ob_type);
2158 }
2159
2160 if (descr != NULL) {
2161 PyErr_Clear();
2162 Py_INCREF(descr);
2163 return descr;
2164 }
2165
2166 assert(PyErr_Occurred());
2167 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002168}
2169
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002170PyDoc_STRVAR(instancemethod_doc,
2171"instancemethod(function, instance, class)\n\
2172\n\
2173Create an instance method object.");
2174
2175static PyObject *
2176instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2177{
2178 PyObject *func;
2179 PyObject *self;
2180 PyObject *classObj;
2181
2182 if (!PyArg_ParseTuple(args, "OOO:instancemethod",
2183 &func, &self, &classObj))
2184 return NULL;
2185 if (!PyCallable_Check(func)) {
2186 PyErr_SetString(PyExc_TypeError,
2187 "first argument must be callable");
2188 return NULL;
2189 }
2190 if (self == Py_None)
2191 self = NULL;
2192 return PyMethod_New(func, self, classObj);
2193}
2194
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002195static void
Fred Drake79912472000-07-09 04:06:11 +00002196instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002197{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002198 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002199 if (im->im_weakreflist != NULL)
2200 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002201 Py_DECREF(im->im_func);
2202 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002203 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002204 im->im_self = (PyObject *)free_list;
2205 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002206}
2207
Guido van Rossumebc8c511992-09-03 20:39:51 +00002208static int
Fred Drake79912472000-07-09 04:06:11 +00002209instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002210{
Guido van Rossume9df7271995-04-06 14:46:51 +00002211 if (a->im_self != b->im_self)
2212 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002213 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002214}
2215
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002216static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002217instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002218{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002219 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002220 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002221 PyObject *klass = a->im_class;
2222 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2223 char *sfuncname = "?", *sklassname = "?";
2224
2225 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002226 if (funcname == NULL) {
2227 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2228 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002229 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002230 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002231 else if (!PyString_Check(funcname)) {
2232 Py_DECREF(funcname);
2233 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002234 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002235 else
2236 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002237 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002238 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002239 else {
2240 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002241 if (klassname == NULL) {
2242 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2243 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002244 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002245 }
Guido van Rossum40667692001-08-17 13:59:27 +00002246 else if (!PyString_Check(klassname)) {
2247 Py_DECREF(klassname);
2248 klassname = NULL;
2249 }
2250 else
2251 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002252 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002253 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002254 result = PyString_FromFormat("<unbound method %s.%s>",
2255 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002256 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002257 /* XXX Shouldn't use repr() here! */
2258 PyObject *selfrepr = PyObject_Repr(self);
2259 if (selfrepr == NULL)
2260 goto fail;
2261 if (!PyString_Check(selfrepr)) {
2262 Py_DECREF(selfrepr);
2263 goto fail;
2264 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002265 result = PyString_FromFormat("<bound method %s.%s of %s>",
2266 sklassname, sfuncname,
2267 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002268 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002269 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002270 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002271 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002272 Py_XDECREF(klassname);
2273 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002274}
2275
Guido van Rossum9bfef441993-03-29 10:43:31 +00002276static long
Fred Drake79912472000-07-09 04:06:11 +00002277instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002278{
2279 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002280 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002281 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002282 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002283 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002284 if (x == -1)
2285 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002286 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002287 if (y == -1)
2288 return -1;
2289 return x ^ y;
2290}
2291
Jeremy Hylton8caad492000-06-23 14:18:11 +00002292static int
2293instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2294{
2295 int err;
2296 if (im->im_func) {
2297 err = visit(im->im_func, arg);
2298 if (err)
2299 return err;
2300 }
2301 if (im->im_self) {
2302 err = visit(im->im_self, arg);
2303 if (err)
2304 return err;
2305 }
2306 if (im->im_class) {
2307 err = visit(im->im_class, arg);
2308 if (err)
2309 return err;
2310 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002311 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002312}
2313
Guido van Rossuma15dece2001-08-24 18:48:27 +00002314static char *
2315getclassname(PyObject *class)
2316{
2317 PyObject *name;
2318
2319 if (class == NULL)
2320 name = NULL;
2321 else
2322 name = PyObject_GetAttrString(class, "__name__");
2323 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002324 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002325 PyErr_Clear();
2326 return "?";
2327 }
2328 if (!PyString_Check(name)) {
2329 Py_DECREF(name);
2330 return "?";
2331 }
2332 PyString_InternInPlace(&name);
2333 Py_DECREF(name);
2334 return PyString_AS_STRING(name);
2335}
2336
2337static char *
2338getinstclassname(PyObject *inst)
2339{
2340 PyObject *class;
2341 char *name;
2342
2343 if (inst == NULL)
2344 return "nothing";
2345
2346 class = PyObject_GetAttrString(inst, "__class__");
2347 if (class == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002348 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002349 PyErr_Clear();
2350 class = (PyObject *)(inst->ob_type);
2351 Py_INCREF(class);
2352 }
2353 name = getclassname(class);
2354 Py_XDECREF(class);
2355 return name;
2356}
2357
Tim Peters6d6c1a32001-08-02 04:15:00 +00002358static PyObject *
2359instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2360{
2361 PyObject *self = PyMethod_GET_SELF(func);
2362 PyObject *class = PyMethod_GET_CLASS(func);
2363 PyObject *result;
2364
2365 func = PyMethod_GET_FUNCTION(func);
2366 if (self == NULL) {
2367 /* Unbound methods must be called with an instance of
2368 the class (or a derived class) as first argument */
2369 int ok;
2370 if (PyTuple_Size(arg) >= 1)
2371 self = PyTuple_GET_ITEM(arg, 0);
2372 if (self == NULL)
2373 ok = 0;
2374 else {
2375 ok = PyObject_IsInstance(self, class);
2376 if (ok < 0)
2377 return NULL;
2378 }
2379 if (!ok) {
2380 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002381 "unbound method %s%s must be called with "
2382 "%s instance as first argument "
2383 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002384 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002385 PyEval_GetFuncDesc(func),
2386 getclassname(class),
2387 getinstclassname(self),
2388 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002389 return NULL;
2390 }
2391 Py_INCREF(arg);
2392 }
2393 else {
2394 int argcount = PyTuple_Size(arg);
2395 PyObject *newarg = PyTuple_New(argcount + 1);
2396 int i;
2397 if (newarg == NULL)
2398 return NULL;
2399 Py_INCREF(self);
2400 PyTuple_SET_ITEM(newarg, 0, self);
2401 for (i = 0; i < argcount; i++) {
2402 PyObject *v = PyTuple_GET_ITEM(arg, i);
2403 Py_XINCREF(v);
2404 PyTuple_SET_ITEM(newarg, i+1, v);
2405 }
2406 arg = newarg;
2407 }
2408 result = PyObject_Call((PyObject *)func, arg, kw);
2409 Py_DECREF(arg);
2410 return result;
2411}
2412
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002413static PyObject *
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002414instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *class)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002415{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002416 /* Don't rebind an already bound method, or an unbound method
2417 of a class that's not a base class of class */
2418 if (PyMethod_GET_SELF(meth) != NULL ||
2419 (PyMethod_GET_CLASS(meth) != NULL &&
2420 !PyObject_IsSubclass(class, PyMethod_GET_CLASS(meth)))) {
Guido van Rossum501c7c72001-08-16 20:41:56 +00002421 Py_INCREF(meth);
2422 return meth;
2423 }
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002424 if (obj == Py_None)
2425 obj = NULL;
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002426 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002427}
2428
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002429PyTypeObject PyMethod_Type = {
2430 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002431 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002432 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002433 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002434 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002435 (destructor)instancemethod_dealloc, /* tp_dealloc */
2436 0, /* tp_print */
2437 0, /* tp_getattr */
2438 0, /* tp_setattr */
2439 (cmpfunc)instancemethod_compare, /* tp_compare */
2440 (reprfunc)instancemethod_repr, /* tp_repr */
2441 0, /* tp_as_number */
2442 0, /* tp_as_sequence */
2443 0, /* tp_as_mapping */
2444 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002445 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002446 0, /* tp_str */
2447 (getattrofunc)instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002448 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002449 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002450 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002451 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002452 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002453 0, /* tp_clear */
2454 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002455 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2456 0, /* tp_iter */
2457 0, /* tp_iternext */
2458 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002459 instancemethod_memberlist, /* tp_members */
Guido van Rossum56ff3872001-10-22 02:00:09 +00002460 0, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002461 0, /* tp_base */
2462 0, /* tp_dict */
2463 instancemethod_descr_get, /* tp_descr_get */
2464 0, /* tp_descr_set */
2465 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002466 0, /* tp_init */
2467 0, /* tp_alloc */
2468 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002469};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002470
2471/* Clear out the free list */
2472
2473void
Fred Drake79912472000-07-09 04:06:11 +00002474PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002475{
2476 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002477 PyMethodObject *im = free_list;
2478 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002479 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002480 }
2481}