blob: c4b1d8e1f9b9f04875bd5c4736f0622380d631cd [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 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000196 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 if (PyFunction_Check(v)) {
198 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
199 (PyObject *)class);
200 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000201 v = w;
202 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000203 f = v->ob_type->tp_descr_get;
204 if (f == NULL)
205 Py_INCREF(v);
206 else
207 v = f(v, (PyObject *)NULL, (PyObject *)op);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000208 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209}
210
Guido van Rossuma63eff61998-05-29 21:37:21 +0000211static void
Fred Drake79912472000-07-09 04:06:11 +0000212set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000213{
214 PyObject *temp = *slot;
215 Py_XINCREF(v);
216 *slot = v;
217 Py_XDECREF(temp);
218}
219
Guido van Rossum7ba30431998-07-08 13:34:48 +0000220static void
Fred Drake79912472000-07-09 04:06:11 +0000221set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000222{
223 PyClassObject *dummy;
224
225 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
226 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
227 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
228}
229
Guido van Rossuma63eff61998-05-29 21:37:21 +0000230static char *
Fred Drake79912472000-07-09 04:06:11 +0000231set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000232{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000233 if (v == NULL || !PyDict_Check(v))
234 return "__dict__ must be a dictionary object";
235 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000236 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000237 return "";
238}
239
240static char *
Fred Drake79912472000-07-09 04:06:11 +0000241set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000242{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000243 int i, n;
244
245 if (v == NULL || !PyTuple_Check(v))
246 return "__bases__ must be a tuple object";
247 n = PyTuple_Size(v);
248 for (i = 0; i < n; i++) {
249 PyObject *x = PyTuple_GET_ITEM(v, i);
250 if (!PyClass_Check(x))
251 return "__bases__ items must be classes";
252 if (PyClass_IsSubclass(x, (PyObject *)c))
253 return "a __bases__ item causes an inheritance cycle";
254 }
255 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000256 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000257 return "";
258}
259
260static char *
Fred Drake79912472000-07-09 04:06:11 +0000261set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000262{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000263 if (v == NULL || !PyString_Check(v))
264 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000265 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000266 return "__name__ must not contain null bytes";
267 set_slot(&c->cl_name, v);
268 return "";
269}
270
Guido van Rossum94308391991-10-20 20:11:48 +0000271static int
Fred Drake79912472000-07-09 04:06:11 +0000272class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000273{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000274 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 if (PyEval_GetRestricted()) {
276 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000277 "classes are read-only in restricted mode");
278 return -1;
279 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000280 sname = PyString_AsString(name);
281 if (sname[0] == '_' && sname[1] == '_') {
282 int n = PyString_Size(name);
283 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000284 char *err = NULL;
285 if (strcmp(sname, "__dict__") == 0)
286 err = set_dict(op, v);
287 else if (strcmp(sname, "__bases__") == 0)
288 err = set_bases(op, v);
289 else if (strcmp(sname, "__name__") == 0)
290 err = set_name(op, v);
291 else if (strcmp(sname, "__getattr__") == 0)
292 set_slot(&op->cl_getattr, v);
293 else if (strcmp(sname, "__setattr__") == 0)
294 set_slot(&op->cl_setattr, v);
295 else if (strcmp(sname, "__delattr__") == 0)
296 set_slot(&op->cl_delattr, v);
297 /* For the last three, we fall through to update the
298 dictionary as well. */
299 if (err != NULL) {
300 if (*err == '\0')
301 return 0;
302 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000303 return -1;
304 }
305 }
306 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000307 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000309 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000310 PyErr_Format(PyExc_AttributeError,
311 "class %.50s has no attribute '%.400s'",
312 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000313 return rv;
314 }
Guido van Rossum94308391991-10-20 20:11:48 +0000315 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000317}
318
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000320class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000321{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000322 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000323 char buf[140];
324 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000326 name = "?";
327 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000329 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000330 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000331 else
Fred Drakea44d3532000-06-30 15:01:00 +0000332 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000333 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000334 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000336}
337
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000338static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000339class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000340{
341 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
342 PyObject *name = op->cl_name;
343 PyObject *res;
344 int m, n;
345
346 if (name == NULL || !PyString_Check(name))
347 return class_repr(op);
348 if (mod == NULL || !PyString_Check(mod)) {
349 Py_INCREF(name);
350 return name;
351 }
352 m = PyString_Size(mod);
353 n = PyString_Size(name);
354 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
355 if (res != NULL) {
356 char *s = PyString_AsString(res);
357 memcpy(s, PyString_AsString(mod), m);
358 s += m;
359 *s++ = '.';
360 memcpy(s, PyString_AsString(name), n);
361 }
362 return res;
363}
364
Jeremy Hylton8caad492000-06-23 14:18:11 +0000365static int
366class_traverse(PyClassObject *o, visitproc visit, void *arg)
367{
368 int err;
369 if (o->cl_bases) {
370 err = visit(o->cl_bases, arg);
371 if (err)
372 return err;
373 }
374 if (o->cl_dict) {
375 err = visit(o->cl_dict, arg);
376 if (err)
377 return err;
378 }
379 if (o->cl_name) {
380 err = visit(o->cl_name, arg);
381 if (err)
382 return err;
383 }
384 if (o->cl_getattr) {
385 err = visit(o->cl_getattr, arg);
386 if (err)
387 return err;
388 }
389 if (o->cl_setattr) {
390 err = visit(o->cl_setattr, arg);
391 if (err)
392 return err;
393 }
394 if (o->cl_delattr) {
395 err = visit(o->cl_delattr, arg);
396 if (err)
397 return err;
398 }
399 return 0;
400}
401
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402PyTypeObject PyClass_Type = {
403 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404 0,
405 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000406 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000408 (destructor)class_dealloc, /* tp_dealloc */
409 0, /* tp_print */
410 0, /* tp_getattr */
411 0, /* tp_setattr */
412 0, /* tp_compare */
413 (reprfunc)class_repr, /* tp_repr */
414 0, /* tp_as_number */
415 0, /* tp_as_sequence */
416 0, /* tp_as_mapping */
417 0, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000418 PyInstance_New, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +0000419 (reprfunc)class_str, /* tp_str */
420 (getattrofunc)class_getattr, /* tp_getattro */
421 (setattrofunc)class_setattr, /* tp_setattro */
422 0, /* tp_as_buffer */
423 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
424 0, /* tp_doc */
425 (traverseproc)class_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000426 0, /* tp_clear */
427 0, /* tp_richcompare */
428 0, /* tp_weaklistoffset */
429 0, /* tp_iter */
430 0, /* tp_iternext */
431 0, /* tp_methods */
432 0, /* tp_members */
433 0, /* tp_getset */
434 0, /* tp_base */
435 0, /* tp_dict */
436 0, /* tp_descr_get */
437 0, /* tp_descr_set */
438 0, /* tp_dictoffset */
439 0, /* tp_init */
440 0, /* tp_alloc */
441 class_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442};
443
Guido van Rossum81daa321993-05-20 14:24:46 +0000444int
Fred Drake79912472000-07-09 04:06:11 +0000445PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000446{
447 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000449 if (class == base)
450 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000452 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 cp = (PyClassObject *)class;
454 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000455 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000457 return 1;
458 }
459 return 0;
460}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461
Guido van Rossum81daa321993-05-20 14:24:46 +0000462
463/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465PyObject *
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000466PyInstance_NewRaw(PyObject *klass, PyObject *dict)
467{
468 PyInstanceObject *inst;
469
470 if (!PyClass_Check(klass)) {
471 PyErr_BadInternalCall();
472 return NULL;
473 }
474 if (dict == NULL) {
475 dict = PyDict_New();
476 if (dict == NULL)
477 return NULL;
478 }
479 else {
480 if (!PyDict_Check(dict)) {
481 PyErr_BadInternalCall();
482 return NULL;
483 }
484 Py_INCREF(dict);
485 }
486 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
487 if (inst == NULL) {
488 Py_DECREF(dict);
489 return NULL;
490 }
Fred Drake4e262a92001-03-22 18:26:47 +0000491 inst->in_weakreflist = NULL;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000492 Py_INCREF(klass);
493 inst->in_class = (PyClassObject *)klass;
494 inst->in_dict = dict;
495 PyObject_GC_Init(inst);
496 return (PyObject *)inst;
497}
498
499PyObject *
500PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 register PyInstanceObject *inst;
503 PyObject *init;
504 static PyObject *initstr;
Fred Drake5cc2c8c2001-01-28 03:53:08 +0000505
506 inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
Guido van Rossume8122f11991-05-05 20:03:07 +0000507 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508 return NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000509 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000510 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000511 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000512 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 if ((arg != NULL && (!PyTuple_Check(arg) ||
514 PyTuple_Size(arg) != 0))
515 || (kw != NULL && (!PyDict_Check(kw) ||
516 PyDict_Size(kw) != 0))) {
517 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000518 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000520 inst = NULL;
521 }
522 }
523 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
525 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000526 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 inst = NULL;
529 }
530 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 if (res != Py_None) {
532 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000533 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000535 inst = NULL;
536 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000538 }
539 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541}
542
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000543/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544
545static void
Fred Drake79912472000-07-09 04:06:11 +0000546instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000547{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 PyObject *error_type, *error_value, *error_traceback;
549 PyObject *del;
550 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000551#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000552 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000553#endif
Fred Drake41deb1e2001-02-01 05:27:45 +0000554
Fred Drakeb60654b2001-02-26 18:56:37 +0000555 PyObject_ClearWeakRefs((PyObject *) inst);
Fred Drake41deb1e2001-02-01 05:27:45 +0000556
Tim Peters6b184912000-09-17 14:40:17 +0000557 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000558#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000559#ifndef Py_REF_DEBUG
560# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
561#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000562 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000564 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000565#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000566 /* compensate for boost in _Py_NewReference; note that
567 * _Py_RefTotal was also boosted; we'll knock that down later.
568 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000569 inst->ob_type->tp_allocs--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000570#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000571#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000572 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000574#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000575
576 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000578 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000579 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000580 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000581 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000583 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000584 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000585 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 Py_DECREF(res);
587 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000588 }
Tim Peters6b184912000-09-17 14:40:17 +0000589 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000591 /* Undo the temporary resurrection; can't use DECREF here, it would
592 * cause a recursive call.
593 */
594#ifdef Py_REF_DEBUG
595 /* _Py_RefTotal was boosted either by _Py_NewReference or
596 * Py_INCREF above.
597 */
598 _Py_RefTotal--;
599#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000600 if (--inst->ob_refcnt > 0) {
601#ifdef COUNT_ALLOCS
Tim Peters6d6c1a32001-08-02 04:15:00 +0000602 inst->ob_type->tp_frees--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000603#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000604 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000605 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000606#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000607 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000608#ifdef COUNT_ALLOCS
609 /* compensate for increment in _Py_ForgetReference */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000610 inst->ob_type->tp_frees--;
Tim Peters6b184912000-09-17 14:40:17 +0000611#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000612#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000613 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000614#endif
Tim Peters6b184912000-09-17 14:40:17 +0000615#endif
Neil Schemenauerce209672000-09-15 18:57:21 +0000616 PyObject_GC_Fini(inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 Py_DECREF(inst->in_class);
618 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000619 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000620 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000621}
622
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000624instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 register PyObject *v;
627 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000628 if (sname[0] == '_' && sname[1] == '_') {
629 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 if (PyEval_GetRestricted()) {
631 PyErr_SetString(PyExc_RuntimeError,
632 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000633 return NULL;
634 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000636 return inst->in_dict;
637 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000638 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 Py_INCREF(inst->in_class);
640 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000641 }
Guido van Rossum94308391991-10-20 20:11:48 +0000642 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000643 v = instance_getattr2(inst, name);
644 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000645 PyErr_Format(PyExc_AttributeError,
646 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000647 PyString_AS_STRING(inst->in_class->cl_name), sname);
648 }
649 return v;
650}
651
652static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000653instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000654{
655 register PyObject *v;
656 PyClassObject *class;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000657 descrgetfunc f;
658
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000659 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000661 if (v == NULL) {
662 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000663 if (v == NULL)
664 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000665 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000666 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000667 if (class != NULL) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000668 f = v->ob_type->tp_descr_get;
669 if (f != NULL) {
670 PyObject *w = f(v, (PyObject *)inst,
671 (PyObject *)(inst->in_class));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000673 v = w;
674 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 else if (PyMethod_Check(v)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676 /* XXX This should be a tp_descr_get slot of
677 PyMethodObjects */
678 PyObject *im_class = PyMethod_GET_CLASS(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000679 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000681 PyObject *im_func = PyMethod_GET_FUNCTION(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 PyObject *w = PyMethod_New(im_func,
683 (PyObject *)inst, im_class);
684 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000685 v = w;
686 }
687 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000688 }
689 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690}
691
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000693instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000694{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000696 res = instance_getattr1(inst, name);
697 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698 PyObject *args;
699 PyErr_Clear();
700 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000701 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000702 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 res = PyEval_CallObject(func, args);
704 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000705 }
706 return res;
707}
708
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000709static int
Fred Drake79912472000-07-09 04:06:11 +0000710instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000711{
Guido van Rossum94472a01992-09-04 09:45:18 +0000712 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000714 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000715 PyErr_Format(PyExc_AttributeError,
716 "%.50s instance has no attribute '%.400s'",
717 PyString_AS_STRING(inst->in_class->cl_name),
718 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000719 return rv;
720 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000721 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723}
724
Guido van Rossume7737541994-09-05 07:31:41 +0000725static int
Fred Drake79912472000-07-09 04:06:11 +0000726instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000727{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000728 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000730 if (sname[0] == '_' && sname[1] == '_') {
731 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000732 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000733 if (strcmp(sname, "__dict__") == 0) {
734 if (PyEval_GetRestricted()) {
735 PyErr_SetString(PyExc_RuntimeError,
736 "__dict__ not accessible in restricted mode");
737 return -1;
738 }
739 if (v == NULL || !PyDict_Check(v)) {
740 PyErr_SetString(PyExc_TypeError,
741 "__dict__ must be set to a dictionary");
742 return -1;
743 }
744 tmp = inst->in_dict;
745 Py_INCREF(v);
746 inst->in_dict = v;
747 Py_DECREF(tmp);
748 return 0;
749 }
750 if (strcmp(sname, "__class__") == 0) {
751 if (PyEval_GetRestricted()) {
752 PyErr_SetString(PyExc_RuntimeError,
753 "__class__ not accessible in restricted mode");
754 return -1;
755 }
756 if (v == NULL || !PyClass_Check(v)) {
757 PyErr_SetString(PyExc_TypeError,
758 "__class__ must be set to a class");
759 return -1;
760 }
761 tmp = (PyObject *)(inst->in_class);
762 Py_INCREF(v);
763 inst->in_class = (PyClassObject *)v;
764 Py_DECREF(tmp);
765 return 0;
766 }
Guido van Rossume7737541994-09-05 07:31:41 +0000767 }
Guido van Rossume7737541994-09-05 07:31:41 +0000768 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000769 if (v == NULL)
770 func = inst->in_class->cl_delattr;
771 else
772 func = inst->in_class->cl_setattr;
773 if (func == NULL)
774 return instance_setattr1(inst, name, v);
775 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000777 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000779 if (args == NULL)
780 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 res = PyEval_CallObject(func, args);
782 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000783 if (res == NULL)
784 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000786 return 0;
787}
788
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000790instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000791{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 PyObject *func;
793 PyObject *res;
794 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000795
Guido van Rossum2878a691996-08-09 20:53:24 +0000796 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000797 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000798 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000800 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000802 PyObject *mod = PyDict_GetItemString(
803 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000804 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 if (classname != NULL && PyString_Check(classname))
806 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000807 else
808 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000810 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000811 sprintf(buf, "<?.%.100s instance at %p>",
812 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000813 else
Fred Drakea44d3532000-06-30 15:01:00 +0000814 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000815 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000816 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000818 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 res = PyEval_CallObject(func, (PyObject *)NULL);
820 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000821 return res;
822}
823
Guido van Rossum82c690f2001-04-30 14:39:18 +0000824static PyObject *
825instance_str(PyInstanceObject *inst)
826{
827 PyObject *func;
828 PyObject *res;
829 static PyObject *strstr;
830
831 if (strstr == NULL)
832 strstr = PyString_InternFromString("__str__");
833 func = instance_getattr(inst, strstr);
834 if (func == NULL) {
835 PyErr_Clear();
836 return instance_repr(inst);
837 }
838 res = PyEval_CallObject(func, (PyObject *)NULL);
839 Py_DECREF(func);
840 return res;
841}
842
Guido van Rossum9bfef441993-03-29 10:43:31 +0000843static long
Fred Drake79912472000-07-09 04:06:11 +0000844instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000845{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 PyObject *func;
847 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000848 long outcome;
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000849 static PyObject *hashstr, *eqstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000850
Guido van Rossum2878a691996-08-09 20:53:24 +0000851 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000852 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000853 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000854 if (func == NULL) {
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000855 /* If there is no __eq__ and no __cmp__ method, we hash on the
856 address. If an __eq__ or __cmp__ method exists, there must
857 be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000859 if (eqstr == NULL)
860 eqstr = PyString_InternFromString("__eq__");
861 func = instance_getattr(inst, eqstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000862 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000863 PyErr_Clear();
Guido van Rossum65e8bd72001-01-18 23:46:31 +0000864 if (cmpstr == NULL)
865 cmpstr = PyString_InternFromString("__cmp__");
866 func = instance_getattr(inst, cmpstr);
867 if (func == NULL) {
868 PyErr_Clear();
869 return _Py_HashPointer(inst);
870 }
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000871 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873 return -1;
874 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 res = PyEval_CallObject(func, (PyObject *)NULL);
876 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000877 if (res == NULL)
878 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 if (PyInt_Check(res)) {
880 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000881 if (outcome == -1)
882 outcome = -2;
883 }
884 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 PyErr_SetString(PyExc_TypeError,
886 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000887 outcome = -1;
888 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000890 return outcome;
891}
892
Jeremy Hylton8caad492000-06-23 14:18:11 +0000893static int
894instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
895{
896 int err;
897 if (o->in_class) {
898 err = visit((PyObject *)(o->in_class), arg);
899 if (err)
900 return err;
901 }
902 if (o->in_dict) {
903 err = visit(o->in_dict, arg);
904 if (err)
905 return err;
906 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000907 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000908}
909
Guido van Rossum213c7a62001-04-23 14:08:49 +0000910static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
911static PyObject *iterstr, *nextstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000912
Guido van Rossum9bfef441993-03-29 10:43:31 +0000913static int
Fred Drake79912472000-07-09 04:06:11 +0000914instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 PyObject *func;
917 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000918 int outcome;
919
Guido van Rossum2878a691996-08-09 20:53:24 +0000920 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000921 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000922 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923 if (func == NULL)
924 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 res = PyEval_CallObject(func, (PyObject *)NULL);
926 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000927 if (res == NULL)
928 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 if (PyInt_Check(res)) {
930 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyErr_SetString(PyExc_ValueError,
933 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934 }
935 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 PyErr_SetString(PyExc_TypeError,
937 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938 outcome = -1;
939 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000941 return outcome;
942}
943
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000945instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000946{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 PyObject *func;
948 PyObject *arg;
949 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000950
Guido van Rossum2878a691996-08-09 20:53:24 +0000951 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000952 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000953 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000954 if (func == NULL)
955 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000956 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000959 return NULL;
960 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 res = PyEval_CallObject(func, arg);
962 Py_DECREF(func);
963 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964 return res;
965}
966
Guido van Rossum9bfef441993-03-29 10:43:31 +0000967static int
Fred Drake79912472000-07-09 04:06:11 +0000968instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000969{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 PyObject *func;
971 PyObject *arg;
972 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000973
Guido van Rossum2878a691996-08-09 20:53:24 +0000974 if (value == NULL) {
975 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000976 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000977 func = instance_getattr(inst, delitemstr);
978 }
979 else {
980 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000981 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000982 func = instance_getattr(inst, setitemstr);
983 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000984 if (func == NULL)
985 return -1;
986 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000992 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 res = PyEval_CallObject(func, arg);
995 Py_DECREF(func);
996 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997 if (res == NULL)
998 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 return 0;
1001}
1002
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003static PyMappingMethods instance_as_mapping = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001004 (inquiry)instance_length, /* mp_length */
1005 (binaryfunc)instance_subscript, /* mp_subscript */
1006 (objobjargproc)instance_ass_subscript, /* mp_ass_subscript */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001007};
1008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001010instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001011{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013
Guido van Rossum2878a691996-08-09 20:53:24 +00001014 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001015 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001016 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017 if (func == NULL)
1018 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 return NULL;
1023 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 res = PyEval_CallObject(func, arg);
1025 Py_DECREF(func);
1026 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027 return res;
1028}
1029
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +00001031sliceobj_from_intint(int i, int j)
1032{
1033 PyObject *start, *end, *res;
1034
1035 start = PyInt_FromLong((long)i);
1036 if (!start)
1037 return NULL;
1038
1039 end = PyInt_FromLong((long)j);
1040 if (!end) {
1041 Py_DECREF(start);
1042 return NULL;
1043 }
1044 res = PySlice_New(start, end, NULL);
1045 Py_DECREF(start);
1046 Py_DECREF(end);
1047 return res;
1048}
1049
1050
1051static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001052instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 PyObject *func, *arg, *res;
1055 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056
Guido van Rossum2878a691996-08-09 20:53:24 +00001057 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001058 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001059 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001060
1061 if (func == NULL) {
1062 PyErr_Clear();
1063
1064 if (getitemstr == NULL)
1065 getitemstr = PyString_InternFromString("__getitem__");
1066 func = instance_getattr(inst, getitemstr);
1067 if (func == NULL)
1068 return NULL;
1069 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1070 } else
1071 arg = Py_BuildValue("(ii)", i, j);
1072
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075 return NULL;
1076 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 res = PyEval_CallObject(func, arg);
1078 Py_DECREF(func);
1079 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080 return res;
1081}
1082
1083static int
Fred Drake79912472000-07-09 04:06:11 +00001084instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001085{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001087
Guido van Rossum2878a691996-08-09 20:53:24 +00001088 if (item == NULL) {
1089 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001090 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001091 func = instance_getattr(inst, delitemstr);
1092 }
1093 else {
1094 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001095 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001096 func = instance_getattr(inst, setitemstr);
1097 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001099 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001100 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001102 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001104 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001106 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001107 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108 res = PyEval_CallObject(func, arg);
1109 Py_DECREF(func);
1110 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111 if (res == NULL)
1112 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001114 return 0;
1115}
1116
1117static int
Fred Drake79912472000-07-09 04:06:11 +00001118instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001119{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 PyObject *func, *arg, *res;
1121 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122
Guido van Rossum2878a691996-08-09 20:53:24 +00001123 if (value == NULL) {
1124 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 delslicestr =
1126 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001127 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001128 if (func == NULL) {
1129 PyErr_Clear();
1130 if (delitemstr == NULL)
1131 delitemstr =
1132 PyString_InternFromString("__delitem__");
1133 func = instance_getattr(inst, delitemstr);
1134 if (func == NULL)
1135 return -1;
1136
1137 arg = Py_BuildValue("(N)",
1138 sliceobj_from_intint(i, j));
1139 } else
1140 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001141 }
1142 else {
1143 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 setslicestr =
1145 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001146 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001147 if (func == NULL) {
1148 PyErr_Clear();
1149 if (setitemstr == NULL)
1150 setitemstr =
1151 PyString_InternFromString("__setitem__");
1152 func = instance_getattr(inst, setitemstr);
1153 if (func == NULL)
1154 return -1;
1155
1156 arg = Py_BuildValue("(NO)",
1157 sliceobj_from_intint(i, j), value);
1158 } else
1159 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001160 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001161 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001162 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001163 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001164 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001165 res = PyEval_CallObject(func, arg);
1166 Py_DECREF(func);
1167 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001168 if (res == NULL)
1169 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001170 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001171 return 0;
1172}
1173
Tim Peterscb8d3682001-05-05 21:05:01 +00001174static int
1175instance_contains(PyInstanceObject *inst, PyObject *member)
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001176{
1177 static PyObject *__contains__;
Tim Peterscb8d3682001-05-05 21:05:01 +00001178 PyObject *func;
1179
1180 /* Try __contains__ first.
1181 * If that can't be done, try iterator-based searching.
1182 */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001183
1184 if(__contains__ == NULL) {
1185 __contains__ = PyString_InternFromString("__contains__");
1186 if(__contains__ == NULL)
1187 return -1;
1188 }
1189 func = instance_getattr(inst, __contains__);
Tim Peterscb8d3682001-05-05 21:05:01 +00001190 if (func) {
1191 PyObject *res;
1192 int ret;
1193 PyObject *arg = Py_BuildValue("(O)", member);
1194 if(arg == NULL) {
1195 Py_DECREF(func);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001196 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001197 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001198 res = PyEval_CallObject(func, arg);
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001199 Py_DECREF(func);
Tim Peterscb8d3682001-05-05 21:05:01 +00001200 Py_DECREF(arg);
1201 if(res == NULL)
1202 return -1;
1203 ret = PyObject_IsTrue(res);
1204 Py_DECREF(res);
1205 return ret;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001206 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001207
1208 /* Couldn't find __contains__. */
1209 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1210 /* Assume the failure was simply due to that there is no
1211 * __contains__ attribute, and try iterating instead.
1212 */
1213 PyErr_Clear();
1214 return _PySequence_IterContains((PyObject *)inst, member);
1215 }
1216 else
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001217 return -1;
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001218}
1219
Fred Drake79912472000-07-09 04:06:11 +00001220static PySequenceMethods
1221instance_as_sequence = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001222 (inquiry)instance_length, /* sq_length */
1223 0, /* sq_concat */
1224 0, /* sq_repeat */
1225 (intargfunc)instance_item, /* sq_item */
1226 (intintargfunc)instance_slice, /* sq_slice */
1227 (intobjargproc)instance_ass_item, /* sq_ass_item */
1228 (intintobjargproc)instance_ass_slice, /* sq_ass_slice */
1229 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001230};
1231
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001233generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001236
1237 if ((func = instance_getattr(self, methodname)) == NULL)
1238 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 res = PyEval_CallObject(func, (PyObject *)NULL);
1240 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001241 return res;
1242}
1243
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001244static PyObject *
1245generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001246{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001247 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001249 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001250 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001251 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001252 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001254 Py_INCREF(Py_NotImplemented);
1255 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001256 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001258 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001260 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001261 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001262 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 Py_DECREF(args);
1264 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001265 return result;
1266}
1267
1268
1269static PyObject *coerce_obj;
1270
1271/* Try one half of a binary operator involving a class instance. */
1272static PyObject *
1273half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1274 int swapped)
1275{
1276 PyObject *args;
1277 PyObject *coercefunc;
1278 PyObject *coerced = NULL;
1279 PyObject *v1;
1280 PyObject *result;
1281
1282 if (!PyInstance_Check(v)) {
1283 Py_INCREF(Py_NotImplemented);
1284 return Py_NotImplemented;
1285 }
1286
1287 if (coerce_obj == NULL) {
1288 coerce_obj = PyString_InternFromString("__coerce__");
1289 if (coerce_obj == NULL)
1290 return NULL;
1291 }
1292 coercefunc = PyObject_GetAttr(v, coerce_obj);
1293 if (coercefunc == NULL) {
1294 PyErr_Clear();
1295 return generic_binary_op(v, w, opname);
1296 }
1297
1298 args = Py_BuildValue("(O)", w);
1299 if (args == NULL) {
1300 return NULL;
1301 }
1302 coerced = PyEval_CallObject(coercefunc, args);
1303 Py_DECREF(args);
1304 Py_DECREF(coercefunc);
1305 if (coerced == NULL) {
1306 return NULL;
1307 }
1308 if (coerced == Py_None || coerced == Py_NotImplemented) {
1309 Py_DECREF(coerced);
1310 return generic_binary_op(v, w, opname);
1311 }
1312 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1313 Py_DECREF(coerced);
1314 PyErr_SetString(PyExc_TypeError,
1315 "coercion should return None or 2-tuple");
1316 return NULL;
1317 }
1318 v1 = PyTuple_GetItem(coerced, 0);
1319 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001320 if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001321 /* prevent recursion if __coerce__ returns self as the first
1322 * argument */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001323 result = generic_binary_op(v1, w, opname);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001324 } else {
1325 if (swapped)
1326 result = (thisfunc)(w, v1);
1327 else
1328 result = (thisfunc)(v1, w);
1329 }
1330 Py_DECREF(coerced);
1331 return result;
1332}
1333
1334/* Implement a binary operator involving at least one class instance. */
1335static PyObject *
1336do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1337 binaryfunc thisfunc)
1338{
1339 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1340 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001341 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001342 result = half_binop(w, v, ropname, thisfunc, 1);
1343 }
1344 return result;
1345}
1346
1347static PyObject *
1348do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1349 char *ropname, binaryfunc thisfunc)
1350{
1351 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1352 if (result == Py_NotImplemented) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001353 Py_DECREF(result);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001354 result = do_binop(v, w, opname, ropname, thisfunc);
1355 }
1356 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001357}
1358
Guido van Rossum879c5811995-01-10 15:24:06 +00001359static int
Fred Drake79912472000-07-09 04:06:11 +00001360instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001361{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 PyObject *v = *pv;
1363 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001364 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 PyObject *args;
1366 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001367
Guido van Rossum2878a691996-08-09 20:53:24 +00001368 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001369 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001370 if (coerce_obj == NULL)
1371 return -1;
1372 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001373 coercefunc = PyObject_GetAttr(v, coerce_obj);
1374 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001375 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001377 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001378 }
1379 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001381 if (args == NULL) {
1382 return -1;
1383 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001384 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001386 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001387 if (coerced == NULL) {
1388 /* __coerce__ call raised an exception */
1389 return -1;
1390 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001391 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001392 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001394 return 1;
1395 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001397 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 Py_DECREF(coerced);
1399 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001400 "coercion should return None or 2-tuple");
1401 return -1;
1402 }
1403 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 *pv = PyTuple_GetItem(coerced, 0);
1405 *pw = PyTuple_GetItem(coerced, 1);
1406 Py_INCREF(*pv);
1407 Py_INCREF(*pw);
1408 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001409 return 0;
1410}
1411
Guido van Rossum04691fc1992-08-12 15:35:34 +00001412#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001413static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001415 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001416 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001417}
1418
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001419#define BINARY(f, m, n) \
1420static PyObject *f(PyObject *v, PyObject *w) { \
1421 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1422}
1423
1424#define BINARY_INPLACE(f, m, n) \
1425static PyObject *f(PyObject *v, PyObject *w) { \
1426 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1427 "__r" m "__", n); \
1428}
1429
Guido van Rossum04691fc1992-08-12 15:35:34 +00001430UNARY(instance_neg, "__neg__")
1431UNARY(instance_pos, "__pos__")
1432UNARY(instance_abs, "__abs__")
1433
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001434BINARY(instance_or, "or", PyNumber_Or)
1435BINARY(instance_and, "and", PyNumber_And)
1436BINARY(instance_xor, "xor", PyNumber_Xor)
1437BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1438BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1439BINARY(instance_add, "add", PyNumber_Add)
1440BINARY(instance_sub, "sub", PyNumber_Subtract)
1441BINARY(instance_mul, "mul", PyNumber_Multiply)
1442BINARY(instance_div, "div", PyNumber_Divide)
1443BINARY(instance_mod, "mod", PyNumber_Remainder)
1444BINARY(instance_divmod, "divmod", PyNumber_Divmod)
1445
1446BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1447BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1448BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1449BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1450BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1451BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1452BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1453BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1454BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1455BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
1456
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001457/* Try a 3-way comparison, returning an int; v is an instance. Return:
1458 -2 for an exception;
1459 -1 if v < w;
1460 0 if v == w;
1461 1 if v > w;
1462 2 if this particular 3-way comparison is not implemented or undefined.
1463*/
1464static int
1465half_cmp(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001466{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001467 static PyObject *cmp_obj;
1468 PyObject *args;
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001469 PyObject *cmp_func;
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001470 PyObject *result;
1471 long l;
1472
1473 assert(PyInstance_Check(v));
1474
1475 if (cmp_obj == NULL) {
1476 cmp_obj = PyString_InternFromString("__cmp__");
1477 if (cmp_obj == NULL)
1478 return -2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001479 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001480
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001481 cmp_func = PyObject_GetAttr(v, cmp_obj);
1482 if (cmp_func == NULL) {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001483 PyErr_Clear();
1484 return 2;
1485 }
1486
1487 args = Py_BuildValue("(O)", w);
1488 if (args == NULL)
1489 return -2;
1490
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001491 result = PyEval_CallObject(cmp_func, args);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001492 Py_DECREF(args);
Guido van Rossum3202c6f2001-01-29 23:50:25 +00001493 Py_DECREF(cmp_func);
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001494
1495 if (result == NULL)
1496 return -2;
1497
1498 if (result == Py_NotImplemented) {
1499 Py_DECREF(result);
1500 return 2;
1501 }
1502
1503 l = PyInt_AsLong(result);
1504 Py_DECREF(result);
1505 if (l == -1 && PyErr_Occurred()) {
1506 PyErr_SetString(PyExc_TypeError,
1507 "comparison did not return an int");
1508 return -2;
1509 }
1510
1511 return l < 0 ? -1 : l > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001512}
1513
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001514/* Try a 3-way comparison, returning an int; either v or w is an instance.
1515 We first try a coercion. Return:
1516 -2 for an exception;
1517 -1 if v < w;
1518 0 if v == w;
1519 1 if v > w;
1520 2 if this particular 3-way comparison is not implemented or undefined.
1521 THIS IS ONLY CALLED FROM object.c!
1522*/
1523static int
1524instance_compare(PyObject *v, PyObject *w)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001525{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001526 int c;
1527
1528 c = PyNumber_CoerceEx(&v, &w);
1529 if (c < 0)
1530 return -2;
1531 if (c == 0) {
1532 /* If neither is now an instance, use regular comparison */
1533 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1534 c = PyObject_Compare(v, w);
1535 Py_DECREF(v);
1536 Py_DECREF(w);
1537 if (PyErr_Occurred())
1538 return -2;
1539 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001540 }
1541 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001542 else {
1543 /* The coercion didn't do anything.
1544 Treat this the same as returning v and w unchanged. */
1545 Py_INCREF(v);
1546 Py_INCREF(w);
1547 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001548
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001549 if (PyInstance_Check(v)) {
1550 c = half_cmp(v, w);
1551 if (c <= 1) {
1552 Py_DECREF(v);
1553 Py_DECREF(w);
1554 return c;
1555 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001556 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001557 if (PyInstance_Check(w)) {
1558 c = half_cmp(w, v);
1559 if (c <= 1) {
1560 Py_DECREF(v);
1561 Py_DECREF(w);
1562 if (c >= -1)
1563 c = -c;
1564 return c;
1565 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001566 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001567 Py_DECREF(v);
1568 Py_DECREF(w);
1569 return 2;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001570}
1571
Guido van Rossum9bfef441993-03-29 10:43:31 +00001572static int
Fred Drake79912472000-07-09 04:06:11 +00001573instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001574{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001576 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001577 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001578
Guido van Rossum2878a691996-08-09 20:53:24 +00001579 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001580 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001581 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001583 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001584 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001585 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001587 /* Fall back to the default behavior:
1588 all instances are nonzero */
1589 return 1;
1590 }
1591 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592 res = PyEval_CallObject(func, (PyObject *)NULL);
1593 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001594 if (res == NULL)
1595 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596 if (!PyInt_Check(res)) {
1597 Py_DECREF(res);
1598 PyErr_SetString(PyExc_TypeError,
1599 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001600 return -1;
1601 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 outcome = PyInt_AsLong(res);
1603 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001604 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001605 PyErr_SetString(PyExc_ValueError,
1606 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001607 return -1;
1608 }
1609 return outcome > 0;
1610}
1611
1612UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001613UNARY(instance_int, "__int__")
1614UNARY(instance_long, "__long__")
1615UNARY(instance_float, "__float__")
1616UNARY(instance_oct, "__oct__")
1617UNARY(instance_hex, "__hex__")
1618
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001619static PyObject *
1620bin_power(PyObject *v, PyObject *w)
1621{
1622 return PyNumber_Power(v, w, Py_None);
1623}
1624
Guido van Rossum03093a21994-09-28 15:51:32 +00001625/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001627instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001628{
1629 if (z == Py_None) {
1630 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001631 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001632 else {
1633 PyObject *func;
1634 PyObject *args;
1635 PyObject *result;
1636
1637 /* XXX Doesn't do coercions... */
1638 func = PyObject_GetAttrString(v, "__pow__");
1639 if (func == NULL)
1640 return NULL;
1641 args = Py_BuildValue("(OO)", w, z);
1642 if (args == NULL) {
1643 Py_DECREF(func);
1644 return NULL;
1645 }
1646 result = PyEval_CallObject(func, args);
1647 Py_DECREF(func);
1648 Py_DECREF(args);
1649 return result;
1650 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001651}
1652
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001653static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001654bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001655{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001656 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001657}
1658
1659
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001660static PyObject *
1661instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1662{
1663 if (z == Py_None) {
1664 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1665 "__rpow__", bin_inplace_power);
1666 }
1667 else {
1668 /* XXX Doesn't do coercions... */
1669 PyObject *func;
1670 PyObject *args;
1671 PyObject *result;
1672
1673 func = PyObject_GetAttrString(v, "__ipow__");
1674 if (func == NULL) {
1675 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1676 return NULL;
1677 PyErr_Clear();
1678 return instance_pow(v, w, z);
1679 }
1680 args = Py_BuildValue("(OO)", w, z);
1681 if (args == NULL) {
1682 Py_DECREF(func);
1683 return NULL;
1684 }
1685 result = PyEval_CallObject(func, args);
1686 Py_DECREF(func);
1687 Py_DECREF(args);
1688 return result;
1689 }
1690}
1691
1692
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001693/* Map rich comparison operators to their __xx__ namesakes */
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001694#define NAME_OPS 6
1695static PyObject **name_op = NULL;
1696
1697static int
Guido van Rossum0ba9e3a2001-05-22 02:33:08 +00001698init_name_op(void)
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001699{
1700 int i;
1701 char *_name_op[] = {
1702 "__lt__",
1703 "__le__",
1704 "__eq__",
1705 "__ne__",
1706 "__gt__",
1707 "__ge__",
1708 };
1709
1710 name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1711 if (name_op == NULL)
1712 return -1;
1713 for (i = 0; i < NAME_OPS; ++i) {
1714 name_op[i] = PyString_InternFromString(_name_op[i]);
1715 if (name_op[i] == NULL)
1716 return -1;
1717 }
1718 return 0;
1719}
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001720
1721static PyObject *
1722half_richcompare(PyObject *v, PyObject *w, int op)
1723{
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001724 PyObject *method;
1725 PyObject *args;
1726 PyObject *res;
1727
1728 assert(PyInstance_Check(v));
1729
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001730 if (name_op == NULL) {
1731 if (init_name_op() < 0)
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001732 return NULL;
Jeremy Hylton1b0feb42001-05-11 14:48:41 +00001733 }
1734 /* If the instance doesn't define an __getattr__ method, use
1735 instance_getattr2 directly because it will not set an
1736 exception on failure. */
1737 if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
1738 method = instance_getattr2((PyInstanceObject *)v,
1739 name_op[op]);
1740 if (method == NULL) {
1741 assert(!PyErr_Occurred());
1742 res = Py_NotImplemented;
1743 Py_INCREF(res);
1744 return res;
1745 }
1746 } else {
1747 method = PyObject_GetAttr(v, name_op[op]);
1748 if (method == NULL) {
1749 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1750 return NULL;
1751 PyErr_Clear();
1752 res = Py_NotImplemented;
1753 Py_INCREF(res);
1754 return res;
1755 }
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001756 }
1757
1758 args = Py_BuildValue("(O)", w);
1759 if (args == NULL) {
1760 Py_DECREF(method);
1761 return NULL;
1762 }
1763
1764 res = PyEval_CallObject(method, args);
1765 Py_DECREF(args);
1766 Py_DECREF(method);
1767
1768 return res;
1769}
1770
1771/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
1772static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
1773
1774static PyObject *
1775instance_richcompare(PyObject *v, PyObject *w, int op)
1776{
1777 PyObject *res;
1778
1779 if (PyInstance_Check(v)) {
1780 res = half_richcompare(v, w, op);
1781 if (res != Py_NotImplemented)
1782 return res;
1783 Py_DECREF(res);
1784 }
1785
1786 if (PyInstance_Check(w)) {
1787 res = half_richcompare(w, v, swapped_op[op]);
1788 if (res != Py_NotImplemented)
1789 return res;
1790 Py_DECREF(res);
1791 }
1792
1793 Py_INCREF(Py_NotImplemented);
1794 return Py_NotImplemented;
1795}
1796
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001797
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001798/* Get the iterator */
1799static PyObject *
1800instance_getiter(PyInstanceObject *self)
1801{
1802 PyObject *func;
1803
1804 if (iterstr == NULL)
1805 iterstr = PyString_InternFromString("__iter__");
1806 if (getitemstr == NULL)
1807 getitemstr = PyString_InternFromString("__getitem__");
1808
1809 if ((func = instance_getattr(self, iterstr)) != NULL) {
1810 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1811 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001812 if (res != NULL && !PyIter_Check(res)) {
1813 PyErr_Format(PyExc_TypeError,
1814 "__iter__ returned non-iterator "
1815 "of type '%.100s'",
1816 res->ob_type->tp_name);
1817 Py_DECREF(res);
1818 res = NULL;
1819 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001820 return res;
1821 }
1822 PyErr_Clear();
1823 if ((func = instance_getattr(self, getitemstr)) == NULL) {
1824 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1825 return NULL;
1826 }
1827 Py_DECREF(func);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001828 return PySeqIter_New((PyObject *)self);
1829}
1830
1831
1832/* Call the iterator's next */
1833static PyObject *
1834instance_iternext(PyInstanceObject *self)
1835{
1836 PyObject *func;
1837
1838 if (nextstr == NULL)
1839 nextstr = PyString_InternFromString("next");
1840
1841 if ((func = instance_getattr(self, nextstr)) != NULL) {
1842 PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
1843 Py_DECREF(func);
1844 if (res != NULL) {
1845 return res;
1846 }
1847 if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
1848 PyErr_Clear();
1849 return NULL;
1850 }
1851 return NULL;
1852 }
1853 PyErr_SetString(PyExc_TypeError, "instance has no next() method");
1854 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001855}
1856
Tim Peters6d6c1a32001-08-02 04:15:00 +00001857static PyObject *
1858instance_call(PyObject *func, PyObject *arg, PyObject *kw)
1859{
1860 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
1861 if (call == NULL) {
1862 PyInstanceObject *inst = (PyInstanceObject*) func;
1863 PyErr_Clear();
1864 PyErr_Format(PyExc_AttributeError,
1865 "%.200s instance has no __call__ method",
1866 PyString_AsString(inst->in_class->cl_name));
1867 return NULL;
1868 }
1869 res = PyObject_Call(call, arg, kw);
1870 Py_DECREF(call);
1871 return res;
1872}
1873
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001874
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001875static PyNumberMethods instance_as_number = {
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001876 (binaryfunc)instance_add, /* nb_add */
1877 (binaryfunc)instance_sub, /* nb_subtract */
1878 (binaryfunc)instance_mul, /* nb_multiply */
1879 (binaryfunc)instance_div, /* nb_divide */
1880 (binaryfunc)instance_mod, /* nb_remainder */
1881 (binaryfunc)instance_divmod, /* nb_divmod */
1882 (ternaryfunc)instance_pow, /* nb_power */
1883 (unaryfunc)instance_neg, /* nb_negative */
1884 (unaryfunc)instance_pos, /* nb_positive */
1885 (unaryfunc)instance_abs, /* nb_absolute */
1886 (inquiry)instance_nonzero, /* nb_nonzero */
1887 (unaryfunc)instance_invert, /* nb_invert */
1888 (binaryfunc)instance_lshift, /* nb_lshift */
1889 (binaryfunc)instance_rshift, /* nb_rshift */
1890 (binaryfunc)instance_and, /* nb_and */
1891 (binaryfunc)instance_xor, /* nb_xor */
1892 (binaryfunc)instance_or, /* nb_or */
1893 (coercion)instance_coerce, /* nb_coerce */
1894 (unaryfunc)instance_int, /* nb_int */
1895 (unaryfunc)instance_long, /* nb_long */
1896 (unaryfunc)instance_float, /* nb_float */
1897 (unaryfunc)instance_oct, /* nb_oct */
1898 (unaryfunc)instance_hex, /* nb_hex */
1899 (binaryfunc)instance_iadd, /* nb_inplace_add */
1900 (binaryfunc)instance_isub, /* nb_inplace_subtract */
1901 (binaryfunc)instance_imul, /* nb_inplace_multiply */
1902 (binaryfunc)instance_idiv, /* nb_inplace_divide */
1903 (binaryfunc)instance_imod, /* nb_inplace_remainder */
1904 (ternaryfunc)instance_ipow, /* nb_inplace_power */
1905 (binaryfunc)instance_ilshift, /* nb_inplace_lshift */
1906 (binaryfunc)instance_irshift, /* nb_inplace_rshift */
1907 (binaryfunc)instance_iand, /* nb_inplace_and */
1908 (binaryfunc)instance_ixor, /* nb_inplace_xor */
1909 (binaryfunc)instance_ior, /* nb_inplace_or */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001910};
1911
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001912PyTypeObject PyInstance_Type = {
1913 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001914 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001915 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001916 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001917 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001918 (destructor)instance_dealloc, /* tp_dealloc */
1919 0, /* tp_print */
1920 0, /* tp_getattr */
1921 0, /* tp_setattr */
1922 instance_compare, /* tp_compare */
1923 (reprfunc)instance_repr, /* tp_repr */
1924 &instance_as_number, /* tp_as_number */
1925 &instance_as_sequence, /* tp_as_sequence */
1926 &instance_as_mapping, /* tp_as_mapping */
1927 (hashfunc)instance_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001928 instance_call, /* tp_call */
Guido van Rossum82c690f2001-04-30 14:39:18 +00001929 (reprfunc)instance_str, /* tp_str */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001930 (getattrofunc)instance_getattr, /* tp_getattro */
1931 (setattrofunc)instance_setattr, /* tp_setattro */
1932 0, /* tp_as_buffer */
1933 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
1934 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00001935 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00001936 0, /* tp_clear */
1937 instance_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001938 offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
1939 (getiterfunc)instance_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001940 (iternextfunc)instance_iternext, /* tp_iternext */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001941};
1942
1943
Guido van Rossum81daa321993-05-20 14:24:46 +00001944/* Instance method objects are used for two purposes:
1945 (a) as bound instance methods (returned by instancename.methodname)
1946 (b) as unbound methods (returned by ClassName.methodname)
1947 In case (b), im_self is NULL
1948*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001949
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001950static PyMethodObject *free_list;
1951
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001952PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001953PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001954{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001955 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001956 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001957 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001958 return NULL;
1959 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001960 im = free_list;
1961 if (im != NULL) {
1962 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001963 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001964 }
1965 else {
1966 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1967 if (im == NULL)
1968 return NULL;
1969 }
Fred Drakedb81e8d2001-03-23 04:19:27 +00001970 im->im_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001971 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001972 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001973 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001974 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001975 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001976 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001977 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001978 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001979}
1980
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001981/* Class method methods */
1982
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001983#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001984
Guido van Rossume8122f11991-05-05 20:03:07 +00001985static struct memberlist instancemethod_memberlist[] = {
1986 {"im_func", T_OBJECT, OFF(im_func)},
1987 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001988 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001989 /* Dummies that are not handled by getattr() except for __members__ */
1990 {"__doc__", T_INT, 0},
1991 {"__name__", T_INT, 0},
Barry Warsawd6a9e842001-01-15 20:40:19 +00001992 {"__dict__", T_OBJECT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993 {NULL} /* Sentinel */
1994};
1995
Barry Warsawd6a9e842001-01-15 20:40:19 +00001996static int
1997instancemethod_setattro(register PyMethodObject *im, PyObject *name,
1998 PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001999{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002000 char *sname = PyString_AsString(name);
Barry Warsawd6a9e842001-01-15 20:40:19 +00002001
Barry Warsaw4f9b13b2001-02-26 18:09:15 +00002002 PyErr_Format(PyExc_TypeError, "read-only attribute: %s", sname);
2003 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +00002004}
2005
2006
2007static PyObject *
2008instancemethod_getattro(register PyMethodObject *im, PyObject *name)
2009{
2010 PyObject *rtn;
2011 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00002012 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00002013 /* Inherit __name__ and __doc__ from the callable object
2014 implementing the method */
2015 if (strcmp(sname, "__name__") == 0 ||
2016 strcmp(sname, "__doc__") == 0)
2017 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00002018 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002019 if (PyEval_GetRestricted()) {
2020 PyErr_SetString(PyExc_RuntimeError,
2021 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00002022 return NULL;
2023 }
Barry Warsawd6a9e842001-01-15 20:40:19 +00002024 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0)
2025 return PyObject_GetAttr(im->im_func, name);
2026
2027 rtn = PyMember_Get((char *)im, instancemethod_memberlist, sname);
2028 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
2029 PyErr_Clear();
2030 rtn = PyObject_GetAttr(im->im_func, name);
2031 }
2032 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002033}
2034
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002035static void
Fred Drake79912472000-07-09 04:06:11 +00002036instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002037{
Fred Drakedb81e8d2001-03-23 04:19:27 +00002038 PyObject_ClearWeakRefs((PyObject *)im);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002039 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002040 Py_DECREF(im->im_func);
2041 Py_XDECREF(im->im_self);
2042 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002043 im->im_self = (PyObject *)free_list;
2044 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002045}
2046
Guido van Rossumebc8c511992-09-03 20:39:51 +00002047static int
Fred Drake79912472000-07-09 04:06:11 +00002048instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00002049{
Guido van Rossume9df7271995-04-06 14:46:51 +00002050 if (a->im_self != b->im_self)
2051 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002052 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00002053}
2054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002056instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00002057{
Tim Peters6d6c1a32001-08-02 04:15:00 +00002058 char buffer[240];
2059 PyObject *self = a->im_self;
Guido van Rossum7859f871998-07-08 14:58:16 +00002060 PyObject *func = a->im_func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002061 PyObject *klass = a->im_class;
2062 PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2063 char *sfuncname = "?", *sklassname = "?";
2064
2065 funcname = PyObject_GetAttrString(func, "__name__");
2066 if (funcname == NULL)
2067 PyErr_Clear();
2068 else if (!PyString_Check(funcname)) {
2069 Py_DECREF(funcname);
2070 funcname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002071 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002072 else
2073 sfuncname = PyString_AS_STRING(funcname);
2074 klassname = PyObject_GetAttrString(klass, "__name__");
2075 if (klassname == NULL)
2076 PyErr_Clear();
2077 else if (!PyString_Check(klassname)) {
2078 Py_DECREF(klassname);
2079 klassname = NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +00002080 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002081 else
Tim Peters6d6c1a32001-08-02 04:15:00 +00002082 sklassname = PyString_AS_STRING(klassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002083 if (self == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002084 sprintf(buffer, "<unbound method %.100s.%.100s>",
2085 sklassname, sfuncname);
Guido van Rossum81daa321993-05-20 14:24:46 +00002086 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002087 /* XXX Shouldn't use repr() here! */
2088 PyObject *selfrepr = PyObject_Repr(self);
2089 if (selfrepr == NULL)
2090 goto fail;
2091 if (!PyString_Check(selfrepr)) {
2092 Py_DECREF(selfrepr);
2093 goto fail;
2094 }
2095 sprintf(buffer, "<bound method %.60s.%.60s of %.60s>",
2096 sklassname, sfuncname, PyString_AS_STRING(selfrepr));
2097 Py_DECREF(selfrepr);
Guido van Rossum81daa321993-05-20 14:24:46 +00002098 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002099 result = PyString_FromString(buffer);
2100 fail:
Guido van Rossum42636dc1999-10-11 14:03:12 +00002101 Py_XDECREF(funcname);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002102 Py_XDECREF(klassname);
2103 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00002104}
2105
Guido van Rossum9bfef441993-03-29 10:43:31 +00002106static long
Fred Drake79912472000-07-09 04:06:11 +00002107instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002108{
2109 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00002110 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002111 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00002112 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002113 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002114 if (x == -1)
2115 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002116 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002117 if (y == -1)
2118 return -1;
2119 return x ^ y;
2120}
2121
Jeremy Hylton8caad492000-06-23 14:18:11 +00002122static int
2123instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2124{
2125 int err;
2126 if (im->im_func) {
2127 err = visit(im->im_func, arg);
2128 if (err)
2129 return err;
2130 }
2131 if (im->im_self) {
2132 err = visit(im->im_self, arg);
2133 if (err)
2134 return err;
2135 }
2136 if (im->im_class) {
2137 err = visit(im->im_class, arg);
2138 if (err)
2139 return err;
2140 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00002141 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002142}
2143
Tim Peters6d6c1a32001-08-02 04:15:00 +00002144static PyObject *
2145instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2146{
2147 PyObject *self = PyMethod_GET_SELF(func);
2148 PyObject *class = PyMethod_GET_CLASS(func);
2149 PyObject *result;
2150
2151 func = PyMethod_GET_FUNCTION(func);
2152 if (self == NULL) {
2153 /* Unbound methods must be called with an instance of
2154 the class (or a derived class) as first argument */
2155 int ok;
2156 if (PyTuple_Size(arg) >= 1)
2157 self = PyTuple_GET_ITEM(arg, 0);
2158 if (self == NULL)
2159 ok = 0;
2160 else {
2161 ok = PyObject_IsInstance(self, class);
2162 if (ok < 0)
2163 return NULL;
2164 }
2165 if (!ok) {
2166 PyErr_Format(PyExc_TypeError,
2167 "unbound method %s%s must be "
2168 "called with instance as first argument",
2169 PyEval_GetFuncName(func),
2170 PyEval_GetFuncDesc(func));
2171 return NULL;
2172 }
2173 Py_INCREF(arg);
2174 }
2175 else {
2176 int argcount = PyTuple_Size(arg);
2177 PyObject *newarg = PyTuple_New(argcount + 1);
2178 int i;
2179 if (newarg == NULL)
2180 return NULL;
2181 Py_INCREF(self);
2182 PyTuple_SET_ITEM(newarg, 0, self);
2183 for (i = 0; i < argcount; i++) {
2184 PyObject *v = PyTuple_GET_ITEM(arg, i);
2185 Py_XINCREF(v);
2186 PyTuple_SET_ITEM(newarg, i+1, v);
2187 }
2188 arg = newarg;
2189 }
2190 result = PyObject_Call((PyObject *)func, arg, kw);
2191 Py_DECREF(arg);
2192 return result;
2193}
2194
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002195PyTypeObject PyMethod_Type = {
2196 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002197 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00002198 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002199 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002200 0,
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002201 (destructor)instancemethod_dealloc, /* tp_dealloc */
2202 0, /* tp_print */
2203 0, /* tp_getattr */
2204 0, /* tp_setattr */
2205 (cmpfunc)instancemethod_compare, /* tp_compare */
2206 (reprfunc)instancemethod_repr, /* tp_repr */
2207 0, /* tp_as_number */
2208 0, /* tp_as_sequence */
2209 0, /* tp_as_mapping */
2210 (hashfunc)instancemethod_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002211 instancemethod_call, /* tp_call */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002212 0, /* tp_str */
2213 (getattrofunc)instancemethod_getattro, /* tp_getattro */
2214 (setattrofunc)instancemethod_setattro, /* tp_setattro */
2215 0, /* tp_as_buffer */
Fred Drake4dcb85b2001-05-03 16:04:13 +00002216 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Guido van Rossum8998b4f2001-01-17 15:28:20 +00002217 0, /* tp_doc */
Jeremy Hylton8caad492000-06-23 14:18:11 +00002218 (traverseproc)instancemethod_traverse, /* tp_traverse */
Fred Drakedb81e8d2001-03-23 04:19:27 +00002219 0, /* tp_clear */
2220 0, /* tp_richcompare */
2221 offsetof(PyMethodObject, im_weakreflist) /* tp_weaklistoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002222};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002223
2224/* Clear out the free list */
2225
2226void
Fred Drake79912472000-07-09 04:06:11 +00002227PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002228{
2229 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00002230 PyMethodObject *im = free_list;
2231 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00002232 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002233 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00002234 }
2235}