blob: f7fd30c773457daa9786e5f10a37212521ca86d2 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Class object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +00006
Neil Schemenauer29bfc072001-01-04 01:43:46 +00007
Guido van Rossum52ca98a1994-09-05 07:32:29 +00008/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +00009static PyObject *class_lookup(PyClassObject *, PyObject *,
10 PyClassObject **);
11static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
12static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000013
Guido van Rossuma63eff61998-05-29 21:37:21 +000014static PyObject *getattrstr, *setattrstr, *delattrstr;
15
Fred Drake79912472000-07-09 04:06:11 +000016
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017PyObject *
Fred Drake79912472000-07-09 04:06:11 +000018PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
19 /* bases is NULL or tuple of classobjects! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000022 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000023 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000024 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000025 if (docstr == NULL)
26 return NULL;
27 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000028 if (modstr == NULL) {
29 modstr= PyString_InternFromString("__module__");
30 if (modstr == NULL)
31 return NULL;
32 }
33 if (namestr == NULL) {
34 namestr= PyString_InternFromString("__name__");
35 if (namestr == NULL)
36 return NULL;
37 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000038 if (name == NULL || !PyString_Check(name)) {
39 PyErr_SetString(PyExc_SystemError,
40 "PyClass_New: name must be a string");
41 return NULL;
42 }
43 if (dict == NULL || !PyDict_Check(dict)) {
44 PyErr_SetString(PyExc_SystemError,
45 "PyClass_New: dict must be a dictionary");
46 return NULL;
47 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 if (PyDict_GetItem(dict, docstr) == NULL) {
49 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000050 return NULL;
51 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000052 if (PyDict_GetItem(dict, modstr) == NULL) {
53 PyObject *globals = PyEval_GetGlobals();
54 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000055 PyObject *modname = PyDict_GetItem(globals, namestr);
56 if (modname != NULL) {
57 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000058 return NULL;
59 }
60 }
61 }
Guido van Rossume2966a61991-12-10 13:53:23 +000062 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000064 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000065 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000066 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000067 else {
68 int i;
69 if (!PyTuple_Check(bases)) {
70 PyErr_SetString(PyExc_SystemError,
71 "PyClass_New: bases must be a tuple");
72 return NULL;
73 }
74 i = PyTuple_Size(bases);
75 while (--i >= 0) {
76 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
77 PyErr_SetString(PyExc_SystemError,
78 "PyClass_New: base must be a class");
79 return NULL;
80 }
81 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +000083 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000085 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000088 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000091 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000093 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000094 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000095 getattrstr = PyString_InternFromString("__getattr__");
96 setattrstr = PyString_InternFromString("__setattr__");
97 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +000098 }
99 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
100 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
101 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 Py_XINCREF(op->cl_getattr);
103 Py_XINCREF(op->cl_setattr);
104 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000105 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
109/* Class methods */
110
111static void
Fred Drake79912472000-07-09 04:06:11 +0000112class_dealloc(PyClassObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000114 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_DECREF(op->cl_bases);
116 Py_DECREF(op->cl_dict);
117 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000118 Py_XDECREF(op->cl_getattr);
119 Py_XDECREF(op->cl_setattr);
120 Py_XDECREF(op->cl_delattr);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000121 op = (PyClassObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000122 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000126class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
Guido van Rossum81daa321993-05-20 14:24:46 +0000127{
128 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000130 if (value != NULL) {
131 *pclass = cp;
132 return value;
133 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000135 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000136 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 PyObject *v = class_lookup(
138 (PyClassObject *)
139 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000140 if (v != NULL)
141 return v;
142 }
143 return NULL;
144}
145
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000147class_getattr(register PyClassObject *op, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 register PyObject *v;
150 register char *sname = PyString_AsString(name);
151 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000152 if (sname[0] == '_' && sname[1] == '_') {
153 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 if (PyEval_GetRestricted()) {
155 PyErr_SetString(PyExc_RuntimeError,
156 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000157 return NULL;
158 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000160 return op->cl_dict;
161 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000162 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000164 return op->cl_bases;
165 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000166 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000167 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000169 else
170 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000172 return v;
173 }
Guido van Rossum94308391991-10-20 20:11:48 +0000174 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000175 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000176 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000177 PyErr_Format(PyExc_AttributeError,
178 "class %.50s has no attribute '%.400s'",
179 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000180 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000182 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (PyFunction_Check(v)) {
184 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
185 (PyObject *)class);
186 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000187 v = w;
188 }
189 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190}
191
Guido van Rossuma63eff61998-05-29 21:37:21 +0000192static void
Fred Drake79912472000-07-09 04:06:11 +0000193set_slot(PyObject **slot, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000194{
195 PyObject *temp = *slot;
196 Py_XINCREF(v);
197 *slot = v;
198 Py_XDECREF(temp);
199}
200
Guido van Rossum7ba30431998-07-08 13:34:48 +0000201static void
Fred Drake79912472000-07-09 04:06:11 +0000202set_attr_slots(PyClassObject *c)
Guido van Rossum7ba30431998-07-08 13:34:48 +0000203{
204 PyClassObject *dummy;
205
206 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
207 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
208 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
209}
210
Guido van Rossuma63eff61998-05-29 21:37:21 +0000211static char *
Fred Drake79912472000-07-09 04:06:11 +0000212set_dict(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000213{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000214 if (v == NULL || !PyDict_Check(v))
215 return "__dict__ must be a dictionary object";
216 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000217 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000218 return "";
219}
220
221static char *
Fred Drake79912472000-07-09 04:06:11 +0000222set_bases(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000223{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000224 int i, n;
225
226 if (v == NULL || !PyTuple_Check(v))
227 return "__bases__ must be a tuple object";
228 n = PyTuple_Size(v);
229 for (i = 0; i < n; i++) {
230 PyObject *x = PyTuple_GET_ITEM(v, i);
231 if (!PyClass_Check(x))
232 return "__bases__ items must be classes";
233 if (PyClass_IsSubclass(x, (PyObject *)c))
234 return "a __bases__ item causes an inheritance cycle";
235 }
236 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000237 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000238 return "";
239}
240
241static char *
Fred Drake79912472000-07-09 04:06:11 +0000242set_name(PyClassObject *c, PyObject *v)
Guido van Rossuma63eff61998-05-29 21:37:21 +0000243{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000244 if (v == NULL || !PyString_Check(v))
245 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000246 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000247 return "__name__ must not contain null bytes";
248 set_slot(&c->cl_name, v);
249 return "";
250}
251
Guido van Rossum94308391991-10-20 20:11:48 +0000252static int
Fred Drake79912472000-07-09 04:06:11 +0000253class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
Guido van Rossum94308391991-10-20 20:11:48 +0000254{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000255 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 if (PyEval_GetRestricted()) {
257 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000258 "classes are read-only in restricted mode");
259 return -1;
260 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000261 sname = PyString_AsString(name);
262 if (sname[0] == '_' && sname[1] == '_') {
263 int n = PyString_Size(name);
264 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000265 char *err = NULL;
266 if (strcmp(sname, "__dict__") == 0)
267 err = set_dict(op, v);
268 else if (strcmp(sname, "__bases__") == 0)
269 err = set_bases(op, v);
270 else if (strcmp(sname, "__name__") == 0)
271 err = set_name(op, v);
272 else if (strcmp(sname, "__getattr__") == 0)
273 set_slot(&op->cl_getattr, v);
274 else if (strcmp(sname, "__setattr__") == 0)
275 set_slot(&op->cl_setattr, v);
276 else if (strcmp(sname, "__delattr__") == 0)
277 set_slot(&op->cl_delattr, v);
278 /* For the last three, we fall through to update the
279 dictionary as well. */
280 if (err != NULL) {
281 if (*err == '\0')
282 return 0;
283 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000284 return -1;
285 }
286 }
287 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000288 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000290 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000291 PyErr_Format(PyExc_AttributeError,
292 "class %.50s has no attribute '%.400s'",
293 PyString_AS_STRING(op->cl_name), sname);
Guido van Rossum94472a01992-09-04 09:45:18 +0000294 return rv;
295 }
Guido van Rossum94308391991-10-20 20:11:48 +0000296 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000298}
299
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000301class_repr(PyClassObject *op)
Guido van Rossum25831651993-05-19 14:50:45 +0000302{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000303 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000304 char buf[140];
305 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000307 name = "?";
308 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000310 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000311 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000312 else
Fred Drakea44d3532000-06-30 15:01:00 +0000313 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000314 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000315 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000317}
318
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000319static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000320class_str(PyClassObject *op)
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000321{
322 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
323 PyObject *name = op->cl_name;
324 PyObject *res;
325 int m, n;
326
327 if (name == NULL || !PyString_Check(name))
328 return class_repr(op);
329 if (mod == NULL || !PyString_Check(mod)) {
330 Py_INCREF(name);
331 return name;
332 }
333 m = PyString_Size(mod);
334 n = PyString_Size(name);
335 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
336 if (res != NULL) {
337 char *s = PyString_AsString(res);
338 memcpy(s, PyString_AsString(mod), m);
339 s += m;
340 *s++ = '.';
341 memcpy(s, PyString_AsString(name), n);
342 }
343 return res;
344}
345
Jeremy Hylton8caad492000-06-23 14:18:11 +0000346static int
347class_traverse(PyClassObject *o, visitproc visit, void *arg)
348{
349 int err;
350 if (o->cl_bases) {
351 err = visit(o->cl_bases, arg);
352 if (err)
353 return err;
354 }
355 if (o->cl_dict) {
356 err = visit(o->cl_dict, arg);
357 if (err)
358 return err;
359 }
360 if (o->cl_name) {
361 err = visit(o->cl_name, arg);
362 if (err)
363 return err;
364 }
365 if (o->cl_getattr) {
366 err = visit(o->cl_getattr, arg);
367 if (err)
368 return err;
369 }
370 if (o->cl_setattr) {
371 err = visit(o->cl_setattr, arg);
372 if (err)
373 return err;
374 }
375 if (o->cl_delattr) {
376 err = visit(o->cl_delattr, arg);
377 if (err)
378 return err;
379 }
380 return 0;
381}
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383PyTypeObject PyClass_Type = {
384 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 0,
386 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000387 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000389 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000391 0, /*tp_getattr*/
392 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000394 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 0, /*tp_as_number*/
396 0, /*tp_as_sequence*/
397 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000398 0, /*tp_hash*/
399 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000400 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000401 (getattrofunc)class_getattr, /*tp_getattro*/
402 (setattrofunc)class_setattr, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000403 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000404 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000405 0, /* tp_doc */
406 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407};
408
Guido van Rossum81daa321993-05-20 14:24:46 +0000409int
Fred Drake79912472000-07-09 04:06:11 +0000410PyClass_IsSubclass(PyObject *class, PyObject *base)
Guido van Rossum81daa321993-05-20 14:24:46 +0000411{
412 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000414 if (class == base)
415 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000417 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 cp = (PyClassObject *)class;
419 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000420 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000422 return 1;
423 }
424 return 0;
425}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426
Guido van Rossum81daa321993-05-20 14:24:46 +0000427
428/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000431PyInstance_New(PyObject *class, PyObject *arg, PyObject *kw)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 register PyInstanceObject *inst;
434 PyObject *init;
435 static PyObject *initstr;
436 if (!PyClass_Check(class)) {
437 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438 return NULL;
439 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000441 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000444 if (inst->in_dict == NULL) {
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000445 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumd7823f22000-06-28 23:46:07 +0000446 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447 return NULL;
448 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000449 Py_INCREF(class);
450 inst->in_class = (PyClassObject *)class;
Neil Schemenauere3550a62000-10-04 16:20:41 +0000451 PyObject_GC_Init(inst);
Guido van Rossum2878a691996-08-09 20:53:24 +0000452 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000453 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000454 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000455 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 if ((arg != NULL && (!PyTuple_Check(arg) ||
457 PyTuple_Size(arg) != 0))
458 || (kw != NULL && (!PyDict_Check(kw) ||
459 PyDict_Size(kw) != 0))) {
460 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000461 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000463 inst = NULL;
464 }
465 }
466 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
468 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000469 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000471 inst = NULL;
472 }
473 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 if (res != Py_None) {
475 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000476 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000478 inst = NULL;
479 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000481 }
482 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}
485
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000486/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487
488static void
Fred Drake79912472000-07-09 04:06:11 +0000489instance_dealloc(register PyInstanceObject *inst)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 PyObject *error_type, *error_value, *error_traceback;
492 PyObject *del;
493 static PyObject *delstr;
Tim Peters6b184912000-09-17 14:40:17 +0000494#ifdef Py_REF_DEBUG
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000495 extern long _Py_RefTotal;
Skip Montanaro4ca150b2000-07-08 12:04:57 +0000496#endif
Tim Peters6b184912000-09-17 14:40:17 +0000497 /* Temporarily resurrect the object. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000498#ifdef Py_TRACE_REFS
Tim Peters6b184912000-09-17 14:40:17 +0000499#ifndef Py_REF_DEBUG
500# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
501#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000502 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000504 _Py_NewReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000505#ifdef COUNT_ALLOCS
Tim Peters6b184912000-09-17 14:40:17 +0000506 /* compensate for boost in _Py_NewReference; note that
507 * _Py_RefTotal was also boosted; we'll knock that down later.
508 */
509 inst->ob_type->tp_alloc--;
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000510#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000511#else /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000512 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000514#endif /* !Py_TRACE_REFS */
Tim Peters6b184912000-09-17 14:40:17 +0000515
516 /* Save the current exception, if any. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000518 /* Execute __del__ method, if any. */
Guido van Rossum2878a691996-08-09 20:53:24 +0000519 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000520 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000521 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Tim Peters6b184912000-09-17 14:40:17 +0000523 if (res == NULL)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000524 PyErr_WriteUnraisable(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000525 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 Py_DECREF(res);
527 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 }
Tim Peters6b184912000-09-17 14:40:17 +0000529 /* Restore the saved exception. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 PyErr_Restore(error_type, error_value, error_traceback);
Tim Peters6b184912000-09-17 14:40:17 +0000531 /* Undo the temporary resurrection; can't use DECREF here, it would
532 * cause a recursive call.
533 */
534#ifdef Py_REF_DEBUG
535 /* _Py_RefTotal was boosted either by _Py_NewReference or
536 * Py_INCREF above.
537 */
538 _Py_RefTotal--;
539#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000540 if (--inst->ob_refcnt > 0) {
541#ifdef COUNT_ALLOCS
542 inst->ob_type->tp_free--;
543#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000544 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000545 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000546#ifdef Py_TRACE_REFS
Guido van Rossumbffd6832000-01-20 22:32:56 +0000547 _Py_ForgetReference((PyObject *)inst);
Tim Peters6b184912000-09-17 14:40:17 +0000548#ifdef COUNT_ALLOCS
549 /* compensate for increment in _Py_ForgetReference */
550 inst->ob_type->tp_free--;
551#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000552#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000553 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000554#endif
Tim Peters6b184912000-09-17 14:40:17 +0000555#endif
Neil Schemenauerce209672000-09-15 18:57:21 +0000556 PyObject_GC_Fini(inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 Py_DECREF(inst->in_class);
558 Py_XDECREF(inst->in_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000559 inst = (PyInstanceObject *) PyObject_AS_GC(inst);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000560 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561}
562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000564instance_getattr1(register PyInstanceObject *inst, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 register PyObject *v;
567 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000568 if (sname[0] == '_' && sname[1] == '_') {
569 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 if (PyEval_GetRestricted()) {
571 PyErr_SetString(PyExc_RuntimeError,
572 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000573 return NULL;
574 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000576 return inst->in_dict;
577 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000578 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 Py_INCREF(inst->in_class);
580 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000581 }
Guido van Rossum94308391991-10-20 20:11:48 +0000582 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000583 v = instance_getattr2(inst, name);
584 if (v == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +0000585 PyErr_Format(PyExc_AttributeError,
586 "%.50s instance has no attribute '%.400s'",
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000587 PyString_AS_STRING(inst->in_class->cl_name), sname);
588 }
589 return v;
590}
591
592static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000593instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000594{
595 register PyObject *v;
596 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000597 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000599 if (v == NULL) {
600 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000601 if (v == NULL)
602 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000603 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000604 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000605 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 if (PyFunction_Check(v)) {
607 PyObject *w = PyMethod_New(v, (PyObject *)inst,
608 (PyObject *)class);
609 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000610 v = w;
611 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 else if (PyMethod_Check(v)) {
613 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000614 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
616 PyObject *im_func = PyMethod_Function(v);
617 PyObject *w = PyMethod_New(im_func,
618 (PyObject *)inst, im_class);
619 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000620 v = w;
621 }
622 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000623 }
624 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625}
626
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000628instance_getattr(register PyInstanceObject *inst, PyObject *name)
Guido van Rossume7737541994-09-05 07:31:41 +0000629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000631 res = instance_getattr1(inst, name);
632 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 PyObject *args;
634 PyErr_Clear();
635 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000636 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000637 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 res = PyEval_CallObject(func, args);
639 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000640 }
641 return res;
642}
643
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644static int
Fred Drake79912472000-07-09 04:06:11 +0000645instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000646{
Guido van Rossum94472a01992-09-04 09:45:18 +0000647 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000649 if (rv < 0)
Fred Drake661ea262000-10-24 19:57:45 +0000650 PyErr_Format(PyExc_AttributeError,
651 "%.50s instance has no attribute '%.400s'",
652 PyString_AS_STRING(inst->in_class->cl_name),
653 PyString_AS_STRING(name));
Guido van Rossum94472a01992-09-04 09:45:18 +0000654 return rv;
655 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658}
659
Guido van Rossume7737541994-09-05 07:31:41 +0000660static int
Fred Drake79912472000-07-09 04:06:11 +0000661instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
Guido van Rossume7737541994-09-05 07:31:41 +0000662{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000663 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000665 if (sname[0] == '_' && sname[1] == '_') {
666 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000667 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000668 if (strcmp(sname, "__dict__") == 0) {
669 if (PyEval_GetRestricted()) {
670 PyErr_SetString(PyExc_RuntimeError,
671 "__dict__ not accessible in restricted mode");
672 return -1;
673 }
674 if (v == NULL || !PyDict_Check(v)) {
675 PyErr_SetString(PyExc_TypeError,
676 "__dict__ must be set to a dictionary");
677 return -1;
678 }
679 tmp = inst->in_dict;
680 Py_INCREF(v);
681 inst->in_dict = v;
682 Py_DECREF(tmp);
683 return 0;
684 }
685 if (strcmp(sname, "__class__") == 0) {
686 if (PyEval_GetRestricted()) {
687 PyErr_SetString(PyExc_RuntimeError,
688 "__class__ not accessible in restricted mode");
689 return -1;
690 }
691 if (v == NULL || !PyClass_Check(v)) {
692 PyErr_SetString(PyExc_TypeError,
693 "__class__ must be set to a class");
694 return -1;
695 }
696 tmp = (PyObject *)(inst->in_class);
697 Py_INCREF(v);
698 inst->in_class = (PyClassObject *)v;
699 Py_DECREF(tmp);
700 return 0;
701 }
Guido van Rossume7737541994-09-05 07:31:41 +0000702 }
Guido van Rossume7737541994-09-05 07:31:41 +0000703 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000704 if (v == NULL)
705 func = inst->in_class->cl_delattr;
706 else
707 func = inst->in_class->cl_setattr;
708 if (func == NULL)
709 return instance_setattr1(inst, name, v);
710 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000712 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000714 if (args == NULL)
715 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 res = PyEval_CallObject(func, args);
717 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000718 if (res == NULL)
719 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000721 return 0;
722}
723
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000725instance_repr(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000726{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 PyObject *func;
728 PyObject *res;
729 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000730
Guido van Rossum2878a691996-08-09 20:53:24 +0000731 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000732 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000733 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000734 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000735 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000737 PyObject *mod = PyDict_GetItemString(
738 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000739 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 if (classname != NULL && PyString_Check(classname))
741 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000742 else
743 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000745 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000746 sprintf(buf, "<?.%.100s instance at %p>",
747 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000748 else
Fred Drakea44d3532000-06-30 15:01:00 +0000749 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000750 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000751 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000752 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000753 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 res = PyEval_CallObject(func, (PyObject *)NULL);
755 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756 return res;
757}
758
Guido van Rossum9bfef441993-03-29 10:43:31 +0000759static long
Fred Drake79912472000-07-09 04:06:11 +0000760instance_hash(PyInstanceObject *inst)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000761{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 PyObject *func;
763 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000764 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000766
Guido van Rossum2878a691996-08-09 20:53:24 +0000767 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000768 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000769 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000770 if (func == NULL) {
771 /* If there is no __cmp__ method, we hash on the address.
772 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000774 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000775 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000776 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000777 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 PyErr_Clear();
Fred Drake13634cf2000-06-29 19:17:04 +0000779 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000780 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000782 return -1;
783 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 res = PyEval_CallObject(func, (PyObject *)NULL);
785 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000786 if (res == NULL)
787 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 if (PyInt_Check(res)) {
789 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000790 if (outcome == -1)
791 outcome = -2;
792 }
793 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 PyErr_SetString(PyExc_TypeError,
795 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000796 outcome = -1;
797 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799 return outcome;
800}
801
Jeremy Hylton8caad492000-06-23 14:18:11 +0000802static int
803instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
804{
805 int err;
806 if (o->in_class) {
807 err = visit((PyObject *)(o->in_class), arg);
808 if (err)
809 return err;
810 }
811 if (o->in_dict) {
812 err = visit(o->in_dict, arg);
813 if (err)
814 return err;
815 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000816 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000817}
818
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000820
Guido van Rossum9bfef441993-03-29 10:43:31 +0000821static int
Fred Drake79912472000-07-09 04:06:11 +0000822instance_length(PyInstanceObject *inst)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000823{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyObject *func;
825 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826 int outcome;
827
Guido van Rossum2878a691996-08-09 20:53:24 +0000828 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000829 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000830 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000831 if (func == NULL)
832 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 res = PyEval_CallObject(func, (PyObject *)NULL);
834 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000835 if (res == NULL)
836 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 if (PyInt_Check(res)) {
838 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000839 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 PyErr_SetString(PyExc_ValueError,
841 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842 }
843 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyErr_SetString(PyExc_TypeError,
845 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 outcome = -1;
847 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000849 return outcome;
850}
851
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000853instance_subscript(PyInstanceObject *inst, PyObject *key)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000854{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 PyObject *func;
856 PyObject *arg;
857 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858
Guido van Rossum2878a691996-08-09 20:53:24 +0000859 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000860 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000861 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000862 if (func == NULL)
863 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000867 return NULL;
868 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 res = PyEval_CallObject(func, arg);
870 Py_DECREF(func);
871 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000872 return res;
873}
874
Guido van Rossum9bfef441993-03-29 10:43:31 +0000875static int
Fred Drake79912472000-07-09 04:06:11 +0000876instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000877{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 PyObject *func;
879 PyObject *arg;
880 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000881
Guido van Rossum2878a691996-08-09 20:53:24 +0000882 if (value == NULL) {
883 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000884 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000885 func = instance_getattr(inst, delitemstr);
886 }
887 else {
888 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000889 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000890 func = instance_getattr(inst, setitemstr);
891 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000892 if (func == NULL)
893 return -1;
894 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000896 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000900 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 res = PyEval_CallObject(func, arg);
903 Py_DECREF(func);
904 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905 if (res == NULL)
906 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908 return 0;
909}
910
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912 (inquiry)instance_length, /*mp_length*/
913 (binaryfunc)instance_subscript, /*mp_subscript*/
914 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915};
916
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000918instance_item(PyInstanceObject *inst, int i)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000921
Guido van Rossum2878a691996-08-09 20:53:24 +0000922 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000923 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925 if (func == NULL)
926 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000930 return NULL;
931 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 res = PyEval_CallObject(func, arg);
933 Py_DECREF(func);
934 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 return res;
936}
937
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938static PyObject *
Thomas Wouters1d75a792000-08-17 22:37:32 +0000939sliceobj_from_intint(int i, int j)
940{
941 PyObject *start, *end, *res;
942
943 start = PyInt_FromLong((long)i);
944 if (!start)
945 return NULL;
946
947 end = PyInt_FromLong((long)j);
948 if (!end) {
949 Py_DECREF(start);
950 return NULL;
951 }
952 res = PySlice_New(start, end, NULL);
953 Py_DECREF(start);
954 Py_DECREF(end);
955 return res;
956}
957
958
959static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000960instance_slice(PyInstanceObject *inst, int i, int j)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 PyObject *func, *arg, *res;
963 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964
Guido van Rossum2878a691996-08-09 20:53:24 +0000965 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000966 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000967 func = instance_getattr(inst, getslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +0000968
969 if (func == NULL) {
970 PyErr_Clear();
971
972 if (getitemstr == NULL)
973 getitemstr = PyString_InternFromString("__getitem__");
974 func = instance_getattr(inst, getitemstr);
975 if (func == NULL)
976 return NULL;
977 arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
978 } else
979 arg = Py_BuildValue("(ii)", i, j);
980
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000983 return NULL;
984 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 res = PyEval_CallObject(func, arg);
986 Py_DECREF(func);
987 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 return res;
989}
990
991static int
Fred Drake79912472000-07-09 04:06:11 +0000992instance_ass_item(PyInstanceObject *inst, int i, PyObject *item)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995
Guido van Rossum2878a691996-08-09 20:53:24 +0000996 if (item == NULL) {
997 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000998 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000999 func = instance_getattr(inst, delitemstr);
1000 }
1001 else {
1002 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001003 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001004 func = instance_getattr(inst, setitemstr);
1005 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001007 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001008 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001014 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 res = PyEval_CallObject(func, arg);
1017 Py_DECREF(func);
1018 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 if (res == NULL)
1020 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 return 0;
1023}
1024
1025static int
Fred Drake79912472000-07-09 04:06:11 +00001026instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 PyObject *func, *arg, *res;
1029 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030
Guido van Rossum2878a691996-08-09 20:53:24 +00001031 if (value == NULL) {
1032 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 delslicestr =
1034 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001035 func = instance_getattr(inst, delslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001036 if (func == NULL) {
1037 PyErr_Clear();
1038 if (delitemstr == NULL)
1039 delitemstr =
1040 PyString_InternFromString("__delitem__");
1041 func = instance_getattr(inst, delitemstr);
1042 if (func == NULL)
1043 return -1;
1044
1045 arg = Py_BuildValue("(N)",
1046 sliceobj_from_intint(i, j));
1047 } else
1048 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum2878a691996-08-09 20:53:24 +00001049 }
1050 else {
1051 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 setslicestr =
1053 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001054 func = instance_getattr(inst, setslicestr);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001055 if (func == NULL) {
1056 PyErr_Clear();
1057 if (setitemstr == NULL)
1058 setitemstr =
1059 PyString_InternFromString("__setitem__");
1060 func = instance_getattr(inst, setitemstr);
1061 if (func == NULL)
1062 return -1;
1063
1064 arg = Py_BuildValue("(NO)",
1065 sliceobj_from_intint(i, j), value);
1066 } else
1067 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum2878a691996-08-09 20:53:24 +00001068 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001069 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001071 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 res = PyEval_CallObject(func, arg);
1074 Py_DECREF(func);
1075 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076 if (res == NULL)
1077 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079 return 0;
1080}
1081
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001082static int instance_contains(PyInstanceObject *inst, PyObject *member)
1083{
1084 static PyObject *__contains__;
1085 PyObject *func, *arg, *res;
1086 int ret;
1087
1088 if(__contains__ == NULL) {
1089 __contains__ = PyString_InternFromString("__contains__");
1090 if(__contains__ == NULL)
1091 return -1;
1092 }
1093 func = instance_getattr(inst, __contains__);
1094 if(func == NULL) {
Thomas Wouters7e474022000-07-16 12:04:32 +00001095 /* fall back to previous behavior */
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001096 int i, cmp_res;
1097
1098 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1099 return -1;
1100 PyErr_Clear();
1101 for(i=0;;i++) {
1102 PyObject *obj = instance_item(inst, i);
1103 int ret = 0;
1104
1105 if(obj == NULL) {
1106 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1107 return -1;
1108 PyErr_Clear();
1109 return 0;
1110 }
1111 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1112 ret = -1;
1113 if(cmp_res == 0)
1114 ret = 1;
1115 Py_DECREF(obj);
1116 if(ret)
1117 return ret;
1118 }
1119 }
1120 arg = Py_BuildValue("(O)", member);
1121 if(arg == NULL) {
1122 Py_DECREF(func);
1123 return -1;
1124 }
1125 res = PyEval_CallObject(func, arg);
1126 Py_DECREF(func);
1127 Py_DECREF(arg);
1128 if(res == NULL)
1129 return -1;
1130 ret = PyObject_IsTrue(res);
1131 Py_DECREF(res);
1132 return ret;
1133}
1134
Fred Drake79912472000-07-09 04:06:11 +00001135static PySequenceMethods
1136instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001137 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001138 0, /*sq_concat*/
1139 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001140 (intargfunc)instance_item, /*sq_item*/
1141 (intintargfunc)instance_slice, /*sq_slice*/
1142 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1143 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001144 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001145};
1146
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001148generic_unary_op(PyInstanceObject *self, PyObject *methodname)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001149{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001151
1152 if ((func = instance_getattr(self, methodname)) == NULL)
1153 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001154 res = PyEval_CallObject(func, (PyObject *)NULL);
1155 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001156 return res;
1157}
1158
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001159static PyObject *
1160generic_binary_op(PyObject *v, PyObject *w, char *opname)
Guido van Rossum03093a21994-09-28 15:51:32 +00001161{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001162 PyObject *result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 PyObject *args;
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001164 PyObject *func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001165 if (func == NULL) {
Guido van Rossum617c1b01998-05-28 19:50:02 +00001166 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001167 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168 PyErr_Clear();
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001169 Py_INCREF(Py_NotImplemented);
1170 return Py_NotImplemented;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001171 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001173 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001175 return NULL;
Guido van Rossum03093a21994-09-28 15:51:32 +00001176 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001177 result = PyEval_CallObject(func, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001178 Py_DECREF(args);
1179 Py_DECREF(func);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001180 return result;
1181}
1182
1183
1184static PyObject *coerce_obj;
1185
1186/* Try one half of a binary operator involving a class instance. */
1187static PyObject *
1188half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1189 int swapped)
1190{
1191 PyObject *args;
1192 PyObject *coercefunc;
1193 PyObject *coerced = NULL;
1194 PyObject *v1;
1195 PyObject *result;
1196
1197 if (!PyInstance_Check(v)) {
1198 Py_INCREF(Py_NotImplemented);
1199 return Py_NotImplemented;
1200 }
1201
1202 if (coerce_obj == NULL) {
1203 coerce_obj = PyString_InternFromString("__coerce__");
1204 if (coerce_obj == NULL)
1205 return NULL;
1206 }
1207 coercefunc = PyObject_GetAttr(v, coerce_obj);
1208 if (coercefunc == NULL) {
1209 PyErr_Clear();
1210 return generic_binary_op(v, w, opname);
1211 }
1212
1213 args = Py_BuildValue("(O)", w);
1214 if (args == NULL) {
1215 return NULL;
1216 }
1217 coerced = PyEval_CallObject(coercefunc, args);
1218 Py_DECREF(args);
1219 Py_DECREF(coercefunc);
1220 if (coerced == NULL) {
1221 return NULL;
1222 }
1223 if (coerced == Py_None || coerced == Py_NotImplemented) {
1224 Py_DECREF(coerced);
1225 return generic_binary_op(v, w, opname);
1226 }
1227 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1228 Py_DECREF(coerced);
1229 PyErr_SetString(PyExc_TypeError,
1230 "coercion should return None or 2-tuple");
1231 return NULL;
1232 }
1233 v1 = PyTuple_GetItem(coerced, 0);
1234 w = PyTuple_GetItem(coerced, 1);
1235 if (v1 == v) {
1236 /* prevent recursion if __coerce__ returns self as the first
1237 * argument */
1238 result = generic_binary_op(v, w, opname);
1239 } else {
1240 if (swapped)
1241 result = (thisfunc)(w, v1);
1242 else
1243 result = (thisfunc)(v1, w);
1244 }
1245 Py_DECREF(coerced);
1246 return result;
1247}
1248
1249/* Implement a binary operator involving at least one class instance. */
1250static PyObject *
1251do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1252 binaryfunc thisfunc)
1253{
1254 PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1255 if (result == Py_NotImplemented) {
1256 Py_DECREF(Py_NotImplemented);
1257 result = half_binop(w, v, ropname, thisfunc, 1);
1258 }
1259 return result;
1260}
1261
1262static PyObject *
1263do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1264 char *ropname, binaryfunc thisfunc)
1265{
1266 PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1267 if (result == Py_NotImplemented) {
1268 Py_DECREF(Py_NotImplemented);
1269 result = do_binop(v, w, opname, ropname, thisfunc);
1270 }
1271 return result;
Guido van Rossum03093a21994-09-28 15:51:32 +00001272}
1273
Guido van Rossum879c5811995-01-10 15:24:06 +00001274static int
Fred Drake79912472000-07-09 04:06:11 +00001275instance_coerce(PyObject **pv, PyObject **pw)
Guido van Rossum879c5811995-01-10 15:24:06 +00001276{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 PyObject *v = *pv;
1278 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001279 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 PyObject *args;
1281 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001282
Guido van Rossum2878a691996-08-09 20:53:24 +00001283 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001284 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001285 if (coerce_obj == NULL)
1286 return -1;
1287 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001288 coercefunc = PyObject_GetAttr(v, coerce_obj);
1289 if (coercefunc == NULL) {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001290 /* No __coerce__ method */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 PyErr_Clear();
1292 Py_INCREF(v);
1293 Py_INCREF(w);
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001294 return 1;
Guido van Rossum879c5811995-01-10 15:24:06 +00001295 }
1296 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001298 if (args == NULL) {
1299 return -1;
1300 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001301 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001303 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001304 if (coerced == NULL) {
1305 /* __coerce__ call raised an exception */
1306 return -1;
1307 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001308 if (coerced == Py_None || coerced == Py_NotImplemented) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001309 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001311 return 1;
1312 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001314 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 Py_DECREF(coerced);
1316 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001317 "coercion should return None or 2-tuple");
1318 return -1;
1319 }
1320 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321 *pv = PyTuple_GetItem(coerced, 0);
1322 *pw = PyTuple_GetItem(coerced, 1);
1323 Py_INCREF(*pv);
1324 Py_INCREF(*pw);
1325 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001326 return 0;
1327}
1328
Guido van Rossum04691fc1992-08-12 15:35:34 +00001329#define UNARY(funcname, methodname) \
Thomas Woutersc3073522000-07-23 22:09:59 +00001330static PyObject *funcname(PyInstanceObject *self) { \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001332 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001333 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001334}
1335
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001336#define BINARY(f, m, n) \
1337static PyObject *f(PyObject *v, PyObject *w) { \
1338 return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1339}
1340
1341#define BINARY_INPLACE(f, m, n) \
1342static PyObject *f(PyObject *v, PyObject *w) { \
1343 return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1344 "__r" m "__", n); \
1345}
1346
Guido van Rossum04691fc1992-08-12 15:35:34 +00001347UNARY(instance_neg, "__neg__")
1348UNARY(instance_pos, "__pos__")
1349UNARY(instance_abs, "__abs__")
1350
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001351BINARY(instance_or, "or", PyNumber_Or)
1352BINARY(instance_and, "and", PyNumber_And)
1353BINARY(instance_xor, "xor", PyNumber_Xor)
1354BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1355BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1356BINARY(instance_add, "add", PyNumber_Add)
1357BINARY(instance_sub, "sub", PyNumber_Subtract)
1358BINARY(instance_mul, "mul", PyNumber_Multiply)
1359BINARY(instance_div, "div", PyNumber_Divide)
1360BINARY(instance_mod, "mod", PyNumber_Remainder)
1361BINARY(instance_divmod, "divmod", PyNumber_Divmod)
1362
1363BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1364BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1365BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1366BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1367BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1368BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1369BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1370BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1371BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1372BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
1373
1374static PyObject *
1375do_cmp(PyObject *v, PyObject *w)
1376{
1377 int cmp = PyObject_Compare(v, w);
1378 if (PyErr_Occurred()) {
1379 return NULL;
1380 }
1381 return PyInt_FromLong(cmp);
1382}
1383
1384static PyObject *
1385instance_cmp(PyObject *v, PyObject *w)
1386{
1387 PyObject *result = half_binop(v, w, "__cmp__", do_cmp, 0);
1388 if (result == Py_NotImplemented) {
1389 Py_DECREF(Py_NotImplemented);
1390 /* __rcmp__ is not called on instances, instead they
1391 * automaticly reverse the arguments and return the negative of
1392 * __cmp__ if it exists */
1393 result = half_binop(w, v, "__cmp__", do_cmp, 0);
1394
1395 if (result != Py_NotImplemented && result != NULL) {
1396 PyObject *r = PyNumber_Negative(result);
1397 Py_DECREF(result);
1398 result = r;
1399 }
1400 }
1401 return result;
1402}
1403
1404static int
1405instance_compare(PyObject *inst, PyObject *other)
1406{
1407 PyObject *result;
1408 long outcome;
1409 result = instance_cmp(inst, other);
1410 if (result == NULL) {
1411 return -1;
1412 }
1413 if (result == Py_NotImplemented) {
1414 Py_DECREF(result);
1415 return -1;
1416 }
1417 if (!PyInt_Check(result)) {
1418 Py_DECREF(result);
1419 PyErr_SetString(PyExc_TypeError,
1420 "comparison did not return an int");
1421 return -1;
1422 }
1423 outcome = PyInt_AsLong(result);
1424 Py_DECREF(result);
1425 if (outcome < 0)
1426 return -1;
1427 else if (outcome > 0)
1428 return 1;
1429 return 0;
1430}
1431
Guido van Rossum9bfef441993-03-29 10:43:31 +00001432static int
Fred Drake79912472000-07-09 04:06:11 +00001433instance_nonzero(PyInstanceObject *self)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001434{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001436 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001438
Guido van Rossum2878a691996-08-09 20:53:24 +00001439 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001440 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001441 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001443 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001444 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001445 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001447 /* Fall back to the default behavior:
1448 all instances are nonzero */
1449 return 1;
1450 }
1451 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 res = PyEval_CallObject(func, (PyObject *)NULL);
1453 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001454 if (res == NULL)
1455 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456 if (!PyInt_Check(res)) {
1457 Py_DECREF(res);
1458 PyErr_SetString(PyExc_TypeError,
1459 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460 return -1;
1461 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462 outcome = PyInt_AsLong(res);
1463 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001464 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 PyErr_SetString(PyExc_ValueError,
1466 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001467 return -1;
1468 }
1469 return outcome > 0;
1470}
1471
1472UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001473UNARY(instance_int, "__int__")
1474UNARY(instance_long, "__long__")
1475UNARY(instance_float, "__float__")
1476UNARY(instance_oct, "__oct__")
1477UNARY(instance_hex, "__hex__")
1478
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001479static PyObject *
1480bin_power(PyObject *v, PyObject *w)
1481{
1482 return PyNumber_Power(v, w, Py_None);
1483}
1484
Guido van Rossum03093a21994-09-28 15:51:32 +00001485/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001487instance_pow(PyObject *v, PyObject *w, PyObject *z)
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001488{
1489 if (z == Py_None) {
1490 return do_binop(v, w, "__pow__", "__rpow__", bin_power);
Guido van Rossum03093a21994-09-28 15:51:32 +00001491 }
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001492 else {
1493 PyObject *func;
1494 PyObject *args;
1495 PyObject *result;
1496
1497 /* XXX Doesn't do coercions... */
1498 func = PyObject_GetAttrString(v, "__pow__");
1499 if (func == NULL)
1500 return NULL;
1501 args = Py_BuildValue("(OO)", w, z);
1502 if (args == NULL) {
1503 Py_DECREF(func);
1504 return NULL;
1505 }
1506 result = PyEval_CallObject(func, args);
1507 Py_DECREF(func);
1508 Py_DECREF(args);
1509 return result;
1510 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001511}
1512
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001513static PyObject *
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001514bin_inplace_power(PyObject *v, PyObject *w)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001515{
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001516 return PyNumber_InPlacePower(v, w, Py_None);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001517}
1518
1519
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001520static PyObject *
1521instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1522{
1523 if (z == Py_None) {
1524 return do_binop_inplace(v, w, "__ipow__", "__pow__",
1525 "__rpow__", bin_inplace_power);
1526 }
1527 else {
1528 /* XXX Doesn't do coercions... */
1529 PyObject *func;
1530 PyObject *args;
1531 PyObject *result;
1532
1533 func = PyObject_GetAttrString(v, "__ipow__");
1534 if (func == NULL) {
1535 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1536 return NULL;
1537 PyErr_Clear();
1538 return instance_pow(v, w, z);
1539 }
1540 args = Py_BuildValue("(OO)", w, z);
1541 if (args == NULL) {
1542 Py_DECREF(func);
1543 return NULL;
1544 }
1545 result = PyEval_CallObject(func, args);
1546 Py_DECREF(func);
1547 Py_DECREF(args);
1548 return result;
1549 }
1550}
1551
1552
1553
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554static PyNumberMethods instance_as_number = {
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001555 (binaryfunc)instance_add, /*nb_add*/
1556 (binaryfunc)instance_sub, /*nb_subtract*/
1557 (binaryfunc)instance_mul, /*nb_multiply*/
1558 (binaryfunc)instance_div, /*nb_divide*/
1559 (binaryfunc)instance_mod, /*nb_remainder*/
1560 (binaryfunc)instance_divmod, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001561 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001562 (unaryfunc)instance_neg, /*nb_negative*/
1563 (unaryfunc)instance_pos, /*nb_positive*/
1564 (unaryfunc)instance_abs, /*nb_absolute*/
1565 (inquiry)instance_nonzero, /*nb_nonzero*/
1566 (unaryfunc)instance_invert, /*nb_invert*/
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001567 (binaryfunc)instance_lshift, /*nb_lshift*/
1568 (binaryfunc)instance_rshift, /*nb_rshift*/
1569 (binaryfunc)instance_and, /*nb_and*/
1570 (binaryfunc)instance_xor, /*nb_xor*/
1571 (binaryfunc)instance_or, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001572 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001573 (unaryfunc)instance_int, /*nb_int*/
1574 (unaryfunc)instance_long, /*nb_long*/
1575 (unaryfunc)instance_float, /*nb_float*/
1576 (unaryfunc)instance_oct, /*nb_oct*/
1577 (unaryfunc)instance_hex, /*nb_hex*/
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001578 (binaryfunc)instance_iadd, /*nb_inplace_add*/
1579 (binaryfunc)instance_isub, /*nb_inplace_subtract*/
1580 (binaryfunc)instance_imul, /*nb_inplace_multiply*/
1581 (binaryfunc)instance_idiv, /*nb_inplace_divide*/
1582 (binaryfunc)instance_imod, /*nb_inplace_remainder*/
1583 (ternaryfunc)instance_ipow, /*nb_inplace_power*/
1584 (binaryfunc)instance_ilshift, /*nb_inplace_lshift*/
1585 (binaryfunc)instance_irshift, /*nb_inplace_rshift*/
1586 (binaryfunc)instance_iand, /*nb_inplace_and*/
1587 (binaryfunc)instance_ixor, /*nb_inplace_xor*/
1588 (binaryfunc)instance_ior, /*nb_inplace_or*/
1589 (binaryfunc)instance_cmp, /*nb_cmp*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001590};
1591
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592PyTypeObject PyInstance_Type = {
1593 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001594 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001595 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001596 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001597 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001598 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001599 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001600 0, /*tp_getattr*/
1601 0, /*tp_setattr*/
1602 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001603 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001604 &instance_as_number, /*tp_as_number*/
1605 &instance_as_sequence, /*tp_as_sequence*/
1606 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001607 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001608 0, /*tp_call*/
1609 0, /*tp_str*/
1610 (getattrofunc)instance_getattr, /*tp_getattro*/
1611 (setattrofunc)instance_setattr, /*tp_setattro*/
Neil Schemenauer29bfc072001-01-04 01:43:46 +00001612 0, /* tp_as_buffer */
1613 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_NEWSTYLENUMBER, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001614 0, /* tp_doc */
1615 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001616};
1617
1618
Guido van Rossum81daa321993-05-20 14:24:46 +00001619/* Instance method objects are used for two purposes:
1620 (a) as bound instance methods (returned by instancename.methodname)
1621 (b) as unbound methods (returned by ClassName.methodname)
1622 In case (b), im_self is NULL
1623*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001624
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001625static PyMethodObject *free_list;
1626
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001628PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001631 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001633 return NULL;
1634 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001635 im = free_list;
1636 if (im != NULL) {
1637 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001638 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001639 }
1640 else {
1641 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1642 if (im == NULL)
1643 return NULL;
1644 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001646 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001648 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001650 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001651 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001653}
1654
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001656PyMethod_Function(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001657{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658 if (!PyMethod_Check(im)) {
1659 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001660 return NULL;
1661 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001663}
1664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001666PyMethod_Self(register PyObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001667{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001668 if (!PyMethod_Check(im)) {
1669 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001670 return NULL;
1671 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001673}
1674
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001676PyMethod_Class(register PyObject *im)
Guido van Rossum81daa321993-05-20 14:24:46 +00001677{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001678 if (!PyMethod_Check(im)) {
1679 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001680 return NULL;
1681 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001682 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001683}
1684
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001685/* Class method methods */
1686
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001687#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688
Guido van Rossume8122f11991-05-05 20:03:07 +00001689static struct memberlist instancemethod_memberlist[] = {
1690 {"im_func", T_OBJECT, OFF(im_func)},
1691 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001692 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001693 /* Dummies that are not handled by getattr() except for __members__ */
1694 {"__doc__", T_INT, 0},
1695 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696 {NULL} /* Sentinel */
1697};
1698
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001699static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001700instancemethod_getattr(register PyMethodObject *im, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001701{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001703 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001704 /* Inherit __name__ and __doc__ from the callable object
1705 implementing the method */
1706 if (strcmp(sname, "__name__") == 0 ||
1707 strcmp(sname, "__doc__") == 0)
1708 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001709 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710 if (PyEval_GetRestricted()) {
1711 PyErr_SetString(PyExc_RuntimeError,
1712 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001713 return NULL;
1714 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001715 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001716}
1717
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001718static void
Fred Drake79912472000-07-09 04:06:11 +00001719instancemethod_dealloc(register PyMethodObject *im)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001720{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001721 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001722 Py_DECREF(im->im_func);
1723 Py_XDECREF(im->im_self);
1724 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001725 im->im_self = (PyObject *)free_list;
1726 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001727}
1728
Guido van Rossumebc8c511992-09-03 20:39:51 +00001729static int
Fred Drake79912472000-07-09 04:06:11 +00001730instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
Guido van Rossumebc8c511992-09-03 20:39:51 +00001731{
Guido van Rossume9df7271995-04-06 14:46:51 +00001732 if (a->im_self != b->im_self)
1733 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001734 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001735}
1736
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001737static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001738instancemethod_repr(PyMethodObject *a)
Guido van Rossum25831651993-05-19 14:50:45 +00001739{
1740 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001742 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001743 PyClassObject *class = (PyClassObject *)(a->im_class);
1744 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001745 char *fcname, *icname, *fname;
1746 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001747 if (PyFunction_Check(func)) {
1748 funcname = ((PyFunctionObject *)func)->func_name;
1749 Py_INCREF(funcname);
1750 }
1751 else {
1752 funcname = PyObject_GetAttrString(func,"__name__");
1753 if (funcname == NULL)
1754 PyErr_Clear();
1755 }
1756 if (funcname != NULL && PyString_Check(funcname))
1757 fname = PyString_AS_STRING(funcname);
1758 else
1759 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001760 if (fclassname != NULL && PyString_Check(fclassname))
1761 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001762 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001763 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001764 if (self == NULL)
1765 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1766 else {
1767 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001768 if (iclassname != NULL && PyString_Check(iclassname))
1769 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001770 else
1771 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001772 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1773 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001774 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001775 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001777}
1778
Guido van Rossum9bfef441993-03-29 10:43:31 +00001779static long
Fred Drake79912472000-07-09 04:06:11 +00001780instancemethod_hash(PyMethodObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001781{
1782 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001783 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001785 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001787 if (x == -1)
1788 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001790 if (y == -1)
1791 return -1;
1792 return x ^ y;
1793}
1794
Jeremy Hylton8caad492000-06-23 14:18:11 +00001795static int
1796instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1797{
1798 int err;
1799 if (im->im_func) {
1800 err = visit(im->im_func, arg);
1801 if (err)
1802 return err;
1803 }
1804 if (im->im_self) {
1805 err = visit(im->im_self, arg);
1806 if (err)
1807 return err;
1808 }
1809 if (im->im_class) {
1810 err = visit(im->im_class, arg);
1811 if (err)
1812 return err;
1813 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001814 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001815}
1816
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001817PyTypeObject PyMethod_Type = {
1818 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001819 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001820 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001821 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001822 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001823 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001824 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001825 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001826 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001827 (cmpfunc)instancemethod_compare, /*tp_compare*/
1828 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001829 0, /*tp_as_number*/
1830 0, /*tp_as_sequence*/
1831 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001832 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001833 0, /*tp_call*/
1834 0, /*tp_str*/
1835 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1836 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001837 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001838 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001839 0, /* tp_doc */
1840 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001841};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001842
1843/* Clear out the free list */
1844
1845void
Fred Drake79912472000-07-09 04:06:11 +00001846PyMethod_Fini(void)
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001847{
1848 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001849 PyMethodObject *im = free_list;
1850 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +00001851 im = (PyMethodObject *) PyObject_AS_GC(im);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001852 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001853 }
1854}