blob: d1eb451e8e841f56981ca79e2803532e28ba4753 [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 *
Fred Drake79912472000-07-09 04:06:11 +0000975instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000976{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 PyObject *func, *arg, *res;
978 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000979
Guido van Rossum2878a691996-08-09 20:53:24 +0000980 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000981 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000982 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000983 if (func == NULL)
984 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 return NULL;
989 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 res = PyEval_CallObject(func, arg);
991 Py_DECREF(func);
992 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 return res;
994}
995
996static int
Fred Drake79912472000-07-09 04:06:11 +0000997instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000
Guido van Rossum2878a691996-08-09 20:53:24 +00001001 if (item == NULL) {
1002 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001003 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001004 func = instance_getattr(inst, delitemstr);
1005 }
1006 else {
1007 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001008 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001009 func = instance_getattr(inst, setitemstr);
1010 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001011 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001012 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 arg = Py_BuildValue("(iO)", i, item);
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 Rossum6d946f91992-08-14 13:49:30 +00001019 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 }
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 if (res == NULL)
1025 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027 return 0;
1028}
1029
1030static int
Fred Drake79912472000-07-09 04:06:11 +00001031instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001032{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 PyObject *func, *arg, *res;
1034 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001035
Guido van Rossum2878a691996-08-09 20:53:24 +00001036 if (value == NULL) {
1037 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 delslicestr =
1039 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001040 func = instance_getattr(inst, delslicestr);
1041 }
1042 else {
1043 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044 setslicestr =
1045 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001046 func = instance_getattr(inst, setslicestr);
1047 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001049 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001056 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001057 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 res = PyEval_CallObject(func, arg);
1059 Py_DECREF(func);
1060 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001061 if (res == NULL)
1062 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064 return 0;
1065}
1066
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001067static int instance_contains(PyInstanceObject *inst, PyObject *member)
1068{
1069 static PyObject *__contains__;
1070 PyObject *func, *arg, *res;
1071 int ret;
1072
1073 if(__contains__ == NULL) {
1074 __contains__ = PyString_InternFromString("__contains__");
1075 if(__contains__ == NULL)
1076 return -1;
1077 }
1078 func = instance_getattr(inst, __contains__);
1079 if(func == NULL) {
Thomas Wouters7e474022000-07-16 12:04:32 +00001080 /* fall back to previous behavior */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001081 int i, cmp_res;
1082
1083 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1084 return -1;
1085 PyErr_Clear();
1086 for(i=0;;i++) {
1087 PyObject *obj = instance_item(inst, i);
1088 int ret = 0;
1089
1090 if(obj == NULL) {
1091 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1092 return -1;
1093 PyErr_Clear();
1094 return 0;
1095 }
1096 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1097 ret = -1;
1098 if(cmp_res == 0)
1099 ret = 1;
1100 Py_DECREF(obj);
1101 if(ret)
1102 return ret;
1103 }
1104 }
1105 arg = Py_BuildValue("(O)", member);
1106 if(arg == NULL) {
1107 Py_DECREF(func);
1108 return -1;
1109 }
1110 res = PyEval_CallObject(func, arg);
1111 Py_DECREF(func);
1112 Py_DECREF(arg);
1113 if(res == NULL)
1114 return -1;
1115 ret = PyObject_IsTrue(res);
1116 Py_DECREF(res);
1117 return ret;
1118}
1119
Fred Drake79912472000-07-09 04:06:11 +00001120static PySequenceMethods
1121instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001122 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001123 0, /*sq_concat*/
1124 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001125 (intargfunc)instance_item, /*sq_item*/
1126 (intintargfunc)instance_slice, /*sq_slice*/
1127 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1128 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001129 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001130};
1131
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001133generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136
1137 if ((func = instance_getattr(self, methodname)) == NULL)
1138 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139 res = PyEval_CallObject(func, (PyObject *)NULL);
1140 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001141 return res;
1142}
1143
Guido van Rossum03093a21994-09-28 15:51:32 +00001144
1145/* Forward */
Fred Drake79912472000-07-09 04:06:11 +00001146static int
1147halfbinop(PyObject *, PyObject *, char *, PyObject **,
1148 PyObject * (*)(PyObject *, PyObject *), int);
Guido van Rossum03093a21994-09-28 15:51:32 +00001149
1150
1151/* Implement a binary operator involving at least one class instance. */
1152
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001154PyInstance_DoBinOp(PyObject *v, PyObject *w, char *opname, char *ropname,
1155 PyObject * (*thisfunc)(PyObject *, PyObject *))
Guido van Rossum03093a21994-09-28 15:51:32 +00001156{
1157 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001159 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001160 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001161 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001162 return result;
Thomas Wouters7e474022000-07-16 12:04:32 +00001163 /* Sigh -- special case for comparisons */
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001164 if (strcmp(opname, "__cmp__") == 0) {
1165 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1166 return PyInt_FromLong(c);
1167 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001168 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001170 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001171}
1172
Guido van Rossum03093a21994-09-28 15:51:32 +00001173
1174/* Try one half of a binary operator involving a class instance.
1175 Return value:
1176 -1 if an exception is to be reported right away
1177 0 if we have a valid result
1178 1 if we could try another operation
1179*/
1180
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001182
Guido van Rossum03093a21994-09-28 15:51:32 +00001183static int
Fred Drake79912472000-07-09 04:06:11 +00001184halfbinop(PyObject *v, PyObject *w, char *opname, PyObject **r_result,
1185 PyObject * (*thisfunc)(PyObject *, PyObject *), int swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +00001186{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 PyObject *func;
1188 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001189 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 PyObject *coerced = NULL;
1191 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001192
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001194 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001195 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001196 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001197 if (coerce_obj == NULL)
1198 return -1;
1199 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001200 coercefunc = PyObject_GetAttr(v, coerce_obj);
1201 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001203 }
1204 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001206 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 return -1;
1208 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001209 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001211 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001212 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001213 return -1;
1214 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 if (coerced == Py_None) {
1216 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001217 return 1;
1218 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1220 Py_DECREF(coerced);
1221 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001222 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001223 return -1;
1224 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 v1 = PyTuple_GetItem(coerced, 0);
1226 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001227 if (v1 != v) {
1228 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001230 if (swapped)
1231 *r_result = (*thisfunc)(w, v);
1232 else
1233 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001235 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001236 }
1237 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001238 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001240 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001242 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001243 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001245 return 1;
1246 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001248 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 Py_DECREF(func);
1250 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001251 return -1;
1252 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 *r_result = PyEval_CallObject(func, args);
1254 Py_DECREF(args);
1255 Py_DECREF(func);
1256 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001257 return *r_result == NULL ? -1 : 0;
1258}
1259
Guido van Rossum879c5811995-01-10 15:24:06 +00001260static int
Fred Drake79912472000-07-09 04:06:11 +00001261instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001262{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 PyObject *v = *pv;
1264 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001265 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 PyObject *args;
1267 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001268
Guido van Rossum2878a691996-08-09 20:53:24 +00001269 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001270 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001271 if (coerce_obj == NULL)
1272 return -1;
1273 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001274 coercefunc = PyObject_GetAttr(v, coerce_obj);
1275 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001276 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 PyErr_Clear();
1278 Py_INCREF(v);
1279 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001280 return 0;
1281 }
1282 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001284 if (args == NULL) {
1285 return -1;
1286 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001287 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001289 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001290 if (coerced == NULL) {
1291 /* __coerce__ call raised an exception */
1292 return -1;
1293 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001295 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001297 return 1;
1298 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001299 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001300 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 Py_DECREF(coerced);
1302 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001303 "coercion should return None or 2-tuple");
1304 return -1;
1305 }
1306 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 *pv = PyTuple_GetItem(coerced, 0);
1308 *pw = PyTuple_GetItem(coerced, 1);
1309 Py_INCREF(*pv);
1310 Py_INCREF(*pw);
1311 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001312 return 0;
1313}
1314
Guido van Rossum03093a21994-09-28 15:51:32 +00001315
Guido van Rossum04691fc1992-08-12 15:35:34 +00001316#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317static PyObject *funcname(self) PyInstanceObject *self; { \
1318 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001319 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001320 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001321}
1322
Guido van Rossum04691fc1992-08-12 15:35:34 +00001323UNARY(instance_neg, "__neg__")
1324UNARY(instance_pos, "__pos__")
1325UNARY(instance_abs, "__abs__")
1326
Guido van Rossum9bfef441993-03-29 10:43:31 +00001327static int
Fred Drake79912472000-07-09 04:06:11 +00001328instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001329{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001331 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001333
Guido van Rossum2878a691996-08-09 20:53:24 +00001334 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001335 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001336 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001338 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001339 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001340 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001342 /* Fall back to the default behavior:
1343 all instances are nonzero */
1344 return 1;
1345 }
1346 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 res = PyEval_CallObject(func, (PyObject *)NULL);
1348 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001349 if (res == NULL)
1350 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 if (!PyInt_Check(res)) {
1352 Py_DECREF(res);
1353 PyErr_SetString(PyExc_TypeError,
1354 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001355 return -1;
1356 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357 outcome = PyInt_AsLong(res);
1358 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001359 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 PyErr_SetString(PyExc_ValueError,
1361 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001362 return -1;
1363 }
1364 return outcome > 0;
1365}
1366
1367UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001368UNARY(instance_int, "__int__")
1369UNARY(instance_long, "__long__")
1370UNARY(instance_float, "__float__")
1371UNARY(instance_oct, "__oct__")
1372UNARY(instance_hex, "__hex__")
1373
Guido van Rossum03093a21994-09-28 15:51:32 +00001374/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001376instance_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum03093a21994-09-28 15:51:32 +00001377{
1378 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 PyObject *func;
1380 PyObject *args;
1381 PyObject *result;
1382 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001383
1384 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001385 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001387 if (func == NULL)
1388 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001390 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001392 return NULL;
1393 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 result = PyEval_CallObject(func, args);
1395 Py_DECREF(func);
1396 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001397 return result;
1398}
1399
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001401 0, /*nb_add*/
1402 0, /*nb_subtract*/
1403 0, /*nb_multiply*/
1404 0, /*nb_divide*/
1405 0, /*nb_remainder*/
1406 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001407 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001408 (unaryfunc)instance_neg, /*nb_negative*/
1409 (unaryfunc)instance_pos, /*nb_positive*/
1410 (unaryfunc)instance_abs, /*nb_absolute*/
1411 (inquiry)instance_nonzero, /*nb_nonzero*/
1412 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001413 0, /*nb_lshift*/
1414 0, /*nb_rshift*/
1415 0, /*nb_and*/
1416 0, /*nb_xor*/
1417 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001418 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001419 (unaryfunc)instance_int, /*nb_int*/
1420 (unaryfunc)instance_long, /*nb_long*/
1421 (unaryfunc)instance_float, /*nb_float*/
1422 (unaryfunc)instance_oct, /*nb_oct*/
1423 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001424};
1425
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426PyTypeObject PyInstance_Type = {
1427 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001428 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001429 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001430 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001431 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001432 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001433 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001434 0, /*tp_getattr*/
1435 0, /*tp_setattr*/
1436 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001437 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001438 &instance_as_number, /*tp_as_number*/
1439 &instance_as_sequence, /*tp_as_sequence*/
1440 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001441 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001442 0, /*tp_call*/
1443 0, /*tp_str*/
1444 (getattrofunc)instance_getattr, /*tp_getattro*/
1445 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001446 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001447 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001448 0, /* tp_doc */
1449 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001450};
1451
1452
Guido van Rossum81daa321993-05-20 14:24:46 +00001453/* Instance method objects are used for two purposes:
1454 (a) as bound instance methods (returned by instancename.methodname)
1455 (b) as unbound methods (returned by ClassName.methodname)
1456 In case (b), im_self is NULL
1457*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001458
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001459static PyMethodObject *free_list;
1460
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001462PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001463{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001465 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001467 return NULL;
1468 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001469 im = free_list;
1470 if (im != NULL) {
1471 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001472 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001473 }
1474 else {
1475 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1476 if (im == NULL)
1477 return NULL;
1478 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001480 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001482 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001484 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001485 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001487}
1488
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001489PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001490PyMethod_Function(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001491{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 if (!PyMethod_Check(im)) {
1493 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001494 return NULL;
1495 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001497}
1498
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001500PyMethod_Self(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001501{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 if (!PyMethod_Check(im)) {
1503 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001504 return NULL;
1505 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001507}
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001510PyMethod_Class(register PyObject *im)
Guido van Rossum81daa321993-05-20 14:24:46 +00001511{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 if (!PyMethod_Check(im)) {
1513 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001514 return NULL;
1515 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001517}
1518
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001519/* Class method methods */
1520
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001522
Guido van Rossume8122f11991-05-05 20:03:07 +00001523static struct memberlist instancemethod_memberlist[] = {
1524 {"im_func", T_OBJECT, OFF(im_func)},
1525 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001526 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001527 /* Dummies that are not handled by getattr() except for __members__ */
1528 {"__doc__", T_INT, 0},
1529 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001530 {NULL} /* Sentinel */
1531};
1532
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001533static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001534instancemethod_getattr(register PyMethodObject *im, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001535{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001537 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001538 /* Inherit __name__ and __doc__ from the callable object
1539 implementing the method */
1540 if (strcmp(sname, "__name__") == 0 ||
1541 strcmp(sname, "__doc__") == 0)
1542 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001543 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001544 if (PyEval_GetRestricted()) {
1545 PyErr_SetString(PyExc_RuntimeError,
1546 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001547 return NULL;
1548 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550}
1551
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001552static void
Fred Drake79912472000-07-09 04:06:11 +00001553instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001554{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001555 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 Py_DECREF(im->im_func);
1557 Py_XDECREF(im->im_self);
1558 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001559 im->im_self = (PyObject *)free_list;
1560 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001561}
1562
Guido van Rossumebc8c511992-09-03 20:39:51 +00001563static int
Fred Drake79912472000-07-09 04:06:11 +00001564instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00001565{
Guido van Rossume9df7271995-04-06 14:46:51 +00001566 if (a->im_self != b->im_self)
1567 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001569}
1570
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001572instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00001573{
1574 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001576 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001577 PyClassObject *class = (PyClassObject *)(a->im_class);
1578 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001579 char *fcname, *icname, *fname;
1580 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001581 if (PyFunction_Check(func)) {
1582 funcname = ((PyFunctionObject *)func)->func_name;
1583 Py_INCREF(funcname);
1584 }
1585 else {
1586 funcname = PyObject_GetAttrString(func,"__name__");
1587 if (funcname == NULL)
1588 PyErr_Clear();
1589 }
1590 if (funcname != NULL && PyString_Check(funcname))
1591 fname = PyString_AS_STRING(funcname);
1592 else
1593 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 if (fclassname != NULL && PyString_Check(fclassname))
1595 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001596 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001597 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001598 if (self == NULL)
1599 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1600 else {
1601 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 if (iclassname != NULL && PyString_Check(iclassname))
1603 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001604 else
1605 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001606 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1607 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001608 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001609 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001611}
1612
Guido van Rossum9bfef441993-03-29 10:43:31 +00001613static long
Fred Drake79912472000-07-09 04:06:11 +00001614instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001615{
1616 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001617 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001619 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001620 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001621 if (x == -1)
1622 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001624 if (y == -1)
1625 return -1;
1626 return x ^ y;
1627}
1628
Jeremy Hylton8caad492000-06-23 14:18:11 +00001629static int
1630instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1631{
1632 int err;
1633 if (im->im_func) {
1634 err = visit(im->im_func, arg);
1635 if (err)
1636 return err;
1637 }
1638 if (im->im_self) {
1639 err = visit(im->im_self, arg);
1640 if (err)
1641 return err;
1642 }
1643 if (im->im_class) {
1644 err = visit(im->im_class, arg);
1645 if (err)
1646 return err;
1647 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001648 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001649}
1650
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001651PyTypeObject PyMethod_Type = {
1652 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001653 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001654 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001655 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001656 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001657 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001658 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001659 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001660 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001661 (cmpfunc)instancemethod_compare, /*tp_compare*/
1662 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001663 0, /*tp_as_number*/
1664 0, /*tp_as_sequence*/
1665 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001666 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001667 0, /*tp_call*/
1668 0, /*tp_str*/
1669 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1670 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001671 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001672 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001673 0, /* tp_doc */
1674 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001675};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001676
1677/* Clear out the free list */
1678
1679void
Fred Drake79912472000-07-09 04:06:11 +00001680PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001681{
1682 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001683 PyMethodObject *im = free_list;
1684 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00001685 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001686 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001687 }
1688}