blob: 1c9cd7ee3f75d434b88e92899c0f109f85088e40 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Class object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +00006
Guido van Rossum52ca98a1994-09-05 07:32:29 +00007/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +00008static PyObject *class_lookup(PyClassObject *, PyObject *,
9 PyClassObject **);
10static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
11static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000012
Guido van Rossuma63eff61998-05-29 21:37:21 +000013static PyObject *getattrstr, *setattrstr, *delattrstr;
14
Fred Drake79912472000-07-09 04:06:11 +000015
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016PyObject *
Fred Drake79912472000-07-09 04:06:11 +000017PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
18 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000021 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000022 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000023 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000024 if (docstr == NULL)
25 return NULL;
26 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000027 if (modstr == NULL) {
28 modstr= PyString_InternFromString("__module__");
29 if (modstr == NULL)
30 return NULL;
31 }
32 if (namestr == NULL) {
33 namestr= PyString_InternFromString("__name__");
34 if (namestr == NULL)
35 return NULL;
36 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000037 if (name == NULL || !PyString_Check(name)) {
38 PyErr_SetString(PyExc_SystemError,
39 "PyClass_New: name must be a string");
40 return NULL;
41 }
42 if (dict == NULL || !PyDict_Check(dict)) {
43 PyErr_SetString(PyExc_SystemError,
44 "PyClass_New: dict must be a dictionary");
45 return NULL;
46 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047 if (PyDict_GetItem(dict, docstr) == NULL) {
48 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000049 return NULL;
50 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000051 if (PyDict_GetItem(dict, modstr) == NULL) {
52 PyObject *globals = PyEval_GetGlobals();
53 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000054 PyObject *modname = PyDict_GetItem(globals, namestr);
55 if (modname != NULL) {
56 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000057 return NULL;
58 }
59 }
60 }
Guido van Rossume2966a61991-12-10 13:53:23 +000061 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000063 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000064 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000065 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000066 else {
67 int i;
68 if (!PyTuple_Check(bases)) {
69 PyErr_SetString(PyExc_SystemError,
70 "PyClass_New: bases must be a tuple");
71 return NULL;
72 }
73 i = PyTuple_Size(bases);
74 while (--i >= 0) {
75 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
76 PyErr_SetString(PyExc_SystemError,
77 "PyClass_New: base must be a class");
78 return NULL;
79 }
80 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000082 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000083 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000084 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000087 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000090 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000092 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000093 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000094 getattrstr = PyString_InternFromString("__getattr__");
95 setattrstr = PyString_InternFromString("__setattr__");
96 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +000097 }
98 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
99 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
100 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 Py_XINCREF(op->cl_getattr);
102 Py_XINCREF(op->cl_setattr);
103 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000104 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
107
108/* Class methods */
109
110static void
Fred Drake79912472000-07-09 04:06:11 +0000111class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000113 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 Py_DECREF(op->cl_bases);
115 Py_DECREF(op->cl_dict);
116 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000117 Py_XDECREF(op->cl_getattr);
118 Py_XDECREF(op->cl_setattr);
119 Py_XDECREF(op->cl_delattr);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000120 op = (PyClassObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000121 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122}
123
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000125class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000126{
127 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000129 if (value != NULL) {
130 *pclass = cp;
131 return value;
132 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000134 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000135 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136 PyObject *v = class_lookup(
137 (PyClassObject *)
138 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000139 if (v != NULL)
140 return v;
141 }
142 return NULL;
143}
144
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000146class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 register PyObject *v;
149 register char *sname = PyString_AsString(name);
150 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000151 if (sname[0] == '_' && sname[1] == '_') {
152 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 if (PyEval_GetRestricted()) {
154 PyErr_SetString(PyExc_RuntimeError,
155 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000156 return NULL;
157 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000159 return op->cl_dict;
160 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000161 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000163 return op->cl_bases;
164 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000165 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000166 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000168 else
169 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000171 return v;
172 }
Guido van Rossum94308391991-10-20 20:11:48 +0000173 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000174 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000175 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000176 PyErr_Format(PyExc_AttributeError,
177 "class %.50s has no attribute '%.400s'",
178 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000179 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000181 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 if (PyFunction_Check(v)) {
183 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
184 (PyObject *)class);
185 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000186 v = w;
187 }
188 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189}
190
Guido van Rossuma63eff61998-05-29 21:37:21 +0000191static void
Fred Drake79912472000-07-09 04:06:11 +0000192set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000193{
194 PyObject *temp = *slot;
195 Py_XINCREF(v);
196 *slot = v;
197 Py_XDECREF(temp);
198}
199
Guido van Rossum7ba30431998-07-08 13:34:48 +0000200static void
Fred Drake79912472000-07-09 04:06:11 +0000201set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000202{
203 PyClassObject *dummy;
204
205 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
206 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
207 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
208}
209
Guido van Rossuma63eff61998-05-29 21:37:21 +0000210static char *
Fred Drake79912472000-07-09 04:06:11 +0000211set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000212{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000213 if (v == NULL || !PyDict_Check(v))
214 return "__dict__ must be a dictionary object";
215 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000216 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000217 return "";
218}
219
220static char *
Fred Drake79912472000-07-09 04:06:11 +0000221set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000222{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000223 int i, n;
224
225 if (v == NULL || !PyTuple_Check(v))
226 return "__bases__ must be a tuple object";
227 n = PyTuple_Size(v);
228 for (i = 0; i < n; i++) {
229 PyObject *x = PyTuple_GET_ITEM(v, i);
230 if (!PyClass_Check(x))
231 return "__bases__ items must be classes";
232 if (PyClass_IsSubclass(x, (PyObject *)c))
233 return "a __bases__ item causes an inheritance cycle";
234 }
235 set_slot(&c->cl_bases, 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_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000242{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000243 if (v == NULL || !PyString_Check(v))
244 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000245 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000246 return "__name__ must not contain null bytes";
247 set_slot(&c->cl_name, v);
248 return "";
249}
250
Guido van Rossum94308391991-10-20 20:11:48 +0000251static int
Fred Drake79912472000-07-09 04:06:11 +0000252class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000253{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000254 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 if (PyEval_GetRestricted()) {
256 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000257 "classes are read-only in restricted mode");
258 return -1;
259 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000260 sname = PyString_AsString(name);
261 if (sname[0] == '_' && sname[1] == '_') {
262 int n = PyString_Size(name);
263 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000264 char *err = NULL;
265 if (strcmp(sname, "__dict__") == 0)
266 err = set_dict(op, v);
267 else if (strcmp(sname, "__bases__") == 0)
268 err = set_bases(op, v);
269 else if (strcmp(sname, "__name__") == 0)
270 err = set_name(op, v);
271 else if (strcmp(sname, "__getattr__") == 0)
272 set_slot(&op->cl_getattr, v);
273 else if (strcmp(sname, "__setattr__") == 0)
274 set_slot(&op->cl_setattr, v);
275 else if (strcmp(sname, "__delattr__") == 0)
276 set_slot(&op->cl_delattr, v);
277 /* For the last three, we fall through to update the
278 dictionary as well. */
279 if (err != NULL) {
280 if (*err == '\0')
281 return 0;
282 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000283 return -1;
284 }
285 }
286 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000287 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000289 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000290 PyErr_Format(PyExc_AttributeError,
291 "class %.50s has no attribute '%.400s'",
292 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000293 return rv;
294 }
Guido van Rossum94308391991-10-20 20:11:48 +0000295 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000297}
298
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000300class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000301{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000302 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000303 char buf[140];
304 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000306 name = "?";
307 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000309 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000310 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000311 else
Fred Drakea44d3532000-06-30 15:01:00 +0000312 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000313 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000314 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000316}
317
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000318static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000319class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000320{
321 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
322 PyObject *name = op->cl_name;
323 PyObject *res;
324 int m, n;
325
326 if (name == NULL || !PyString_Check(name))
327 return class_repr(op);
328 if (mod == NULL || !PyString_Check(mod)) {
329 Py_INCREF(name);
330 return name;
331 }
332 m = PyString_Size(mod);
333 n = PyString_Size(name);
334 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
335 if (res != NULL) {
336 char *s = PyString_AsString(res);
337 memcpy(s, PyString_AsString(mod), m);
338 s += m;
339 *s++ = '.';
340 memcpy(s, PyString_AsString(name), n);
341 }
342 return res;
343}
344
Jeremy Hylton8caad492000-06-23 14:18:11 +0000345static int
346class_traverse(PyClassObject *o, visitproc visit, void *arg)
347{
348 int err;
349 if (o->cl_bases) {
350 err = visit(o->cl_bases, arg);
351 if (err)
352 return err;
353 }
354 if (o->cl_dict) {
355 err = visit(o->cl_dict, arg);
356 if (err)
357 return err;
358 }
359 if (o->cl_name) {
360 err = visit(o->cl_name, arg);
361 if (err)
362 return err;
363 }
364 if (o->cl_getattr) {
365 err = visit(o->cl_getattr, arg);
366 if (err)
367 return err;
368 }
369 if (o->cl_setattr) {
370 err = visit(o->cl_setattr, arg);
371 if (err)
372 return err;
373 }
374 if (o->cl_delattr) {
375 err = visit(o->cl_delattr, arg);
376 if (err)
377 return err;
378 }
379 return 0;
380}
381
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382PyTypeObject PyClass_Type = {
383 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 0,
385 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000386 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000388 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000390 0, /*tp_getattr*/
391 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000393 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394 0, /*tp_as_number*/
395 0, /*tp_as_sequence*/
396 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000397 0, /*tp_hash*/
398 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000399 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000400 (getattrofunc)class_getattr, /*tp_getattro*/
401 (setattrofunc)class_setattr, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000402 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000403 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000404 0, /* tp_doc */
405 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406};
407
Guido van Rossum81daa321993-05-20 14:24:46 +0000408int
Fred Drake79912472000-07-09 04:06:11 +0000409PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000410{
411 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000413 if (class == base)
414 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000416 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 cp = (PyClassObject *)class;
418 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000419 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000421 return 1;
422 }
423 return 0;
424}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425
Guido van Rossum81daa321993-05-20 14:24:46 +0000426
427/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000430PyInstance_New(PyObject *class, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 register PyInstanceObject *inst;
433 PyObject *init;
434 static PyObject *initstr;
435 if (!PyClass_Check(class)) {
436 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437 return NULL;
438 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000440 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000443 if (inst->in_dict == NULL) {
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000444 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumd7823f22000-06-28 23:46:07 +0000445 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 return NULL;
447 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000448 Py_INCREF(class);
449 inst->in_class = (PyClassObject *)class;
Neil Schemenauere3550a62000-10-04 16:20:41 +0000450 PyObject_GC_Init(inst);
Guido van Rossum2878a691996-08-09 20:53:24 +0000451 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000452 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000453 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000454 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 if ((arg != NULL && (!PyTuple_Check(arg) ||
456 PyTuple_Size(arg) != 0))
457 || (kw != NULL && (!PyDict_Check(kw) ||
458 PyDict_Size(kw) != 0))) {
459 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000460 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000462 inst = NULL;
463 }
464 }
465 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
467 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000468 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000470 inst = NULL;
471 }
472 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 if (res != Py_None) {
474 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000475 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000477 inst = NULL;
478 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000480 }
481 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483}
484
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000485/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486
487static void
Fred Drake79912472000-07-09 04:06:11 +0000488instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 PyObject *error_type, *error_value, *error_traceback;
491 PyObject *del;
492 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000493#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000494 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000495#endif
Tim Peters6b184912000-09-17 14:40:17 +0000496 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000497#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000498#ifndef Py_REF_DEBUG
499# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
500#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000501 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000503 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000504#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000505 /* compensate for boost in _Py_NewReference; note that
506 * _Py_RefTotal was also boosted; we'll knock that down later.
507 */
508 inst->ob_type->tp_alloc--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000509#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000510#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000511 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000513#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000514
515 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000517 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000518 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000519 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000520 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000522 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000523 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000524 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 Py_DECREF(res);
526 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000527 }
Tim Peters6b184912000-09-17 14:40:17 +0000528 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000530 /* Undo the temporary resurrection; can't use DECREF here, it would
531 * cause a recursive call.
532 */
533#ifdef Py_REF_DEBUG
534 /* _Py_RefTotal was boosted either by _Py_NewReference or
535 * Py_INCREF above.
536 */
537 _Py_RefTotal--;
538#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000539 if (--inst->ob_refcnt > 0) {
540#ifdef COUNT_ALLOCS
541 inst->ob_type->tp_free--;
542#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000543 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000544 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000545#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000546 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000547#ifdef COUNT_ALLOCS
548 /* compensate for increment in _Py_ForgetReference */
549 inst->ob_type->tp_free--;
550#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000551#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000552 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000553#endif
Tim Peters6b184912000-09-17 14:40:17 +0000554#endif
Neil Schemenauerce209672000-09-15 18:57:21 +0000555 PyObject_GC_Fini(inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 Py_DECREF(inst->in_class);
557 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000558 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000559 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560}
561
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000563instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 register PyObject *v;
566 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000567 if (sname[0] == '_' && sname[1] == '_') {
568 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 if (PyEval_GetRestricted()) {
570 PyErr_SetString(PyExc_RuntimeError,
571 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000572 return NULL;
573 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000575 return inst->in_dict;
576 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000577 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 Py_INCREF(inst->in_class);
579 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000580 }
Guido van Rossum94308391991-10-20 20:11:48 +0000581 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000582 v = instance_getattr2(inst, name);
583 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000584 PyErr_Format(PyExc_AttributeError,
585 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000586 PyString_AS_STRING(inst->in_class->cl_name), sname);
587 }
588 return v;
589}
590
591static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000592instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000593{
594 register PyObject *v;
595 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000596 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000598 if (v == NULL) {
599 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000600 if (v == NULL)
601 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000602 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000603 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000604 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 if (PyFunction_Check(v)) {
606 PyObject *w = PyMethod_New(v, (PyObject *)inst,
607 (PyObject *)class);
608 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000609 v = w;
610 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 else if (PyMethod_Check(v)) {
612 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000613 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
615 PyObject *im_func = PyMethod_Function(v);
616 PyObject *w = PyMethod_New(im_func,
617 (PyObject *)inst, im_class);
618 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000619 v = w;
620 }
621 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000622 }
623 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624}
625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000627instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000628{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000630 res = instance_getattr1(inst, name);
631 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 PyObject *args;
633 PyErr_Clear();
634 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000635 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000636 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 res = PyEval_CallObject(func, args);
638 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000639 }
640 return res;
641}
642
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000643static int
Fred Drake79912472000-07-09 04:06:11 +0000644instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000645{
Guido van Rossum94472a01992-09-04 09:45:18 +0000646 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000648 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000649 PyErr_Format(PyExc_AttributeError,
650 "%.50s instance has no attribute '%.400s'",
651 PyString_AS_STRING(inst->in_class->cl_name),
652 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000653 return rv;
654 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000655 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657}
658
Guido van Rossume7737541994-09-05 07:31:41 +0000659static int
Fred Drake79912472000-07-09 04:06:11 +0000660instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000661{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000662 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000664 if (sname[0] == '_' && sname[1] == '_') {
665 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000666 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000667 if (strcmp(sname, "__dict__") == 0) {
668 if (PyEval_GetRestricted()) {
669 PyErr_SetString(PyExc_RuntimeError,
670 "__dict__ not accessible in restricted mode");
671 return -1;
672 }
673 if (v == NULL || !PyDict_Check(v)) {
674 PyErr_SetString(PyExc_TypeError,
675 "__dict__ must be set to a dictionary");
676 return -1;
677 }
678 tmp = inst->in_dict;
679 Py_INCREF(v);
680 inst->in_dict = v;
681 Py_DECREF(tmp);
682 return 0;
683 }
684 if (strcmp(sname, "__class__") == 0) {
685 if (PyEval_GetRestricted()) {
686 PyErr_SetString(PyExc_RuntimeError,
687 "__class__ not accessible in restricted mode");
688 return -1;
689 }
690 if (v == NULL || !PyClass_Check(v)) {
691 PyErr_SetString(PyExc_TypeError,
692 "__class__ must be set to a class");
693 return -1;
694 }
695 tmp = (PyObject *)(inst->in_class);
696 Py_INCREF(v);
697 inst->in_class = (PyClassObject *)v;
698 Py_DECREF(tmp);
699 return 0;
700 }
Guido van Rossume7737541994-09-05 07:31:41 +0000701 }
Guido van Rossume7737541994-09-05 07:31:41 +0000702 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000703 if (v == NULL)
704 func = inst->in_class->cl_delattr;
705 else
706 func = inst->in_class->cl_setattr;
707 if (func == NULL)
708 return instance_setattr1(inst, name, v);
709 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000711 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000713 if (args == NULL)
714 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 res = PyEval_CallObject(func, args);
716 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000717 if (res == NULL)
718 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000720 return 0;
721}
722
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000724instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 PyObject *func;
727 PyObject *res;
728 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000729
Guido van Rossum2878a691996-08-09 20:53:24 +0000730 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000731 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000732 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000733 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000734 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000736 PyObject *mod = PyDict_GetItemString(
737 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000738 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 if (classname != NULL && PyString_Check(classname))
740 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000741 else
742 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000744 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000745 sprintf(buf, "<?.%.100s instance at %p>",
746 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000747 else
Fred Drakea44d3532000-06-30 15:01:00 +0000748 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000749 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000750 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000752 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 res = PyEval_CallObject(func, (PyObject *)NULL);
754 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000755 return res;
756}
757
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000759instance_compare1(PyObject *inst, PyObject *other)
Guido van Rossume7d444f1995-01-07 12:35:18 +0000760{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000762 instance_compare1);
763}
764
Guido van Rossum9bfef441993-03-29 10:43:31 +0000765static int
Fred Drake79912472000-07-09 04:06:11 +0000766instance_compare(PyObject *inst, PyObject *other)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000769 long outcome;
770 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000771 if (result == NULL)
772 return -1;
773 if (!PyInt_Check(result)) {
774 Py_DECREF(result);
775 PyErr_SetString(PyExc_TypeError,
776 "comparison did not return an int");
777 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000778 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 outcome = PyInt_AsLong(result);
780 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000781 if (outcome < 0)
782 return -1;
783 else if (outcome > 0)
784 return 1;
785 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000786}
787
Guido van Rossum9bfef441993-03-29 10:43:31 +0000788static long
Fred Drake79912472000-07-09 04:06:11 +0000789instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000790{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 PyObject *func;
792 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000793 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000795
Guido van Rossum2878a691996-08-09 20:53:24 +0000796 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000797 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000798 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799 if (func == NULL) {
800 /* If there is no __cmp__ method, we hash on the address.
801 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000803 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000804 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000805 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000806 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 PyErr_Clear();
Fred Drake13634cf2000-06-29 19:17:04 +0000808 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000809 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000811 return -1;
812 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 res = PyEval_CallObject(func, (PyObject *)NULL);
814 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000815 if (res == NULL)
816 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 if (PyInt_Check(res)) {
818 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000819 if (outcome == -1)
820 outcome = -2;
821 }
822 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 PyErr_SetString(PyExc_TypeError,
824 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000825 outcome = -1;
826 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828 return outcome;
829}
830
Jeremy Hylton8caad492000-06-23 14:18:11 +0000831static int
832instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
833{
834 int err;
835 if (o->in_class) {
836 err = visit((PyObject *)(o->in_class), arg);
837 if (err)
838 return err;
839 }
840 if (o->in_dict) {
841 err = visit(o->in_dict, arg);
842 if (err)
843 return err;
844 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000845 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000846}
847
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000849
Guido van Rossum9bfef441993-03-29 10:43:31 +0000850static int
Fred Drake79912472000-07-09 04:06:11 +0000851instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000852{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 PyObject *func;
854 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855 int outcome;
856
Guido van Rossum2878a691996-08-09 20:53:24 +0000857 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000858 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000859 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000860 if (func == NULL)
861 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 res = PyEval_CallObject(func, (PyObject *)NULL);
863 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000864 if (res == NULL)
865 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 if (PyInt_Check(res)) {
867 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000868 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 PyErr_SetString(PyExc_ValueError,
870 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000871 }
872 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 PyErr_SetString(PyExc_TypeError,
874 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875 outcome = -1;
876 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000878 return outcome;
879}
880
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000882instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000883{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 PyObject *func;
885 PyObject *arg;
886 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000887
Guido van Rossum2878a691996-08-09 20:53:24 +0000888 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000889 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000890 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000891 if (func == NULL)
892 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000896 return NULL;
897 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 res = PyEval_CallObject(func, arg);
899 Py_DECREF(func);
900 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 return res;
902}
903
Guido van Rossum9bfef441993-03-29 10:43:31 +0000904static int
Fred Drake79912472000-07-09 04:06:11 +0000905instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000906{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 PyObject *func;
908 PyObject *arg;
909 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910
Guido van Rossum2878a691996-08-09 20:53:24 +0000911 if (value == NULL) {
912 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000913 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000914 func = instance_getattr(inst, delitemstr);
915 }
916 else {
917 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000918 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000919 func = instance_getattr(inst, setitemstr);
920 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000921 if (func == NULL)
922 return -1;
923 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000929 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000930 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 res = PyEval_CallObject(func, arg);
932 Py_DECREF(func);
933 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934 if (res == NULL)
935 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000937 return 0;
938}
939
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000941 (inquiry)instance_length, /*mp_length*/
942 (binaryfunc)instance_subscript, /*mp_subscript*/
943 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944};
945
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000947instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 PyObject *func, *arg, *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("(i)", i);
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 Rossumc0b618a1997-05-02 03:12:38 +0000967static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +0000968sliceobj_from_intint(int i, int j)
969{
970 PyObject *start, *end, *res;
971
972 start = PyInt_FromLong((long)i);
973 if (!start)
974 return NULL;
975
976 end = PyInt_FromLong((long)j);
977 if (!end) {
978 Py_DECREF(start);
979 return NULL;
980 }
981 res = PySlice_New(start, end, NULL);
982 Py_DECREF(start);
983 Py_DECREF(end);
984 return res;
985}
986
987
988static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000989instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyObject *func, *arg, *res;
992 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993
Guido van Rossum2878a691996-08-09 20:53:24 +0000994 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000995 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000996 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +0000997
998 if (func == NULL) {
999 PyErr_Clear();
1000
1001 if (getitemstr == NULL)
1002 getitemstr = PyString_InternFromString("__getitem__");
1003 func = instance_getattr(inst, getitemstr);
1004 if (func == NULL)
1005 return NULL;
1006 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
1007 } else
1008 arg = Py_BuildValue("(ii)", i, j);
1009
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012 return NULL;
1013 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 res = PyEval_CallObject(func, arg);
1015 Py_DECREF(func);
1016 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001017 return res;
1018}
1019
1020static int
Fred Drake79912472000-07-09 04:06:11 +00001021instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024
Guido van Rossum2878a691996-08-09 20:53:24 +00001025 if (item == NULL) {
1026 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001027 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001028 func = instance_getattr(inst, delitemstr);
1029 }
1030 else {
1031 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001032 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001033 func = instance_getattr(inst, setitemstr);
1034 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001036 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001037 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001039 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001041 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001043 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 res = PyEval_CallObject(func, arg);
1046 Py_DECREF(func);
1047 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 if (res == NULL)
1049 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051 return 0;
1052}
1053
1054static int
Fred Drake79912472000-07-09 04:06:11 +00001055instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 PyObject *func, *arg, *res;
1058 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059
Guido van Rossum2878a691996-08-09 20:53:24 +00001060 if (value == NULL) {
1061 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 delslicestr =
1063 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001064 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001065 if (func == NULL) {
1066 PyErr_Clear();
1067 if (delitemstr == NULL)
1068 delitemstr =
1069 PyString_InternFromString("__delitem__");
1070 func = instance_getattr(inst, delitemstr);
1071 if (func == NULL)
1072 return -1;
1073
1074 arg = Py_BuildValue("(N)",
1075 sliceobj_from_intint(i, j));
1076 } else
1077 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001078 }
1079 else {
1080 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 setslicestr =
1082 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001083 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001084 if (func == NULL) {
1085 PyErr_Clear();
1086 if (setitemstr == NULL)
1087 setitemstr =
1088 PyString_InternFromString("__setitem__");
1089 func = instance_getattr(inst, setitemstr);
1090 if (func == NULL)
1091 return -1;
1092
1093 arg = Py_BuildValue("(NO)",
1094 sliceobj_from_intint(i, j), value);
1095 } else
1096 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001097 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001100 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001101 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001102 res = PyEval_CallObject(func, arg);
1103 Py_DECREF(func);
1104 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105 if (res == NULL)
1106 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108 return 0;
1109}
1110
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001111static int instance_contains(PyInstanceObject *inst, PyObject *member)
1112{
1113 static PyObject *__contains__;
1114 PyObject *func, *arg, *res;
1115 int ret;
1116
1117 if(__contains__ == NULL) {
1118 __contains__ = PyString_InternFromString("__contains__");
1119 if(__contains__ == NULL)
1120 return -1;
1121 }
1122 func = instance_getattr(inst, __contains__);
1123 if(func == NULL) {
Thomas Wouters7e474022000-07-16 12:04:32 +00001124 /* fall back to previous behavior */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001125 int i, cmp_res;
1126
1127 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1128 return -1;
1129 PyErr_Clear();
1130 for(i=0;;i++) {
1131 PyObject *obj = instance_item(inst, i);
1132 int ret = 0;
1133
1134 if(obj == NULL) {
1135 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1136 return -1;
1137 PyErr_Clear();
1138 return 0;
1139 }
1140 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1141 ret = -1;
1142 if(cmp_res == 0)
1143 ret = 1;
1144 Py_DECREF(obj);
1145 if(ret)
1146 return ret;
1147 }
1148 }
1149 arg = Py_BuildValue("(O)", member);
1150 if(arg == NULL) {
1151 Py_DECREF(func);
1152 return -1;
1153 }
1154 res = PyEval_CallObject(func, arg);
1155 Py_DECREF(func);
1156 Py_DECREF(arg);
1157 if(res == NULL)
1158 return -1;
1159 ret = PyObject_IsTrue(res);
1160 Py_DECREF(res);
1161 return ret;
1162}
1163
Fred Drake79912472000-07-09 04:06:11 +00001164static PySequenceMethods
1165instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001166 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001167 0, /*sq_concat*/
1168 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001169 (intargfunc)instance_item, /*sq_item*/
1170 (intintargfunc)instance_slice, /*sq_slice*/
1171 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1172 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001173 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001174};
1175
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001177generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001178{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001180
1181 if ((func = instance_getattr(self, methodname)) == NULL)
1182 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 res = PyEval_CallObject(func, (PyObject *)NULL);
1184 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001185 return res;
1186}
1187
Guido van Rossum03093a21994-09-28 15:51:32 +00001188
Guido van Rossum03093a21994-09-28 15:51:32 +00001189/* Implement a binary operator involving at least one class instance. */
1190
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001192PyInstance_DoBinOp(PyObject *v, PyObject *w, char *opname, char *ropname,
1193 PyObject * (*thisfunc)(PyObject *, PyObject *))
Guido van Rossum03093a21994-09-28 15:51:32 +00001194{
1195 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 PyObject *result = NULL;
Barry Warsawdc55d712000-08-18 04:57:32 +00001197
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001198 if (PyInstance_HalfBinOp(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001199 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001200 if (PyInstance_HalfBinOp(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001201 return result;
Thomas Wouters7e474022000-07-16 12:04:32 +00001202 /* Sigh -- special case for comparisons */
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001203 if (strcmp(opname, "__cmp__") == 0) {
Barry Warsawdc55d712000-08-18 04:57:32 +00001204 Py_uintptr_t iv = (Py_uintptr_t)v;
1205 Py_uintptr_t iw = (Py_uintptr_t)w;
1206 long c = (iv < iw) ? -1 : (iv > iw) ? 1 : 0;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001207 return PyInt_FromLong(c);
1208 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001209 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001211 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001212}
1213
Guido van Rossum03093a21994-09-28 15:51:32 +00001214
1215/* Try one half of a binary operator involving a class instance.
1216 Return value:
1217 -1 if an exception is to be reported right away
1218 0 if we have a valid result
1219 1 if we could try another operation
1220*/
1221
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001223
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001224int
1225PyInstance_HalfBinOp(PyObject *v, PyObject *w, char *opname, PyObject **r_result,
1226 PyObject * (*thisfunc)(PyObject *, PyObject *), int swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +00001227{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 PyObject *func;
1229 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001230 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 PyObject *coerced = NULL;
1232 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001235 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001236 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001237 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001238 if (coerce_obj == NULL)
1239 return -1;
1240 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001241 coercefunc = PyObject_GetAttr(v, coerce_obj);
1242 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001244 }
1245 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001247 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001248 return -1;
1249 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001250 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001252 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001253 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001254 return -1;
1255 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 if (coerced == Py_None) {
1257 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001258 return 1;
1259 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1261 Py_DECREF(coerced);
1262 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001263 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001264 return -1;
1265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 v1 = PyTuple_GetItem(coerced, 0);
1267 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001268 if (v1 != v) {
1269 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001271 if (swapped)
1272 *r_result = (*thisfunc)(w, v);
1273 else
1274 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001276 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001277 }
1278 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001279 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001281 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001283 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001284 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001286 return 1;
1287 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001289 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 Py_DECREF(func);
1291 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001292 return -1;
1293 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 *r_result = PyEval_CallObject(func, args);
1295 Py_DECREF(args);
1296 Py_DECREF(func);
1297 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001298 return *r_result == NULL ? -1 : 0;
1299}
1300
Guido van Rossum879c5811995-01-10 15:24:06 +00001301static int
Fred Drake79912472000-07-09 04:06:11 +00001302instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001303{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 PyObject *v = *pv;
1305 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001306 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 PyObject *args;
1308 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001309
Guido van Rossum2878a691996-08-09 20:53:24 +00001310 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001311 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001312 if (coerce_obj == NULL)
1313 return -1;
1314 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001315 coercefunc = PyObject_GetAttr(v, coerce_obj);
1316 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001317 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 PyErr_Clear();
1319 Py_INCREF(v);
1320 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001321 return 0;
1322 }
1323 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001325 if (args == NULL) {
1326 return -1;
1327 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001328 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001330 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001331 if (coerced == NULL) {
1332 /* __coerce__ call raised an exception */
1333 return -1;
1334 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001336 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001338 return 1;
1339 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001341 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 Py_DECREF(coerced);
1343 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001344 "coercion should return None or 2-tuple");
1345 return -1;
1346 }
1347 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 *pv = PyTuple_GetItem(coerced, 0);
1349 *pw = PyTuple_GetItem(coerced, 1);
1350 Py_INCREF(*pv);
1351 Py_INCREF(*pw);
1352 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001353 return 0;
1354}
1355
Guido van Rossum03093a21994-09-28 15:51:32 +00001356
Guido van Rossum04691fc1992-08-12 15:35:34 +00001357#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001358static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001360 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001361 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001362}
1363
Guido van Rossum04691fc1992-08-12 15:35:34 +00001364UNARY(instance_neg, "__neg__")
1365UNARY(instance_pos, "__pos__")
1366UNARY(instance_abs, "__abs__")
1367
Guido van Rossum9bfef441993-03-29 10:43:31 +00001368static int
Fred Drake79912472000-07-09 04:06:11 +00001369instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001370{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001372 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001374
Guido van Rossum2878a691996-08-09 20:53:24 +00001375 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001376 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001377 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001379 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001380 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001381 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001383 /* Fall back to the default behavior:
1384 all instances are nonzero */
1385 return 1;
1386 }
1387 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388 res = PyEval_CallObject(func, (PyObject *)NULL);
1389 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001390 if (res == NULL)
1391 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392 if (!PyInt_Check(res)) {
1393 Py_DECREF(res);
1394 PyErr_SetString(PyExc_TypeError,
1395 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001396 return -1;
1397 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 outcome = PyInt_AsLong(res);
1399 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001400 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401 PyErr_SetString(PyExc_ValueError,
1402 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001403 return -1;
1404 }
1405 return outcome > 0;
1406}
1407
1408UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001409UNARY(instance_int, "__int__")
1410UNARY(instance_long, "__long__")
1411UNARY(instance_float, "__float__")
1412UNARY(instance_oct, "__oct__")
1413UNARY(instance_hex, "__hex__")
1414
Guido van Rossum03093a21994-09-28 15:51:32 +00001415/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001416static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001417instance_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum03093a21994-09-28 15:51:32 +00001418{
1419 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 PyObject *func;
1421 PyObject *args;
1422 PyObject *result;
1423 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001424
1425 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001426 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001428 if (func == NULL)
1429 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001431 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001433 return NULL;
1434 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 result = PyEval_CallObject(func, args);
1436 Py_DECREF(func);
1437 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001438 return result;
1439}
1440
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001441static PyObject *
1442instance_inplace_pow(PyObject *v, PyObject *w, PyObject *z)
1443{
1444 /* XXX Doesn't do coercions... */
1445 PyObject *func;
1446 PyObject *args;
1447 PyObject *result;
1448 static PyObject *ipowstr;
1449
1450 if (ipowstr == NULL)
1451 ipowstr = PyString_InternFromString("__ipow__");
1452 func = PyObject_GetAttr(v, ipowstr);
1453 if (func == NULL) {
1454 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1455 return NULL;
Thomas Wouters1de2a792000-08-25 10:47:46 +00001456 PyErr_Clear();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001457 return instance_pow(v, w, z);
1458 }
1459 args = Py_BuildValue("(OO)", w, z);
1460 if (args == NULL) {
1461 Py_DECREF(func);
1462 return NULL;
1463 }
1464 result = PyEval_CallObject(func, args);
1465 Py_DECREF(func);
1466 Py_DECREF(args);
1467 return result;
1468}
1469
1470
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001472 0, /*nb_add*/
1473 0, /*nb_subtract*/
1474 0, /*nb_multiply*/
1475 0, /*nb_divide*/
1476 0, /*nb_remainder*/
1477 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001478 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001479 (unaryfunc)instance_neg, /*nb_negative*/
1480 (unaryfunc)instance_pos, /*nb_positive*/
1481 (unaryfunc)instance_abs, /*nb_absolute*/
1482 (inquiry)instance_nonzero, /*nb_nonzero*/
1483 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001484 0, /*nb_lshift*/
1485 0, /*nb_rshift*/
1486 0, /*nb_and*/
1487 0, /*nb_xor*/
1488 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001489 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001490 (unaryfunc)instance_int, /*nb_int*/
1491 (unaryfunc)instance_long, /*nb_long*/
1492 (unaryfunc)instance_float, /*nb_float*/
1493 (unaryfunc)instance_oct, /*nb_oct*/
1494 (unaryfunc)instance_hex, /*nb_hex*/
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001495 0, /*nb_inplace_add*/
1496 0, /*nb_inplace_subtract*/
1497 0, /*nb_inplace_multiply*/
1498 0, /*nb_inplace_divide*/
1499 0, /*nb_inplace_remainder*/
1500 (ternaryfunc)instance_inplace_pow, /*nb_inplace_power*/
1501 0, /*nb_inplace_lshift*/
1502 0, /*nb_inplace_rshift*/
1503 0, /*nb_inplace_and*/
1504 0, /*nb_inplace_xor*/
1505 0, /*nb_inplace_or*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001506};
1507
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508PyTypeObject PyInstance_Type = {
1509 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001510 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001511 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001512 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001513 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001514 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001515 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001516 0, /*tp_getattr*/
1517 0, /*tp_setattr*/
1518 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001519 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001520 &instance_as_number, /*tp_as_number*/
1521 &instance_as_sequence, /*tp_as_sequence*/
1522 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001523 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001524 0, /*tp_call*/
1525 0, /*tp_str*/
1526 (getattrofunc)instance_getattr, /*tp_getattro*/
1527 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001528 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001529 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001530 0, /* tp_doc */
1531 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001532};
1533
1534
Guido van Rossum81daa321993-05-20 14:24:46 +00001535/* Instance method objects are used for two purposes:
1536 (a) as bound instance methods (returned by instancename.methodname)
1537 (b) as unbound methods (returned by ClassName.methodname)
1538 In case (b), im_self is NULL
1539*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001540
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001541static PyMethodObject *free_list;
1542
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001544PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001545{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001547 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001548 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001549 return NULL;
1550 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001551 im = free_list;
1552 if (im != NULL) {
1553 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001554 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001555 }
1556 else {
1557 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1558 if (im == NULL)
1559 return NULL;
1560 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001561 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001562 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001564 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001566 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001567 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001569}
1570
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001572PyMethod_Function(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001573{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 if (!PyMethod_Check(im)) {
1575 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001576 return NULL;
1577 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001579}
1580
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001582PyMethod_Self(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001583{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001584 if (!PyMethod_Check(im)) {
1585 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001586 return NULL;
1587 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001589}
1590
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001592PyMethod_Class(register PyObject *im)
Guido van Rossum81daa321993-05-20 14:24:46 +00001593{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 if (!PyMethod_Check(im)) {
1595 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001596 return NULL;
1597 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001599}
1600
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001601/* Class method methods */
1602
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001604
Guido van Rossume8122f11991-05-05 20:03:07 +00001605static struct memberlist instancemethod_memberlist[] = {
1606 {"im_func", T_OBJECT, OFF(im_func)},
1607 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001608 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001609 /* Dummies that are not handled by getattr() except for __members__ */
1610 {"__doc__", T_INT, 0},
1611 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001612 {NULL} /* Sentinel */
1613};
1614
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001616instancemethod_getattr(register PyMethodObject *im, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001619 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001620 /* Inherit __name__ and __doc__ from the callable object
1621 implementing the method */
1622 if (strcmp(sname, "__name__") == 0 ||
1623 strcmp(sname, "__doc__") == 0)
1624 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001625 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 if (PyEval_GetRestricted()) {
1627 PyErr_SetString(PyExc_RuntimeError,
1628 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001629 return NULL;
1630 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632}
1633
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001634static void
Fred Drake79912472000-07-09 04:06:11 +00001635instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001636{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001637 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 Py_DECREF(im->im_func);
1639 Py_XDECREF(im->im_self);
1640 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001641 im->im_self = (PyObject *)free_list;
1642 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001643}
1644
Guido van Rossumebc8c511992-09-03 20:39:51 +00001645static int
Fred Drake79912472000-07-09 04:06:11 +00001646instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00001647{
Guido van Rossume9df7271995-04-06 14:46:51 +00001648 if (a->im_self != b->im_self)
1649 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001651}
1652
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001653static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001654instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00001655{
1656 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001658 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 PyClassObject *class = (PyClassObject *)(a->im_class);
1660 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001661 char *fcname, *icname, *fname;
1662 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001663 if (PyFunction_Check(func)) {
1664 funcname = ((PyFunctionObject *)func)->func_name;
1665 Py_INCREF(funcname);
1666 }
1667 else {
1668 funcname = PyObject_GetAttrString(func,"__name__");
1669 if (funcname == NULL)
1670 PyErr_Clear();
1671 }
1672 if (funcname != NULL && PyString_Check(funcname))
1673 fname = PyString_AS_STRING(funcname);
1674 else
1675 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001676 if (fclassname != NULL && PyString_Check(fclassname))
1677 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001678 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001679 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001680 if (self == NULL)
1681 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1682 else {
1683 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684 if (iclassname != NULL && PyString_Check(iclassname))
1685 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001686 else
1687 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001688 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1689 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001690 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001691 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001693}
1694
Guido van Rossum9bfef441993-03-29 10:43:31 +00001695static long
Fred Drake79912472000-07-09 04:06:11 +00001696instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001697{
1698 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001699 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001701 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001703 if (x == -1)
1704 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001705 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001706 if (y == -1)
1707 return -1;
1708 return x ^ y;
1709}
1710
Jeremy Hylton8caad492000-06-23 14:18:11 +00001711static int
1712instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1713{
1714 int err;
1715 if (im->im_func) {
1716 err = visit(im->im_func, arg);
1717 if (err)
1718 return err;
1719 }
1720 if (im->im_self) {
1721 err = visit(im->im_self, arg);
1722 if (err)
1723 return err;
1724 }
1725 if (im->im_class) {
1726 err = visit(im->im_class, arg);
1727 if (err)
1728 return err;
1729 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001730 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001731}
1732
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733PyTypeObject PyMethod_Type = {
1734 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001735 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001736 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001737 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001738 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001739 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001740 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001741 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001742 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001743 (cmpfunc)instancemethod_compare, /*tp_compare*/
1744 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001745 0, /*tp_as_number*/
1746 0, /*tp_as_sequence*/
1747 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001748 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001749 0, /*tp_call*/
1750 0, /*tp_str*/
1751 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1752 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001753 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001754 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001755 0, /* tp_doc */
1756 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001757};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001758
1759/* Clear out the free list */
1760
1761void
Fred Drake79912472000-07-09 04:06:11 +00001762PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001763{
1764 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001765 PyMethodObject *im = free_list;
1766 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00001767 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001768 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001769 }
1770}