blob: f1fd31f289b9aed53eef84e65c395c9d4ad03167 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Class object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000015
Guido van Rossum52ca98a1994-09-05 07:32:29 +000016/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000017static PyObject *class_lookup(PyClassObject *, PyObject *,
18 PyClassObject **);
19static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
20static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000021
Guido van Rossuma63eff61998-05-29 21:37:21 +000022static PyObject *getattrstr, *setattrstr, *delattrstr;
23
Fred Drake79912472000-07-09 04:06:11 +000024
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025PyObject *
Fred Drake79912472000-07-09 04:06:11 +000026PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
27 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000030 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000031 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000032 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000033 if (docstr == NULL)
34 return NULL;
35 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000036 if (modstr == NULL) {
37 modstr= PyString_InternFromString("__module__");
38 if (modstr == NULL)
39 return NULL;
40 }
41 if (namestr == NULL) {
42 namestr= PyString_InternFromString("__name__");
43 if (namestr == NULL)
44 return NULL;
45 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000046 if (name == NULL || !PyString_Check(name)) {
47 PyErr_SetString(PyExc_SystemError,
48 "PyClass_New: name must be a string");
49 return NULL;
50 }
51 if (dict == NULL || !PyDict_Check(dict)) {
52 PyErr_SetString(PyExc_SystemError,
53 "PyClass_New: dict must be a dictionary");
54 return NULL;
55 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056 if (PyDict_GetItem(dict, docstr) == NULL) {
57 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000058 return NULL;
59 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000060 if (PyDict_GetItem(dict, modstr) == NULL) {
61 PyObject *globals = PyEval_GetGlobals();
62 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000063 PyObject *modname = PyDict_GetItem(globals, namestr);
64 if (modname != NULL) {
65 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000066 return NULL;
67 }
68 }
69 }
Guido van Rossume2966a61991-12-10 13:53:23 +000070 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000071 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000072 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000073 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000074 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000075 else {
76 int i;
77 if (!PyTuple_Check(bases)) {
78 PyErr_SetString(PyExc_SystemError,
79 "PyClass_New: bases must be a tuple");
80 return NULL;
81 }
82 i = PyTuple_Size(bases);
83 while (--i >= 0) {
84 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
85 PyErr_SetString(PyExc_SystemError,
86 "PyClass_New: base must be a class");
87 return NULL;
88 }
89 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000091 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000093 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000096 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000099 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000101 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000102 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000103 getattrstr = PyString_InternFromString("__getattr__");
104 setattrstr = PyString_InternFromString("__setattr__");
105 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000106 }
107 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
108 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
109 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 Py_XINCREF(op->cl_getattr);
111 Py_XINCREF(op->cl_setattr);
112 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000113 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115}
116
117/* Class methods */
118
119static void
Fred Drake79912472000-07-09 04:06:11 +0000120class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000122 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 Py_DECREF(op->cl_bases);
124 Py_DECREF(op->cl_dict);
125 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000126 Py_XDECREF(op->cl_getattr);
127 Py_XDECREF(op->cl_setattr);
128 Py_XDECREF(op->cl_delattr);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000129 op = (PyClassObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000130 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131}
132
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000134class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000135{
136 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000138 if (value != NULL) {
139 *pclass = cp;
140 return value;
141 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000143 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000144 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 PyObject *v = class_lookup(
146 (PyClassObject *)
147 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000148 if (v != NULL)
149 return v;
150 }
151 return NULL;
152}
153
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000155class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 register PyObject *v;
158 register char *sname = PyString_AsString(name);
159 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000160 if (sname[0] == '_' && sname[1] == '_') {
161 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 if (PyEval_GetRestricted()) {
163 PyErr_SetString(PyExc_RuntimeError,
164 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000165 return NULL;
166 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000168 return op->cl_dict;
169 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000170 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000172 return op->cl_bases;
173 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000174 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000175 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000177 else
178 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000180 return v;
181 }
Guido van Rossum94308391991-10-20 20:11:48 +0000182 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000183 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000184 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000186 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000188 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 if (PyFunction_Check(v)) {
190 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
191 (PyObject *)class);
192 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000193 v = w;
194 }
195 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196}
197
Guido van Rossuma63eff61998-05-29 21:37:21 +0000198static void
Fred Drake79912472000-07-09 04:06:11 +0000199set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000200{
201 PyObject *temp = *slot;
202 Py_XINCREF(v);
203 *slot = v;
204 Py_XDECREF(temp);
205}
206
Guido van Rossum7ba30431998-07-08 13:34:48 +0000207static void
Fred Drake79912472000-07-09 04:06:11 +0000208set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000209{
210 PyClassObject *dummy;
211
212 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
213 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
214 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
215}
216
Guido van Rossuma63eff61998-05-29 21:37:21 +0000217static char *
Fred Drake79912472000-07-09 04:06:11 +0000218set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000219{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000220 if (v == NULL || !PyDict_Check(v))
221 return "__dict__ must be a dictionary object";
222 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000223 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000224 return "";
225}
226
227static char *
Fred Drake79912472000-07-09 04:06:11 +0000228set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000229{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000230 int i, n;
231
232 if (v == NULL || !PyTuple_Check(v))
233 return "__bases__ must be a tuple object";
234 n = PyTuple_Size(v);
235 for (i = 0; i < n; i++) {
236 PyObject *x = PyTuple_GET_ITEM(v, i);
237 if (!PyClass_Check(x))
238 return "__bases__ items must be classes";
239 if (PyClass_IsSubclass(x, (PyObject *)c))
240 return "a __bases__ item causes an inheritance cycle";
241 }
242 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000243 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000244 return "";
245}
246
247static char *
Fred Drake79912472000-07-09 04:06:11 +0000248set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000249{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000250 if (v == NULL || !PyString_Check(v))
251 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000252 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000253 return "__name__ must not contain null bytes";
254 set_slot(&c->cl_name, v);
255 return "";
256}
257
Guido van Rossum94308391991-10-20 20:11:48 +0000258static int
Fred Drake79912472000-07-09 04:06:11 +0000259class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000260{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000261 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 if (PyEval_GetRestricted()) {
263 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000264 "classes are read-only in restricted mode");
265 return -1;
266 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000267 sname = PyString_AsString(name);
268 if (sname[0] == '_' && sname[1] == '_') {
269 int n = PyString_Size(name);
270 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000271 char *err = NULL;
272 if (strcmp(sname, "__dict__") == 0)
273 err = set_dict(op, v);
274 else if (strcmp(sname, "__bases__") == 0)
275 err = set_bases(op, v);
276 else if (strcmp(sname, "__name__") == 0)
277 err = set_name(op, v);
278 else if (strcmp(sname, "__getattr__") == 0)
279 set_slot(&op->cl_getattr, v);
280 else if (strcmp(sname, "__setattr__") == 0)
281 set_slot(&op->cl_setattr, v);
282 else if (strcmp(sname, "__delattr__") == 0)
283 set_slot(&op->cl_delattr, v);
284 /* For the last three, we fall through to update the
285 dictionary as well. */
286 if (err != NULL) {
287 if (*err == '\0')
288 return 0;
289 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000290 return -1;
291 }
292 }
293 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000294 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000296 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000298 "delete non-existing class attribute");
299 return rv;
300 }
Guido van Rossum94308391991-10-20 20:11:48 +0000301 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000303}
304
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000306class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000307{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000308 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000309 char buf[140];
310 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000312 name = "?";
313 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000315 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000316 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000317 else
Fred Drakea44d3532000-06-30 15:01:00 +0000318 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000319 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000320 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000322}
323
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000324static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000325class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000326{
327 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
328 PyObject *name = op->cl_name;
329 PyObject *res;
330 int m, n;
331
332 if (name == NULL || !PyString_Check(name))
333 return class_repr(op);
334 if (mod == NULL || !PyString_Check(mod)) {
335 Py_INCREF(name);
336 return name;
337 }
338 m = PyString_Size(mod);
339 n = PyString_Size(name);
340 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
341 if (res != NULL) {
342 char *s = PyString_AsString(res);
343 memcpy(s, PyString_AsString(mod), m);
344 s += m;
345 *s++ = '.';
346 memcpy(s, PyString_AsString(name), n);
347 }
348 return res;
349}
350
Jeremy Hylton8caad492000-06-23 14:18:11 +0000351static int
352class_traverse(PyClassObject *o, visitproc visit, void *arg)
353{
354 int err;
355 if (o->cl_bases) {
356 err = visit(o->cl_bases, arg);
357 if (err)
358 return err;
359 }
360 if (o->cl_dict) {
361 err = visit(o->cl_dict, arg);
362 if (err)
363 return err;
364 }
365 if (o->cl_name) {
366 err = visit(o->cl_name, arg);
367 if (err)
368 return err;
369 }
370 if (o->cl_getattr) {
371 err = visit(o->cl_getattr, arg);
372 if (err)
373 return err;
374 }
375 if (o->cl_setattr) {
376 err = visit(o->cl_setattr, arg);
377 if (err)
378 return err;
379 }
380 if (o->cl_delattr) {
381 err = visit(o->cl_delattr, arg);
382 if (err)
383 return err;
384 }
385 return 0;
386}
387
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388PyTypeObject PyClass_Type = {
389 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390 0,
391 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000392 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000394 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000396 0, /*tp_getattr*/
397 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000399 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400 0, /*tp_as_number*/
401 0, /*tp_as_sequence*/
402 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000403 0, /*tp_hash*/
404 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000405 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000406 (getattrofunc)class_getattr, /*tp_getattro*/
407 (setattrofunc)class_setattr, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000408 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000409 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000410 0, /* tp_doc */
411 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412};
413
Guido van Rossum81daa321993-05-20 14:24:46 +0000414int
Fred Drake79912472000-07-09 04:06:11 +0000415PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000416{
417 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000419 if (class == base)
420 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000422 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 cp = (PyClassObject *)class;
424 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000425 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000427 return 1;
428 }
429 return 0;
430}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431
Guido van Rossum81daa321993-05-20 14:24:46 +0000432
433/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000436PyInstance_New(PyObject *class, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 register PyInstanceObject *inst;
439 PyObject *init;
440 static PyObject *initstr;
441 if (!PyClass_Check(class)) {
442 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 return NULL;
444 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000446 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 inst->in_dict = PyDict_New();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000449 PyObject_GC_Init(inst);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000450 if (inst->in_dict == NULL) {
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000451 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumd7823f22000-06-28 23:46:07 +0000452 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 return NULL;
454 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000455 Py_INCREF(class);
456 inst->in_class = (PyClassObject *)class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000457 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000458 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000459 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000460 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 if ((arg != NULL && (!PyTuple_Check(arg) ||
462 PyTuple_Size(arg) != 0))
463 || (kw != NULL && (!PyDict_Check(kw) ||
464 PyDict_Size(kw) != 0))) {
465 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000466 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000468 inst = NULL;
469 }
470 }
471 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
473 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000474 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000476 inst = NULL;
477 }
478 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 if (res != Py_None) {
480 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000481 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000483 inst = NULL;
484 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000485 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000486 }
487 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489}
490
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000491/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492
493static void
Fred Drake79912472000-07-09 04:06:11 +0000494instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 PyObject *error_type, *error_value, *error_traceback;
497 PyObject *del;
498 static PyObject *delstr;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000499#ifdef Py_TRACE_REFS
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000500 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000501#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000502 PyObject_GC_Fini(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000503 /* Call the __del__ method if it exists. First temporarily
504 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000505#ifdef Py_TRACE_REFS
506 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000508 _Py_NewReference((PyObject *)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000510#ifdef COUNT_ALLOCS
511 inst->ob_type->tp_alloc--; /* ditto */
512#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000513#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000515#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000517 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000518 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000519 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000521 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyObject *f, *t, *v, *tb;
523 PyErr_Fetch(&t, &v, &tb);
524 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000525 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000527 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyFile_WriteObject(t, f, Py_PRINT_RAW);
529 if (v && v != Py_None) {
530 PyFile_WriteString(": ", f);
531 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000532 }
533 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 PyFile_WriteString(" in ", f);
535 PyFile_WriteObject(del, f, 0);
536 PyFile_WriteString(" ignored\n", f);
537 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000538 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000539 Py_XDECREF(t);
540 Py_XDECREF(v);
541 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000542 }
543 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 Py_DECREF(res);
545 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000546 }
547 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000549 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000550 if (--inst->ob_refcnt > 0) {
551#ifdef COUNT_ALLOCS
552 inst->ob_type->tp_free--;
553#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000554 PyObject_GC_Init((PyObject *)inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000555 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000556 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000557#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000558#ifdef COUNT_ALLOCS
559 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
560#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000561 _Py_ForgetReference((PyObject *)inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000562#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000563 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000564#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000565#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_DECREF(inst->in_class);
567 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000568 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000569 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570}
571
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000573instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 register PyObject *v;
576 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000577 if (sname[0] == '_' && sname[1] == '_') {
578 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 if (PyEval_GetRestricted()) {
580 PyErr_SetString(PyExc_RuntimeError,
581 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000582 return NULL;
583 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000585 return inst->in_dict;
586 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000587 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 Py_INCREF(inst->in_class);
589 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000590 }
Guido van Rossum94308391991-10-20 20:11:48 +0000591 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000592 v = instance_getattr2(inst, name);
593 if (v == NULL) {
594 PyErr_Format(PyExc_AttributeError,"'%.50s' instance has no attribute '%.400s'",
595 PyString_AS_STRING(inst->in_class->cl_name), sname);
596 }
597 return v;
598}
599
600static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000601instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000602{
603 register PyObject *v;
604 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000605 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000607 if (v == NULL) {
608 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000609 if (v == NULL)
610 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000611 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000612 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000613 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 if (PyFunction_Check(v)) {
615 PyObject *w = PyMethod_New(v, (PyObject *)inst,
616 (PyObject *)class);
617 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000618 v = w;
619 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 else if (PyMethod_Check(v)) {
621 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000622 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
624 PyObject *im_func = PyMethod_Function(v);
625 PyObject *w = PyMethod_New(im_func,
626 (PyObject *)inst, im_class);
627 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000628 v = w;
629 }
630 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000631 }
632 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633}
634
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000636instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000637{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000639 res = instance_getattr1(inst, name);
640 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 PyObject *args;
642 PyErr_Clear();
643 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000644 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000645 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 res = PyEval_CallObject(func, args);
647 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000648 }
649 return res;
650}
651
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652static int
Fred Drake79912472000-07-09 04:06:11 +0000653instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654{
Guido van Rossum94472a01992-09-04 09:45:18 +0000655 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000657 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000659 "delete non-existing instance attribute");
660 return rv;
661 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000664}
665
Guido van Rossume7737541994-09-05 07:31:41 +0000666static int
Fred Drake79912472000-07-09 04:06:11 +0000667instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000668{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000669 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000671 if (sname[0] == '_' && sname[1] == '_') {
672 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000673 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000674 if (strcmp(sname, "__dict__") == 0) {
675 if (PyEval_GetRestricted()) {
676 PyErr_SetString(PyExc_RuntimeError,
677 "__dict__ not accessible in restricted mode");
678 return -1;
679 }
680 if (v == NULL || !PyDict_Check(v)) {
681 PyErr_SetString(PyExc_TypeError,
682 "__dict__ must be set to a dictionary");
683 return -1;
684 }
685 tmp = inst->in_dict;
686 Py_INCREF(v);
687 inst->in_dict = v;
688 Py_DECREF(tmp);
689 return 0;
690 }
691 if (strcmp(sname, "__class__") == 0) {
692 if (PyEval_GetRestricted()) {
693 PyErr_SetString(PyExc_RuntimeError,
694 "__class__ not accessible in restricted mode");
695 return -1;
696 }
697 if (v == NULL || !PyClass_Check(v)) {
698 PyErr_SetString(PyExc_TypeError,
699 "__class__ must be set to a class");
700 return -1;
701 }
702 tmp = (PyObject *)(inst->in_class);
703 Py_INCREF(v);
704 inst->in_class = (PyClassObject *)v;
705 Py_DECREF(tmp);
706 return 0;
707 }
Guido van Rossume7737541994-09-05 07:31:41 +0000708 }
Guido van Rossume7737541994-09-05 07:31:41 +0000709 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000710 if (v == NULL)
711 func = inst->in_class->cl_delattr;
712 else
713 func = inst->in_class->cl_setattr;
714 if (func == NULL)
715 return instance_setattr1(inst, name, v);
716 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000718 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000720 if (args == NULL)
721 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 res = PyEval_CallObject(func, args);
723 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000724 if (res == NULL)
725 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000727 return 0;
728}
729
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000730static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000731instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000732{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733 PyObject *func;
734 PyObject *res;
735 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000736
Guido van Rossum2878a691996-08-09 20:53:24 +0000737 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000738 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000739 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000740 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000741 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000743 PyObject *mod = PyDict_GetItemString(
744 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000745 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746 if (classname != NULL && PyString_Check(classname))
747 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000748 else
749 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000751 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000752 sprintf(buf, "<?.%.100s instance at %p>",
753 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000754 else
Fred Drakea44d3532000-06-30 15:01:00 +0000755 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000756 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000757 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 res = PyEval_CallObject(func, (PyObject *)NULL);
761 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000762 return res;
763}
764
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000766instance_compare1(PyObject *inst, PyObject *other)
Guido van Rossume7d444f1995-01-07 12:35:18 +0000767{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000769 instance_compare1);
770}
771
Guido van Rossum9bfef441993-03-29 10:43:31 +0000772static int
Fred Drake79912472000-07-09 04:06:11 +0000773instance_compare(PyObject *inst, PyObject *other)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000774{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000776 long outcome;
777 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000778 if (result == NULL)
779 return -1;
780 if (!PyInt_Check(result)) {
781 Py_DECREF(result);
782 PyErr_SetString(PyExc_TypeError,
783 "comparison did not return an int");
784 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000785 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 outcome = PyInt_AsLong(result);
787 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000788 if (outcome < 0)
789 return -1;
790 else if (outcome > 0)
791 return 1;
792 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000793}
794
Guido van Rossum9bfef441993-03-29 10:43:31 +0000795static long
Fred Drake79912472000-07-09 04:06:11 +0000796instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000797{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyObject *func;
799 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000800 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000802
Guido van Rossum2878a691996-08-09 20:53:24 +0000803 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000804 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000805 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000806 if (func == NULL) {
807 /* If there is no __cmp__ method, we hash on the address.
808 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000810 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000811 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000812 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000813 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 PyErr_Clear();
Fred Drake13634cf2000-06-29 19:17:04 +0000815 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000816 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000818 return -1;
819 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 res = PyEval_CallObject(func, (PyObject *)NULL);
821 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000822 if (res == NULL)
823 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 if (PyInt_Check(res)) {
825 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000826 if (outcome == -1)
827 outcome = -2;
828 }
829 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 PyErr_SetString(PyExc_TypeError,
831 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000832 outcome = -1;
833 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000835 return outcome;
836}
837
Jeremy Hylton8caad492000-06-23 14:18:11 +0000838static int
839instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
840{
841 int err;
842 if (o->in_class) {
843 err = visit((PyObject *)(o->in_class), arg);
844 if (err)
845 return err;
846 }
847 if (o->in_dict) {
848 err = visit(o->in_dict, arg);
849 if (err)
850 return err;
851 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000852 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000853}
854
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000856
Guido van Rossum9bfef441993-03-29 10:43:31 +0000857static int
Fred Drake79912472000-07-09 04:06:11 +0000858instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000859{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 PyObject *func;
861 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000862 int outcome;
863
Guido van Rossum2878a691996-08-09 20:53:24 +0000864 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000865 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000866 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000867 if (func == NULL)
868 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 res = PyEval_CallObject(func, (PyObject *)NULL);
870 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000871 if (res == NULL)
872 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 if (PyInt_Check(res)) {
874 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyErr_SetString(PyExc_ValueError,
877 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000878 }
879 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000880 PyErr_SetString(PyExc_TypeError,
881 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000882 outcome = -1;
883 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885 return outcome;
886}
887
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000889instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 PyObject *func;
892 PyObject *arg;
893 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894
Guido van Rossum2878a691996-08-09 20:53:24 +0000895 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000896 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000897 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898 if (func == NULL)
899 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000903 return NULL;
904 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 res = PyEval_CallObject(func, arg);
906 Py_DECREF(func);
907 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908 return res;
909}
910
Guido van Rossum9bfef441993-03-29 10:43:31 +0000911static int
Fred Drake79912472000-07-09 04:06:11 +0000912instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 PyObject *func;
915 PyObject *arg;
916 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917
Guido van Rossum2878a691996-08-09 20:53:24 +0000918 if (value == NULL) {
919 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000920 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000921 func = instance_getattr(inst, delitemstr);
922 }
923 else {
924 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000925 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000926 func = instance_getattr(inst, setitemstr);
927 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 if (func == NULL)
929 return -1;
930 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000936 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000937 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 res = PyEval_CallObject(func, arg);
939 Py_DECREF(func);
940 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000941 if (res == NULL)
942 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944 return 0;
945}
946
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000948 (inquiry)instance_length, /*mp_length*/
949 (binaryfunc)instance_subscript, /*mp_subscript*/
950 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000951};
952
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000954instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000955{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000956 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957
Guido van Rossum2878a691996-08-09 20:53:24 +0000958 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000959 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000960 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961 if (func == NULL)
962 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000966 return NULL;
967 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 res = PyEval_CallObject(func, arg);
969 Py_DECREF(func);
970 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971 return res;
972}
973
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +0000975sliceobj_from_intint(int i, int j)
976{
977 PyObject *start, *end, *res;
978
979 start = PyInt_FromLong((long)i);
980 if (!start)
981 return NULL;
982
983 end = PyInt_FromLong((long)j);
984 if (!end) {
985 Py_DECREF(start);
986 return NULL;
987 }
988 res = PySlice_New(start, end, NULL);
989 Py_DECREF(start);
990 Py_DECREF(end);
991 return res;
992}
993
994
995static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000996instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 PyObject *func, *arg, *res;
999 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000
Guido van Rossum2878a691996-08-09 20:53:24 +00001001 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001002 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001003 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001004
1005 if (func == NULL) {
1006 PyErr_Clear();
1007
1008 if (getitemstr == NULL)
1009 getitemstr = PyString_InternFromString("__getitem__");
1010 func = instance_getattr(inst, getitemstr);
1011 if (func == NULL)
1012 return NULL;
1013 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1014 } else
1015 arg = Py_BuildValue("(ii)", i, j);
1016
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 return NULL;
1020 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 res = PyEval_CallObject(func, arg);
1022 Py_DECREF(func);
1023 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024 return res;
1025}
1026
1027static int
Fred Drake79912472000-07-09 04:06:11 +00001028instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001029{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031
Guido van Rossum2878a691996-08-09 20:53:24 +00001032 if (item == NULL) {
1033 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001034 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001035 func = instance_getattr(inst, delitemstr);
1036 }
1037 else {
1038 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001039 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001040 func = instance_getattr(inst, setitemstr);
1041 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001042 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001043 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001050 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 res = PyEval_CallObject(func, arg);
1053 Py_DECREF(func);
1054 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 if (res == NULL)
1056 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058 return 0;
1059}
1060
1061static int
Fred Drake79912472000-07-09 04:06:11 +00001062instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 PyObject *func, *arg, *res;
1065 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001066
Guido van Rossum2878a691996-08-09 20:53:24 +00001067 if (value == NULL) {
1068 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 delslicestr =
1070 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001071 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001072 if (func == NULL) {
1073 PyErr_Clear();
1074 if (delitemstr == NULL)
1075 delitemstr =
1076 PyString_InternFromString("__delitem__");
1077 func = instance_getattr(inst, delitemstr);
1078 if (func == NULL)
1079 return -1;
1080
1081 arg = Py_BuildValue("(N)",
1082 sliceobj_from_intint(i, j));
1083 } else
1084 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001085 }
1086 else {
1087 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 setslicestr =
1089 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001090 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001091 if (func == NULL) {
1092 PyErr_Clear();
1093 if (setitemstr == NULL)
1094 setitemstr =
1095 PyString_InternFromString("__setitem__");
1096 func = instance_getattr(inst, setitemstr);
1097 if (func == NULL)
1098 return -1;
1099
1100 arg = Py_BuildValue("(NO)",
1101 sliceobj_from_intint(i, j), value);
1102 } else
1103 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001104 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001107 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 res = PyEval_CallObject(func, arg);
1110 Py_DECREF(func);
1111 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112 if (res == NULL)
1113 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001115 return 0;
1116}
1117
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001118static int instance_contains(PyInstanceObject *inst, PyObject *member)
1119{
1120 static PyObject *__contains__;
1121 PyObject *func, *arg, *res;
1122 int ret;
1123
1124 if(__contains__ == NULL) {
1125 __contains__ = PyString_InternFromString("__contains__");
1126 if(__contains__ == NULL)
1127 return -1;
1128 }
1129 func = instance_getattr(inst, __contains__);
1130 if(func == NULL) {
Thomas Wouters7e474022000-07-16 12:04:32 +00001131 /* fall back to previous behavior */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001132 int i, cmp_res;
1133
1134 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1135 return -1;
1136 PyErr_Clear();
1137 for(i=0;;i++) {
1138 PyObject *obj = instance_item(inst, i);
1139 int ret = 0;
1140
1141 if(obj == NULL) {
1142 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1143 return -1;
1144 PyErr_Clear();
1145 return 0;
1146 }
1147 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1148 ret = -1;
1149 if(cmp_res == 0)
1150 ret = 1;
1151 Py_DECREF(obj);
1152 if(ret)
1153 return ret;
1154 }
1155 }
1156 arg = Py_BuildValue("(O)", member);
1157 if(arg == NULL) {
1158 Py_DECREF(func);
1159 return -1;
1160 }
1161 res = PyEval_CallObject(func, arg);
1162 Py_DECREF(func);
1163 Py_DECREF(arg);
1164 if(res == NULL)
1165 return -1;
1166 ret = PyObject_IsTrue(res);
1167 Py_DECREF(res);
1168 return ret;
1169}
1170
Fred Drake79912472000-07-09 04:06:11 +00001171static PySequenceMethods
1172instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001173 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001174 0, /*sq_concat*/
1175 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001176 (intargfunc)instance_item, /*sq_item*/
1177 (intintargfunc)instance_slice, /*sq_slice*/
1178 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1179 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001180 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001181};
1182
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001184generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001185{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001187
1188 if ((func = instance_getattr(self, methodname)) == NULL)
1189 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 res = PyEval_CallObject(func, (PyObject *)NULL);
1191 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001192 return res;
1193}
1194
Guido van Rossum03093a21994-09-28 15:51:32 +00001195
Guido van Rossum03093a21994-09-28 15:51:32 +00001196/* Implement a binary operator involving at least one class instance. */
1197
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001199PyInstance_DoBinOp(PyObject *v, PyObject *w, char *opname, char *ropname,
1200 PyObject * (*thisfunc)(PyObject *, PyObject *))
Guido van Rossum03093a21994-09-28 15:51:32 +00001201{
1202 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 PyObject *result = NULL;
Barry Warsawdc55d712000-08-18 04:57:32 +00001204
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001205 if (PyInstance_HalfBinOp(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001206 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001207 if (PyInstance_HalfBinOp(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001208 return result;
Thomas Wouters7e474022000-07-16 12:04:32 +00001209 /* Sigh -- special case for comparisons */
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001210 if (strcmp(opname, "__cmp__") == 0) {
Barry Warsawdc55d712000-08-18 04:57:32 +00001211 Py_uintptr_t iv = (Py_uintptr_t)v;
1212 Py_uintptr_t iw = (Py_uintptr_t)w;
1213 long c = (iv < iw) ? -1 : (iv > iw) ? 1 : 0;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001214 return PyInt_FromLong(c);
1215 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001216 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001218 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001219}
1220
Guido van Rossum03093a21994-09-28 15:51:32 +00001221
1222/* Try one half of a binary operator involving a class instance.
1223 Return value:
1224 -1 if an exception is to be reported right away
1225 0 if we have a valid result
1226 1 if we could try another operation
1227*/
1228
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001230
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001231int
1232PyInstance_HalfBinOp(PyObject *v, PyObject *w, char *opname, PyObject **r_result,
1233 PyObject * (*thisfunc)(PyObject *, PyObject *), int swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +00001234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 PyObject *func;
1236 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001237 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 PyObject *coerced = NULL;
1239 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001240
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001242 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001243 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001244 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001245 if (coerce_obj == NULL)
1246 return -1;
1247 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001248 coercefunc = PyObject_GetAttr(v, coerce_obj);
1249 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001251 }
1252 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001254 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001255 return -1;
1256 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001257 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001259 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001260 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001261 return -1;
1262 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 if (coerced == Py_None) {
1264 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001265 return 1;
1266 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1268 Py_DECREF(coerced);
1269 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001270 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001271 return -1;
1272 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 v1 = PyTuple_GetItem(coerced, 0);
1274 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001275 if (v1 != v) {
1276 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001278 if (swapped)
1279 *r_result = (*thisfunc)(w, v);
1280 else
1281 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001283 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001284 }
1285 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001286 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001288 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001290 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001291 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001293 return 1;
1294 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001296 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 Py_DECREF(func);
1298 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001299 return -1;
1300 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 *r_result = PyEval_CallObject(func, args);
1302 Py_DECREF(args);
1303 Py_DECREF(func);
1304 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001305 return *r_result == NULL ? -1 : 0;
1306}
1307
Guido van Rossum879c5811995-01-10 15:24:06 +00001308static int
Fred Drake79912472000-07-09 04:06:11 +00001309instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001310{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 PyObject *v = *pv;
1312 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001313 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 PyObject *args;
1315 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001316
Guido van Rossum2878a691996-08-09 20:53:24 +00001317 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001318 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001319 if (coerce_obj == NULL)
1320 return -1;
1321 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001322 coercefunc = PyObject_GetAttr(v, coerce_obj);
1323 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001324 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 PyErr_Clear();
1326 Py_INCREF(v);
1327 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001328 return 0;
1329 }
1330 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001332 if (args == NULL) {
1333 return -1;
1334 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001335 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001337 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001338 if (coerced == NULL) {
1339 /* __coerce__ call raised an exception */
1340 return -1;
1341 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001343 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001345 return 1;
1346 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001348 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 Py_DECREF(coerced);
1350 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001351 "coercion should return None or 2-tuple");
1352 return -1;
1353 }
1354 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 *pv = PyTuple_GetItem(coerced, 0);
1356 *pw = PyTuple_GetItem(coerced, 1);
1357 Py_INCREF(*pv);
1358 Py_INCREF(*pw);
1359 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001360 return 0;
1361}
1362
Guido van Rossum03093a21994-09-28 15:51:32 +00001363
Guido van Rossum04691fc1992-08-12 15:35:34 +00001364#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001365static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001367 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001368 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001369}
1370
Guido van Rossum04691fc1992-08-12 15:35:34 +00001371UNARY(instance_neg, "__neg__")
1372UNARY(instance_pos, "__pos__")
1373UNARY(instance_abs, "__abs__")
1374
Guido van Rossum9bfef441993-03-29 10:43:31 +00001375static int
Fred Drake79912472000-07-09 04:06:11 +00001376instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001377{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001379 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001381
Guido van Rossum2878a691996-08-09 20:53:24 +00001382 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001383 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001384 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001386 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001387 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001388 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001390 /* Fall back to the default behavior:
1391 all instances are nonzero */
1392 return 1;
1393 }
1394 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395 res = PyEval_CallObject(func, (PyObject *)NULL);
1396 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001397 if (res == NULL)
1398 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 if (!PyInt_Check(res)) {
1400 Py_DECREF(res);
1401 PyErr_SetString(PyExc_TypeError,
1402 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001403 return -1;
1404 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 outcome = PyInt_AsLong(res);
1406 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001407 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyErr_SetString(PyExc_ValueError,
1409 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001410 return -1;
1411 }
1412 return outcome > 0;
1413}
1414
1415UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001416UNARY(instance_int, "__int__")
1417UNARY(instance_long, "__long__")
1418UNARY(instance_float, "__float__")
1419UNARY(instance_oct, "__oct__")
1420UNARY(instance_hex, "__hex__")
1421
Guido van Rossum03093a21994-09-28 15:51:32 +00001422/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001424instance_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum03093a21994-09-28 15:51:32 +00001425{
1426 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 PyObject *func;
1428 PyObject *args;
1429 PyObject *result;
1430 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001431
1432 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001433 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001435 if (func == NULL)
1436 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001438 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001440 return NULL;
1441 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 result = PyEval_CallObject(func, args);
1443 Py_DECREF(func);
1444 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001445 return result;
1446}
1447
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001448static PyObject *
1449instance_inplace_pow(PyObject *v, PyObject *w, PyObject *z)
1450{
1451 /* XXX Doesn't do coercions... */
1452 PyObject *func;
1453 PyObject *args;
1454 PyObject *result;
1455 static PyObject *ipowstr;
1456
1457 if (ipowstr == NULL)
1458 ipowstr = PyString_InternFromString("__ipow__");
1459 func = PyObject_GetAttr(v, ipowstr);
1460 if (func == NULL) {
1461 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1462 return NULL;
1463 return instance_pow(v, w, z);
1464 }
1465 args = Py_BuildValue("(OO)", w, z);
1466 if (args == NULL) {
1467 Py_DECREF(func);
1468 return NULL;
1469 }
1470 result = PyEval_CallObject(func, args);
1471 Py_DECREF(func);
1472 Py_DECREF(args);
1473 return result;
1474}
1475
1476
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001478 0, /*nb_add*/
1479 0, /*nb_subtract*/
1480 0, /*nb_multiply*/
1481 0, /*nb_divide*/
1482 0, /*nb_remainder*/
1483 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001484 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001485 (unaryfunc)instance_neg, /*nb_negative*/
1486 (unaryfunc)instance_pos, /*nb_positive*/
1487 (unaryfunc)instance_abs, /*nb_absolute*/
1488 (inquiry)instance_nonzero, /*nb_nonzero*/
1489 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001490 0, /*nb_lshift*/
1491 0, /*nb_rshift*/
1492 0, /*nb_and*/
1493 0, /*nb_xor*/
1494 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001495 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001496 (unaryfunc)instance_int, /*nb_int*/
1497 (unaryfunc)instance_long, /*nb_long*/
1498 (unaryfunc)instance_float, /*nb_float*/
1499 (unaryfunc)instance_oct, /*nb_oct*/
1500 (unaryfunc)instance_hex, /*nb_hex*/
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001501 0, /*nb_inplace_add*/
1502 0, /*nb_inplace_subtract*/
1503 0, /*nb_inplace_multiply*/
1504 0, /*nb_inplace_divide*/
1505 0, /*nb_inplace_remainder*/
1506 (ternaryfunc)instance_inplace_pow, /*nb_inplace_power*/
1507 0, /*nb_inplace_lshift*/
1508 0, /*nb_inplace_rshift*/
1509 0, /*nb_inplace_and*/
1510 0, /*nb_inplace_xor*/
1511 0, /*nb_inplace_or*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001512};
1513
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514PyTypeObject PyInstance_Type = {
1515 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001516 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001517 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001518 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001519 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001520 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001521 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001522 0, /*tp_getattr*/
1523 0, /*tp_setattr*/
1524 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001525 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001526 &instance_as_number, /*tp_as_number*/
1527 &instance_as_sequence, /*tp_as_sequence*/
1528 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001529 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001530 0, /*tp_call*/
1531 0, /*tp_str*/
1532 (getattrofunc)instance_getattr, /*tp_getattro*/
1533 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001534 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001535 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001536 0, /* tp_doc */
1537 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001538};
1539
1540
Guido van Rossum81daa321993-05-20 14:24:46 +00001541/* Instance method objects are used for two purposes:
1542 (a) as bound instance methods (returned by instancename.methodname)
1543 (b) as unbound methods (returned by ClassName.methodname)
1544 In case (b), im_self is NULL
1545*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001546
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001547static PyMethodObject *free_list;
1548
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001550PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001551{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001553 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001555 return NULL;
1556 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001557 im = free_list;
1558 if (im != NULL) {
1559 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001560 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001561 }
1562 else {
1563 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1564 if (im == NULL)
1565 return NULL;
1566 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001567 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001568 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001570 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001572 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001573 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001575}
1576
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001577PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001578PyMethod_Function(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001579{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001580 if (!PyMethod_Check(im)) {
1581 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001582 return NULL;
1583 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001584 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001585}
1586
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001588PyMethod_Self(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001589{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 if (!PyMethod_Check(im)) {
1591 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001592 return NULL;
1593 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001595}
1596
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001598PyMethod_Class(register PyObject *im)
Guido van Rossum81daa321993-05-20 14:24:46 +00001599{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001600 if (!PyMethod_Check(im)) {
1601 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001602 return NULL;
1603 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001605}
1606
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001607/* Class method methods */
1608
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610
Guido van Rossume8122f11991-05-05 20:03:07 +00001611static struct memberlist instancemethod_memberlist[] = {
1612 {"im_func", T_OBJECT, OFF(im_func)},
1613 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001614 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001615 /* Dummies that are not handled by getattr() except for __members__ */
1616 {"__doc__", T_INT, 0},
1617 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001618 {NULL} /* Sentinel */
1619};
1620
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001622instancemethod_getattr(register PyMethodObject *im, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001625 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001626 /* Inherit __name__ and __doc__ from the callable object
1627 implementing the method */
1628 if (strcmp(sname, "__name__") == 0 ||
1629 strcmp(sname, "__doc__") == 0)
1630 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001631 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 if (PyEval_GetRestricted()) {
1633 PyErr_SetString(PyExc_RuntimeError,
1634 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001635 return NULL;
1636 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001638}
1639
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001640static void
Fred Drake79912472000-07-09 04:06:11 +00001641instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001642{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001643 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644 Py_DECREF(im->im_func);
1645 Py_XDECREF(im->im_self);
1646 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001647 im->im_self = (PyObject *)free_list;
1648 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001649}
1650
Guido van Rossumebc8c511992-09-03 20:39:51 +00001651static int
Fred Drake79912472000-07-09 04:06:11 +00001652instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00001653{
Guido van Rossume9df7271995-04-06 14:46:51 +00001654 if (a->im_self != b->im_self)
1655 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001657}
1658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001660instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00001661{
1662 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001663 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001664 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665 PyClassObject *class = (PyClassObject *)(a->im_class);
1666 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001667 char *fcname, *icname, *fname;
1668 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001669 if (PyFunction_Check(func)) {
1670 funcname = ((PyFunctionObject *)func)->func_name;
1671 Py_INCREF(funcname);
1672 }
1673 else {
1674 funcname = PyObject_GetAttrString(func,"__name__");
1675 if (funcname == NULL)
1676 PyErr_Clear();
1677 }
1678 if (funcname != NULL && PyString_Check(funcname))
1679 fname = PyString_AS_STRING(funcname);
1680 else
1681 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001682 if (fclassname != NULL && PyString_Check(fclassname))
1683 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001684 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001685 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001686 if (self == NULL)
1687 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1688 else {
1689 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690 if (iclassname != NULL && PyString_Check(iclassname))
1691 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001692 else
1693 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001694 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1695 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001696 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001697 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001698 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001699}
1700
Guido van Rossum9bfef441993-03-29 10:43:31 +00001701static long
Fred Drake79912472000-07-09 04:06:11 +00001702instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001703{
1704 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001705 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001707 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001709 if (x == -1)
1710 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001711 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001712 if (y == -1)
1713 return -1;
1714 return x ^ y;
1715}
1716
Jeremy Hylton8caad492000-06-23 14:18:11 +00001717static int
1718instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1719{
1720 int err;
1721 if (im->im_func) {
1722 err = visit(im->im_func, arg);
1723 if (err)
1724 return err;
1725 }
1726 if (im->im_self) {
1727 err = visit(im->im_self, arg);
1728 if (err)
1729 return err;
1730 }
1731 if (im->im_class) {
1732 err = visit(im->im_class, arg);
1733 if (err)
1734 return err;
1735 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001736 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001737}
1738
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001739PyTypeObject PyMethod_Type = {
1740 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001741 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001742 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001743 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001744 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001745 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001746 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001747 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001748 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001749 (cmpfunc)instancemethod_compare, /*tp_compare*/
1750 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001751 0, /*tp_as_number*/
1752 0, /*tp_as_sequence*/
1753 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001754 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001755 0, /*tp_call*/
1756 0, /*tp_str*/
1757 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1758 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001759 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001760 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001761 0, /* tp_doc */
1762 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001763};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001764
1765/* Clear out the free list */
1766
1767void
Fred Drake79912472000-07-09 04:06:11 +00001768PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001769{
1770 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001771 PyMethodObject *im = free_list;
1772 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00001773 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001774 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001775 }
1776}