blob: 979c967a06f72915cf37a1e47202ff558a3b5819 [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 *
159new_class(PyObject* unused, PyObject* args)
160{
161 PyObject *name;
162 PyObject *classes;
163 PyObject *dict;
164
165 if (!PyArg_ParseTuple(args, "SO!O!:class",
166 &name,
167 &PyTuple_Type, &classes,
168 &PyDict_Type, &dict))
169 return NULL;
170 return PyClass_New(classes, dict, name);
171}
172
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173static PyObject *
174class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
175{
176 PyObject *name, *bases, *dict;
177 static char *kwlist[] = {"name", "bases", "dict", 0};
178
179 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
180 &name, &bases, &dict))
181 return NULL;
182 return PyClass_New(bases, dict, name);
183}
184
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185/* Class methods */
186
187static void
Fred Drake79912472000-07-09 04:06:11 +0000188class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000190 _PyObject_GC_UNTRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 Py_DECREF(op->cl_bases);
192 Py_DECREF(op->cl_dict);
193 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000194 Py_XDECREF(op->cl_getattr);
195 Py_XDECREF(op->cl_setattr);
196 Py_XDECREF(op->cl_delattr);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000197 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198}
199
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000201class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000202{
203 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000205 if (value != NULL) {
206 *pclass = cp;
207 return value;
208 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000210 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000211 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 PyObject *v = class_lookup(
213 (PyClassObject *)
214 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000215 if (v != NULL)
216 return v;
217 }
218 return NULL;
219}
220
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000222class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 register PyObject *v;
225 register char *sname = PyString_AsString(name);
226 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000227 descrgetfunc f;
228
Guido van Rossum2878a691996-08-09 20:53:24 +0000229 if (sname[0] == '_' && sname[1] == '_') {
230 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 if (PyEval_GetRestricted()) {
232 PyErr_SetString(PyExc_RuntimeError,
233 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000234 return NULL;
235 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000237 return op->cl_dict;
238 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000239 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000241 return op->cl_bases;
242 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000243 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000244 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000246 else
247 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000249 return v;
250 }
Guido van Rossum94308391991-10-20 20:11:48 +0000251 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000252 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000253 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000254 PyErr_Format(PyExc_AttributeError,
255 "class %.50s has no attribute '%.400s'",
256 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000257 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258 }
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000259 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000260 if (f == NULL)
261 Py_INCREF(v);
262 else
263 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000264 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265}
266
Guido van Rossuma63eff61998-05-29 21:37:21 +0000267static void
Fred Drake79912472000-07-09 04:06:11 +0000268set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000269{
270 PyObject *temp = *slot;
271 Py_XINCREF(v);
272 *slot = v;
273 Py_XDECREF(temp);
274}
275
Guido van Rossum7ba30431998-07-08 13:34:48 +0000276static void
Fred Drake79912472000-07-09 04:06:11 +0000277set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000278{
279 PyClassObject *dummy;
280
281 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
282 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
283 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
284}
285
Guido van Rossuma63eff61998-05-29 21:37:21 +0000286static char *
Fred Drake79912472000-07-09 04:06:11 +0000287set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000288{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000289 if (v == NULL || !PyDict_Check(v))
290 return "__dict__ must be a dictionary object";
291 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000292 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000293 return "";
294}
295
296static char *
Fred Drake79912472000-07-09 04:06:11 +0000297set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000298{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000299 int i, n;
300
301 if (v == NULL || !PyTuple_Check(v))
302 return "__bases__ must be a tuple object";
303 n = PyTuple_Size(v);
304 for (i = 0; i < n; i++) {
305 PyObject *x = PyTuple_GET_ITEM(v, i);
306 if (!PyClass_Check(x))
307 return "__bases__ items must be classes";
308 if (PyClass_IsSubclass(x, (PyObject *)c))
309 return "a __bases__ item causes an inheritance cycle";
310 }
311 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000312 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000313 return "";
314}
315
316static char *
Fred Drake79912472000-07-09 04:06:11 +0000317set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000318{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000319 if (v == NULL || !PyString_Check(v))
320 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000321 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000322 return "__name__ must not contain null bytes";
323 set_slot(&c->cl_name, v);
324 return "";
325}
326
Guido van Rossum94308391991-10-20 20:11:48 +0000327static int
Fred Drake79912472000-07-09 04:06:11 +0000328class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000329{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000330 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331 if (PyEval_GetRestricted()) {
332 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000333 "classes are read-only in restricted mode");
334 return -1;
335 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000336 sname = PyString_AsString(name);
337 if (sname[0] == '_' && sname[1] == '_') {
338 int n = PyString_Size(name);
339 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000340 char *err = NULL;
341 if (strcmp(sname, "__dict__") == 0)
342 err = set_dict(op, v);
343 else if (strcmp(sname, "__bases__") == 0)
344 err = set_bases(op, v);
345 else if (strcmp(sname, "__name__") == 0)
346 err = set_name(op, v);
347 else if (strcmp(sname, "__getattr__") == 0)
348 set_slot(&op->cl_getattr, v);
349 else if (strcmp(sname, "__setattr__") == 0)
350 set_slot(&op->cl_setattr, v);
351 else if (strcmp(sname, "__delattr__") == 0)
352 set_slot(&op->cl_delattr, v);
353 /* For the last three, we fall through to update the
354 dictionary as well. */
355 if (err != NULL) {
356 if (*err == '\0')
357 return 0;
358 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000359 return -1;
360 }
361 }
362 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000363 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000365 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000366 PyErr_Format(PyExc_AttributeError,
367 "class %.50s has no attribute '%.400s'",
368 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000369 return rv;
370 }
Guido van Rossum94308391991-10-20 20:11:48 +0000371 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000376class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000377{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000378 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000379 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000381 name = "?";
382 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000384 if (mod == NULL || !PyString_Check(mod))
Martin v. Löwiscf95f9c2001-09-18 20:23:28 +0000385 return PyString_FromFormat("<class ?.%s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000386 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000387 return PyString_FromFormat("<class %s.%s at %p>",
388 PyString_AsString(mod),
389 name, op);
Guido van Rossum25831651993-05-19 14:50:45 +0000390}
391
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000392static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000393class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000394{
395 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
396 PyObject *name = op->cl_name;
397 PyObject *res;
398 int m, n;
399
400 if (name == NULL || !PyString_Check(name))
401 return class_repr(op);
402 if (mod == NULL || !PyString_Check(mod)) {
403 Py_INCREF(name);
404 return name;
405 }
406 m = PyString_Size(mod);
407 n = PyString_Size(name);
408 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
409 if (res != NULL) {
410 char *s = PyString_AsString(res);
411 memcpy(s, PyString_AsString(mod), m);
412 s += m;
413 *s++ = '.';
414 memcpy(s, PyString_AsString(name), n);
415 }
416 return res;
417}
418
Jeremy Hylton8caad492000-06-23 14:18:11 +0000419static int
420class_traverse(PyClassObject *o, visitproc visit, void *arg)
421{
422 int err;
423 if (o->cl_bases) {
424 err = visit(o->cl_bases, arg);
425 if (err)
426 return err;
427 }
428 if (o->cl_dict) {
429 err = visit(o->cl_dict, arg);
430 if (err)
431 return err;
432 }
433 if (o->cl_name) {
434 err = visit(o->cl_name, arg);
435 if (err)
436 return err;
437 }
438 if (o->cl_getattr) {
439 err = visit(o->cl_getattr, arg);
440 if (err)
441 return err;
442 }
443 if (o->cl_setattr) {
444 err = visit(o->cl_setattr, arg);
445 if (err)
446 return err;
447 }
448 if (o->cl_delattr) {
449 err = visit(o->cl_delattr, arg);
450 if (err)
451 return err;
452 }
453 return 0;
454}
455
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456PyTypeObject PyClass_Type = {
457 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000459 "classobj",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000460 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000462 (destructor)class_dealloc, /* tp_dealloc */
463 0, /* tp_print */
464 0, /* tp_getattr */
465 0, /* tp_setattr */
466 0, /* tp_compare */
467 (reprfunc)class_repr, /* tp_repr */
468 0, /* tp_as_number */
469 0, /* tp_as_sequence */
470 0, /* tp_as_mapping */
471 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000473 (reprfunc)class_str, /* tp_str */
474 (getattrofunc)class_getattr, /* tp_getattro */
475 (setattrofunc)class_setattr, /* tp_setattro */
476 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000477 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000478 class_doc, /* tp_doc */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000479 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000480 0, /* tp_clear */
481 0, /* tp_richcompare */
482 0, /* tp_weaklistoffset */
483 0, /* tp_iter */
484 0, /* tp_iternext */
485 0, /* tp_methods */
486 0, /* tp_members */
487 0, /* tp_getset */
488 0, /* tp_base */
489 0, /* tp_dict */
490 0, /* tp_descr_get */
491 0, /* tp_descr_set */
492 0, /* tp_dictoffset */
493 0, /* tp_init */
494 0, /* tp_alloc */
495 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000496};
497
Guido van Rossum81daa321993-05-20 14:24:46 +0000498int
Fred Drake79912472000-07-09 04:06:11 +0000499PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000500{
501 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000503 if (class == base)
504 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000506 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 cp = (PyClassObject *)class;
508 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000509 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000511 return 1;
512 }
513 return 0;
514}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515
Guido van Rossum81daa321993-05-20 14:24:46 +0000516
517/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000520PyInstance_NewRaw(PyObject *klass, PyObject *dict)
521{
522 PyInstanceObject *inst;
523
524 if (!PyClass_Check(klass)) {
525 PyErr_BadInternalCall();
526 return NULL;
527 }
528 if (dict == NULL) {
529 dict = PyDict_New();
530 if (dict == NULL)
531 return NULL;
532 }
533 else {
534 if (!PyDict_Check(dict)) {
535 PyErr_BadInternalCall();
536 return NULL;
537 }
538 Py_INCREF(dict);
539 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000540 inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000541 if (inst == NULL) {
542 Py_DECREF(dict);
543 return NULL;
544 }
Fred Drake4e262a92001-03-22 18:26:47 +0000545 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000546 Py_INCREF(klass);
547 inst->in_class = (PyClassObject *)klass;
548 inst->in_dict = dict;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000549 _PyObject_GC_TRACK(inst);
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000550 return (PyObject *)inst;
551}
552
553PyObject *
554PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 register PyInstanceObject *inst;
557 PyObject *init;
558 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000559
560 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000561 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000563 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000564 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000565 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000566 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 if ((arg != NULL && (!PyTuple_Check(arg) ||
568 PyTuple_Size(arg) != 0))
569 || (kw != NULL && (!PyDict_Check(kw) ||
570 PyDict_Size(kw) != 0))) {
571 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000572 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000574 inst = NULL;
575 }
576 }
577 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
579 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000580 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000582 inst = NULL;
583 }
584 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 if (res != Py_None) {
586 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000587 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000589 inst = NULL;
590 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000592 }
593 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595}
596
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000597/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000598
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000599PyDoc_STRVAR(instance_doc,
600"instance(class[, dict])\n\
601\n\
602Create an instance without calling its __init__() method.\n\
603The class must be a classic class.\n\
604If present, dict must be a dictionary or None.");
605
606static PyObject *
607instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
608{
609 PyObject *klass;
610 PyObject *dict = Py_None;
611
612 if (!PyArg_ParseTuple(args, "O!|O:instance",
613 &PyClass_Type, &klass, &dict))
614 return NULL;
615
616 if (dict == Py_None)
617 dict = NULL;
618 else if (!PyDict_Check(dict)) {
619 PyErr_SetString(PyExc_TypeError,
620 "instance() second arg must be dictionary or None");
621 return NULL;
622 }
623 return PyInstance_NewRaw(klass, dict);
624}
625
626
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627static void
Fred Drake79912472000-07-09 04:06:11 +0000628instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyObject *error_type, *error_value, *error_traceback;
631 PyObject *del;
632 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000633#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000634 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000635#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000636 _PyObject_GC_UNTRACK(inst);
Fred Drakec916f5a2001-10-26 17:56:51 +0000637 if (inst->in_weakreflist != NULL)
638 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000639
Tim Peters6b184912000-09-17 14:40:17 +0000640 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000641#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000642#ifndef Py_REF_DEBUG
643# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
644#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000645 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000647 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000648#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000649 /* compensate for boost in _Py_NewReference; note that
650 * _Py_RefTotal was also boosted; we'll knock that down later.
651 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000652 inst->ob_type->tp_allocs--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000653#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000654#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000655 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000657#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000658
659 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000661 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000662 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000663 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000664 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000666 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000667 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000668 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 Py_DECREF(res);
670 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000671 }
Tim Peters6b184912000-09-17 14:40:17 +0000672 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000674 /* Undo the temporary resurrection; can't use DECREF here, it would
675 * cause a recursive call.
676 */
677#ifdef Py_REF_DEBUG
678 /* _Py_RefTotal was boosted either by _Py_NewReference or
679 * Py_INCREF above.
680 */
681 _Py_RefTotal--;
682#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000683 if (--inst->ob_refcnt > 0) {
684#ifdef COUNT_ALLOCS
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685 inst->ob_type->tp_frees--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000686#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000687 _PyObject_GC_TRACK(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000688 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000689 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000690#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000691 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000692#ifdef COUNT_ALLOCS
693 /* compensate for increment in _Py_ForgetReference */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000694 inst->ob_type->tp_frees--;
Tim Peters6b184912000-09-17 14:40:17 +0000695#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000696#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000697 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000698#endif
Tim Peters6b184912000-09-17 14:40:17 +0000699#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 Py_DECREF(inst->in_class);
701 Py_XDECREF(inst->in_dict);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000702 PyObject_GC_Del(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000703}
704
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000706instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000707{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 register PyObject *v;
709 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000710 if (sname[0] == '_' && sname[1] == '_') {
711 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 if (PyEval_GetRestricted()) {
713 PyErr_SetString(PyExc_RuntimeError,
714 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000715 return NULL;
716 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000718 return inst->in_dict;
719 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000720 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 Py_INCREF(inst->in_class);
722 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000723 }
Guido van Rossum94308391991-10-20 20:11:48 +0000724 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000725 v = instance_getattr2(inst, name);
726 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000727 PyErr_Format(PyExc_AttributeError,
728 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000729 PyString_AS_STRING(inst->in_class->cl_name), sname);
730 }
731 return v;
732}
733
734static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000735instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000736{
737 register PyObject *v;
738 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000739 descrgetfunc f;
740
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000742 if (v != NULL) {
743 Py_INCREF(v);
744 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000745 }
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000746 v = class_lookup(inst->in_class, name, &class);
747 if (v != NULL) {
748 Py_INCREF(v);
Guido van Rossum915f0eb2001-10-17 20:26:38 +0000749 f = TP_DESCR_GET(v->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000750 if (f != NULL) {
751 PyObject *w = f(v, (PyObject *)inst,
752 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000754 v = w;
755 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000756 }
757 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758}
759
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000761instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000762{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000764 res = instance_getattr1(inst, name);
765 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 PyObject *args;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000767 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
768 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 PyErr_Clear();
770 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000771 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000772 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 res = PyEval_CallObject(func, args);
774 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000775 }
776 return res;
777}
778
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000779static int
Fred Drake79912472000-07-09 04:06:11 +0000780instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000781{
Guido van Rossum94472a01992-09-04 09:45:18 +0000782 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000784 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000785 PyErr_Format(PyExc_AttributeError,
786 "%.50s instance has no attribute '%.400s'",
787 PyString_AS_STRING(inst->in_class->cl_name),
788 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000789 return rv;
790 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000791 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000793}
794
Guido van Rossume7737541994-09-05 07:31:41 +0000795static int
Fred Drake79912472000-07-09 04:06:11 +0000796instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000797{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000798 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000800 if (sname[0] == '_' && sname[1] == '_') {
801 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000802 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000803 if (strcmp(sname, "__dict__") == 0) {
804 if (PyEval_GetRestricted()) {
805 PyErr_SetString(PyExc_RuntimeError,
806 "__dict__ not accessible in restricted mode");
807 return -1;
808 }
809 if (v == NULL || !PyDict_Check(v)) {
810 PyErr_SetString(PyExc_TypeError,
811 "__dict__ must be set to a dictionary");
812 return -1;
813 }
814 tmp = inst->in_dict;
815 Py_INCREF(v);
816 inst->in_dict = v;
817 Py_DECREF(tmp);
818 return 0;
819 }
820 if (strcmp(sname, "__class__") == 0) {
821 if (PyEval_GetRestricted()) {
822 PyErr_SetString(PyExc_RuntimeError,
823 "__class__ not accessible in restricted mode");
824 return -1;
825 }
826 if (v == NULL || !PyClass_Check(v)) {
827 PyErr_SetString(PyExc_TypeError,
828 "__class__ must be set to a class");
829 return -1;
830 }
831 tmp = (PyObject *)(inst->in_class);
832 Py_INCREF(v);
833 inst->in_class = (PyClassObject *)v;
834 Py_DECREF(tmp);
835 return 0;
836 }
Guido van Rossume7737541994-09-05 07:31:41 +0000837 }
Guido van Rossume7737541994-09-05 07:31:41 +0000838 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000839 if (v == NULL)
840 func = inst->in_class->cl_delattr;
841 else
842 func = inst->in_class->cl_setattr;
843 if (func == NULL)
844 return instance_setattr1(inst, name, v);
845 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000847 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000849 if (args == NULL)
850 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 res = PyEval_CallObject(func, args);
852 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000853 if (res == NULL)
854 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000856 return 0;
857}
858
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000860instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 PyObject *func;
863 PyObject *res;
864 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865
Guido van Rossum2878a691996-08-09 20:53:24 +0000866 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000867 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000868 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000869 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000870 PyObject *classname, *mod;
Guido van Rossum25831651993-05-19 14:50:45 +0000871 char *cname;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000872 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
873 return NULL;
874 PyErr_Clear();
875 classname = inst->in_class->cl_name;
876 mod = PyDict_GetItemString(inst->in_class->cl_dict,
877 "__module__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 if (classname != NULL && PyString_Check(classname))
879 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000880 else
881 cname = "?";
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000882 if (mod == NULL || !PyString_Check(mod))
Barry Warsaw7ce36942001-08-24 18:34:26 +0000883 return PyString_FromFormat("<?.%s instance at %p>",
884 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000885 else
Barry Warsaw7ce36942001-08-24 18:34:26 +0000886 return PyString_FromFormat("<%s.%s instance at %p>",
887 PyString_AsString(mod),
888 cname, inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000889 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 res = PyEval_CallObject(func, (PyObject *)NULL);
891 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000892 return res;
893}
894
Guido van Rossum82c690f2001-04-30 14:39:18 +0000895static PyObject *
896instance_str(PyInstanceObject *inst)
897{
898 PyObject *func;
899 PyObject *res;
900 static PyObject *strstr;
901
902 if (strstr == NULL)
903 strstr = PyString_InternFromString("__str__");
904 func = instance_getattr(inst, strstr);
905 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000906 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
907 return NULL;
Guido van Rossum82c690f2001-04-30 14:39:18 +0000908 PyErr_Clear();
909 return instance_repr(inst);
910 }
911 res = PyEval_CallObject(func, (PyObject *)NULL);
912 Py_DECREF(func);
913 return res;
914}
915
Guido van Rossum9bfef441993-03-29 10:43:31 +0000916static long
Fred Drake79912472000-07-09 04:06:11 +0000917instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000918{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 PyObject *func;
920 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000921 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000922 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000923
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000925 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000926 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000927 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000928 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
929 return -1;
930 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000931 /* If there is no __eq__ and no __cmp__ method, we hash on the
932 address. If an __eq__ or __cmp__ method exists, there must
933 be a __hash__. */
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000934 if (eqstr == NULL)
935 eqstr = PyString_InternFromString("__eq__");
936 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000937 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000938 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
939 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000941 if (cmpstr == NULL)
942 cmpstr = PyString_InternFromString("__cmp__");
943 func = instance_getattr(inst, cmpstr);
944 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +0000945 if (!PyErr_ExceptionMatches(
946 PyExc_AttributeError))
947 return -1;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000948 PyErr_Clear();
949 return _Py_HashPointer(inst);
950 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000951 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000953 return -1;
954 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 res = PyEval_CallObject(func, (PyObject *)NULL);
956 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000957 if (res == NULL)
958 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 if (PyInt_Check(res)) {
960 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000961 if (outcome == -1)
962 outcome = -2;
963 }
964 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 PyErr_SetString(PyExc_TypeError,
966 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000967 outcome = -1;
968 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000970 return outcome;
971}
972
Jeremy Hylton8caad492000-06-23 14:18:11 +0000973static int
974instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
975{
976 int err;
977 if (o->in_class) {
978 err = visit((PyObject *)(o->in_class), arg);
979 if (err)
980 return err;
981 }
982 if (o->in_dict) {
983 err = visit(o->in_dict, arg);
984 if (err)
985 return err;
986 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000987 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000988}
989
Guido van Rossum213c7a62001-04-23 14:08:49 +0000990static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
991static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000992
Guido van Rossum9bfef441993-03-29 10:43:31 +0000993static int
Fred Drake79912472000-07-09 04:06:11 +0000994instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 PyObject *func;
997 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998 int outcome;
999
Guido van Rossum2878a691996-08-09 20:53:24 +00001000 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001001 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001002 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003 if (func == NULL)
1004 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 res = PyEval_CallObject(func, (PyObject *)NULL);
1006 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001007 if (res == NULL)
1008 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 if (PyInt_Check(res)) {
1010 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001011 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 PyErr_SetString(PyExc_ValueError,
1013 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001014 }
1015 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 PyErr_SetString(PyExc_TypeError,
1017 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001018 outcome = -1;
1019 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021 return outcome;
1022}
1023
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001025instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001026{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 PyObject *func;
1028 PyObject *arg;
1029 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030
Guido van Rossum2878a691996-08-09 20:53:24 +00001031 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001032 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001033 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 if (func == NULL)
1035 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001037 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001039 return NULL;
1040 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 res = PyEval_CallObject(func, arg);
1042 Py_DECREF(func);
1043 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044 return res;
1045}
1046
Guido van Rossum9bfef441993-03-29 10:43:31 +00001047static int
Fred Drake79912472000-07-09 04:06:11 +00001048instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001049{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 PyObject *func;
1051 PyObject *arg;
1052 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053
Guido van Rossum2878a691996-08-09 20:53:24 +00001054 if (value == NULL) {
1055 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001056 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001057 func = instance_getattr(inst, delitemstr);
1058 }
1059 else {
1060 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001061 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001062 func = instance_getattr(inst, setitemstr);
1063 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064 if (func == NULL)
1065 return -1;
1066 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001072 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 res = PyEval_CallObject(func, arg);
1075 Py_DECREF(func);
1076 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001077 if (res == NULL)
1078 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080 return 0;
1081}
1082
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001084 (inquiry)instance_length, /* mp_length */
1085 (binaryfunc)instance_subscript, /* mp_subscript */
1086 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001087};
1088
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001090instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001091{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093
Guido van Rossum2878a691996-08-09 20:53:24 +00001094 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001095 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001096 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001097 if (func == NULL)
1098 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001100 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001102 return NULL;
1103 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 res = PyEval_CallObject(func, arg);
1105 Py_DECREF(func);
1106 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001107 return res;
1108}
1109
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +00001111sliceobj_from_intint(int i, int j)
1112{
1113 PyObject *start, *end, *res;
1114
1115 start = PyInt_FromLong((long)i);
1116 if (!start)
1117 return NULL;
1118
1119 end = PyInt_FromLong((long)j);
1120 if (!end) {
1121 Py_DECREF(start);
1122 return NULL;
1123 }
1124 res = PySlice_New(start, end, NULL);
1125 Py_DECREF(start);
1126 Py_DECREF(end);
1127 return res;
1128}
1129
1130
1131static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001132instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134 PyObject *func, *arg, *res;
1135 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136
Guido van Rossum2878a691996-08-09 20:53:24 +00001137 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001138 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001139 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001140
1141 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001142 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1143 return NULL;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001144 PyErr_Clear();
1145
1146 if (getitemstr == NULL)
1147 getitemstr = PyString_InternFromString("__getitem__");
1148 func = instance_getattr(inst, getitemstr);
1149 if (func == NULL)
1150 return NULL;
1151 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1152 } else
1153 arg = Py_BuildValue("(ii)", i, j);
1154
Guido van Rossum04691fc1992-08-12 15:35:34 +00001155 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001156 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001157 return NULL;
1158 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001159 res = PyEval_CallObject(func, arg);
1160 Py_DECREF(func);
1161 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001162 return res;
1163}
1164
1165static int
Fred Drake79912472000-07-09 04:06:11 +00001166instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001167{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001169
Guido van Rossum2878a691996-08-09 20:53:24 +00001170 if (item == NULL) {
1171 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001172 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001173 func = instance_getattr(inst, delitemstr);
1174 }
1175 else {
1176 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001177 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001178 func = instance_getattr(inst, setitemstr);
1179 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001180 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001181 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001182 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001184 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001188 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001189 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 res = PyEval_CallObject(func, arg);
1191 Py_DECREF(func);
1192 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001193 if (res == NULL)
1194 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001196 return 0;
1197}
1198
1199static int
Fred Drake79912472000-07-09 04:06:11 +00001200instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001201{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 PyObject *func, *arg, *res;
1203 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001204
Guido van Rossum2878a691996-08-09 20:53:24 +00001205 if (value == NULL) {
1206 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 delslicestr =
1208 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001209 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001210 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001211 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1212 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001213 PyErr_Clear();
1214 if (delitemstr == NULL)
1215 delitemstr =
1216 PyString_InternFromString("__delitem__");
1217 func = instance_getattr(inst, delitemstr);
1218 if (func == NULL)
1219 return -1;
1220
1221 arg = Py_BuildValue("(N)",
1222 sliceobj_from_intint(i, j));
1223 } else
1224 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001225 }
1226 else {
1227 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 setslicestr =
1229 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001230 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001231 if (func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001232 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1233 return -1;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001234 PyErr_Clear();
1235 if (setitemstr == NULL)
1236 setitemstr =
1237 PyString_InternFromString("__setitem__");
1238 func = instance_getattr(inst, setitemstr);
1239 if (func == NULL)
1240 return -1;
1241
1242 arg = Py_BuildValue("(NO)",
1243 sliceobj_from_intint(i, j), value);
1244 } else
1245 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001246 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001247 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001249 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001250 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 res = PyEval_CallObject(func, arg);
1252 Py_DECREF(func);
1253 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001254 if (res == NULL)
1255 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001257 return 0;
1258}
1259
Tim Peterscb8d3682001-05-05 21:05:01 +00001260static int
1261instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001262{
1263 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001264 PyObject *func;
1265
1266 /* Try __contains__ first.
1267 * If that can't be done, try iterator-based searching.
1268 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001269
1270 if(__contains__ == NULL) {
1271 __contains__ = PyString_InternFromString("__contains__");
1272 if(__contains__ == NULL)
1273 return -1;
1274 }
1275 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001276 if (func) {
1277 PyObject *res;
1278 int ret;
1279 PyObject *arg = Py_BuildValue("(O)", member);
1280 if(arg == NULL) {
1281 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001282 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001283 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001284 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001285 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001286 Py_DECREF(arg);
1287 if(res == NULL)
1288 return -1;
1289 ret = PyObject_IsTrue(res);
1290 Py_DECREF(res);
1291 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001292 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001293
1294 /* Couldn't find __contains__. */
1295 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1296 /* Assume the failure was simply due to that there is no
1297 * __contains__ attribute, and try iterating instead.
1298 */
1299 PyErr_Clear();
Tim Peters16a77ad2001-09-08 04:00:12 +00001300 return _PySequence_IterSearch((PyObject *)inst, member,
1301 PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001302 }
1303 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001304 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001305}
1306
Fred Drake79912472000-07-09 04:06:11 +00001307static PySequenceMethods
1308instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001309 (inquiry)instance_length, /* sq_length */
1310 0, /* sq_concat */
1311 0, /* sq_repeat */
1312 (intargfunc)instance_item, /* sq_item */
1313 (intintargfunc)instance_slice, /* sq_slice */
1314 (intobjargproc)instance_ass_item, /* sq_ass_item */
1315 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1316 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001317};
1318
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001320generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001321{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001323
1324 if ((func = instance_getattr(self, methodname)) == NULL)
1325 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 res = PyEval_CallObject(func, (PyObject *)NULL);
1327 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001328 return res;
1329}
1330
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001331static PyObject *
1332generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001333{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001334 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001336 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001337 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001338 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001339 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001341 Py_INCREF(Py_NotImplemented);
1342 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001343 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001345 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001347 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001348 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001349 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 Py_DECREF(args);
1351 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001352 return result;
1353}
1354
1355
1356static PyObject *coerce_obj;
1357
1358/* Try one half of a binary operator involving a class instance. */
1359static PyObject *
1360half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1361 int swapped)
1362{
1363 PyObject *args;
1364 PyObject *coercefunc;
1365 PyObject *coerced = NULL;
1366 PyObject *v1;
1367 PyObject *result;
1368
1369 if (!PyInstance_Check(v)) {
1370 Py_INCREF(Py_NotImplemented);
1371 return Py_NotImplemented;
1372 }
1373
1374 if (coerce_obj == NULL) {
1375 coerce_obj = PyString_InternFromString("__coerce__");
1376 if (coerce_obj == NULL)
1377 return NULL;
1378 }
1379 coercefunc = PyObject_GetAttr(v, coerce_obj);
1380 if (coercefunc == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001381 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1382 return NULL;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001383 PyErr_Clear();
1384 return generic_binary_op(v, w, opname);
1385 }
1386
1387 args = Py_BuildValue("(O)", w);
1388 if (args == NULL) {
1389 return NULL;
1390 }
1391 coerced = PyEval_CallObject(coercefunc, args);
1392 Py_DECREF(args);
1393 Py_DECREF(coercefunc);
1394 if (coerced == NULL) {
1395 return NULL;
1396 }
1397 if (coerced == Py_None || coerced == Py_NotImplemented) {
1398 Py_DECREF(coerced);
1399 return generic_binary_op(v, w, opname);
1400 }
1401 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1402 Py_DECREF(coerced);
1403 PyErr_SetString(PyExc_TypeError,
1404 "coercion should return None or 2-tuple");
1405 return NULL;
1406 }
1407 v1 = PyTuple_GetItem(coerced, 0);
1408 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001409 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001410 /* prevent recursion if __coerce__ returns self as the first
1411 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001412 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001413 } else {
1414 if (swapped)
1415 result = (thisfunc)(w, v1);
1416 else
1417 result = (thisfunc)(v1, w);
1418 }
1419 Py_DECREF(coerced);
1420 return result;
1421}
1422
1423/* Implement a binary operator involving at least one class instance. */
1424static PyObject *
1425do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1426 binaryfunc thisfunc)
1427{
1428 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1429 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001430 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001431 result = half_binop(w, v, ropname, thisfunc, 1);
1432 }
1433 return result;
1434}
1435
1436static PyObject *
1437do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1438 char *ropname, binaryfunc thisfunc)
1439{
1440 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1441 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001442 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001443 result = do_binop(v, w, opname, ropname, thisfunc);
1444 }
1445 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001446}
1447
Guido van Rossum879c5811995-01-10 15:24:06 +00001448static int
Fred Drake79912472000-07-09 04:06:11 +00001449instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001450{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 PyObject *v = *pv;
1452 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001453 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454 PyObject *args;
1455 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001456
Guido van Rossum2878a691996-08-09 20:53:24 +00001457 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001458 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001459 if (coerce_obj == NULL)
1460 return -1;
1461 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001462 coercefunc = PyObject_GetAttr(v, coerce_obj);
1463 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001464 /* No __coerce__ method */
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001465 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1466 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001468 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001469 }
1470 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001472 if (args == NULL) {
1473 return -1;
1474 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001475 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001477 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001478 if (coerced == NULL) {
1479 /* __coerce__ call raised an exception */
1480 return -1;
1481 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001482 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001483 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001485 return 1;
1486 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001488 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001489 Py_DECREF(coerced);
1490 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001491 "coercion should return None or 2-tuple");
1492 return -1;
1493 }
1494 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495 *pv = PyTuple_GetItem(coerced, 0);
1496 *pw = PyTuple_GetItem(coerced, 1);
1497 Py_INCREF(*pv);
1498 Py_INCREF(*pw);
1499 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001500 return 0;
1501}
1502
Guido van Rossum04691fc1992-08-12 15:35:34 +00001503#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001504static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001506 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001507 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001508}
1509
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001510#define BINARY(f, m, n) \
1511static PyObject *f(PyObject *v, PyObject *w) { \
1512 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1513}
1514
1515#define BINARY_INPLACE(f, m, n) \
1516static PyObject *f(PyObject *v, PyObject *w) { \
1517 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1518 "__r" m "__", n); \
1519}
1520
Guido van Rossum04691fc1992-08-12 15:35:34 +00001521UNARY(instance_neg, "__neg__")
1522UNARY(instance_pos, "__pos__")
1523UNARY(instance_abs, "__abs__")
1524
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001525BINARY(instance_or, "or", PyNumber_Or)
1526BINARY(instance_and, "and", PyNumber_And)
1527BINARY(instance_xor, "xor", PyNumber_Xor)
1528BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1529BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1530BINARY(instance_add, "add", PyNumber_Add)
1531BINARY(instance_sub, "sub", PyNumber_Subtract)
1532BINARY(instance_mul, "mul", PyNumber_Multiply)
1533BINARY(instance_div, "div", PyNumber_Divide)
1534BINARY(instance_mod, "mod", PyNumber_Remainder)
1535BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001536BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1537BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001538
1539BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1540BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1541BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1542BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1543BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1544BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1545BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1546BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1547BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1548BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001549BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1550BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001551
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001552/* Try a 3-way comparison, returning an int; v is an instance. Return:
1553 -2 for an exception;
1554 -1 if v < w;
1555 0 if v == w;
1556 1 if v > w;
1557 2 if this particular 3-way comparison is not implemented or undefined.
1558*/
1559static int
1560half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001561{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001562 static PyObject *cmp_obj;
1563 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001564 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001565 PyObject *result;
1566 long l;
1567
1568 assert(PyInstance_Check(v));
1569
1570 if (cmp_obj == NULL) {
1571 cmp_obj = PyString_InternFromString("__cmp__");
1572 if (cmp_obj == NULL)
1573 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001574 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001575
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001576 cmp_func = PyObject_GetAttr(v, cmp_obj);
1577 if (cmp_func == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001578 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1579 return -2;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001580 PyErr_Clear();
1581 return 2;
1582 }
1583
1584 args = Py_BuildValue("(O)", w);
1585 if (args == NULL)
1586 return -2;
1587
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001588 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001589 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001590 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001591
1592 if (result == NULL)
1593 return -2;
1594
1595 if (result == Py_NotImplemented) {
1596 Py_DECREF(result);
1597 return 2;
1598 }
1599
1600 l = PyInt_AsLong(result);
1601 Py_DECREF(result);
1602 if (l == -1 && PyErr_Occurred()) {
1603 PyErr_SetString(PyExc_TypeError,
1604 "comparison did not return an int");
1605 return -2;
1606 }
1607
1608 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001609}
1610
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001611/* Try a 3-way comparison, returning an int; either v or w is an instance.
1612 We first try a coercion. Return:
1613 -2 for an exception;
1614 -1 if v < w;
1615 0 if v == w;
1616 1 if v > w;
1617 2 if this particular 3-way comparison is not implemented or undefined.
1618 THIS IS ONLY CALLED FROM object.c!
1619*/
1620static int
1621instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001622{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001623 int c;
1624
1625 c = PyNumber_CoerceEx(&v, &w);
1626 if (c < 0)
1627 return -2;
1628 if (c == 0) {
1629 /* If neither is now an instance, use regular comparison */
1630 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1631 c = PyObject_Compare(v, w);
1632 Py_DECREF(v);
1633 Py_DECREF(w);
1634 if (PyErr_Occurred())
1635 return -2;
1636 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001637 }
1638 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001639 else {
1640 /* The coercion didn't do anything.
1641 Treat this the same as returning v and w unchanged. */
1642 Py_INCREF(v);
1643 Py_INCREF(w);
1644 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001645
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001646 if (PyInstance_Check(v)) {
1647 c = half_cmp(v, w);
1648 if (c <= 1) {
1649 Py_DECREF(v);
1650 Py_DECREF(w);
1651 return c;
1652 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001653 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001654 if (PyInstance_Check(w)) {
1655 c = half_cmp(w, v);
1656 if (c <= 1) {
1657 Py_DECREF(v);
1658 Py_DECREF(w);
1659 if (c >= -1)
1660 c = -c;
1661 return c;
1662 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001663 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001664 Py_DECREF(v);
1665 Py_DECREF(w);
1666 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001667}
1668
Guido van Rossum9bfef441993-03-29 10:43:31 +00001669static int
Fred Drake79912472000-07-09 04:06:11 +00001670instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001671{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001673 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001674 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001675
Guido van Rossum2878a691996-08-09 20:53:24 +00001676 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001677 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001678 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001679 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1680 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001681 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001682 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001683 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001684 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001685 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1686 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001687 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001688 /* Fall back to the default behavior:
1689 all instances are nonzero */
1690 return 1;
1691 }
1692 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001693 res = PyEval_CallObject(func, (PyObject *)NULL);
1694 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001695 if (res == NULL)
1696 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001697 if (!PyInt_Check(res)) {
1698 Py_DECREF(res);
1699 PyErr_SetString(PyExc_TypeError,
1700 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001701 return -1;
1702 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001703 outcome = PyInt_AsLong(res);
1704 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001705 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706 PyErr_SetString(PyExc_ValueError,
1707 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001708 return -1;
1709 }
1710 return outcome > 0;
1711}
1712
1713UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001714UNARY(instance_int, "__int__")
1715UNARY(instance_long, "__long__")
1716UNARY(instance_float, "__float__")
1717UNARY(instance_oct, "__oct__")
1718UNARY(instance_hex, "__hex__")
1719
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001720static PyObject *
1721bin_power(PyObject *v, PyObject *w)
1722{
1723 return PyNumber_Power(v, w, Py_None);
1724}
1725
Guido van Rossum03093a21994-09-28 15:51:32 +00001726/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001728instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001729{
1730 if (z == Py_None) {
1731 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001732 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001733 else {
1734 PyObject *func;
1735 PyObject *args;
1736 PyObject *result;
1737
1738 /* XXX Doesn't do coercions... */
1739 func = PyObject_GetAttrString(v, "__pow__");
1740 if (func == NULL)
1741 return NULL;
1742 args = Py_BuildValue("(OO)", w, z);
1743 if (args == NULL) {
1744 Py_DECREF(func);
1745 return NULL;
1746 }
1747 result = PyEval_CallObject(func, args);
1748 Py_DECREF(func);
1749 Py_DECREF(args);
1750 return result;
1751 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001752}
1753
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001754static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001755bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001756{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001757 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001758}
1759
1760
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001761static PyObject *
1762instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1763{
1764 if (z == Py_None) {
1765 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1766 "__rpow__", bin_inplace_power);
1767 }
1768 else {
1769 /* XXX Doesn't do coercions... */
1770 PyObject *func;
1771 PyObject *args;
1772 PyObject *result;
1773
1774 func = PyObject_GetAttrString(v, "__ipow__");
1775 if (func == NULL) {
1776 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1777 return NULL;
1778 PyErr_Clear();
1779 return instance_pow(v, w, z);
1780 }
1781 args = Py_BuildValue("(OO)", w, z);
1782 if (args == NULL) {
1783 Py_DECREF(func);
1784 return NULL;
1785 }
1786 result = PyEval_CallObject(func, args);
1787 Py_DECREF(func);
1788 Py_DECREF(args);
1789 return result;
1790 }
1791}
1792
1793
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001794/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001795#define NAME_OPS 6
1796static PyObject **name_op = NULL;
1797
1798static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001799init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001800{
1801 int i;
1802 char *_name_op[] = {
1803 "__lt__",
1804 "__le__",
1805 "__eq__",
1806 "__ne__",
1807 "__gt__",
1808 "__ge__",
1809 };
1810
1811 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1812 if (name_op == NULL)
1813 return -1;
1814 for (i = 0; i < NAME_OPS; ++i) {
1815 name_op[i] = PyString_InternFromString(_name_op[i]);
1816 if (name_op[i] == NULL)
1817 return -1;
1818 }
1819 return 0;
1820}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001821
1822static PyObject *
1823half_richcompare(PyObject *v, PyObject *w, int op)
1824{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001825 PyObject *method;
1826 PyObject *args;
1827 PyObject *res;
1828
1829 assert(PyInstance_Check(v));
1830
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001831 if (name_op == NULL) {
1832 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001833 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001834 }
1835 /* If the instance doesn't define an __getattr__ method, use
1836 instance_getattr2 directly because it will not set an
1837 exception on failure. */
1838 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
1839 method = instance_getattr2((PyInstanceObject *)v,
1840 name_op[op]);
1841 if (method == NULL) {
1842 assert(!PyErr_Occurred());
1843 res = Py_NotImplemented;
1844 Py_INCREF(res);
1845 return res;
1846 }
1847 } else {
1848 method = PyObject_GetAttr(v, name_op[op]);
1849 if (method == NULL) {
1850 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1851 return NULL;
1852 PyErr_Clear();
1853 res = Py_NotImplemented;
1854 Py_INCREF(res);
1855 return res;
1856 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001857 }
1858
1859 args = Py_BuildValue("(O)", w);
1860 if (args == NULL) {
1861 Py_DECREF(method);
1862 return NULL;
1863 }
1864
1865 res = PyEval_CallObject(method, args);
1866 Py_DECREF(args);
1867 Py_DECREF(method);
1868
1869 return res;
1870}
1871
1872/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1873static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1874
1875static PyObject *
1876instance_richcompare(PyObject *v, PyObject *w, int op)
1877{
1878 PyObject *res;
1879
1880 if (PyInstance_Check(v)) {
1881 res = half_richcompare(v, w, op);
1882 if (res != Py_NotImplemented)
1883 return res;
1884 Py_DECREF(res);
1885 }
1886
1887 if (PyInstance_Check(w)) {
1888 res = half_richcompare(w, v, swapped_op[op]);
1889 if (res != Py_NotImplemented)
1890 return res;
1891 Py_DECREF(res);
1892 }
1893
1894 Py_INCREF(Py_NotImplemented);
1895 return Py_NotImplemented;
1896}
1897
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001898
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001899/* Get the iterator */
1900static PyObject *
1901instance_getiter(PyInstanceObject *self)
1902{
1903 PyObject *func;
1904
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001905 if (iterstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001906 iterstr = PyString_InternFromString("__iter__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001907 if (iterstr == NULL)
1908 return NULL;
1909 }
1910 if (getitemstr == NULL) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001911 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001912 if (getitemstr == NULL)
1913 return NULL;
1914 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001915
1916 if ((func = instance_getattr(self, iterstr)) != NULL) {
1917 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1918 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001919 if (res != NULL && !PyIter_Check(res)) {
1920 PyErr_Format(PyExc_TypeError,
1921 "__iter__ returned non-iterator "
1922 "of type '%.100s'",
1923 res->ob_type->tp_name);
1924 Py_DECREF(res);
1925 res = NULL;
1926 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001927 return res;
1928 }
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001929 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1930 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001931 PyErr_Clear();
1932 if ((func = instance_getattr(self, getitemstr)) == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001933 PyErr_SetString(PyExc_TypeError,
1934 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001935 return NULL;
1936 }
1937 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001938 return PySeqIter_New((PyObject *)self);
1939}
1940
1941
1942/* Call the iterator's next */
1943static PyObject *
1944instance_iternext(PyInstanceObject *self)
1945{
1946 PyObject *func;
1947
1948 if (nextstr == NULL)
1949 nextstr = PyString_InternFromString("next");
1950
1951 if ((func = instance_getattr(self, nextstr)) != NULL) {
1952 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1953 Py_DECREF(func);
1954 if (res != NULL) {
1955 return res;
1956 }
1957 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1958 PyErr_Clear();
1959 return NULL;
1960 }
1961 return NULL;
1962 }
1963 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1964 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001965}
1966
Tim Peters6d6c1a32001-08-02 04:15:00 +00001967static PyObject *
1968instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1969{
Guido van Rossum16b93b32002-06-13 21:32:51 +00001970 PyThreadState *tstate = PyThreadState_GET();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001971 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1972 if (call == NULL) {
1973 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00001974 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1975 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001976 PyErr_Clear();
1977 PyErr_Format(PyExc_AttributeError,
1978 "%.200s instance has no __call__ method",
1979 PyString_AsString(inst->in_class->cl_name));
1980 return NULL;
1981 }
Guido van Rossum16b93b32002-06-13 21:32:51 +00001982 /* We must check and increment the recursion depth here. Scenario:
1983 class A:
1984 pass
1985 A.__call__ = A() # that's right
1986 a = A() # ok
1987 a() # infinite recursion
1988 This bounces between instance_call() and PyObject_Call() without
1989 ever hitting eval_frame() (which has the main recursion check). */
1990 if (tstate->recursion_depth++ > Py_GetRecursionLimit()) {
1991 PyErr_SetString(PyExc_RuntimeError,
1992 "maximum __call__ recursion depth exceeded");
1993 res = NULL;
1994 }
1995 else
1996 res = PyObject_Call(call, arg, kw);
1997 tstate->recursion_depth--;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001998 Py_DECREF(call);
1999 return res;
2000}
2001
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002002
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002003static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002004 (binaryfunc)instance_add, /* nb_add */
2005 (binaryfunc)instance_sub, /* nb_subtract */
2006 (binaryfunc)instance_mul, /* nb_multiply */
2007 (binaryfunc)instance_div, /* nb_divide */
2008 (binaryfunc)instance_mod, /* nb_remainder */
2009 (binaryfunc)instance_divmod, /* nb_divmod */
2010 (ternaryfunc)instance_pow, /* nb_power */
2011 (unaryfunc)instance_neg, /* nb_negative */
2012 (unaryfunc)instance_pos, /* nb_positive */
2013 (unaryfunc)instance_abs, /* nb_absolute */
2014 (inquiry)instance_nonzero, /* nb_nonzero */
2015 (unaryfunc)instance_invert, /* nb_invert */
2016 (binaryfunc)instance_lshift, /* nb_lshift */
2017 (binaryfunc)instance_rshift, /* nb_rshift */
2018 (binaryfunc)instance_and, /* nb_and */
2019 (binaryfunc)instance_xor, /* nb_xor */
2020 (binaryfunc)instance_or, /* nb_or */
2021 (coercion)instance_coerce, /* nb_coerce */
2022 (unaryfunc)instance_int, /* nb_int */
2023 (unaryfunc)instance_long, /* nb_long */
2024 (unaryfunc)instance_float, /* nb_float */
2025 (unaryfunc)instance_oct, /* nb_oct */
2026 (unaryfunc)instance_hex, /* nb_hex */
2027 (binaryfunc)instance_iadd, /* nb_inplace_add */
2028 (binaryfunc)instance_isub, /* nb_inplace_subtract */
2029 (binaryfunc)instance_imul, /* nb_inplace_multiply */
2030 (binaryfunc)instance_idiv, /* nb_inplace_divide */
2031 (binaryfunc)instance_imod, /* nb_inplace_remainder */
2032 (ternaryfunc)instance_ipow, /* nb_inplace_power */
2033 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
2034 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
2035 (binaryfunc)instance_iand, /* nb_inplace_and */
2036 (binaryfunc)instance_ixor, /* nb_inplace_xor */
2037 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum4668b002001-08-08 05:00:18 +00002038 (binaryfunc)instance_floordiv, /* nb_floor_divide */
2039 (binaryfunc)instance_truediv, /* nb_true_divide */
2040 (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
2041 (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
Guido van Rossum04691fc1992-08-12 15:35:34 +00002042};
2043
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002044PyTypeObject PyInstance_Type = {
2045 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002046 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00002047 "instance",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002048 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002049 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002050 (destructor)instance_dealloc, /* tp_dealloc */
2051 0, /* tp_print */
2052 0, /* tp_getattr */
2053 0, /* tp_setattr */
2054 instance_compare, /* tp_compare */
2055 (reprfunc)instance_repr, /* tp_repr */
2056 &instance_as_number, /* tp_as_number */
2057 &instance_as_sequence, /* tp_as_sequence */
2058 &instance_as_mapping, /* tp_as_mapping */
2059 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002060 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00002061 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002062 (getattrofunc)instance_getattr, /* tp_getattro */
2063 (setattrofunc)instance_setattr, /* tp_setattro */
2064 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002065 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002066 instance_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002067 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002068 0, /* tp_clear */
2069 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002070 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2071 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002072 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002073 0, /* tp_methods */
2074 0, /* tp_members */
2075 0, /* tp_getset */
2076 0, /* tp_base */
2077 0, /* tp_dict */
2078 0, /* tp_descr_get */
2079 0, /* tp_descr_set */
2080 0, /* tp_dictoffset */
2081 0, /* tp_init */
2082 0, /* tp_alloc */
2083 instance_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002084};
2085
2086
Guido van Rossum81daa321993-05-20 14:24:46 +00002087/* Instance method objects are used for two purposes:
2088 (a) as bound instance methods (returned by instancename.methodname)
2089 (b) as unbound methods (returned by ClassName.methodname)
2090 In case (b), im_self is NULL
2091*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002092
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002093static PyMethodObject *free_list;
2094
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002095PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002096PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002097{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002098 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00002099 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002100 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002101 return NULL;
2102 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002103 im = free_list;
2104 if (im != NULL) {
2105 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002106 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002107 }
2108 else {
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002109 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002110 if (im == NULL)
2111 return NULL;
2112 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00002113 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002114 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002115 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002116 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00002117 im->im_self = self;
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002118 Py_XINCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00002119 im->im_class = class;
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002120 _PyObject_GC_TRACK(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002121 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002122}
2123
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002124/* Descriptors for PyMethod attributes */
2125
2126/* im_class, im_func and im_self are stored in the PyMethod object */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002127
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002128#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129
Guido van Rossum6f799372001-09-20 20:46:19 +00002130static PyMemberDef instancemethod_memberlist[] = {
2131 {"im_class", T_OBJECT, OFF(im_class), READONLY|RESTRICTED,
2132 "the class associated with a method"},
2133 {"im_func", T_OBJECT, OFF(im_func), READONLY|RESTRICTED,
2134 "the function (or other callable) implementing a method"},
2135 {"im_self", T_OBJECT, OFF(im_self), READONLY|RESTRICTED,
2136 "the instance to which a method is bound; None for unbound methods"},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002137 {NULL} /* Sentinel */
2138};
2139
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002140/* The getattr() implementation for PyMethod objects is similar to
2141 PyObject_GenericGetAttr(), but instead of looking in __dict__ it
2142 asks im_self for the attribute. Then the error handling is a bit
2143 different because we want to preserve the exception raised by the
2144 delegate, unless we have an alternative from our class. */
2145
2146static PyObject *
2147instancemethod_getattro(PyObject *obj, PyObject *name)
2148{
2149 PyMethodObject *im = (PyMethodObject *)obj;
2150 PyTypeObject *tp = obj->ob_type;
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002151 PyObject *descr = NULL, *res;
2152 descrgetfunc f = NULL;
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002153
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002154 if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2155 if (tp->tp_dict == NULL) {
2156 if (PyType_Ready(tp) < 0)
2157 return NULL;
2158 }
2159 descr = _PyType_Lookup(tp, name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002160 }
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002161
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002162 f = NULL;
2163 if (descr != NULL) {
Guido van Rossum915f0eb2001-10-17 20:26:38 +00002164 f = TP_DESCR_GET(descr->ob_type);
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002165 if (f != NULL && PyDescr_IsData(descr))
2166 return f(descr, obj, (PyObject *)obj->ob_type);
2167 }
2168
2169 res = PyObject_GetAttr(im->im_func, name);
2170 if (res != NULL || !PyErr_ExceptionMatches(PyExc_AttributeError))
2171 return res;
2172
2173 if (f != NULL) {
2174 PyErr_Clear();
2175 return f(descr, obj, (PyObject *)obj->ob_type);
2176 }
2177
2178 if (descr != NULL) {
2179 PyErr_Clear();
2180 Py_INCREF(descr);
2181 return descr;
2182 }
2183
2184 assert(PyErr_Occurred());
2185 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002186}
2187
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002188PyDoc_STRVAR(instancemethod_doc,
2189"instancemethod(function, instance, class)\n\
2190\n\
2191Create an instance method object.");
2192
2193static PyObject *
2194instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2195{
2196 PyObject *func;
2197 PyObject *self;
2198 PyObject *classObj;
2199
2200 if (!PyArg_ParseTuple(args, "OOO:instancemethod",
2201 &func, &self, &classObj))
2202 return NULL;
2203 if (!PyCallable_Check(func)) {
2204 PyErr_SetString(PyExc_TypeError,
2205 "first argument must be callable");
2206 return NULL;
2207 }
2208 if (self == Py_None)
2209 self = NULL;
2210 return PyMethod_New(func, self, classObj);
2211}
2212
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002213static void
Fred Drake79912472000-07-09 04:06:11 +00002214instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002215{
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002216 _PyObject_GC_UNTRACK(im);
Fred Drakec916f5a2001-10-26 17:56:51 +00002217 if (im->im_weakreflist != NULL)
2218 PyObject_ClearWeakRefs((PyObject *)im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002219 Py_DECREF(im->im_func);
2220 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002221 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002222 im->im_self = (PyObject *)free_list;
2223 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002224}
2225
Guido van Rossumebc8c511992-09-03 20:39:51 +00002226static int
Fred Drake79912472000-07-09 04:06:11 +00002227instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002228{
Guido van Rossume9df7271995-04-06 14:46:51 +00002229 if (a->im_self != b->im_self)
2230 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002231 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002232}
2233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002234static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002235instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002236{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002237 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002238 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002239 PyObject *klass = a->im_class;
2240 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2241 char *sfuncname = "?", *sklassname = "?";
2242
2243 funcname = PyObject_GetAttrString(func, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002244 if (funcname == NULL) {
2245 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2246 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002247 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002248 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002249 else if (!PyString_Check(funcname)) {
2250 Py_DECREF(funcname);
2251 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002252 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002253 else
2254 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002255 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002256 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002257 else {
2258 klassname = PyObject_GetAttrString(klass, "__name__");
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002259 if (klassname == NULL) {
2260 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2261 return NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002262 PyErr_Clear();
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002263 }
Guido van Rossum40667692001-08-17 13:59:27 +00002264 else if (!PyString_Check(klassname)) {
2265 Py_DECREF(klassname);
2266 klassname = NULL;
2267 }
2268 else
2269 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002270 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002271 if (self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +00002272 result = PyString_FromFormat("<unbound method %s.%s>",
2273 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002274 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002275 /* XXX Shouldn't use repr() here! */
2276 PyObject *selfrepr = PyObject_Repr(self);
2277 if (selfrepr == NULL)
2278 goto fail;
2279 if (!PyString_Check(selfrepr)) {
2280 Py_DECREF(selfrepr);
2281 goto fail;
2282 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00002283 result = PyString_FromFormat("<bound method %s.%s of %s>",
2284 sklassname, sfuncname,
2285 PyString_AS_STRING(selfrepr));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002286 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002287 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002288 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002289 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002290 Py_XDECREF(klassname);
2291 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002292}
2293
Guido van Rossum9bfef441993-03-29 10:43:31 +00002294static long
Fred Drake79912472000-07-09 04:06:11 +00002295instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002296{
2297 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002298 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002299 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002300 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002301 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002302 if (x == -1)
2303 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002304 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002305 if (y == -1)
2306 return -1;
2307 return x ^ y;
2308}
2309
Jeremy Hylton8caad492000-06-23 14:18:11 +00002310static int
2311instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2312{
2313 int err;
2314 if (im->im_func) {
2315 err = visit(im->im_func, arg);
2316 if (err)
2317 return err;
2318 }
2319 if (im->im_self) {
2320 err = visit(im->im_self, arg);
2321 if (err)
2322 return err;
2323 }
2324 if (im->im_class) {
2325 err = visit(im->im_class, arg);
2326 if (err)
2327 return err;
2328 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002329 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002330}
2331
Guido van Rossuma15dece2001-08-24 18:48:27 +00002332static char *
2333getclassname(PyObject *class)
2334{
2335 PyObject *name;
2336
2337 if (class == NULL)
2338 name = NULL;
2339 else
2340 name = PyObject_GetAttrString(class, "__name__");
2341 if (name == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002342 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002343 PyErr_Clear();
2344 return "?";
2345 }
2346 if (!PyString_Check(name)) {
2347 Py_DECREF(name);
2348 return "?";
2349 }
2350 PyString_InternInPlace(&name);
2351 Py_DECREF(name);
2352 return PyString_AS_STRING(name);
2353}
2354
2355static char *
2356getinstclassname(PyObject *inst)
2357{
2358 PyObject *class;
2359 char *name;
2360
2361 if (inst == NULL)
2362 return "nothing";
2363
2364 class = PyObject_GetAttrString(inst, "__class__");
2365 if (class == NULL) {
Guido van Rossume7b8ecf2002-06-13 21:42:04 +00002366 /* This function cannot return an exception */
Guido van Rossuma15dece2001-08-24 18:48:27 +00002367 PyErr_Clear();
2368 class = (PyObject *)(inst->ob_type);
2369 Py_INCREF(class);
2370 }
2371 name = getclassname(class);
2372 Py_XDECREF(class);
2373 return name;
2374}
2375
Tim Peters6d6c1a32001-08-02 04:15:00 +00002376static PyObject *
2377instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2378{
2379 PyObject *self = PyMethod_GET_SELF(func);
2380 PyObject *class = PyMethod_GET_CLASS(func);
2381 PyObject *result;
2382
2383 func = PyMethod_GET_FUNCTION(func);
2384 if (self == NULL) {
2385 /* Unbound methods must be called with an instance of
2386 the class (or a derived class) as first argument */
2387 int ok;
2388 if (PyTuple_Size(arg) >= 1)
2389 self = PyTuple_GET_ITEM(arg, 0);
2390 if (self == NULL)
2391 ok = 0;
2392 else {
2393 ok = PyObject_IsInstance(self, class);
2394 if (ok < 0)
2395 return NULL;
2396 }
2397 if (!ok) {
2398 PyErr_Format(PyExc_TypeError,
Guido van Rossuma15dece2001-08-24 18:48:27 +00002399 "unbound method %s%s must be called with "
2400 "%s instance as first argument "
2401 "(got %s%s instead)",
Tim Peters6d6c1a32001-08-02 04:15:00 +00002402 PyEval_GetFuncName(func),
Guido van Rossuma15dece2001-08-24 18:48:27 +00002403 PyEval_GetFuncDesc(func),
2404 getclassname(class),
2405 getinstclassname(self),
2406 self == NULL ? "" : " instance");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002407 return NULL;
2408 }
2409 Py_INCREF(arg);
2410 }
2411 else {
2412 int argcount = PyTuple_Size(arg);
2413 PyObject *newarg = PyTuple_New(argcount + 1);
2414 int i;
2415 if (newarg == NULL)
2416 return NULL;
2417 Py_INCREF(self);
2418 PyTuple_SET_ITEM(newarg, 0, self);
2419 for (i = 0; i < argcount; i++) {
2420 PyObject *v = PyTuple_GET_ITEM(arg, i);
2421 Py_XINCREF(v);
2422 PyTuple_SET_ITEM(newarg, i+1, v);
2423 }
2424 arg = newarg;
2425 }
2426 result = PyObject_Call((PyObject *)func, arg, kw);
2427 Py_DECREF(arg);
2428 return result;
2429}
2430
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002431static PyObject *
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002432instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *class)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002433{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002434 /* Don't rebind an already bound method, or an unbound method
2435 of a class that's not a base class of class */
2436 if (PyMethod_GET_SELF(meth) != NULL ||
2437 (PyMethod_GET_CLASS(meth) != NULL &&
2438 !PyObject_IsSubclass(class, PyMethod_GET_CLASS(meth)))) {
Guido van Rossum501c7c72001-08-16 20:41:56 +00002439 Py_INCREF(meth);
2440 return meth;
2441 }
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002442 if (obj == Py_None)
2443 obj = NULL;
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002444 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002445}
2446
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002447PyTypeObject PyMethod_Type = {
2448 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002449 0,
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002450 "instancemethod",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002451 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002452 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002453 (destructor)instancemethod_dealloc, /* tp_dealloc */
2454 0, /* tp_print */
2455 0, /* tp_getattr */
2456 0, /* tp_setattr */
2457 (cmpfunc)instancemethod_compare, /* tp_compare */
2458 (reprfunc)instancemethod_repr, /* tp_repr */
2459 0, /* tp_as_number */
2460 0, /* tp_as_sequence */
2461 0, /* tp_as_mapping */
2462 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002463 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002464 0, /* tp_str */
2465 (getattrofunc)instancemethod_getattro, /* tp_getattro */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002466 PyObject_GenericSetAttr, /* tp_setattro */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002467 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002468 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002469 instancemethod_doc, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002470 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002471 0, /* tp_clear */
2472 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002473 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2474 0, /* tp_iter */
2475 0, /* tp_iternext */
2476 0, /* tp_methods */
Guido van Rossumf0b35e12001-09-18 03:53:24 +00002477 instancemethod_memberlist, /* tp_members */
Guido van Rossum56ff3872001-10-22 02:00:09 +00002478 0, /* tp_getset */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002479 0, /* tp_base */
2480 0, /* tp_dict */
2481 instancemethod_descr_get, /* tp_descr_get */
2482 0, /* tp_descr_set */
2483 0, /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +00002484 0, /* tp_init */
2485 0, /* tp_alloc */
2486 instancemethod_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002487};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002488
2489/* Clear out the free list */
2490
2491void
Fred Drake79912472000-07-09 04:06:11 +00002492PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002493{
2494 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002495 PyMethodObject *im = free_list;
2496 free_list = (PyMethodObject *)(im->im_self);
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002497 PyObject_GC_Del(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002498 }
2499}