blob: 0f39d4ba6801664474a5e8523a66221322dff027 [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 Rossumc0b618a1997-05-02 03:12:38 +0000652 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000653 if (v != NULL) {
654 Py_INCREF(v);
655 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656 }
Guido van Rossumf23c41d2001-08-17 13:43:27 +0000657 v = class_lookup(inst->in_class, name, &class);
658 if (v != NULL) {
659 Py_INCREF(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000660 f = v->ob_type->tp_descr_get;
661 if (f != NULL) {
662 PyObject *w = f(v, (PyObject *)inst,
663 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000665 v = w;
666 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000667 }
668 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000669}
670
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000672instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000673{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000675 res = instance_getattr1(inst, name);
676 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 PyObject *args;
678 PyErr_Clear();
679 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000680 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000681 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 res = PyEval_CallObject(func, args);
683 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000684 }
685 return res;
686}
687
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688static int
Fred Drake79912472000-07-09 04:06:11 +0000689instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690{
Guido van Rossum94472a01992-09-04 09:45:18 +0000691 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000693 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000694 PyErr_Format(PyExc_AttributeError,
695 "%.50s instance has no attribute '%.400s'",
696 PyString_AS_STRING(inst->in_class->cl_name),
697 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000698 return rv;
699 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000700 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702}
703
Guido van Rossume7737541994-09-05 07:31:41 +0000704static int
Fred Drake79912472000-07-09 04:06:11 +0000705instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000706{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000707 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000709 if (sname[0] == '_' && sname[1] == '_') {
710 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000711 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000712 if (strcmp(sname, "__dict__") == 0) {
713 if (PyEval_GetRestricted()) {
714 PyErr_SetString(PyExc_RuntimeError,
715 "__dict__ not accessible in restricted mode");
716 return -1;
717 }
718 if (v == NULL || !PyDict_Check(v)) {
719 PyErr_SetString(PyExc_TypeError,
720 "__dict__ must be set to a dictionary");
721 return -1;
722 }
723 tmp = inst->in_dict;
724 Py_INCREF(v);
725 inst->in_dict = v;
726 Py_DECREF(tmp);
727 return 0;
728 }
729 if (strcmp(sname, "__class__") == 0) {
730 if (PyEval_GetRestricted()) {
731 PyErr_SetString(PyExc_RuntimeError,
732 "__class__ not accessible in restricted mode");
733 return -1;
734 }
735 if (v == NULL || !PyClass_Check(v)) {
736 PyErr_SetString(PyExc_TypeError,
737 "__class__ must be set to a class");
738 return -1;
739 }
740 tmp = (PyObject *)(inst->in_class);
741 Py_INCREF(v);
742 inst->in_class = (PyClassObject *)v;
743 Py_DECREF(tmp);
744 return 0;
745 }
Guido van Rossume7737541994-09-05 07:31:41 +0000746 }
Guido van Rossume7737541994-09-05 07:31:41 +0000747 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000748 if (v == NULL)
749 func = inst->in_class->cl_delattr;
750 else
751 func = inst->in_class->cl_setattr;
752 if (func == NULL)
753 return instance_setattr1(inst, name, v);
754 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000756 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000758 if (args == NULL)
759 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 res = PyEval_CallObject(func, args);
761 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000762 if (res == NULL)
763 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000765 return 0;
766}
767
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000769instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000770{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 PyObject *func;
772 PyObject *res;
773 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000774
Guido van Rossum2878a691996-08-09 20:53:24 +0000775 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000776 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000777 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000778 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000779 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000781 PyObject *mod = PyDict_GetItemString(
782 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000783 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 if (classname != NULL && PyString_Check(classname))
785 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000786 else
787 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000789 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000790 sprintf(buf, "<?.%.100s instance at %p>",
791 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000792 else
Fred Drakea44d3532000-06-30 15:01:00 +0000793 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000794 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000795 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 res = PyEval_CallObject(func, (PyObject *)NULL);
799 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 return res;
801}
802
Guido van Rossum82c690f2001-04-30 14:39:18 +0000803static PyObject *
804instance_str(PyInstanceObject *inst)
805{
806 PyObject *func;
807 PyObject *res;
808 static PyObject *strstr;
809
810 if (strstr == NULL)
811 strstr = PyString_InternFromString("__str__");
812 func = instance_getattr(inst, strstr);
813 if (func == NULL) {
814 PyErr_Clear();
815 return instance_repr(inst);
816 }
817 res = PyEval_CallObject(func, (PyObject *)NULL);
818 Py_DECREF(func);
819 return res;
820}
821
Guido van Rossum9bfef441993-03-29 10:43:31 +0000822static long
Fred Drake79912472000-07-09 04:06:11 +0000823instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000824{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 PyObject *func;
826 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000827 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000828 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000829
Guido van Rossum2878a691996-08-09 20:53:24 +0000830 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000831 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000832 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833 if (func == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000834 /* If there is no __eq__ and no __cmp__ method, we hash on the
835 address. If an __eq__ or __cmp__ method exists, there must
836 be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000838 if (eqstr == NULL)
839 eqstr = PyString_InternFromString("__eq__");
840 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000841 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000843 if (cmpstr == NULL)
844 cmpstr = PyString_InternFromString("__cmp__");
845 func = instance_getattr(inst, cmpstr);
846 if (func == NULL) {
847 PyErr_Clear();
848 return _Py_HashPointer(inst);
849 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000850 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000852 return -1;
853 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 res = PyEval_CallObject(func, (PyObject *)NULL);
855 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000856 if (res == NULL)
857 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 if (PyInt_Check(res)) {
859 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000860 if (outcome == -1)
861 outcome = -2;
862 }
863 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 PyErr_SetString(PyExc_TypeError,
865 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000866 outcome = -1;
867 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000869 return outcome;
870}
871
Jeremy Hylton8caad492000-06-23 14:18:11 +0000872static int
873instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
874{
875 int err;
876 if (o->in_class) {
877 err = visit((PyObject *)(o->in_class), arg);
878 if (err)
879 return err;
880 }
881 if (o->in_dict) {
882 err = visit(o->in_dict, arg);
883 if (err)
884 return err;
885 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000886 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000887}
888
Guido van Rossum213c7a62001-04-23 14:08:49 +0000889static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
890static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000891
Guido van Rossum9bfef441993-03-29 10:43:31 +0000892static int
Fred Drake79912472000-07-09 04:06:11 +0000893instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 PyObject *func;
896 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000897 int outcome;
898
Guido van Rossum2878a691996-08-09 20:53:24 +0000899 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000900 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000901 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000902 if (func == NULL)
903 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 res = PyEval_CallObject(func, (PyObject *)NULL);
905 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000906 if (res == NULL)
907 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 if (PyInt_Check(res)) {
909 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 PyErr_SetString(PyExc_ValueError,
912 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913 }
914 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 PyErr_SetString(PyExc_TypeError,
916 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917 outcome = -1;
918 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 return outcome;
921}
922
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000924instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 PyObject *func;
927 PyObject *arg;
928 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929
Guido van Rossum2878a691996-08-09 20:53:24 +0000930 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000931 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000932 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000933 if (func == NULL)
934 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000936 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938 return NULL;
939 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 res = PyEval_CallObject(func, arg);
941 Py_DECREF(func);
942 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000943 return res;
944}
945
Guido van Rossum9bfef441993-03-29 10:43:31 +0000946static int
Fred Drake79912472000-07-09 04:06:11 +0000947instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 PyObject *func;
950 PyObject *arg;
951 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952
Guido van Rossum2878a691996-08-09 20:53:24 +0000953 if (value == NULL) {
954 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000955 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000956 func = instance_getattr(inst, delitemstr);
957 }
958 else {
959 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000960 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000961 func = instance_getattr(inst, setitemstr);
962 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000963 if (func == NULL)
964 return -1;
965 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000969 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000971 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000972 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 res = PyEval_CallObject(func, arg);
974 Py_DECREF(func);
975 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000976 if (res == NULL)
977 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000979 return 0;
980}
981
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000983 (inquiry)instance_length, /* mp_length */
984 (binaryfunc)instance_subscript, /* mp_subscript */
985 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986};
987
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000989instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000992
Guido van Rossum2878a691996-08-09 20:53:24 +0000993 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000994 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000995 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000996 if (func == NULL)
997 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000999 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001001 return NULL;
1002 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 res = PyEval_CallObject(func, arg);
1004 Py_DECREF(func);
1005 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006 return res;
1007}
1008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +00001010sliceobj_from_intint(int i, int j)
1011{
1012 PyObject *start, *end, *res;
1013
1014 start = PyInt_FromLong((long)i);
1015 if (!start)
1016 return NULL;
1017
1018 end = PyInt_FromLong((long)j);
1019 if (!end) {
1020 Py_DECREF(start);
1021 return NULL;
1022 }
1023 res = PySlice_New(start, end, NULL);
1024 Py_DECREF(start);
1025 Py_DECREF(end);
1026 return res;
1027}
1028
1029
1030static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001031instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001032{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 PyObject *func, *arg, *res;
1034 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035
Guido van Rossum2878a691996-08-09 20:53:24 +00001036 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001037 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001038 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001039
1040 if (func == NULL) {
1041 PyErr_Clear();
1042
1043 if (getitemstr == NULL)
1044 getitemstr = PyString_InternFromString("__getitem__");
1045 func = instance_getattr(inst, getitemstr);
1046 if (func == NULL)
1047 return NULL;
1048 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1049 } else
1050 arg = Py_BuildValue("(ii)", i, j);
1051
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054 return NULL;
1055 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 res = PyEval_CallObject(func, arg);
1057 Py_DECREF(func);
1058 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 return res;
1060}
1061
1062static int
Fred Drake79912472000-07-09 04:06:11 +00001063instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001066
Guido van Rossum2878a691996-08-09 20:53:24 +00001067 if (item == NULL) {
1068 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001069 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001070 func = instance_getattr(inst, delitemstr);
1071 }
1072 else {
1073 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001074 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001075 func = instance_getattr(inst, setitemstr);
1076 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001077 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001078 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001081 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001085 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 res = PyEval_CallObject(func, arg);
1088 Py_DECREF(func);
1089 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001090 if (res == NULL)
1091 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093 return 0;
1094}
1095
1096static int
Fred Drake79912472000-07-09 04:06:11 +00001097instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 PyObject *func, *arg, *res;
1100 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001101
Guido van Rossum2878a691996-08-09 20:53:24 +00001102 if (value == NULL) {
1103 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 delslicestr =
1105 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001106 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001107 if (func == NULL) {
1108 PyErr_Clear();
1109 if (delitemstr == NULL)
1110 delitemstr =
1111 PyString_InternFromString("__delitem__");
1112 func = instance_getattr(inst, delitemstr);
1113 if (func == NULL)
1114 return -1;
1115
1116 arg = Py_BuildValue("(N)",
1117 sliceobj_from_intint(i, j));
1118 } else
1119 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001120 }
1121 else {
1122 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 setslicestr =
1124 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001125 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001126 if (func == NULL) {
1127 PyErr_Clear();
1128 if (setitemstr == NULL)
1129 setitemstr =
1130 PyString_InternFromString("__setitem__");
1131 func = instance_getattr(inst, setitemstr);
1132 if (func == NULL)
1133 return -1;
1134
1135 arg = Py_BuildValue("(NO)",
1136 sliceobj_from_intint(i, j), value);
1137 } else
1138 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001139 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001140 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001142 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001143 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 res = PyEval_CallObject(func, arg);
1145 Py_DECREF(func);
1146 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001147 if (res == NULL)
1148 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001150 return 0;
1151}
1152
Tim Peterscb8d3682001-05-05 21:05:01 +00001153static int
1154instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001155{
1156 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001157 PyObject *func;
1158
1159 /* Try __contains__ first.
1160 * If that can't be done, try iterator-based searching.
1161 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001162
1163 if(__contains__ == NULL) {
1164 __contains__ = PyString_InternFromString("__contains__");
1165 if(__contains__ == NULL)
1166 return -1;
1167 }
1168 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001169 if (func) {
1170 PyObject *res;
1171 int ret;
1172 PyObject *arg = Py_BuildValue("(O)", member);
1173 if(arg == NULL) {
1174 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001175 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001176 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001177 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001178 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001179 Py_DECREF(arg);
1180 if(res == NULL)
1181 return -1;
1182 ret = PyObject_IsTrue(res);
1183 Py_DECREF(res);
1184 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001185 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001186
1187 /* Couldn't find __contains__. */
1188 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1189 /* Assume the failure was simply due to that there is no
1190 * __contains__ attribute, and try iterating instead.
1191 */
1192 PyErr_Clear();
1193 return _PySequence_IterContains((PyObject *)inst, member);
1194 }
1195 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001196 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001197}
1198
Fred Drake79912472000-07-09 04:06:11 +00001199static PySequenceMethods
1200instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001201 (inquiry)instance_length, /* sq_length */
1202 0, /* sq_concat */
1203 0, /* sq_repeat */
1204 (intargfunc)instance_item, /* sq_item */
1205 (intintargfunc)instance_slice, /* sq_slice */
1206 (intobjargproc)instance_ass_item, /* sq_ass_item */
1207 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1208 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209};
1210
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001212generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001213{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001215
1216 if ((func = instance_getattr(self, methodname)) == NULL)
1217 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 res = PyEval_CallObject(func, (PyObject *)NULL);
1219 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001220 return res;
1221}
1222
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001223static PyObject *
1224generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001225{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001226 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001228 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001229 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001230 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001231 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001233 Py_INCREF(Py_NotImplemented);
1234 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001235 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001237 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001239 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001240 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001241 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 Py_DECREF(args);
1243 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001244 return result;
1245}
1246
1247
1248static PyObject *coerce_obj;
1249
1250/* Try one half of a binary operator involving a class instance. */
1251static PyObject *
1252half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1253 int swapped)
1254{
1255 PyObject *args;
1256 PyObject *coercefunc;
1257 PyObject *coerced = NULL;
1258 PyObject *v1;
1259 PyObject *result;
1260
1261 if (!PyInstance_Check(v)) {
1262 Py_INCREF(Py_NotImplemented);
1263 return Py_NotImplemented;
1264 }
1265
1266 if (coerce_obj == NULL) {
1267 coerce_obj = PyString_InternFromString("__coerce__");
1268 if (coerce_obj == NULL)
1269 return NULL;
1270 }
1271 coercefunc = PyObject_GetAttr(v, coerce_obj);
1272 if (coercefunc == NULL) {
1273 PyErr_Clear();
1274 return generic_binary_op(v, w, opname);
1275 }
1276
1277 args = Py_BuildValue("(O)", w);
1278 if (args == NULL) {
1279 return NULL;
1280 }
1281 coerced = PyEval_CallObject(coercefunc, args);
1282 Py_DECREF(args);
1283 Py_DECREF(coercefunc);
1284 if (coerced == NULL) {
1285 return NULL;
1286 }
1287 if (coerced == Py_None || coerced == Py_NotImplemented) {
1288 Py_DECREF(coerced);
1289 return generic_binary_op(v, w, opname);
1290 }
1291 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1292 Py_DECREF(coerced);
1293 PyErr_SetString(PyExc_TypeError,
1294 "coercion should return None or 2-tuple");
1295 return NULL;
1296 }
1297 v1 = PyTuple_GetItem(coerced, 0);
1298 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001299 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001300 /* prevent recursion if __coerce__ returns self as the first
1301 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001302 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001303 } else {
1304 if (swapped)
1305 result = (thisfunc)(w, v1);
1306 else
1307 result = (thisfunc)(v1, w);
1308 }
1309 Py_DECREF(coerced);
1310 return result;
1311}
1312
1313/* Implement a binary operator involving at least one class instance. */
1314static PyObject *
1315do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1316 binaryfunc thisfunc)
1317{
1318 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1319 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001320 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001321 result = half_binop(w, v, ropname, thisfunc, 1);
1322 }
1323 return result;
1324}
1325
1326static PyObject *
1327do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1328 char *ropname, binaryfunc thisfunc)
1329{
1330 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1331 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001332 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001333 result = do_binop(v, w, opname, ropname, thisfunc);
1334 }
1335 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001336}
1337
Guido van Rossum879c5811995-01-10 15:24:06 +00001338static int
Fred Drake79912472000-07-09 04:06:11 +00001339instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001340{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 PyObject *v = *pv;
1342 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001343 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 PyObject *args;
1345 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001346
Guido van Rossum2878a691996-08-09 20:53:24 +00001347 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001348 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001349 if (coerce_obj == NULL)
1350 return -1;
1351 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001352 coercefunc = PyObject_GetAttr(v, coerce_obj);
1353 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001354 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001356 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001357 }
1358 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001360 if (args == NULL) {
1361 return -1;
1362 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001363 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001365 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001366 if (coerced == NULL) {
1367 /* __coerce__ call raised an exception */
1368 return -1;
1369 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001370 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001371 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001373 return 1;
1374 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001376 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377 Py_DECREF(coerced);
1378 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001379 "coercion should return None or 2-tuple");
1380 return -1;
1381 }
1382 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 *pv = PyTuple_GetItem(coerced, 0);
1384 *pw = PyTuple_GetItem(coerced, 1);
1385 Py_INCREF(*pv);
1386 Py_INCREF(*pw);
1387 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001388 return 0;
1389}
1390
Guido van Rossum04691fc1992-08-12 15:35:34 +00001391#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001392static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001394 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001395 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001396}
1397
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001398#define BINARY(f, m, n) \
1399static PyObject *f(PyObject *v, PyObject *w) { \
1400 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1401}
1402
1403#define BINARY_INPLACE(f, m, n) \
1404static PyObject *f(PyObject *v, PyObject *w) { \
1405 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1406 "__r" m "__", n); \
1407}
1408
Guido van Rossum04691fc1992-08-12 15:35:34 +00001409UNARY(instance_neg, "__neg__")
1410UNARY(instance_pos, "__pos__")
1411UNARY(instance_abs, "__abs__")
1412
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001413BINARY(instance_or, "or", PyNumber_Or)
1414BINARY(instance_and, "and", PyNumber_And)
1415BINARY(instance_xor, "xor", PyNumber_Xor)
1416BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1417BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1418BINARY(instance_add, "add", PyNumber_Add)
1419BINARY(instance_sub, "sub", PyNumber_Subtract)
1420BINARY(instance_mul, "mul", PyNumber_Multiply)
1421BINARY(instance_div, "div", PyNumber_Divide)
1422BINARY(instance_mod, "mod", PyNumber_Remainder)
1423BINARY(instance_divmod, "divmod", PyNumber_Divmod)
Guido van Rossum4668b002001-08-08 05:00:18 +00001424BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1425BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001426
1427BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1428BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1429BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1430BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1431BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1432BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1433BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1434BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1435BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1436BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
Guido van Rossum4668b002001-08-08 05:00:18 +00001437BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1438BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001439
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001440/* Try a 3-way comparison, returning an int; v is an instance. Return:
1441 -2 for an exception;
1442 -1 if v < w;
1443 0 if v == w;
1444 1 if v > w;
1445 2 if this particular 3-way comparison is not implemented or undefined.
1446*/
1447static int
1448half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001449{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001450 static PyObject *cmp_obj;
1451 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001452 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001453 PyObject *result;
1454 long l;
1455
1456 assert(PyInstance_Check(v));
1457
1458 if (cmp_obj == NULL) {
1459 cmp_obj = PyString_InternFromString("__cmp__");
1460 if (cmp_obj == NULL)
1461 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001462 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001463
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001464 cmp_func = PyObject_GetAttr(v, cmp_obj);
1465 if (cmp_func == NULL) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001466 PyErr_Clear();
1467 return 2;
1468 }
1469
1470 args = Py_BuildValue("(O)", w);
1471 if (args == NULL)
1472 return -2;
1473
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001474 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001475 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001476 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001477
1478 if (result == NULL)
1479 return -2;
1480
1481 if (result == Py_NotImplemented) {
1482 Py_DECREF(result);
1483 return 2;
1484 }
1485
1486 l = PyInt_AsLong(result);
1487 Py_DECREF(result);
1488 if (l == -1 && PyErr_Occurred()) {
1489 PyErr_SetString(PyExc_TypeError,
1490 "comparison did not return an int");
1491 return -2;
1492 }
1493
1494 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001495}
1496
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001497/* Try a 3-way comparison, returning an int; either v or w is an instance.
1498 We first try a coercion. Return:
1499 -2 for an exception;
1500 -1 if v < w;
1501 0 if v == w;
1502 1 if v > w;
1503 2 if this particular 3-way comparison is not implemented or undefined.
1504 THIS IS ONLY CALLED FROM object.c!
1505*/
1506static int
1507instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001508{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001509 int c;
1510
1511 c = PyNumber_CoerceEx(&v, &w);
1512 if (c < 0)
1513 return -2;
1514 if (c == 0) {
1515 /* If neither is now an instance, use regular comparison */
1516 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1517 c = PyObject_Compare(v, w);
1518 Py_DECREF(v);
1519 Py_DECREF(w);
1520 if (PyErr_Occurred())
1521 return -2;
1522 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001523 }
1524 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001525 else {
1526 /* The coercion didn't do anything.
1527 Treat this the same as returning v and w unchanged. */
1528 Py_INCREF(v);
1529 Py_INCREF(w);
1530 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001531
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001532 if (PyInstance_Check(v)) {
1533 c = half_cmp(v, w);
1534 if (c <= 1) {
1535 Py_DECREF(v);
1536 Py_DECREF(w);
1537 return c;
1538 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001539 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001540 if (PyInstance_Check(w)) {
1541 c = half_cmp(w, v);
1542 if (c <= 1) {
1543 Py_DECREF(v);
1544 Py_DECREF(w);
1545 if (c >= -1)
1546 c = -c;
1547 return c;
1548 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001549 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001550 Py_DECREF(v);
1551 Py_DECREF(w);
1552 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001553}
1554
Guido van Rossum9bfef441993-03-29 10:43:31 +00001555static int
Fred Drake79912472000-07-09 04:06:11 +00001556instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001557{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001559 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001561
Guido van Rossum2878a691996-08-09 20:53:24 +00001562 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001563 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001564 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001566 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001567 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001568 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001570 /* Fall back to the default behavior:
1571 all instances are nonzero */
1572 return 1;
1573 }
1574 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575 res = PyEval_CallObject(func, (PyObject *)NULL);
1576 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001577 if (res == NULL)
1578 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 if (!PyInt_Check(res)) {
1580 Py_DECREF(res);
1581 PyErr_SetString(PyExc_TypeError,
1582 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001583 return -1;
1584 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001585 outcome = PyInt_AsLong(res);
1586 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001587 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 PyErr_SetString(PyExc_ValueError,
1589 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001590 return -1;
1591 }
1592 return outcome > 0;
1593}
1594
1595UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001596UNARY(instance_int, "__int__")
1597UNARY(instance_long, "__long__")
1598UNARY(instance_float, "__float__")
1599UNARY(instance_oct, "__oct__")
1600UNARY(instance_hex, "__hex__")
1601
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001602static PyObject *
1603bin_power(PyObject *v, PyObject *w)
1604{
1605 return PyNumber_Power(v, w, Py_None);
1606}
1607
Guido van Rossum03093a21994-09-28 15:51:32 +00001608/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001610instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001611{
1612 if (z == Py_None) {
1613 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001614 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001615 else {
1616 PyObject *func;
1617 PyObject *args;
1618 PyObject *result;
1619
1620 /* XXX Doesn't do coercions... */
1621 func = PyObject_GetAttrString(v, "__pow__");
1622 if (func == NULL)
1623 return NULL;
1624 args = Py_BuildValue("(OO)", w, z);
1625 if (args == NULL) {
1626 Py_DECREF(func);
1627 return NULL;
1628 }
1629 result = PyEval_CallObject(func, args);
1630 Py_DECREF(func);
1631 Py_DECREF(args);
1632 return result;
1633 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001634}
1635
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001636static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001637bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001638{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001639 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001640}
1641
1642
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001643static PyObject *
1644instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1645{
1646 if (z == Py_None) {
1647 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1648 "__rpow__", bin_inplace_power);
1649 }
1650 else {
1651 /* XXX Doesn't do coercions... */
1652 PyObject *func;
1653 PyObject *args;
1654 PyObject *result;
1655
1656 func = PyObject_GetAttrString(v, "__ipow__");
1657 if (func == NULL) {
1658 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1659 return NULL;
1660 PyErr_Clear();
1661 return instance_pow(v, w, z);
1662 }
1663 args = Py_BuildValue("(OO)", w, z);
1664 if (args == NULL) {
1665 Py_DECREF(func);
1666 return NULL;
1667 }
1668 result = PyEval_CallObject(func, args);
1669 Py_DECREF(func);
1670 Py_DECREF(args);
1671 return result;
1672 }
1673}
1674
1675
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001676/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001677#define NAME_OPS 6
1678static PyObject **name_op = NULL;
1679
1680static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001681init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001682{
1683 int i;
1684 char *_name_op[] = {
1685 "__lt__",
1686 "__le__",
1687 "__eq__",
1688 "__ne__",
1689 "__gt__",
1690 "__ge__",
1691 };
1692
1693 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1694 if (name_op == NULL)
1695 return -1;
1696 for (i = 0; i < NAME_OPS; ++i) {
1697 name_op[i] = PyString_InternFromString(_name_op[i]);
1698 if (name_op[i] == NULL)
1699 return -1;
1700 }
1701 return 0;
1702}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001703
1704static PyObject *
1705half_richcompare(PyObject *v, PyObject *w, int op)
1706{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001707 PyObject *method;
1708 PyObject *args;
1709 PyObject *res;
1710
1711 assert(PyInstance_Check(v));
1712
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001713 if (name_op == NULL) {
1714 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001715 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001716 }
1717 /* If the instance doesn't define an __getattr__ method, use
1718 instance_getattr2 directly because it will not set an
1719 exception on failure. */
1720 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
1721 method = instance_getattr2((PyInstanceObject *)v,
1722 name_op[op]);
1723 if (method == NULL) {
1724 assert(!PyErr_Occurred());
1725 res = Py_NotImplemented;
1726 Py_INCREF(res);
1727 return res;
1728 }
1729 } else {
1730 method = PyObject_GetAttr(v, name_op[op]);
1731 if (method == NULL) {
1732 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1733 return NULL;
1734 PyErr_Clear();
1735 res = Py_NotImplemented;
1736 Py_INCREF(res);
1737 return res;
1738 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001739 }
1740
1741 args = Py_BuildValue("(O)", w);
1742 if (args == NULL) {
1743 Py_DECREF(method);
1744 return NULL;
1745 }
1746
1747 res = PyEval_CallObject(method, args);
1748 Py_DECREF(args);
1749 Py_DECREF(method);
1750
1751 return res;
1752}
1753
1754/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1755static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1756
1757static PyObject *
1758instance_richcompare(PyObject *v, PyObject *w, int op)
1759{
1760 PyObject *res;
1761
1762 if (PyInstance_Check(v)) {
1763 res = half_richcompare(v, w, op);
1764 if (res != Py_NotImplemented)
1765 return res;
1766 Py_DECREF(res);
1767 }
1768
1769 if (PyInstance_Check(w)) {
1770 res = half_richcompare(w, v, swapped_op[op]);
1771 if (res != Py_NotImplemented)
1772 return res;
1773 Py_DECREF(res);
1774 }
1775
1776 Py_INCREF(Py_NotImplemented);
1777 return Py_NotImplemented;
1778}
1779
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001780
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001781/* Get the iterator */
1782static PyObject *
1783instance_getiter(PyInstanceObject *self)
1784{
1785 PyObject *func;
1786
1787 if (iterstr == NULL)
1788 iterstr = PyString_InternFromString("__iter__");
1789 if (getitemstr == NULL)
1790 getitemstr = PyString_InternFromString("__getitem__");
1791
1792 if ((func = instance_getattr(self, iterstr)) != NULL) {
1793 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1794 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001795 if (res != NULL && !PyIter_Check(res)) {
1796 PyErr_Format(PyExc_TypeError,
1797 "__iter__ returned non-iterator "
1798 "of type '%.100s'",
1799 res->ob_type->tp_name);
1800 Py_DECREF(res);
1801 res = NULL;
1802 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001803 return res;
1804 }
1805 PyErr_Clear();
1806 if ((func = instance_getattr(self, getitemstr)) == NULL) {
1807 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1808 return NULL;
1809 }
1810 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001811 return PySeqIter_New((PyObject *)self);
1812}
1813
1814
1815/* Call the iterator's next */
1816static PyObject *
1817instance_iternext(PyInstanceObject *self)
1818{
1819 PyObject *func;
1820
1821 if (nextstr == NULL)
1822 nextstr = PyString_InternFromString("next");
1823
1824 if ((func = instance_getattr(self, nextstr)) != NULL) {
1825 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1826 Py_DECREF(func);
1827 if (res != NULL) {
1828 return res;
1829 }
1830 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1831 PyErr_Clear();
1832 return NULL;
1833 }
1834 return NULL;
1835 }
1836 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1837 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001838}
1839
Tim Peters6d6c1a32001-08-02 04:15:00 +00001840static PyObject *
1841instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1842{
1843 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1844 if (call == NULL) {
1845 PyInstanceObject *inst = (PyInstanceObject*) func;
1846 PyErr_Clear();
1847 PyErr_Format(PyExc_AttributeError,
1848 "%.200s instance has no __call__ method",
1849 PyString_AsString(inst->in_class->cl_name));
1850 return NULL;
1851 }
1852 res = PyObject_Call(call, arg, kw);
1853 Py_DECREF(call);
1854 return res;
1855}
1856
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001857
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001858static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001859 (binaryfunc)instance_add, /* nb_add */
1860 (binaryfunc)instance_sub, /* nb_subtract */
1861 (binaryfunc)instance_mul, /* nb_multiply */
1862 (binaryfunc)instance_div, /* nb_divide */
1863 (binaryfunc)instance_mod, /* nb_remainder */
1864 (binaryfunc)instance_divmod, /* nb_divmod */
1865 (ternaryfunc)instance_pow, /* nb_power */
1866 (unaryfunc)instance_neg, /* nb_negative */
1867 (unaryfunc)instance_pos, /* nb_positive */
1868 (unaryfunc)instance_abs, /* nb_absolute */
1869 (inquiry)instance_nonzero, /* nb_nonzero */
1870 (unaryfunc)instance_invert, /* nb_invert */
1871 (binaryfunc)instance_lshift, /* nb_lshift */
1872 (binaryfunc)instance_rshift, /* nb_rshift */
1873 (binaryfunc)instance_and, /* nb_and */
1874 (binaryfunc)instance_xor, /* nb_xor */
1875 (binaryfunc)instance_or, /* nb_or */
1876 (coercion)instance_coerce, /* nb_coerce */
1877 (unaryfunc)instance_int, /* nb_int */
1878 (unaryfunc)instance_long, /* nb_long */
1879 (unaryfunc)instance_float, /* nb_float */
1880 (unaryfunc)instance_oct, /* nb_oct */
1881 (unaryfunc)instance_hex, /* nb_hex */
1882 (binaryfunc)instance_iadd, /* nb_inplace_add */
1883 (binaryfunc)instance_isub, /* nb_inplace_subtract */
1884 (binaryfunc)instance_imul, /* nb_inplace_multiply */
1885 (binaryfunc)instance_idiv, /* nb_inplace_divide */
1886 (binaryfunc)instance_imod, /* nb_inplace_remainder */
1887 (ternaryfunc)instance_ipow, /* nb_inplace_power */
1888 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
1889 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
1890 (binaryfunc)instance_iand, /* nb_inplace_and */
1891 (binaryfunc)instance_ixor, /* nb_inplace_xor */
1892 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum4668b002001-08-08 05:00:18 +00001893 (binaryfunc)instance_floordiv, /* nb_floor_divide */
1894 (binaryfunc)instance_truediv, /* nb_true_divide */
1895 (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
1896 (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001897};
1898
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001899PyTypeObject PyInstance_Type = {
1900 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001901 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001902 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001903 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001904 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001905 (destructor)instance_dealloc, /* tp_dealloc */
1906 0, /* tp_print */
1907 0, /* tp_getattr */
1908 0, /* tp_setattr */
1909 instance_compare, /* tp_compare */
1910 (reprfunc)instance_repr, /* tp_repr */
1911 &instance_as_number, /* tp_as_number */
1912 &instance_as_sequence, /* tp_as_sequence */
1913 &instance_as_mapping, /* tp_as_mapping */
1914 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001915 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00001916 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001917 (getattrofunc)instance_getattr, /* tp_getattro */
1918 (setattrofunc)instance_setattr, /* tp_setattro */
1919 0, /* tp_as_buffer */
1920 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
1921 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00001922 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001923 0, /* tp_clear */
1924 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001925 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
1926 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001927 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001928};
1929
1930
Guido van Rossum81daa321993-05-20 14:24:46 +00001931/* Instance method objects are used for two purposes:
1932 (a) as bound instance methods (returned by instancename.methodname)
1933 (b) as unbound methods (returned by ClassName.methodname)
1934 In case (b), im_self is NULL
1935*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001936
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001937static PyMethodObject *free_list;
1938
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001939PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001940PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001941{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001943 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001944 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001945 return NULL;
1946 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001947 im = free_list;
1948 if (im != NULL) {
1949 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001950 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001951 }
1952 else {
1953 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1954 if (im == NULL)
1955 return NULL;
1956 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00001957 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001958 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001959 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001960 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001961 im->im_self = self;
Guido van Rossumcdf0d752001-08-17 12:07:34 +00001962 Py_XINCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001963 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001964 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001965 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001966}
1967
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001968/* Class method methods */
1969
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001970#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001971
Guido van Rossume8122f11991-05-05 20:03:07 +00001972static struct memberlist instancemethod_memberlist[] = {
1973 {"im_func", T_OBJECT, OFF(im_func)},
1974 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001975 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001976 /* Dummies that are not handled by getattr() except for __members__ */
1977 {"__doc__", T_INT, 0},
1978 {"__name__", T_INT, 0},
Barry Warsawd6a9e842001-01-15 20:40:19 +00001979 {"__dict__", T_OBJECT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980 {NULL} /* Sentinel */
1981};
1982
Barry Warsawd6a9e842001-01-15 20:40:19 +00001983static int
1984instancemethod_setattro(register PyMethodObject *im, PyObject *name,
1985 PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001987 char *sname = PyString_AsString(name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00001988
Barry Warsaw4f9b13b2001-02-26 18:09:15 +00001989 PyErr_Format(PyExc_TypeError, "read-only attribute: %s", sname);
1990 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +00001991}
1992
1993
1994static PyObject *
1995instancemethod_getattro(register PyMethodObject *im, PyObject *name)
1996{
1997 PyObject *rtn;
1998 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001999 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00002000 /* Inherit __name__ and __doc__ from the callable object
2001 implementing the method */
2002 if (strcmp(sname, "__name__") == 0 ||
2003 strcmp(sname, "__doc__") == 0)
2004 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00002005 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006 if (PyEval_GetRestricted()) {
2007 PyErr_SetString(PyExc_RuntimeError,
2008 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00002009 return NULL;
2010 }
Barry Warsawd6a9e842001-01-15 20:40:19 +00002011 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0)
2012 return PyObject_GetAttr(im->im_func, name);
2013
2014 rtn = PyMember_Get((char *)im, instancemethod_memberlist, sname);
2015 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
2016 PyErr_Clear();
2017 rtn = PyObject_GetAttr(im->im_func, name);
2018 }
2019 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002020}
2021
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002022static void
Fred Drake79912472000-07-09 04:06:11 +00002023instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002024{
Fred Drakedb81e8d2001-03-23 04:19:27 +00002025 PyObject_ClearWeakRefs((PyObject *)im);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002026 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027 Py_DECREF(im->im_func);
2028 Py_XDECREF(im->im_self);
Guido van Rossumcdf0d752001-08-17 12:07:34 +00002029 Py_XDECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002030 im->im_self = (PyObject *)free_list;
2031 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002032}
2033
Guido van Rossumebc8c511992-09-03 20:39:51 +00002034static int
Fred Drake79912472000-07-09 04:06:11 +00002035instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002036{
Guido van Rossume9df7271995-04-06 14:46:51 +00002037 if (a->im_self != b->im_self)
2038 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002039 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002040}
2041
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002042static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002043instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002044{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002045 char buffer[240];
2046 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002047 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002048 PyObject *klass = a->im_class;
2049 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2050 char *sfuncname = "?", *sklassname = "?";
2051
2052 funcname = PyObject_GetAttrString(func, "__name__");
2053 if (funcname == NULL)
2054 PyErr_Clear();
2055 else if (!PyString_Check(funcname)) {
2056 Py_DECREF(funcname);
2057 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002058 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002059 else
2060 sfuncname = PyString_AS_STRING(funcname);
Guido van Rossum40667692001-08-17 13:59:27 +00002061 if (klass == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002062 klassname = NULL;
Guido van Rossum40667692001-08-17 13:59:27 +00002063 else {
2064 klassname = PyObject_GetAttrString(klass, "__name__");
2065 if (klassname == NULL)
2066 PyErr_Clear();
2067 else if (!PyString_Check(klassname)) {
2068 Py_DECREF(klassname);
2069 klassname = NULL;
2070 }
2071 else
2072 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum7859f871998-07-08 14:58:16 +00002073 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002074 if (self == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002075 sprintf(buffer, "<unbound method %.100s.%.100s>",
2076 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002077 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002078 /* XXX Shouldn't use repr() here! */
2079 PyObject *selfrepr = PyObject_Repr(self);
2080 if (selfrepr == NULL)
2081 goto fail;
2082 if (!PyString_Check(selfrepr)) {
2083 Py_DECREF(selfrepr);
2084 goto fail;
2085 }
2086 sprintf(buffer, "<bound method %.60s.%.60s of %.60s>",
2087 sklassname, sfuncname, PyString_AS_STRING(selfrepr));
2088 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002089 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002090 result = PyString_FromString(buffer);
2091 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002092 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002093 Py_XDECREF(klassname);
2094 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002095}
2096
Guido van Rossum9bfef441993-03-29 10:43:31 +00002097static long
Fred Drake79912472000-07-09 04:06:11 +00002098instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002099{
2100 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002101 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002102 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002103 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002104 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002105 if (x == -1)
2106 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002107 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002108 if (y == -1)
2109 return -1;
2110 return x ^ y;
2111}
2112
Jeremy Hylton8caad492000-06-23 14:18:11 +00002113static int
2114instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2115{
2116 int err;
2117 if (im->im_func) {
2118 err = visit(im->im_func, arg);
2119 if (err)
2120 return err;
2121 }
2122 if (im->im_self) {
2123 err = visit(im->im_self, arg);
2124 if (err)
2125 return err;
2126 }
2127 if (im->im_class) {
2128 err = visit(im->im_class, arg);
2129 if (err)
2130 return err;
2131 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002132 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002133}
2134
Tim Peters6d6c1a32001-08-02 04:15:00 +00002135static PyObject *
2136instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2137{
2138 PyObject *self = PyMethod_GET_SELF(func);
2139 PyObject *class = PyMethod_GET_CLASS(func);
2140 PyObject *result;
2141
2142 func = PyMethod_GET_FUNCTION(func);
2143 if (self == NULL) {
2144 /* Unbound methods must be called with an instance of
2145 the class (or a derived class) as first argument */
2146 int ok;
2147 if (PyTuple_Size(arg) >= 1)
2148 self = PyTuple_GET_ITEM(arg, 0);
2149 if (self == NULL)
2150 ok = 0;
2151 else {
2152 ok = PyObject_IsInstance(self, class);
2153 if (ok < 0)
2154 return NULL;
2155 }
2156 if (!ok) {
2157 PyErr_Format(PyExc_TypeError,
2158 "unbound method %s%s must be "
2159 "called with instance as first argument",
2160 PyEval_GetFuncName(func),
2161 PyEval_GetFuncDesc(func));
2162 return NULL;
2163 }
2164 Py_INCREF(arg);
2165 }
2166 else {
2167 int argcount = PyTuple_Size(arg);
2168 PyObject *newarg = PyTuple_New(argcount + 1);
2169 int i;
2170 if (newarg == NULL)
2171 return NULL;
2172 Py_INCREF(self);
2173 PyTuple_SET_ITEM(newarg, 0, self);
2174 for (i = 0; i < argcount; i++) {
2175 PyObject *v = PyTuple_GET_ITEM(arg, i);
2176 Py_XINCREF(v);
2177 PyTuple_SET_ITEM(newarg, i+1, v);
2178 }
2179 arg = newarg;
2180 }
2181 result = PyObject_Call((PyObject *)func, arg, kw);
2182 Py_DECREF(arg);
2183 return result;
2184}
2185
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002186static PyObject *
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002187instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *class)
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002188{
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002189 /* Don't rebind an already bound method, or an unbound method
2190 of a class that's not a base class of class */
2191 if (PyMethod_GET_SELF(meth) != NULL ||
2192 (PyMethod_GET_CLASS(meth) != NULL &&
2193 !PyObject_IsSubclass(class, PyMethod_GET_CLASS(meth)))) {
Guido van Rossum501c7c72001-08-16 20:41:56 +00002194 Py_INCREF(meth);
2195 return meth;
2196 }
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002197 if (obj == Py_None)
2198 obj = NULL;
Guido van Rossumf23c41d2001-08-17 13:43:27 +00002199 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class);
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002200}
2201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002202PyTypeObject PyMethod_Type = {
2203 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002204 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00002205 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002206 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002207 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002208 (destructor)instancemethod_dealloc, /* tp_dealloc */
2209 0, /* tp_print */
2210 0, /* tp_getattr */
2211 0, /* tp_setattr */
2212 (cmpfunc)instancemethod_compare, /* tp_compare */
2213 (reprfunc)instancemethod_repr, /* tp_repr */
2214 0, /* tp_as_number */
2215 0, /* tp_as_sequence */
2216 0, /* tp_as_mapping */
2217 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002218 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002219 0, /* tp_str */
2220 (getattrofunc)instancemethod_getattro, /* tp_getattro */
2221 (setattrofunc)instancemethod_setattro, /* tp_setattro */
2222 0, /* tp_as_buffer */
Fred Drake4dcb85b2001-05-03 16:04:13 +00002223 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002224 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002225 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002226 0, /* tp_clear */
2227 0, /* tp_richcompare */
Guido van Rossum23cc2b42001-08-15 17:52:31 +00002228 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2229 0, /* tp_iter */
2230 0, /* tp_iternext */
2231 0, /* tp_methods */
2232 0, /* tp_members */
2233 0, /* tp_getset */
2234 0, /* tp_base */
2235 0, /* tp_dict */
2236 instancemethod_descr_get, /* tp_descr_get */
2237 0, /* tp_descr_set */
2238 0, /* tp_dictoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002239};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002240
2241/* Clear out the free list */
2242
2243void
Fred Drake79912472000-07-09 04:06:11 +00002244PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002245{
2246 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002247 PyMethodObject *im = free_list;
2248 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00002249 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002250 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002251 }
2252}