blob: 615c8bab5497a7fdb85dd4bf295781e125994a2b [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) {
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000522 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000523 }
524 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 }
528 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000530 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000531 if (--inst->ob_refcnt > 0) {
532#ifdef COUNT_ALLOCS
533 inst->ob_type->tp_free--;
534#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000535 PyObject_GC_Init((PyObject *)inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000536 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000537 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000538#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000539#ifdef COUNT_ALLOCS
540 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
541#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000542 _Py_ForgetReference((PyObject *)inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000543#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000544 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000545#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000546#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 Py_DECREF(inst->in_class);
548 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000549 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000550 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551}
552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000554instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 register PyObject *v;
557 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000558 if (sname[0] == '_' && sname[1] == '_') {
559 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 if (PyEval_GetRestricted()) {
561 PyErr_SetString(PyExc_RuntimeError,
562 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000563 return NULL;
564 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000566 return inst->in_dict;
567 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000568 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 Py_INCREF(inst->in_class);
570 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000571 }
Guido van Rossum94308391991-10-20 20:11:48 +0000572 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000573 v = instance_getattr2(inst, name);
574 if (v == NULL) {
575 PyErr_Format(PyExc_AttributeError,"'%.50s' instance has no attribute '%.400s'",
576 PyString_AS_STRING(inst->in_class->cl_name), sname);
577 }
578 return v;
579}
580
581static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000582instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000583{
584 register PyObject *v;
585 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000586 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000588 if (v == NULL) {
589 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000590 if (v == NULL)
591 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000593 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000594 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 if (PyFunction_Check(v)) {
596 PyObject *w = PyMethod_New(v, (PyObject *)inst,
597 (PyObject *)class);
598 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000599 v = w;
600 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 else if (PyMethod_Check(v)) {
602 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000603 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
605 PyObject *im_func = PyMethod_Function(v);
606 PyObject *w = PyMethod_New(im_func,
607 (PyObject *)inst, im_class);
608 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000609 v = w;
610 }
611 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000612 }
613 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614}
615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000617instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000618{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000620 res = instance_getattr1(inst, name);
621 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyObject *args;
623 PyErr_Clear();
624 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000625 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000626 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 res = PyEval_CallObject(func, args);
628 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000629 }
630 return res;
631}
632
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633static int
Fred Drake79912472000-07-09 04:06:11 +0000634instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635{
Guido van Rossum94472a01992-09-04 09:45:18 +0000636 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000638 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000640 "delete non-existing instance attribute");
641 return rv;
642 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000643 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000645}
646
Guido van Rossume7737541994-09-05 07:31:41 +0000647static int
Fred Drake79912472000-07-09 04:06:11 +0000648instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000649{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000650 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000652 if (sname[0] == '_' && sname[1] == '_') {
653 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000654 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000655 if (strcmp(sname, "__dict__") == 0) {
656 if (PyEval_GetRestricted()) {
657 PyErr_SetString(PyExc_RuntimeError,
658 "__dict__ not accessible in restricted mode");
659 return -1;
660 }
661 if (v == NULL || !PyDict_Check(v)) {
662 PyErr_SetString(PyExc_TypeError,
663 "__dict__ must be set to a dictionary");
664 return -1;
665 }
666 tmp = inst->in_dict;
667 Py_INCREF(v);
668 inst->in_dict = v;
669 Py_DECREF(tmp);
670 return 0;
671 }
672 if (strcmp(sname, "__class__") == 0) {
673 if (PyEval_GetRestricted()) {
674 PyErr_SetString(PyExc_RuntimeError,
675 "__class__ not accessible in restricted mode");
676 return -1;
677 }
678 if (v == NULL || !PyClass_Check(v)) {
679 PyErr_SetString(PyExc_TypeError,
680 "__class__ must be set to a class");
681 return -1;
682 }
683 tmp = (PyObject *)(inst->in_class);
684 Py_INCREF(v);
685 inst->in_class = (PyClassObject *)v;
686 Py_DECREF(tmp);
687 return 0;
688 }
Guido van Rossume7737541994-09-05 07:31:41 +0000689 }
Guido van Rossume7737541994-09-05 07:31:41 +0000690 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000691 if (v == NULL)
692 func = inst->in_class->cl_delattr;
693 else
694 func = inst->in_class->cl_setattr;
695 if (func == NULL)
696 return instance_setattr1(inst, name, v);
697 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000699 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000701 if (args == NULL)
702 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 res = PyEval_CallObject(func, args);
704 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000705 if (res == NULL)
706 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000708 return 0;
709}
710
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000712instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000713{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 PyObject *func;
715 PyObject *res;
716 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000717
Guido van Rossum2878a691996-08-09 20:53:24 +0000718 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000719 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000720 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000721 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000722 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000724 PyObject *mod = PyDict_GetItemString(
725 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000726 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 if (classname != NULL && PyString_Check(classname))
728 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000729 else
730 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000732 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000733 sprintf(buf, "<?.%.100s instance at %p>",
734 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000735 else
Fred Drakea44d3532000-06-30 15:01:00 +0000736 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000737 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000738 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000740 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 res = PyEval_CallObject(func, (PyObject *)NULL);
742 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000743 return res;
744}
745
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000747instance_compare1(PyObject *inst, PyObject *other)
Guido van Rossume7d444f1995-01-07 12:35:18 +0000748{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000750 instance_compare1);
751}
752
Guido van Rossum9bfef441993-03-29 10:43:31 +0000753static int
Fred Drake79912472000-07-09 04:06:11 +0000754instance_compare(PyObject *inst, PyObject *other)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000755{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000757 long outcome;
758 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000759 if (result == NULL)
760 return -1;
761 if (!PyInt_Check(result)) {
762 Py_DECREF(result);
763 PyErr_SetString(PyExc_TypeError,
764 "comparison did not return an int");
765 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000766 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 outcome = PyInt_AsLong(result);
768 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000769 if (outcome < 0)
770 return -1;
771 else if (outcome > 0)
772 return 1;
773 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000774}
775
Guido van Rossum9bfef441993-03-29 10:43:31 +0000776static long
Fred Drake79912472000-07-09 04:06:11 +0000777instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000778{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 PyObject *func;
780 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000781 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000783
Guido van Rossum2878a691996-08-09 20:53:24 +0000784 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000785 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000786 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000787 if (func == NULL) {
788 /* If there is no __cmp__ method, we hash on the address.
789 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000791 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000792 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000793 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000794 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 PyErr_Clear();
Fred Drake13634cf2000-06-29 19:17:04 +0000796 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000797 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799 return -1;
800 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 res = PyEval_CallObject(func, (PyObject *)NULL);
802 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000803 if (res == NULL)
804 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 if (PyInt_Check(res)) {
806 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000807 if (outcome == -1)
808 outcome = -2;
809 }
810 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 PyErr_SetString(PyExc_TypeError,
812 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000813 outcome = -1;
814 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000816 return outcome;
817}
818
Jeremy Hylton8caad492000-06-23 14:18:11 +0000819static int
820instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
821{
822 int err;
823 if (o->in_class) {
824 err = visit((PyObject *)(o->in_class), arg);
825 if (err)
826 return err;
827 }
828 if (o->in_dict) {
829 err = visit(o->in_dict, arg);
830 if (err)
831 return err;
832 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000833 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000834}
835
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000837
Guido van Rossum9bfef441993-03-29 10:43:31 +0000838static int
Fred Drake79912472000-07-09 04:06:11 +0000839instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 PyObject *func;
842 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000843 int outcome;
844
Guido van Rossum2878a691996-08-09 20:53:24 +0000845 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000846 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000847 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000848 if (func == NULL)
849 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 res = PyEval_CallObject(func, (PyObject *)NULL);
851 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000852 if (res == NULL)
853 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 if (PyInt_Check(res)) {
855 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 PyErr_SetString(PyExc_ValueError,
858 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000859 }
860 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 PyErr_SetString(PyExc_TypeError,
862 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000863 outcome = -1;
864 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000866 return outcome;
867}
868
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000870instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000871{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 PyObject *func;
873 PyObject *arg;
874 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875
Guido van Rossum2878a691996-08-09 20:53:24 +0000876 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000877 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000878 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000879 if (func == NULL)
880 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000882 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000884 return NULL;
885 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 res = PyEval_CallObject(func, arg);
887 Py_DECREF(func);
888 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000889 return res;
890}
891
Guido van Rossum9bfef441993-03-29 10:43:31 +0000892static int
Fred Drake79912472000-07-09 04:06:11 +0000893instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 PyObject *func;
896 PyObject *arg;
897 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898
Guido van Rossum2878a691996-08-09 20:53:24 +0000899 if (value == NULL) {
900 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000901 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000902 func = instance_getattr(inst, delitemstr);
903 }
904 else {
905 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000906 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000907 func = instance_getattr(inst, setitemstr);
908 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000909 if (func == NULL)
910 return -1;
911 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000912 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000917 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000918 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 res = PyEval_CallObject(func, arg);
920 Py_DECREF(func);
921 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922 if (res == NULL)
923 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925 return 0;
926}
927
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000929 (inquiry)instance_length, /*mp_length*/
930 (binaryfunc)instance_subscript, /*mp_subscript*/
931 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932};
933
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000935instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000936{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938
Guido van Rossum2878a691996-08-09 20:53:24 +0000939 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000940 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000941 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942 if (func == NULL)
943 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000947 return NULL;
948 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 res = PyEval_CallObject(func, arg);
950 Py_DECREF(func);
951 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952 return res;
953}
954
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +0000956sliceobj_from_intint(int i, int j)
957{
958 PyObject *start, *end, *res;
959
960 start = PyInt_FromLong((long)i);
961 if (!start)
962 return NULL;
963
964 end = PyInt_FromLong((long)j);
965 if (!end) {
966 Py_DECREF(start);
967 return NULL;
968 }
969 res = PySlice_New(start, end, NULL);
970 Py_DECREF(start);
971 Py_DECREF(end);
972 return res;
973}
974
975
976static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000977instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000978{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 PyObject *func, *arg, *res;
980 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981
Guido van Rossum2878a691996-08-09 20:53:24 +0000982 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000983 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000984 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +0000985
986 if (func == NULL) {
987 PyErr_Clear();
988
989 if (getitemstr == NULL)
990 getitemstr = PyString_InternFromString("__getitem__");
991 func = instance_getattr(inst, getitemstr);
992 if (func == NULL)
993 return NULL;
994 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
995 } else
996 arg = Py_BuildValue("(ii)", i, j);
997
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 return NULL;
1001 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 res = PyEval_CallObject(func, arg);
1003 Py_DECREF(func);
1004 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001005 return res;
1006}
1007
1008static int
Fred Drake79912472000-07-09 04:06:11 +00001009instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012
Guido van Rossum2878a691996-08-09 20:53:24 +00001013 if (item == NULL) {
1014 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001015 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001016 func = instance_getattr(inst, delitemstr);
1017 }
1018 else {
1019 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001020 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001021 func = instance_getattr(inst, setitemstr);
1022 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001023 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001024 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001025 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001029 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001031 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001032 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 res = PyEval_CallObject(func, arg);
1034 Py_DECREF(func);
1035 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001036 if (res == NULL)
1037 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001039 return 0;
1040}
1041
1042static int
Fred Drake79912472000-07-09 04:06:11 +00001043instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 PyObject *func, *arg, *res;
1046 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001047
Guido van Rossum2878a691996-08-09 20:53:24 +00001048 if (value == NULL) {
1049 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 delslicestr =
1051 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001052 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001053 if (func == NULL) {
1054 PyErr_Clear();
1055 if (delitemstr == NULL)
1056 delitemstr =
1057 PyString_InternFromString("__delitem__");
1058 func = instance_getattr(inst, delitemstr);
1059 if (func == NULL)
1060 return -1;
1061
1062 arg = Py_BuildValue("(N)",
1063 sliceobj_from_intint(i, j));
1064 } else
1065 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001066 }
1067 else {
1068 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 setslicestr =
1070 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001071 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001072 if (func == NULL) {
1073 PyErr_Clear();
1074 if (setitemstr == NULL)
1075 setitemstr =
1076 PyString_InternFromString("__setitem__");
1077 func = instance_getattr(inst, setitemstr);
1078 if (func == NULL)
1079 return -1;
1080
1081 arg = Py_BuildValue("(NO)",
1082 sliceobj_from_intint(i, j), value);
1083 } else
1084 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001085 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001088 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 res = PyEval_CallObject(func, arg);
1091 Py_DECREF(func);
1092 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093 if (res == NULL)
1094 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001096 return 0;
1097}
1098
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001099static int instance_contains(PyInstanceObject *inst, PyObject *member)
1100{
1101 static PyObject *__contains__;
1102 PyObject *func, *arg, *res;
1103 int ret;
1104
1105 if(__contains__ == NULL) {
1106 __contains__ = PyString_InternFromString("__contains__");
1107 if(__contains__ == NULL)
1108 return -1;
1109 }
1110 func = instance_getattr(inst, __contains__);
1111 if(func == NULL) {
Thomas Wouters7e474022000-07-16 12:04:32 +00001112 /* fall back to previous behavior */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001113 int i, cmp_res;
1114
1115 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1116 return -1;
1117 PyErr_Clear();
1118 for(i=0;;i++) {
1119 PyObject *obj = instance_item(inst, i);
1120 int ret = 0;
1121
1122 if(obj == NULL) {
1123 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1124 return -1;
1125 PyErr_Clear();
1126 return 0;
1127 }
1128 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1129 ret = -1;
1130 if(cmp_res == 0)
1131 ret = 1;
1132 Py_DECREF(obj);
1133 if(ret)
1134 return ret;
1135 }
1136 }
1137 arg = Py_BuildValue("(O)", member);
1138 if(arg == NULL) {
1139 Py_DECREF(func);
1140 return -1;
1141 }
1142 res = PyEval_CallObject(func, arg);
1143 Py_DECREF(func);
1144 Py_DECREF(arg);
1145 if(res == NULL)
1146 return -1;
1147 ret = PyObject_IsTrue(res);
1148 Py_DECREF(res);
1149 return ret;
1150}
1151
Fred Drake79912472000-07-09 04:06:11 +00001152static PySequenceMethods
1153instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001154 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001155 0, /*sq_concat*/
1156 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001157 (intargfunc)instance_item, /*sq_item*/
1158 (intintargfunc)instance_slice, /*sq_slice*/
1159 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1160 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001161 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001162};
1163
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001164static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001165generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001166{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001168
1169 if ((func = instance_getattr(self, methodname)) == NULL)
1170 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 res = PyEval_CallObject(func, (PyObject *)NULL);
1172 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001173 return res;
1174}
1175
Guido van Rossum03093a21994-09-28 15:51:32 +00001176
Guido van Rossum03093a21994-09-28 15:51:32 +00001177/* Implement a binary operator involving at least one class instance. */
1178
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001180PyInstance_DoBinOp(PyObject *v, PyObject *w, char *opname, char *ropname,
1181 PyObject * (*thisfunc)(PyObject *, PyObject *))
Guido van Rossum03093a21994-09-28 15:51:32 +00001182{
1183 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 PyObject *result = NULL;
Barry Warsawdc55d712000-08-18 04:57:32 +00001185
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001186 if (PyInstance_HalfBinOp(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001187 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001188 if (PyInstance_HalfBinOp(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001189 return result;
Thomas Wouters7e474022000-07-16 12:04:32 +00001190 /* Sigh -- special case for comparisons */
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001191 if (strcmp(opname, "__cmp__") == 0) {
Barry Warsawdc55d712000-08-18 04:57:32 +00001192 Py_uintptr_t iv = (Py_uintptr_t)v;
1193 Py_uintptr_t iw = (Py_uintptr_t)w;
1194 long c = (iv < iw) ? -1 : (iv > iw) ? 1 : 0;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001195 return PyInt_FromLong(c);
1196 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001197 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001199 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001200}
1201
Guido van Rossum03093a21994-09-28 15:51:32 +00001202
1203/* Try one half of a binary operator involving a class instance.
1204 Return value:
1205 -1 if an exception is to be reported right away
1206 0 if we have a valid result
1207 1 if we could try another operation
1208*/
1209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001211
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001212int
1213PyInstance_HalfBinOp(PyObject *v, PyObject *w, char *opname, PyObject **r_result,
1214 PyObject * (*thisfunc)(PyObject *, PyObject *), int swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +00001215{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 PyObject *func;
1217 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001218 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 PyObject *coerced = NULL;
1220 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001221
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001223 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001224 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001225 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001226 if (coerce_obj == NULL)
1227 return -1;
1228 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001229 coercefunc = PyObject_GetAttr(v, coerce_obj);
1230 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001232 }
1233 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001235 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001236 return -1;
1237 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001238 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001240 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001241 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001242 return -1;
1243 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 if (coerced == Py_None) {
1245 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001246 return 1;
1247 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1249 Py_DECREF(coerced);
1250 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001251 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001252 return -1;
1253 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 v1 = PyTuple_GetItem(coerced, 0);
1255 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001256 if (v1 != v) {
1257 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001259 if (swapped)
1260 *r_result = (*thisfunc)(w, v);
1261 else
1262 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001264 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001265 }
1266 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001267 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001269 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001271 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001272 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001274 return 1;
1275 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001276 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001277 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 Py_DECREF(func);
1279 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001280 return -1;
1281 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 *r_result = PyEval_CallObject(func, args);
1283 Py_DECREF(args);
1284 Py_DECREF(func);
1285 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001286 return *r_result == NULL ? -1 : 0;
1287}
1288
Guido van Rossum879c5811995-01-10 15:24:06 +00001289static int
Fred Drake79912472000-07-09 04:06:11 +00001290instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001291{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 PyObject *v = *pv;
1293 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001294 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 PyObject *args;
1296 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001297
Guido van Rossum2878a691996-08-09 20:53:24 +00001298 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001299 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001300 if (coerce_obj == NULL)
1301 return -1;
1302 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001303 coercefunc = PyObject_GetAttr(v, coerce_obj);
1304 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001305 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 PyErr_Clear();
1307 Py_INCREF(v);
1308 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001309 return 0;
1310 }
1311 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001313 if (args == NULL) {
1314 return -1;
1315 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001316 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001318 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001319 if (coerced == NULL) {
1320 /* __coerce__ call raised an exception */
1321 return -1;
1322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001324 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001326 return 1;
1327 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001329 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 Py_DECREF(coerced);
1331 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001332 "coercion should return None or 2-tuple");
1333 return -1;
1334 }
1335 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 *pv = PyTuple_GetItem(coerced, 0);
1337 *pw = PyTuple_GetItem(coerced, 1);
1338 Py_INCREF(*pv);
1339 Py_INCREF(*pw);
1340 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001341 return 0;
1342}
1343
Guido van Rossum03093a21994-09-28 15:51:32 +00001344
Guido van Rossum04691fc1992-08-12 15:35:34 +00001345#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001346static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001348 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001349 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001350}
1351
Guido van Rossum04691fc1992-08-12 15:35:34 +00001352UNARY(instance_neg, "__neg__")
1353UNARY(instance_pos, "__pos__")
1354UNARY(instance_abs, "__abs__")
1355
Guido van Rossum9bfef441993-03-29 10:43:31 +00001356static int
Fred Drake79912472000-07-09 04:06:11 +00001357instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001358{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001360 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001362
Guido van Rossum2878a691996-08-09 20:53:24 +00001363 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001364 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001365 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001367 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001368 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001369 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001371 /* Fall back to the default behavior:
1372 all instances are nonzero */
1373 return 1;
1374 }
1375 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 res = PyEval_CallObject(func, (PyObject *)NULL);
1377 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001378 if (res == NULL)
1379 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 if (!PyInt_Check(res)) {
1381 Py_DECREF(res);
1382 PyErr_SetString(PyExc_TypeError,
1383 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001384 return -1;
1385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 outcome = PyInt_AsLong(res);
1387 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001388 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 PyErr_SetString(PyExc_ValueError,
1390 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001391 return -1;
1392 }
1393 return outcome > 0;
1394}
1395
1396UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001397UNARY(instance_int, "__int__")
1398UNARY(instance_long, "__long__")
1399UNARY(instance_float, "__float__")
1400UNARY(instance_oct, "__oct__")
1401UNARY(instance_hex, "__hex__")
1402
Guido van Rossum03093a21994-09-28 15:51:32 +00001403/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001405instance_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum03093a21994-09-28 15:51:32 +00001406{
1407 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyObject *func;
1409 PyObject *args;
1410 PyObject *result;
1411 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001412
1413 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001414 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001416 if (func == NULL)
1417 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001419 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001421 return NULL;
1422 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423 result = PyEval_CallObject(func, args);
1424 Py_DECREF(func);
1425 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001426 return result;
1427}
1428
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001429static PyObject *
1430instance_inplace_pow(PyObject *v, PyObject *w, PyObject *z)
1431{
1432 /* XXX Doesn't do coercions... */
1433 PyObject *func;
1434 PyObject *args;
1435 PyObject *result;
1436 static PyObject *ipowstr;
1437
1438 if (ipowstr == NULL)
1439 ipowstr = PyString_InternFromString("__ipow__");
1440 func = PyObject_GetAttr(v, ipowstr);
1441 if (func == NULL) {
1442 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1443 return NULL;
Thomas Wouters1de2a792000-08-25 10:47:46 +00001444 PyErr_Clear();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001445 return instance_pow(v, w, z);
1446 }
1447 args = Py_BuildValue("(OO)", w, z);
1448 if (args == NULL) {
1449 Py_DECREF(func);
1450 return NULL;
1451 }
1452 result = PyEval_CallObject(func, args);
1453 Py_DECREF(func);
1454 Py_DECREF(args);
1455 return result;
1456}
1457
1458
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001460 0, /*nb_add*/
1461 0, /*nb_subtract*/
1462 0, /*nb_multiply*/
1463 0, /*nb_divide*/
1464 0, /*nb_remainder*/
1465 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001466 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001467 (unaryfunc)instance_neg, /*nb_negative*/
1468 (unaryfunc)instance_pos, /*nb_positive*/
1469 (unaryfunc)instance_abs, /*nb_absolute*/
1470 (inquiry)instance_nonzero, /*nb_nonzero*/
1471 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001472 0, /*nb_lshift*/
1473 0, /*nb_rshift*/
1474 0, /*nb_and*/
1475 0, /*nb_xor*/
1476 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001477 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001478 (unaryfunc)instance_int, /*nb_int*/
1479 (unaryfunc)instance_long, /*nb_long*/
1480 (unaryfunc)instance_float, /*nb_float*/
1481 (unaryfunc)instance_oct, /*nb_oct*/
1482 (unaryfunc)instance_hex, /*nb_hex*/
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001483 0, /*nb_inplace_add*/
1484 0, /*nb_inplace_subtract*/
1485 0, /*nb_inplace_multiply*/
1486 0, /*nb_inplace_divide*/
1487 0, /*nb_inplace_remainder*/
1488 (ternaryfunc)instance_inplace_pow, /*nb_inplace_power*/
1489 0, /*nb_inplace_lshift*/
1490 0, /*nb_inplace_rshift*/
1491 0, /*nb_inplace_and*/
1492 0, /*nb_inplace_xor*/
1493 0, /*nb_inplace_or*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001494};
1495
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496PyTypeObject PyInstance_Type = {
1497 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001498 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001499 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001500 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001501 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001502 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001503 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001504 0, /*tp_getattr*/
1505 0, /*tp_setattr*/
1506 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001507 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001508 &instance_as_number, /*tp_as_number*/
1509 &instance_as_sequence, /*tp_as_sequence*/
1510 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001511 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001512 0, /*tp_call*/
1513 0, /*tp_str*/
1514 (getattrofunc)instance_getattr, /*tp_getattro*/
1515 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001516 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001517 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001518 0, /* tp_doc */
1519 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001520};
1521
1522
Guido van Rossum81daa321993-05-20 14:24:46 +00001523/* Instance method objects are used for two purposes:
1524 (a) as bound instance methods (returned by instancename.methodname)
1525 (b) as unbound methods (returned by ClassName.methodname)
1526 In case (b), im_self is NULL
1527*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001528
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001529static PyMethodObject *free_list;
1530
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001531PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001532PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001533{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001534 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001535 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001537 return NULL;
1538 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001539 im = free_list;
1540 if (im != NULL) {
1541 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001542 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001543 }
1544 else {
1545 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1546 if (im == NULL)
1547 return NULL;
1548 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001550 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001551 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001552 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001554 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001555 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001557}
1558
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001559PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001560PyMethod_Function(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001561{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001562 if (!PyMethod_Check(im)) {
1563 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001564 return NULL;
1565 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001567}
1568
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001570PyMethod_Self(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001571{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 if (!PyMethod_Check(im)) {
1573 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001574 return NULL;
1575 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001577}
1578
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001580PyMethod_Class(register PyObject *im)
Guido van Rossum81daa321993-05-20 14:24:46 +00001581{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 if (!PyMethod_Check(im)) {
1583 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001584 return NULL;
1585 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001587}
1588
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001589/* Class method methods */
1590
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001592
Guido van Rossume8122f11991-05-05 20:03:07 +00001593static struct memberlist instancemethod_memberlist[] = {
1594 {"im_func", T_OBJECT, OFF(im_func)},
1595 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001596 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001597 /* Dummies that are not handled by getattr() except for __members__ */
1598 {"__doc__", T_INT, 0},
1599 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600 {NULL} /* Sentinel */
1601};
1602
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001604instancemethod_getattr(register PyMethodObject *im, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001606 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001607 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001608 /* Inherit __name__ and __doc__ from the callable object
1609 implementing the method */
1610 if (strcmp(sname, "__name__") == 0 ||
1611 strcmp(sname, "__doc__") == 0)
1612 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001613 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001614 if (PyEval_GetRestricted()) {
1615 PyErr_SetString(PyExc_RuntimeError,
1616 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001617 return NULL;
1618 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620}
1621
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001622static void
Fred Drake79912472000-07-09 04:06:11 +00001623instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001624{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001625 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 Py_DECREF(im->im_func);
1627 Py_XDECREF(im->im_self);
1628 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001629 im->im_self = (PyObject *)free_list;
1630 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001631}
1632
Guido van Rossumebc8c511992-09-03 20:39:51 +00001633static int
Fred Drake79912472000-07-09 04:06:11 +00001634instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00001635{
Guido van Rossume9df7271995-04-06 14:46:51 +00001636 if (a->im_self != b->im_self)
1637 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001639}
1640
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001642instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00001643{
1644 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001646 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 PyClassObject *class = (PyClassObject *)(a->im_class);
1648 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001649 char *fcname, *icname, *fname;
1650 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001651 if (PyFunction_Check(func)) {
1652 funcname = ((PyFunctionObject *)func)->func_name;
1653 Py_INCREF(funcname);
1654 }
1655 else {
1656 funcname = PyObject_GetAttrString(func,"__name__");
1657 if (funcname == NULL)
1658 PyErr_Clear();
1659 }
1660 if (funcname != NULL && PyString_Check(funcname))
1661 fname = PyString_AS_STRING(funcname);
1662 else
1663 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001664 if (fclassname != NULL && PyString_Check(fclassname))
1665 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001666 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001667 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001668 if (self == NULL)
1669 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1670 else {
1671 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 if (iclassname != NULL && PyString_Check(iclassname))
1673 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001674 else
1675 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001676 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1677 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001678 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001679 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001680 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001681}
1682
Guido van Rossum9bfef441993-03-29 10:43:31 +00001683static long
Fred Drake79912472000-07-09 04:06:11 +00001684instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001685{
1686 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001687 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001689 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001691 if (x == -1)
1692 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001693 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001694 if (y == -1)
1695 return -1;
1696 return x ^ y;
1697}
1698
Jeremy Hylton8caad492000-06-23 14:18:11 +00001699static int
1700instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1701{
1702 int err;
1703 if (im->im_func) {
1704 err = visit(im->im_func, arg);
1705 if (err)
1706 return err;
1707 }
1708 if (im->im_self) {
1709 err = visit(im->im_self, arg);
1710 if (err)
1711 return err;
1712 }
1713 if (im->im_class) {
1714 err = visit(im->im_class, arg);
1715 if (err)
1716 return err;
1717 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001718 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001719}
1720
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721PyTypeObject PyMethod_Type = {
1722 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001723 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001724 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001725 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001726 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001727 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001728 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001729 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001730 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001731 (cmpfunc)instancemethod_compare, /*tp_compare*/
1732 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001733 0, /*tp_as_number*/
1734 0, /*tp_as_sequence*/
1735 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001736 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001737 0, /*tp_call*/
1738 0, /*tp_str*/
1739 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1740 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001741 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001742 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001743 0, /* tp_doc */
1744 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001745};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001746
1747/* Clear out the free list */
1748
1749void
Fred Drake79912472000-07-09 04:06:11 +00001750PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001751{
1752 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001753 PyMethodObject *im = free_list;
1754 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00001755 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001756 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001757 }
1758}