blob: 255a432f53316d20265760d32c540f1bfcccb032 [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
Neil Schemenauer29bfc072001-01-04 01:43:46 +00007
Guido van Rossum52ca98a1994-09-05 07:32:29 +00008/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +00009static PyObject *class_lookup(PyClassObject *, PyObject *,
10 PyClassObject **);
11static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
12static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000013
Guido van Rossuma63eff61998-05-29 21:37:21 +000014static PyObject *getattrstr, *setattrstr, *delattrstr;
15
Fred Drake79912472000-07-09 04:06:11 +000016
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017PyObject *
Fred Drake79912472000-07-09 04:06:11 +000018PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
19 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000022 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000023 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000024 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000025 if (docstr == NULL)
26 return NULL;
27 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000028 if (modstr == NULL) {
29 modstr= PyString_InternFromString("__module__");
30 if (modstr == NULL)
31 return NULL;
32 }
33 if (namestr == NULL) {
34 namestr= PyString_InternFromString("__name__");
35 if (namestr == NULL)
36 return NULL;
37 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000038 if (name == NULL || !PyString_Check(name)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000039 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000040 "PyClass_New: name must be a string");
41 return NULL;
42 }
43 if (dict == NULL || !PyDict_Check(dict)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000045 "PyClass_New: dict must be a dictionary");
46 return NULL;
47 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 if (PyDict_GetItem(dict, docstr) == NULL) {
49 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000050 return NULL;
51 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000052 if (PyDict_GetItem(dict, modstr) == NULL) {
53 PyObject *globals = PyEval_GetGlobals();
54 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000055 PyObject *modname = PyDict_GetItem(globals, namestr);
56 if (modname != NULL) {
57 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000058 return NULL;
59 }
60 }
61 }
Guido van Rossume2966a61991-12-10 13:53:23 +000062 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000064 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000065 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000066 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000067 else {
68 int i;
69 if (!PyTuple_Check(bases)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000070 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000071 "PyClass_New: bases must be a tuple");
72 return NULL;
73 }
74 i = PyTuple_Size(bases);
75 while (--i >= 0) {
76 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +000077 PyErr_SetString(PyExc_TypeError,
Guido van Rossum04d73c41997-10-07 14:54:11 +000078 "PyClass_New: base must be a class");
79 return NULL;
80 }
81 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000083 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000085 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000088 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000091 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000093 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000094 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000095 getattrstr = PyString_InternFromString("__getattr__");
96 setattrstr = PyString_InternFromString("__setattr__");
97 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +000098 }
99 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
100 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
101 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 Py_XINCREF(op->cl_getattr);
103 Py_XINCREF(op->cl_setattr);
104 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000105 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
Tim Peters6d6c1a32001-08-02 04:15:00 +0000109static PyObject *
110class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
111{
112 PyObject *name, *bases, *dict;
113 static char *kwlist[] = {"name", "bases", "dict", 0};
114
115 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
116 &name, &bases, &dict))
117 return NULL;
118 return PyClass_New(bases, dict, name);
119}
120
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121/* Class methods */
122
123static void
Fred Drake79912472000-07-09 04:06:11 +0000124class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000126 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 Py_DECREF(op->cl_bases);
128 Py_DECREF(op->cl_dict);
129 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000130 Py_XDECREF(op->cl_getattr);
131 Py_XDECREF(op->cl_setattr);
132 Py_XDECREF(op->cl_delattr);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000133 op = (PyClassObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000134 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
136
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000138class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000139{
140 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000142 if (value != NULL) {
143 *pclass = cp;
144 return value;
145 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000147 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000148 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 PyObject *v = class_lookup(
150 (PyClassObject *)
151 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000152 if (v != NULL)
153 return v;
154 }
155 return NULL;
156}
157
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000159class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 register PyObject *v;
162 register char *sname = PyString_AsString(name);
163 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 descrgetfunc f;
165
Guido van Rossum2878a691996-08-09 20:53:24 +0000166 if (sname[0] == '_' && sname[1] == '_') {
167 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 if (PyEval_GetRestricted()) {
169 PyErr_SetString(PyExc_RuntimeError,
170 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000171 return NULL;
172 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000174 return op->cl_dict;
175 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000176 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000178 return op->cl_bases;
179 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000180 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000181 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000183 else
184 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000186 return v;
187 }
Guido van Rossum94308391991-10-20 20:11:48 +0000188 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000189 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000190 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000191 PyErr_Format(PyExc_AttributeError,
192 "class %.50s has no attribute '%.400s'",
193 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000194 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000196 f = v->ob_type->tp_descr_get;
197 if (f == NULL)
198 Py_INCREF(v);
199 else
200 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000201 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202}
203
Guido van Rossuma63eff61998-05-29 21:37:21 +0000204static void
Fred Drake79912472000-07-09 04:06:11 +0000205set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000206{
207 PyObject *temp = *slot;
208 Py_XINCREF(v);
209 *slot = v;
210 Py_XDECREF(temp);
211}
212
Guido van Rossum7ba30431998-07-08 13:34:48 +0000213static void
Fred Drake79912472000-07-09 04:06:11 +0000214set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000215{
216 PyClassObject *dummy;
217
218 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
219 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
220 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
221}
222
Guido van Rossuma63eff61998-05-29 21:37:21 +0000223static char *
Fred Drake79912472000-07-09 04:06:11 +0000224set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000225{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000226 if (v == NULL || !PyDict_Check(v))
227 return "__dict__ must be a dictionary object";
228 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000229 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000230 return "";
231}
232
233static char *
Fred Drake79912472000-07-09 04:06:11 +0000234set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000235{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000236 int i, n;
237
238 if (v == NULL || !PyTuple_Check(v))
239 return "__bases__ must be a tuple object";
240 n = PyTuple_Size(v);
241 for (i = 0; i < n; i++) {
242 PyObject *x = PyTuple_GET_ITEM(v, i);
243 if (!PyClass_Check(x))
244 return "__bases__ items must be classes";
245 if (PyClass_IsSubclass(x, (PyObject *)c))
246 return "a __bases__ item causes an inheritance cycle";
247 }
248 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000249 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000250 return "";
251}
252
253static char *
Fred Drake79912472000-07-09 04:06:11 +0000254set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000255{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000256 if (v == NULL || !PyString_Check(v))
257 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000258 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000259 return "__name__ must not contain null bytes";
260 set_slot(&c->cl_name, v);
261 return "";
262}
263
Guido van Rossum94308391991-10-20 20:11:48 +0000264static int
Fred Drake79912472000-07-09 04:06:11 +0000265class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000266{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000267 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268 if (PyEval_GetRestricted()) {
269 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000270 "classes are read-only in restricted mode");
271 return -1;
272 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000273 sname = PyString_AsString(name);
274 if (sname[0] == '_' && sname[1] == '_') {
275 int n = PyString_Size(name);
276 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000277 char *err = NULL;
278 if (strcmp(sname, "__dict__") == 0)
279 err = set_dict(op, v);
280 else if (strcmp(sname, "__bases__") == 0)
281 err = set_bases(op, v);
282 else if (strcmp(sname, "__name__") == 0)
283 err = set_name(op, v);
284 else if (strcmp(sname, "__getattr__") == 0)
285 set_slot(&op->cl_getattr, v);
286 else if (strcmp(sname, "__setattr__") == 0)
287 set_slot(&op->cl_setattr, v);
288 else if (strcmp(sname, "__delattr__") == 0)
289 set_slot(&op->cl_delattr, v);
290 /* For the last three, we fall through to update the
291 dictionary as well. */
292 if (err != NULL) {
293 if (*err == '\0')
294 return 0;
295 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000296 return -1;
297 }
298 }
299 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000300 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000302 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000303 PyErr_Format(PyExc_AttributeError,
304 "class %.50s has no attribute '%.400s'",
305 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000306 return rv;
307 }
Guido van Rossum94308391991-10-20 20:11:48 +0000308 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000310}
311
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000313class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000314{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000315 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000316 char buf[140];
317 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000319 name = "?";
320 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000322 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000323 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000324 else
Fred Drakea44d3532000-06-30 15:01:00 +0000325 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000326 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000327 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000329}
330
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000331static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000332class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000333{
334 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
335 PyObject *name = op->cl_name;
336 PyObject *res;
337 int m, n;
338
339 if (name == NULL || !PyString_Check(name))
340 return class_repr(op);
341 if (mod == NULL || !PyString_Check(mod)) {
342 Py_INCREF(name);
343 return name;
344 }
345 m = PyString_Size(mod);
346 n = PyString_Size(name);
347 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
348 if (res != NULL) {
349 char *s = PyString_AsString(res);
350 memcpy(s, PyString_AsString(mod), m);
351 s += m;
352 *s++ = '.';
353 memcpy(s, PyString_AsString(name), n);
354 }
355 return res;
356}
357
Jeremy Hylton8caad492000-06-23 14:18:11 +0000358static int
359class_traverse(PyClassObject *o, visitproc visit, void *arg)
360{
361 int err;
362 if (o->cl_bases) {
363 err = visit(o->cl_bases, arg);
364 if (err)
365 return err;
366 }
367 if (o->cl_dict) {
368 err = visit(o->cl_dict, arg);
369 if (err)
370 return err;
371 }
372 if (o->cl_name) {
373 err = visit(o->cl_name, arg);
374 if (err)
375 return err;
376 }
377 if (o->cl_getattr) {
378 err = visit(o->cl_getattr, arg);
379 if (err)
380 return err;
381 }
382 if (o->cl_setattr) {
383 err = visit(o->cl_setattr, arg);
384 if (err)
385 return err;
386 }
387 if (o->cl_delattr) {
388 err = visit(o->cl_delattr, arg);
389 if (err)
390 return err;
391 }
392 return 0;
393}
394
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395PyTypeObject PyClass_Type = {
396 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397 0,
398 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000399 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000401 (destructor)class_dealloc, /* tp_dealloc */
402 0, /* tp_print */
403 0, /* tp_getattr */
404 0, /* tp_setattr */
405 0, /* tp_compare */
406 (reprfunc)class_repr, /* tp_repr */
407 0, /* tp_as_number */
408 0, /* tp_as_sequence */
409 0, /* tp_as_mapping */
410 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000411 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000412 (reprfunc)class_str, /* tp_str */
413 (getattrofunc)class_getattr, /* tp_getattro */
414 (setattrofunc)class_setattr, /* tp_setattro */
415 0, /* tp_as_buffer */
416 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
417 0, /* tp_doc */
418 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000419 0, /* tp_clear */
420 0, /* tp_richcompare */
421 0, /* tp_weaklistoffset */
422 0, /* tp_iter */
423 0, /* tp_iternext */
424 0, /* tp_methods */
425 0, /* tp_members */
426 0, /* tp_getset */
427 0, /* tp_base */
428 0, /* tp_dict */
429 0, /* tp_descr_get */
430 0, /* tp_descr_set */
431 0, /* tp_dictoffset */
432 0, /* tp_init */
433 0, /* tp_alloc */
434 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435};
436
Guido van Rossum81daa321993-05-20 14:24:46 +0000437int
Fred Drake79912472000-07-09 04:06:11 +0000438PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000439{
440 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000442 if (class == base)
443 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000445 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 cp = (PyClassObject *)class;
447 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000448 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000450 return 1;
451 }
452 return 0;
453}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454
Guido van Rossum81daa321993-05-20 14:24:46 +0000455
456/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000459PyInstance_NewRaw(PyObject *klass, PyObject *dict)
460{
461 PyInstanceObject *inst;
462
463 if (!PyClass_Check(klass)) {
464 PyErr_BadInternalCall();
465 return NULL;
466 }
467 if (dict == NULL) {
468 dict = PyDict_New();
469 if (dict == NULL)
470 return NULL;
471 }
472 else {
473 if (!PyDict_Check(dict)) {
474 PyErr_BadInternalCall();
475 return NULL;
476 }
477 Py_INCREF(dict);
478 }
479 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
480 if (inst == NULL) {
481 Py_DECREF(dict);
482 return NULL;
483 }
Fred Drake4e262a92001-03-22 18:26:47 +0000484 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000485 Py_INCREF(klass);
486 inst->in_class = (PyClassObject *)klass;
487 inst->in_dict = dict;
488 PyObject_GC_Init(inst);
489 return (PyObject *)inst;
490}
491
492PyObject *
493PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 register PyInstanceObject *inst;
496 PyObject *init;
497 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000498
499 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000500 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000502 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000503 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000504 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000505 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 if ((arg != NULL && (!PyTuple_Check(arg) ||
507 PyTuple_Size(arg) != 0))
508 || (kw != NULL && (!PyDict_Check(kw) ||
509 PyDict_Size(kw) != 0))) {
510 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000511 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000513 inst = NULL;
514 }
515 }
516 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
518 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000519 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000521 inst = NULL;
522 }
523 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 if (res != Py_None) {
525 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000526 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 inst = NULL;
529 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000531 }
532 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534}
535
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000536/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537
538static void
Fred Drake79912472000-07-09 04:06:11 +0000539instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 PyObject *error_type, *error_value, *error_traceback;
542 PyObject *del;
543 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000544#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000545 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000546#endif
Fred Drake41deb1e2001-02-01 05:27:45 +0000547
Fred Drakeb60654b2001-02-26 18:56:37 +0000548 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000549
Tim Peters6b184912000-09-17 14:40:17 +0000550 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000551#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000552#ifndef Py_REF_DEBUG
553# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
554#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000555 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000557 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000558#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000559 /* compensate for boost in _Py_NewReference; note that
560 * _Py_RefTotal was also boosted; we'll knock that down later.
561 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562 inst->ob_type->tp_allocs--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000563#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000564#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000565 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000567#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000568
569 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000571 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000572 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000573 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000574 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000576 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000577 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000578 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 Py_DECREF(res);
580 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000581 }
Tim Peters6b184912000-09-17 14:40:17 +0000582 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000584 /* Undo the temporary resurrection; can't use DECREF here, it would
585 * cause a recursive call.
586 */
587#ifdef Py_REF_DEBUG
588 /* _Py_RefTotal was boosted either by _Py_NewReference or
589 * Py_INCREF above.
590 */
591 _Py_RefTotal--;
592#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000593 if (--inst->ob_refcnt > 0) {
594#ifdef COUNT_ALLOCS
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 inst->ob_type->tp_frees--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000596#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000597 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000598 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000599#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000600 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000601#ifdef COUNT_ALLOCS
602 /* compensate for increment in _Py_ForgetReference */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603 inst->ob_type->tp_frees--;
Tim Peters6b184912000-09-17 14:40:17 +0000604#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000605#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000606 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000607#endif
Tim Peters6b184912000-09-17 14:40:17 +0000608#endif
Neil Schemenauerce209672000-09-15 18:57:21 +0000609 PyObject_GC_Fini(inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 Py_DECREF(inst->in_class);
611 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000612 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000613 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614}
615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000617instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000618{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 register PyObject *v;
620 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000621 if (sname[0] == '_' && sname[1] == '_') {
622 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 if (PyEval_GetRestricted()) {
624 PyErr_SetString(PyExc_RuntimeError,
625 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000626 return NULL;
627 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000629 return inst->in_dict;
630 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000631 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 Py_INCREF(inst->in_class);
633 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000634 }
Guido van Rossum94308391991-10-20 20:11:48 +0000635 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000636 v = instance_getattr2(inst, name);
637 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000638 PyErr_Format(PyExc_AttributeError,
639 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000640 PyString_AS_STRING(inst->in_class->cl_name), sname);
641 }
642 return v;
643}
644
645static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000646instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000647{
648 register PyObject *v;
649 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000650 descrgetfunc f;
651
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000652 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000654 if (v == NULL) {
655 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000656 if (v == NULL)
657 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000659 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000660 if (class != NULL) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000661 f = v->ob_type->tp_descr_get;
662 if (f != NULL) {
663 PyObject *w = f(v, (PyObject *)inst,
664 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000666 v = w;
667 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 else if (PyMethod_Check(v)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000669 /* XXX This should be a tp_descr_get slot of
670 PyMethodObjects */
671 PyObject *im_class = PyMethod_GET_CLASS(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000672 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000674 PyObject *im_func = PyMethod_GET_FUNCTION(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyObject *w = PyMethod_New(im_func,
676 (PyObject *)inst, im_class);
677 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000678 v = w;
679 }
680 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000681 }
682 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683}
684
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000686instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000687{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000689 res = instance_getattr1(inst, name);
690 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 PyObject *args;
692 PyErr_Clear();
693 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000694 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000695 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 res = PyEval_CallObject(func, args);
697 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000698 }
699 return res;
700}
701
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702static int
Fred Drake79912472000-07-09 04:06:11 +0000703instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000704{
Guido van Rossum94472a01992-09-04 09:45:18 +0000705 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000707 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000708 PyErr_Format(PyExc_AttributeError,
709 "%.50s instance has no attribute '%.400s'",
710 PyString_AS_STRING(inst->in_class->cl_name),
711 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000712 return rv;
713 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000714 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000716}
717
Guido van Rossume7737541994-09-05 07:31:41 +0000718static int
Fred Drake79912472000-07-09 04:06:11 +0000719instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000720{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000721 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000723 if (sname[0] == '_' && sname[1] == '_') {
724 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000725 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000726 if (strcmp(sname, "__dict__") == 0) {
727 if (PyEval_GetRestricted()) {
728 PyErr_SetString(PyExc_RuntimeError,
729 "__dict__ not accessible in restricted mode");
730 return -1;
731 }
732 if (v == NULL || !PyDict_Check(v)) {
733 PyErr_SetString(PyExc_TypeError,
734 "__dict__ must be set to a dictionary");
735 return -1;
736 }
737 tmp = inst->in_dict;
738 Py_INCREF(v);
739 inst->in_dict = v;
740 Py_DECREF(tmp);
741 return 0;
742 }
743 if (strcmp(sname, "__class__") == 0) {
744 if (PyEval_GetRestricted()) {
745 PyErr_SetString(PyExc_RuntimeError,
746 "__class__ not accessible in restricted mode");
747 return -1;
748 }
749 if (v == NULL || !PyClass_Check(v)) {
750 PyErr_SetString(PyExc_TypeError,
751 "__class__ must be set to a class");
752 return -1;
753 }
754 tmp = (PyObject *)(inst->in_class);
755 Py_INCREF(v);
756 inst->in_class = (PyClassObject *)v;
757 Py_DECREF(tmp);
758 return 0;
759 }
Guido van Rossume7737541994-09-05 07:31:41 +0000760 }
Guido van Rossume7737541994-09-05 07:31:41 +0000761 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000762 if (v == NULL)
763 func = inst->in_class->cl_delattr;
764 else
765 func = inst->in_class->cl_setattr;
766 if (func == NULL)
767 return instance_setattr1(inst, name, v);
768 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000770 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000772 if (args == NULL)
773 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 res = PyEval_CallObject(func, args);
775 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000776 if (res == NULL)
777 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000779 return 0;
780}
781
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000783instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000784{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 PyObject *func;
786 PyObject *res;
787 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000788
Guido van Rossum2878a691996-08-09 20:53:24 +0000789 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000790 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000791 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000792 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000793 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000795 PyObject *mod = PyDict_GetItemString(
796 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000797 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 if (classname != NULL && PyString_Check(classname))
799 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000800 else
801 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000803 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000804 sprintf(buf, "<?.%.100s instance at %p>",
805 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000806 else
Fred Drakea44d3532000-06-30 15:01:00 +0000807 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000808 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000809 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 res = PyEval_CallObject(func, (PyObject *)NULL);
813 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000814 return res;
815}
816
Guido van Rossum82c690f2001-04-30 14:39:18 +0000817static PyObject *
818instance_str(PyInstanceObject *inst)
819{
820 PyObject *func;
821 PyObject *res;
822 static PyObject *strstr;
823
824 if (strstr == NULL)
825 strstr = PyString_InternFromString("__str__");
826 func = instance_getattr(inst, strstr);
827 if (func == NULL) {
828 PyErr_Clear();
829 return instance_repr(inst);
830 }
831 res = PyEval_CallObject(func, (PyObject *)NULL);
832 Py_DECREF(func);
833 return res;
834}
835
Guido van Rossum9bfef441993-03-29 10:43:31 +0000836static long
Fred Drake79912472000-07-09 04:06:11 +0000837instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000838{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 PyObject *func;
840 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000841 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000842 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000843
Guido van Rossum2878a691996-08-09 20:53:24 +0000844 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000845 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000846 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000847 if (func == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000848 /* If there is no __eq__ and no __cmp__ method, we hash on the
849 address. If an __eq__ or __cmp__ method exists, there must
850 be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000852 if (eqstr == NULL)
853 eqstr = PyString_InternFromString("__eq__");
854 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000855 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000857 if (cmpstr == NULL)
858 cmpstr = PyString_InternFromString("__cmp__");
859 func = instance_getattr(inst, cmpstr);
860 if (func == NULL) {
861 PyErr_Clear();
862 return _Py_HashPointer(inst);
863 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000864 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000866 return -1;
867 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 res = PyEval_CallObject(func, (PyObject *)NULL);
869 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000870 if (res == NULL)
871 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 if (PyInt_Check(res)) {
873 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000874 if (outcome == -1)
875 outcome = -2;
876 }
877 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 PyErr_SetString(PyExc_TypeError,
879 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000880 outcome = -1;
881 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000883 return outcome;
884}
885
Jeremy Hylton8caad492000-06-23 14:18:11 +0000886static int
887instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
888{
889 int err;
890 if (o->in_class) {
891 err = visit((PyObject *)(o->in_class), arg);
892 if (err)
893 return err;
894 }
895 if (o->in_dict) {
896 err = visit(o->in_dict, arg);
897 if (err)
898 return err;
899 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000900 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000901}
902
Guido van Rossum213c7a62001-04-23 14:08:49 +0000903static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
904static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000905
Guido van Rossum9bfef441993-03-29 10:43:31 +0000906static int
Fred Drake79912472000-07-09 04:06:11 +0000907instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyObject *func;
910 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000911 int outcome;
912
Guido van Rossum2878a691996-08-09 20:53:24 +0000913 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000914 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000915 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000916 if (func == NULL)
917 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 res = PyEval_CallObject(func, (PyObject *)NULL);
919 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000920 if (res == NULL)
921 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 if (PyInt_Check(res)) {
923 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 PyErr_SetString(PyExc_ValueError,
926 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927 }
928 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 PyErr_SetString(PyExc_TypeError,
930 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931 outcome = -1;
932 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934 return outcome;
935}
936
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000938instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000939{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyObject *func;
941 PyObject *arg;
942 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000943
Guido van Rossum2878a691996-08-09 20:53:24 +0000944 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000945 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000946 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000947 if (func == NULL)
948 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000950 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952 return NULL;
953 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 res = PyEval_CallObject(func, arg);
955 Py_DECREF(func);
956 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957 return res;
958}
959
Guido van Rossum9bfef441993-03-29 10:43:31 +0000960static int
Fred Drake79912472000-07-09 04:06:11 +0000961instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000962{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 PyObject *func;
964 PyObject *arg;
965 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000966
Guido van Rossum2878a691996-08-09 20:53:24 +0000967 if (value == NULL) {
968 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000969 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000970 func = instance_getattr(inst, delitemstr);
971 }
972 else {
973 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000974 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000975 func = instance_getattr(inst, setitemstr);
976 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000977 if (func == NULL)
978 return -1;
979 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000983 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000985 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 res = PyEval_CallObject(func, arg);
988 Py_DECREF(func);
989 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990 if (res == NULL)
991 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 return 0;
994}
995
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000997 (inquiry)instance_length, /* mp_length */
998 (binaryfunc)instance_subscript, /* mp_subscript */
999 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000};
1001
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001003instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001004{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006
Guido van Rossum2878a691996-08-09 20:53:24 +00001007 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001008 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001009 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010 if (func == NULL)
1011 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015 return NULL;
1016 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 res = PyEval_CallObject(func, arg);
1018 Py_DECREF(func);
1019 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 return res;
1021}
1022
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +00001024sliceobj_from_intint(int i, int j)
1025{
1026 PyObject *start, *end, *res;
1027
1028 start = PyInt_FromLong((long)i);
1029 if (!start)
1030 return NULL;
1031
1032 end = PyInt_FromLong((long)j);
1033 if (!end) {
1034 Py_DECREF(start);
1035 return NULL;
1036 }
1037 res = PySlice_New(start, end, NULL);
1038 Py_DECREF(start);
1039 Py_DECREF(end);
1040 return res;
1041}
1042
1043
1044static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001045instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 PyObject *func, *arg, *res;
1048 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001049
Guido van Rossum2878a691996-08-09 20:53:24 +00001050 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001051 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001052 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001053
1054 if (func == NULL) {
1055 PyErr_Clear();
1056
1057 if (getitemstr == NULL)
1058 getitemstr = PyString_InternFromString("__getitem__");
1059 func = instance_getattr(inst, getitemstr);
1060 if (func == NULL)
1061 return NULL;
1062 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1063 } else
1064 arg = Py_BuildValue("(ii)", i, j);
1065
Guido van Rossum04691fc1992-08-12 15:35:34 +00001066 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068 return NULL;
1069 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 res = PyEval_CallObject(func, arg);
1071 Py_DECREF(func);
1072 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073 return res;
1074}
1075
1076static int
Fred Drake79912472000-07-09 04:06:11 +00001077instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080
Guido van Rossum2878a691996-08-09 20:53:24 +00001081 if (item == NULL) {
1082 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001083 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001084 func = instance_getattr(inst, delitemstr);
1085 }
1086 else {
1087 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001088 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001089 func = instance_getattr(inst, setitemstr);
1090 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001091 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001092 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001095 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001097 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001099 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001100 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 res = PyEval_CallObject(func, arg);
1102 Py_DECREF(func);
1103 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001104 if (res == NULL)
1105 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001107 return 0;
1108}
1109
1110static int
Fred Drake79912472000-07-09 04:06:11 +00001111instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113 PyObject *func, *arg, *res;
1114 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001115
Guido van Rossum2878a691996-08-09 20:53:24 +00001116 if (value == NULL) {
1117 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118 delslicestr =
1119 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001120 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001121 if (func == NULL) {
1122 PyErr_Clear();
1123 if (delitemstr == NULL)
1124 delitemstr =
1125 PyString_InternFromString("__delitem__");
1126 func = instance_getattr(inst, delitemstr);
1127 if (func == NULL)
1128 return -1;
1129
1130 arg = Py_BuildValue("(N)",
1131 sliceobj_from_intint(i, j));
1132 } else
1133 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001134 }
1135 else {
1136 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 setslicestr =
1138 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001139 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001140 if (func == NULL) {
1141 PyErr_Clear();
1142 if (setitemstr == NULL)
1143 setitemstr =
1144 PyString_InternFromString("__setitem__");
1145 func = instance_getattr(inst, setitemstr);
1146 if (func == NULL)
1147 return -1;
1148
1149 arg = Py_BuildValue("(NO)",
1150 sliceobj_from_intint(i, j), value);
1151 } else
1152 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001153 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001154 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001156 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001157 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 res = PyEval_CallObject(func, arg);
1159 Py_DECREF(func);
1160 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001161 if (res == NULL)
1162 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001164 return 0;
1165}
1166
Tim Peterscb8d3682001-05-05 21:05:01 +00001167static int
1168instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001169{
1170 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001171 PyObject *func;
1172
1173 /* Try __contains__ first.
1174 * If that can't be done, try iterator-based searching.
1175 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001176
1177 if(__contains__ == NULL) {
1178 __contains__ = PyString_InternFromString("__contains__");
1179 if(__contains__ == NULL)
1180 return -1;
1181 }
1182 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001183 if (func) {
1184 PyObject *res;
1185 int ret;
1186 PyObject *arg = Py_BuildValue("(O)", member);
1187 if(arg == NULL) {
1188 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001189 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001190 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001191 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001192 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001193 Py_DECREF(arg);
1194 if(res == NULL)
1195 return -1;
1196 ret = PyObject_IsTrue(res);
1197 Py_DECREF(res);
1198 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001199 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001200
1201 /* Couldn't find __contains__. */
1202 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1203 /* Assume the failure was simply due to that there is no
1204 * __contains__ attribute, and try iterating instead.
1205 */
1206 PyErr_Clear();
1207 return _PySequence_IterContains((PyObject *)inst, member);
1208 }
1209 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001210 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001211}
1212
Fred Drake79912472000-07-09 04:06:11 +00001213static PySequenceMethods
1214instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001215 (inquiry)instance_length, /* sq_length */
1216 0, /* sq_concat */
1217 0, /* sq_repeat */
1218 (intargfunc)instance_item, /* sq_item */
1219 (intintargfunc)instance_slice, /* sq_slice */
1220 (intobjargproc)instance_ass_item, /* sq_ass_item */
1221 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1222 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001223};
1224
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001226generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001227{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001229
1230 if ((func = instance_getattr(self, methodname)) == NULL)
1231 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 res = PyEval_CallObject(func, (PyObject *)NULL);
1233 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001234 return res;
1235}
1236
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001237static PyObject *
1238generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001239{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001240 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001242 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001243 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001244 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001245 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001247 Py_INCREF(Py_NotImplemented);
1248 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001249 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001251 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001253 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001254 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001255 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 Py_DECREF(args);
1257 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001258 return result;
1259}
1260
1261
1262static PyObject *coerce_obj;
1263
1264/* Try one half of a binary operator involving a class instance. */
1265static PyObject *
1266half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1267 int swapped)
1268{
1269 PyObject *args;
1270 PyObject *coercefunc;
1271 PyObject *coerced = NULL;
1272 PyObject *v1;
1273 PyObject *result;
1274
1275 if (!PyInstance_Check(v)) {
1276 Py_INCREF(Py_NotImplemented);
1277 return Py_NotImplemented;
1278 }
1279
1280 if (coerce_obj == NULL) {
1281 coerce_obj = PyString_InternFromString("__coerce__");
1282 if (coerce_obj == NULL)
1283 return NULL;
1284 }
1285 coercefunc = PyObject_GetAttr(v, coerce_obj);
1286 if (coercefunc == NULL) {
1287 PyErr_Clear();
1288 return generic_binary_op(v, w, opname);
1289 }
1290
1291 args = Py_BuildValue("(O)", w);
1292 if (args == NULL) {
1293 return NULL;
1294 }
1295 coerced = PyEval_CallObject(coercefunc, args);
1296 Py_DECREF(args);
1297 Py_DECREF(coercefunc);
1298 if (coerced == NULL) {
1299 return NULL;
1300 }
1301 if (coerced == Py_None || coerced == Py_NotImplemented) {
1302 Py_DECREF(coerced);
1303 return generic_binary_op(v, w, opname);
1304 }
1305 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1306 Py_DECREF(coerced);
1307 PyErr_SetString(PyExc_TypeError,
1308 "coercion should return None or 2-tuple");
1309 return NULL;
1310 }
1311 v1 = PyTuple_GetItem(coerced, 0);
1312 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001313 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001314 /* prevent recursion if __coerce__ returns self as the first
1315 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001316 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001317 } else {
1318 if (swapped)
1319 result = (thisfunc)(w, v1);
1320 else
1321 result = (thisfunc)(v1, w);
1322 }
1323 Py_DECREF(coerced);
1324 return result;
1325}
1326
1327/* Implement a binary operator involving at least one class instance. */
1328static PyObject *
1329do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1330 binaryfunc thisfunc)
1331{
1332 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1333 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001334 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001335 result = half_binop(w, v, ropname, thisfunc, 1);
1336 }
1337 return result;
1338}
1339
1340static PyObject *
1341do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1342 char *ropname, binaryfunc thisfunc)
1343{
1344 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1345 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001346 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001347 result = do_binop(v, w, opname, ropname, thisfunc);
1348 }
1349 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001350}
1351
Guido van Rossum879c5811995-01-10 15:24:06 +00001352static int
Fred Drake79912472000-07-09 04:06:11 +00001353instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001354{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 PyObject *v = *pv;
1356 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001357 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 PyObject *args;
1359 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001360
Guido van Rossum2878a691996-08-09 20:53:24 +00001361 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001362 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001363 if (coerce_obj == NULL)
1364 return -1;
1365 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001366 coercefunc = PyObject_GetAttr(v, coerce_obj);
1367 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001368 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001370 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001371 }
1372 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001374 if (args == NULL) {
1375 return -1;
1376 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001377 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001379 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001380 if (coerced == NULL) {
1381 /* __coerce__ call raised an exception */
1382 return -1;
1383 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001384 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001385 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001387 return 1;
1388 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001390 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391 Py_DECREF(coerced);
1392 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001393 "coercion should return None or 2-tuple");
1394 return -1;
1395 }
1396 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 *pv = PyTuple_GetItem(coerced, 0);
1398 *pw = PyTuple_GetItem(coerced, 1);
1399 Py_INCREF(*pv);
1400 Py_INCREF(*pw);
1401 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001402 return 0;
1403}
1404
Guido van Rossum04691fc1992-08-12 15:35:34 +00001405#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001406static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001408 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001409 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001410}
1411
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001412#define BINARY(f, m, n) \
1413static PyObject *f(PyObject *v, PyObject *w) { \
1414 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1415}
1416
1417#define BINARY_INPLACE(f, m, n) \
1418static PyObject *f(PyObject *v, PyObject *w) { \
1419 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1420 "__r" m "__", n); \
1421}
1422
Guido van Rossum04691fc1992-08-12 15:35:34 +00001423UNARY(instance_neg, "__neg__")
1424UNARY(instance_pos, "__pos__")
1425UNARY(instance_abs, "__abs__")
1426
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001427BINARY(instance_or, "or", PyNumber_Or)
1428BINARY(instance_and, "and", PyNumber_And)
1429BINARY(instance_xor, "xor", PyNumber_Xor)
1430BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1431BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1432BINARY(instance_add, "add", PyNumber_Add)
1433BINARY(instance_sub, "sub", PyNumber_Subtract)
1434BINARY(instance_mul, "mul", PyNumber_Multiply)
1435BINARY(instance_div, "div", PyNumber_Divide)
1436BINARY(instance_mod, "mod", PyNumber_Remainder)
1437BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001438BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1439BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001440
1441BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1442BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1443BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1444BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1445BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1446BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1447BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1448BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1449BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1450BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001451BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1452BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001453
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001454/* Try a 3-way comparison, returning an int; v is an instance. Return:
1455 -2 for an exception;
1456 -1 if v < w;
1457 0 if v == w;
1458 1 if v > w;
1459 2 if this particular 3-way comparison is not implemented or undefined.
1460*/
1461static int
1462half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001463{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001464 static PyObject *cmp_obj;
1465 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001466 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001467 PyObject *result;
1468 long l;
1469
1470 assert(PyInstance_Check(v));
1471
1472 if (cmp_obj == NULL) {
1473 cmp_obj = PyString_InternFromString("__cmp__");
1474 if (cmp_obj == NULL)
1475 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001476 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001477
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001478 cmp_func = PyObject_GetAttr(v, cmp_obj);
1479 if (cmp_func == NULL) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001480 PyErr_Clear();
1481 return 2;
1482 }
1483
1484 args = Py_BuildValue("(O)", w);
1485 if (args == NULL)
1486 return -2;
1487
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001488 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001489 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001490 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001491
1492 if (result == NULL)
1493 return -2;
1494
1495 if (result == Py_NotImplemented) {
1496 Py_DECREF(result);
1497 return 2;
1498 }
1499
1500 l = PyInt_AsLong(result);
1501 Py_DECREF(result);
1502 if (l == -1 && PyErr_Occurred()) {
1503 PyErr_SetString(PyExc_TypeError,
1504 "comparison did not return an int");
1505 return -2;
1506 }
1507
1508 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001509}
1510
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001511/* Try a 3-way comparison, returning an int; either v or w is an instance.
1512 We first try a coercion. Return:
1513 -2 for an exception;
1514 -1 if v < w;
1515 0 if v == w;
1516 1 if v > w;
1517 2 if this particular 3-way comparison is not implemented or undefined.
1518 THIS IS ONLY CALLED FROM object.c!
1519*/
1520static int
1521instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001522{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001523 int c;
1524
1525 c = PyNumber_CoerceEx(&v, &w);
1526 if (c < 0)
1527 return -2;
1528 if (c == 0) {
1529 /* If neither is now an instance, use regular comparison */
1530 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1531 c = PyObject_Compare(v, w);
1532 Py_DECREF(v);
1533 Py_DECREF(w);
1534 if (PyErr_Occurred())
1535 return -2;
1536 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001537 }
1538 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001539 else {
1540 /* The coercion didn't do anything.
1541 Treat this the same as returning v and w unchanged. */
1542 Py_INCREF(v);
1543 Py_INCREF(w);
1544 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001545
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001546 if (PyInstance_Check(v)) {
1547 c = half_cmp(v, w);
1548 if (c <= 1) {
1549 Py_DECREF(v);
1550 Py_DECREF(w);
1551 return c;
1552 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001553 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001554 if (PyInstance_Check(w)) {
1555 c = half_cmp(w, v);
1556 if (c <= 1) {
1557 Py_DECREF(v);
1558 Py_DECREF(w);
1559 if (c >= -1)
1560 c = -c;
1561 return c;
1562 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001563 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001564 Py_DECREF(v);
1565 Py_DECREF(w);
1566 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001567}
1568
Guido van Rossum9bfef441993-03-29 10:43:31 +00001569static int
Fred Drake79912472000-07-09 04:06:11 +00001570instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001571{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001573 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001575
Guido van Rossum2878a691996-08-09 20:53:24 +00001576 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001577 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001578 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001580 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001581 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001582 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001584 /* Fall back to the default behavior:
1585 all instances are nonzero */
1586 return 1;
1587 }
1588 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 res = PyEval_CallObject(func, (PyObject *)NULL);
1590 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001591 if (res == NULL)
1592 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001593 if (!PyInt_Check(res)) {
1594 Py_DECREF(res);
1595 PyErr_SetString(PyExc_TypeError,
1596 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001597 return -1;
1598 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599 outcome = PyInt_AsLong(res);
1600 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001601 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 PyErr_SetString(PyExc_ValueError,
1603 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001604 return -1;
1605 }
1606 return outcome > 0;
1607}
1608
1609UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001610UNARY(instance_int, "__int__")
1611UNARY(instance_long, "__long__")
1612UNARY(instance_float, "__float__")
1613UNARY(instance_oct, "__oct__")
1614UNARY(instance_hex, "__hex__")
1615
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001616static PyObject *
1617bin_power(PyObject *v, PyObject *w)
1618{
1619 return PyNumber_Power(v, w, Py_None);
1620}
1621
Guido van Rossum03093a21994-09-28 15:51:32 +00001622/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001624instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001625{
1626 if (z == Py_None) {
1627 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001628 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001629 else {
1630 PyObject *func;
1631 PyObject *args;
1632 PyObject *result;
1633
1634 /* XXX Doesn't do coercions... */
1635 func = PyObject_GetAttrString(v, "__pow__");
1636 if (func == NULL)
1637 return NULL;
1638 args = Py_BuildValue("(OO)", w, z);
1639 if (args == NULL) {
1640 Py_DECREF(func);
1641 return NULL;
1642 }
1643 result = PyEval_CallObject(func, args);
1644 Py_DECREF(func);
1645 Py_DECREF(args);
1646 return result;
1647 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001648}
1649
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001650static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001651bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001652{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001653 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001654}
1655
1656
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001657static PyObject *
1658instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1659{
1660 if (z == Py_None) {
1661 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1662 "__rpow__", bin_inplace_power);
1663 }
1664 else {
1665 /* XXX Doesn't do coercions... */
1666 PyObject *func;
1667 PyObject *args;
1668 PyObject *result;
1669
1670 func = PyObject_GetAttrString(v, "__ipow__");
1671 if (func == NULL) {
1672 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1673 return NULL;
1674 PyErr_Clear();
1675 return instance_pow(v, w, z);
1676 }
1677 args = Py_BuildValue("(OO)", w, z);
1678 if (args == NULL) {
1679 Py_DECREF(func);
1680 return NULL;
1681 }
1682 result = PyEval_CallObject(func, args);
1683 Py_DECREF(func);
1684 Py_DECREF(args);
1685 return result;
1686 }
1687}
1688
1689
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001690/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001691#define NAME_OPS 6
1692static PyObject **name_op = NULL;
1693
1694static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001695init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001696{
1697 int i;
1698 char *_name_op[] = {
1699 "__lt__",
1700 "__le__",
1701 "__eq__",
1702 "__ne__",
1703 "__gt__",
1704 "__ge__",
1705 };
1706
1707 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1708 if (name_op == NULL)
1709 return -1;
1710 for (i = 0; i < NAME_OPS; ++i) {
1711 name_op[i] = PyString_InternFromString(_name_op[i]);
1712 if (name_op[i] == NULL)
1713 return -1;
1714 }
1715 return 0;
1716}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001717
1718static PyObject *
1719half_richcompare(PyObject *v, PyObject *w, int op)
1720{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001721 PyObject *method;
1722 PyObject *args;
1723 PyObject *res;
1724
1725 assert(PyInstance_Check(v));
1726
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001727 if (name_op == NULL) {
1728 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001729 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001730 }
1731 /* If the instance doesn't define an __getattr__ method, use
1732 instance_getattr2 directly because it will not set an
1733 exception on failure. */
1734 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
1735 method = instance_getattr2((PyInstanceObject *)v,
1736 name_op[op]);
1737 if (method == NULL) {
1738 assert(!PyErr_Occurred());
1739 res = Py_NotImplemented;
1740 Py_INCREF(res);
1741 return res;
1742 }
1743 } else {
1744 method = PyObject_GetAttr(v, name_op[op]);
1745 if (method == NULL) {
1746 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1747 return NULL;
1748 PyErr_Clear();
1749 res = Py_NotImplemented;
1750 Py_INCREF(res);
1751 return res;
1752 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001753 }
1754
1755 args = Py_BuildValue("(O)", w);
1756 if (args == NULL) {
1757 Py_DECREF(method);
1758 return NULL;
1759 }
1760
1761 res = PyEval_CallObject(method, args);
1762 Py_DECREF(args);
1763 Py_DECREF(method);
1764
1765 return res;
1766}
1767
1768/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1769static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1770
1771static PyObject *
1772instance_richcompare(PyObject *v, PyObject *w, int op)
1773{
1774 PyObject *res;
1775
1776 if (PyInstance_Check(v)) {
1777 res = half_richcompare(v, w, op);
1778 if (res != Py_NotImplemented)
1779 return res;
1780 Py_DECREF(res);
1781 }
1782
1783 if (PyInstance_Check(w)) {
1784 res = half_richcompare(w, v, swapped_op[op]);
1785 if (res != Py_NotImplemented)
1786 return res;
1787 Py_DECREF(res);
1788 }
1789
1790 Py_INCREF(Py_NotImplemented);
1791 return Py_NotImplemented;
1792}
1793
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001794
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001795/* Get the iterator */
1796static PyObject *
1797instance_getiter(PyInstanceObject *self)
1798{
1799 PyObject *func;
1800
1801 if (iterstr == NULL)
1802 iterstr = PyString_InternFromString("__iter__");
1803 if (getitemstr == NULL)
1804 getitemstr = PyString_InternFromString("__getitem__");
1805
1806 if ((func = instance_getattr(self, iterstr)) != NULL) {
1807 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1808 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001809 if (res != NULL && !PyIter_Check(res)) {
1810 PyErr_Format(PyExc_TypeError,
1811 "__iter__ returned non-iterator "
1812 "of type '%.100s'",
1813 res->ob_type->tp_name);
1814 Py_DECREF(res);
1815 res = NULL;
1816 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001817 return res;
1818 }
1819 PyErr_Clear();
1820 if ((func = instance_getattr(self, getitemstr)) == NULL) {
1821 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1822 return NULL;
1823 }
1824 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001825 return PySeqIter_New((PyObject *)self);
1826}
1827
1828
1829/* Call the iterator's next */
1830static PyObject *
1831instance_iternext(PyInstanceObject *self)
1832{
1833 PyObject *func;
1834
1835 if (nextstr == NULL)
1836 nextstr = PyString_InternFromString("next");
1837
1838 if ((func = instance_getattr(self, nextstr)) != NULL) {
1839 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1840 Py_DECREF(func);
1841 if (res != NULL) {
1842 return res;
1843 }
1844 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1845 PyErr_Clear();
1846 return NULL;
1847 }
1848 return NULL;
1849 }
1850 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1851 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001852}
1853
Tim Peters6d6c1a32001-08-02 04:15:00 +00001854static PyObject *
1855instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1856{
1857 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1858 if (call == NULL) {
1859 PyInstanceObject *inst = (PyInstanceObject*) func;
1860 PyErr_Clear();
1861 PyErr_Format(PyExc_AttributeError,
1862 "%.200s instance has no __call__ method",
1863 PyString_AsString(inst->in_class->cl_name));
1864 return NULL;
1865 }
1866 res = PyObject_Call(call, arg, kw);
1867 Py_DECREF(call);
1868 return res;
1869}
1870
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001871
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001872static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001873 (binaryfunc)instance_add, /* nb_add */
1874 (binaryfunc)instance_sub, /* nb_subtract */
1875 (binaryfunc)instance_mul, /* nb_multiply */
1876 (binaryfunc)instance_div, /* nb_divide */
1877 (binaryfunc)instance_mod, /* nb_remainder */
1878 (binaryfunc)instance_divmod, /* nb_divmod */
1879 (ternaryfunc)instance_pow, /* nb_power */
1880 (unaryfunc)instance_neg, /* nb_negative */
1881 (unaryfunc)instance_pos, /* nb_positive */
1882 (unaryfunc)instance_abs, /* nb_absolute */
1883 (inquiry)instance_nonzero, /* nb_nonzero */
1884 (unaryfunc)instance_invert, /* nb_invert */
1885 (binaryfunc)instance_lshift, /* nb_lshift */
1886 (binaryfunc)instance_rshift, /* nb_rshift */
1887 (binaryfunc)instance_and, /* nb_and */
1888 (binaryfunc)instance_xor, /* nb_xor */
1889 (binaryfunc)instance_or, /* nb_or */
1890 (coercion)instance_coerce, /* nb_coerce */
1891 (unaryfunc)instance_int, /* nb_int */
1892 (unaryfunc)instance_long, /* nb_long */
1893 (unaryfunc)instance_float, /* nb_float */
1894 (unaryfunc)instance_oct, /* nb_oct */
1895 (unaryfunc)instance_hex, /* nb_hex */
1896 (binaryfunc)instance_iadd, /* nb_inplace_add */
1897 (binaryfunc)instance_isub, /* nb_inplace_subtract */
1898 (binaryfunc)instance_imul, /* nb_inplace_multiply */
1899 (binaryfunc)instance_idiv, /* nb_inplace_divide */
1900 (binaryfunc)instance_imod, /* nb_inplace_remainder */
1901 (ternaryfunc)instance_ipow, /* nb_inplace_power */
1902 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
1903 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
1904 (binaryfunc)instance_iand, /* nb_inplace_and */
1905 (binaryfunc)instance_ixor, /* nb_inplace_xor */
1906 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum4668b002001-08-08 05:00:18 +00001907 (binaryfunc)instance_floordiv, /* nb_floor_divide */
1908 (binaryfunc)instance_truediv, /* nb_true_divide */
1909 (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
1910 (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001911};
1912
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001913PyTypeObject PyInstance_Type = {
1914 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001915 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001916 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001917 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001918 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001919 (destructor)instance_dealloc, /* tp_dealloc */
1920 0, /* tp_print */
1921 0, /* tp_getattr */
1922 0, /* tp_setattr */
1923 instance_compare, /* tp_compare */
1924 (reprfunc)instance_repr, /* tp_repr */
1925 &instance_as_number, /* tp_as_number */
1926 &instance_as_sequence, /* tp_as_sequence */
1927 &instance_as_mapping, /* tp_as_mapping */
1928 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001929 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00001930 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001931 (getattrofunc)instance_getattr, /* tp_getattro */
1932 (setattrofunc)instance_setattr, /* tp_setattro */
1933 0, /* tp_as_buffer */
1934 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
1935 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00001936 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001937 0, /* tp_clear */
1938 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001939 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
1940 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001941 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001942};
1943
1944
Guido van Rossum81daa321993-05-20 14:24:46 +00001945/* Instance method objects are used for two purposes:
1946 (a) as bound instance methods (returned by instancename.methodname)
1947 (b) as unbound methods (returned by ClassName.methodname)
1948 In case (b), im_self is NULL
1949*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001950
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001951static PyMethodObject *free_list;
1952
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001953PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001954PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001955{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001956 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001957 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001958 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001959 return NULL;
1960 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001961 im = free_list;
1962 if (im != NULL) {
1963 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001964 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001965 }
1966 else {
1967 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1968 if (im == NULL)
1969 return NULL;
1970 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00001971 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001972 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001973 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001974 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001975 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001976 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001977 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001978 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001979 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001980}
1981
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001982/* Class method methods */
1983
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001984#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985
Guido van Rossume8122f11991-05-05 20:03:07 +00001986static struct memberlist instancemethod_memberlist[] = {
1987 {"im_func", T_OBJECT, OFF(im_func)},
1988 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001989 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001990 /* Dummies that are not handled by getattr() except for __members__ */
1991 {"__doc__", T_INT, 0},
1992 {"__name__", T_INT, 0},
Barry Warsawd6a9e842001-01-15 20:40:19 +00001993 {"__dict__", T_OBJECT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994 {NULL} /* Sentinel */
1995};
1996
Barry Warsawd6a9e842001-01-15 20:40:19 +00001997static int
1998instancemethod_setattro(register PyMethodObject *im, PyObject *name,
1999 PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002001 char *sname = PyString_AsString(name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002002
Barry Warsaw4f9b13b2001-02-26 18:09:15 +00002003 PyErr_Format(PyExc_TypeError, "read-only attribute: %s", sname);
2004 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +00002005}
2006
2007
2008static PyObject *
2009instancemethod_getattro(register PyMethodObject *im, PyObject *name)
2010{
2011 PyObject *rtn;
2012 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00002013 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00002014 /* Inherit __name__ and __doc__ from the callable object
2015 implementing the method */
2016 if (strcmp(sname, "__name__") == 0 ||
2017 strcmp(sname, "__doc__") == 0)
2018 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00002019 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020 if (PyEval_GetRestricted()) {
2021 PyErr_SetString(PyExc_RuntimeError,
2022 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00002023 return NULL;
2024 }
Barry Warsawd6a9e842001-01-15 20:40:19 +00002025 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0)
2026 return PyObject_GetAttr(im->im_func, name);
2027
2028 rtn = PyMember_Get((char *)im, instancemethod_memberlist, sname);
2029 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
2030 PyErr_Clear();
2031 rtn = PyObject_GetAttr(im->im_func, name);
2032 }
2033 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002034}
2035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002036static void
Fred Drake79912472000-07-09 04:06:11 +00002037instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002038{
Fred Drakedb81e8d2001-03-23 04:19:27 +00002039 PyObject_ClearWeakRefs((PyObject *)im);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002040 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002041 Py_DECREF(im->im_func);
2042 Py_XDECREF(im->im_self);
2043 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002044 im->im_self = (PyObject *)free_list;
2045 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002046}
2047
Guido van Rossumebc8c511992-09-03 20:39:51 +00002048static int
Fred Drake79912472000-07-09 04:06:11 +00002049instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002050{
Guido van Rossume9df7271995-04-06 14:46:51 +00002051 if (a->im_self != b->im_self)
2052 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002053 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002054}
2055
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002056static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002057instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002058{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002059 char buffer[240];
2060 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002061 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002062 PyObject *klass = a->im_class;
2063 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2064 char *sfuncname = "?", *sklassname = "?";
2065
2066 funcname = PyObject_GetAttrString(func, "__name__");
2067 if (funcname == NULL)
2068 PyErr_Clear();
2069 else if (!PyString_Check(funcname)) {
2070 Py_DECREF(funcname);
2071 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002072 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002073 else
2074 sfuncname = PyString_AS_STRING(funcname);
2075 klassname = PyObject_GetAttrString(klass, "__name__");
2076 if (klassname == NULL)
2077 PyErr_Clear();
2078 else if (!PyString_Check(klassname)) {
2079 Py_DECREF(klassname);
2080 klassname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002081 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002082 else
Tim Peters6d6c1a32001-08-02 04:15:00 +00002083 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002084 if (self == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002085 sprintf(buffer, "<unbound method %.100s.%.100s>",
2086 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002087 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002088 /* XXX Shouldn't use repr() here! */
2089 PyObject *selfrepr = PyObject_Repr(self);
2090 if (selfrepr == NULL)
2091 goto fail;
2092 if (!PyString_Check(selfrepr)) {
2093 Py_DECREF(selfrepr);
2094 goto fail;
2095 }
2096 sprintf(buffer, "<bound method %.60s.%.60s of %.60s>",
2097 sklassname, sfuncname, PyString_AS_STRING(selfrepr));
2098 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002099 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002100 result = PyString_FromString(buffer);
2101 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002102 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002103 Py_XDECREF(klassname);
2104 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002105}
2106
Guido van Rossum9bfef441993-03-29 10:43:31 +00002107static long
Fred Drake79912472000-07-09 04:06:11 +00002108instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002109{
2110 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002111 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002112 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002113 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002114 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002115 if (x == -1)
2116 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002117 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002118 if (y == -1)
2119 return -1;
2120 return x ^ y;
2121}
2122
Jeremy Hylton8caad492000-06-23 14:18:11 +00002123static int
2124instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2125{
2126 int err;
2127 if (im->im_func) {
2128 err = visit(im->im_func, arg);
2129 if (err)
2130 return err;
2131 }
2132 if (im->im_self) {
2133 err = visit(im->im_self, arg);
2134 if (err)
2135 return err;
2136 }
2137 if (im->im_class) {
2138 err = visit(im->im_class, arg);
2139 if (err)
2140 return err;
2141 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002142 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002143}
2144
Tim Peters6d6c1a32001-08-02 04:15:00 +00002145static PyObject *
2146instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2147{
2148 PyObject *self = PyMethod_GET_SELF(func);
2149 PyObject *class = PyMethod_GET_CLASS(func);
2150 PyObject *result;
2151
2152 func = PyMethod_GET_FUNCTION(func);
2153 if (self == NULL) {
2154 /* Unbound methods must be called with an instance of
2155 the class (or a derived class) as first argument */
2156 int ok;
2157 if (PyTuple_Size(arg) >= 1)
2158 self = PyTuple_GET_ITEM(arg, 0);
2159 if (self == NULL)
2160 ok = 0;
2161 else {
2162 ok = PyObject_IsInstance(self, class);
2163 if (ok < 0)
2164 return NULL;
2165 }
2166 if (!ok) {
2167 PyErr_Format(PyExc_TypeError,
2168 "unbound method %s%s must be "
2169 "called with instance as first argument",
2170 PyEval_GetFuncName(func),
2171 PyEval_GetFuncDesc(func));
2172 return NULL;
2173 }
2174 Py_INCREF(arg);
2175 }
2176 else {
2177 int argcount = PyTuple_Size(arg);
2178 PyObject *newarg = PyTuple_New(argcount + 1);
2179 int i;
2180 if (newarg == NULL)
2181 return NULL;
2182 Py_INCREF(self);
2183 PyTuple_SET_ITEM(newarg, 0, self);
2184 for (i = 0; i < argcount; i++) {
2185 PyObject *v = PyTuple_GET_ITEM(arg, i);
2186 Py_XINCREF(v);
2187 PyTuple_SET_ITEM(newarg, i+1, v);
2188 }
2189 arg = newarg;
2190 }
2191 result = PyObject_Call((PyObject *)func, arg, kw);
2192 Py_DECREF(arg);
2193 return result;
2194}
2195
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002196static PyObject *
2197instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *type)
2198{
2199 if (obj == Py_None)
2200 obj = NULL;
2201 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, type);
2202}
2203
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002204PyTypeObject PyMethod_Type = {
2205 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002206 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00002207 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002208 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002209 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002210 (destructor)instancemethod_dealloc, /* tp_dealloc */
2211 0, /* tp_print */
2212 0, /* tp_getattr */
2213 0, /* tp_setattr */
2214 (cmpfunc)instancemethod_compare, /* tp_compare */
2215 (reprfunc)instancemethod_repr, /* tp_repr */
2216 0, /* tp_as_number */
2217 0, /* tp_as_sequence */
2218 0, /* tp_as_mapping */
2219 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002220 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002221 0, /* tp_str */
2222 (getattrofunc)instancemethod_getattro, /* tp_getattro */
2223 (setattrofunc)instancemethod_setattro, /* tp_setattro */
2224 0, /* tp_as_buffer */
Fred Drake4dcb85b2001-05-03 16:04:13 +00002225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002226 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002227 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002228 0, /* tp_clear */
2229 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002230 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2231 0, /* tp_iter */
2232 0, /* tp_iternext */
2233 0, /* tp_methods */
2234 0, /* tp_members */
2235 0, /* tp_getset */
2236 0, /* tp_base */
2237 0, /* tp_dict */
2238 instancemethod_descr_get, /* tp_descr_get */
2239 0, /* tp_descr_set */
2240 0, /* tp_dictoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002241};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002242
2243/* Clear out the free list */
2244
2245void
Fred Drake79912472000-07-09 04:06:11 +00002246PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002247{
2248 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002249 PyMethodObject *im = free_list;
2250 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00002251 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002252 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002253 }
2254}