blob: d3c46b366c69283443527f4babe777da25601e4a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Class object implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000029
Guido van Rossum52ca98a1994-09-05 07:32:29 +000030/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +000031static object *class_lookup PROTO((classobject *, object *, classobject **));
32static object *instance_getattr1 PROTO((instanceobject *, object *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000033
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034object *
Guido van Rossum81daa321993-05-20 14:24:46 +000035newclassobject(bases, dict, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 object *bases; /* NULL or tuple of classobjects! */
Guido van Rossum81daa321993-05-20 14:24:46 +000037 object *dict;
Guido van Rossum94308391991-10-20 20:11:48 +000038 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039{
Guido van Rossum81daa321993-05-20 14:24:46 +000040 int pos;
41 object *key, *value;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000042 classobject *op, *dummy;
Guido van Rossum2878a691996-08-09 20:53:24 +000043 static object *getattrstr, *setattrstr, *delattrstr;
Guido van Rossume7d444f1995-01-07 12:35:18 +000044 if (dictlookup(dict, "__doc__") == NULL) {
45 if (dictinsert(dict, "__doc__", None) < 0)
46 return NULL;
47 }
Guido van Rossume2966a61991-12-10 13:53:23 +000048 if (bases == NULL) {
49 bases = newtupleobject(0);
50 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000051 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000052 }
53 else
54 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000056 if (op == NULL) {
57 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000059 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000061 INCREF(dict);
62 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000063 XINCREF(name);
64 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000065 if (getattrstr == NULL) {
66 getattrstr = newstringobject("__getattr__");
67 setattrstr = newstringobject("__setattr__");
68 delattrstr = newstringobject("__delattr__");
69 }
70 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
71 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
72 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000073 XINCREF(op->cl_getattr);
74 XINCREF(op->cl_setattr);
75 XINCREF(op->cl_delattr);
Guido van Rossum81daa321993-05-20 14:24:46 +000076 pos = 0;
77 while (mappinggetnext(dict, &pos, &key, &value)) {
78 if (is_accessobject(value))
79 setaccessowner(value, (object *)op);
80 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081 return (object *) op;
82}
83
84/* Class methods */
85
86static void
87class_dealloc(op)
88 classobject *op;
89{
Guido van Rossume2966a61991-12-10 13:53:23 +000090 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +000091 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +000092 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 free((ANY *)op);
94}
95
96static object *
Guido van Rossum81daa321993-05-20 14:24:46 +000097class_lookup(cp, name, pclass)
98 classobject *cp;
Guido van Rossum2878a691996-08-09 20:53:24 +000099 object *name;
Guido van Rossum81daa321993-05-20 14:24:46 +0000100 classobject **pclass;
101{
102 int i, n;
Guido van Rossum2878a691996-08-09 20:53:24 +0000103 object *value = mappinglookup(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000104 if (value != NULL) {
105 *pclass = cp;
106 return value;
107 }
108 n = gettuplesize(cp->cl_bases);
109 for (i = 0; i < n; i++) {
110 object *v = class_lookup((classobject *)
111 gettupleitem(cp->cl_bases, i), name, pclass);
112 if (v != NULL)
113 return v;
114 }
115 return NULL;
116}
117
118static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119class_getattr(op, name)
120 register classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000121 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122{
123 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000124 register char *sname = getstringvalue(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000125 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000126 if (sname[0] == '_' && sname[1] == '_') {
127 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000128 if (getrestricted()) {
129 err_setstr(RuntimeError,
130 "class.__dict__ not accessible in restricted mode");
131 return NULL;
132 }
133 INCREF(op->cl_dict);
134 return op->cl_dict;
135 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000136 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000137 INCREF(op->cl_bases);
138 return op->cl_bases;
139 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000140 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000141 if (op->cl_name == NULL)
142 v = None;
143 else
144 v = op->cl_name;
145 INCREF(v);
146 return v;
147 }
Guido van Rossum94308391991-10-20 20:11:48 +0000148 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000149 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000150 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000151 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000152 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000154 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000155 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000156 if (v == NULL)
157 return NULL;
158 }
159 else
160 INCREF(v);
161 if (is_funcobject(v)) {
162 object *w = newinstancemethodobject(v, (object *)NULL,
163 (object *)class);
164 DECREF(v);
165 v = w;
166 }
167 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168}
169
Guido van Rossum94308391991-10-20 20:11:48 +0000170static int
171class_setattr(op, name, v)
172 classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000173 object *name;
Guido van Rossum94308391991-10-20 20:11:48 +0000174 object *v;
175{
Guido van Rossum25831651993-05-19 14:50:45 +0000176 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000177 char *sname = getstringvalue(name);
178 if (sname[0] == '_' && sname[1] == '_') {
179 int n = getstringsize(name);
180 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000181 err_setstr(TypeError, "read-only special attribute");
182 return -1;
183 }
184 }
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000185 if (getrestricted()) {
186 err_setstr(RuntimeError,
187 "classes are read-only in restricted mode");
188 return -1;
189 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000190 ac = mappinglookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000191 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000192 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000193 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000194 int rv = mappingremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000195 if (rv < 0)
196 err_setstr(AttributeError,
197 "delete non-existing class attribute");
198 return rv;
199 }
Guido van Rossum94308391991-10-20 20:11:48 +0000200 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000201 return mappinginsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000202}
203
Guido van Rossum25831651993-05-19 14:50:45 +0000204static object *
205class_repr(op)
206 classobject *op;
207{
208 char buf[140];
209 char *name;
210 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
211 name = "?";
212 else
213 name = getstringvalue(op->cl_name);
214 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
215 return newstringobject(buf);
216}
217
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218typeobject Classtype = {
219 OB_HEAD_INIT(&Typetype)
220 0,
221 "class",
222 sizeof(classobject),
223 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000226 0, /*tp_getattr*/
227 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000229 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 0, /*tp_as_number*/
231 0, /*tp_as_sequence*/
232 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000233 0, /*tp_hash*/
234 0, /*tp_call*/
235 0, /*tp_str*/
236 (getattrofunc)class_getattr, /*tp_getattro*/
237 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238};
239
Guido van Rossum81daa321993-05-20 14:24:46 +0000240int
241issubclass(class, base)
242 object *class;
243 object *base;
244{
245 int i, n;
246 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000247 if (class == base)
248 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000249 if (class == NULL || !is_classobject(class))
250 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000251 cp = (classobject *)class;
252 n = gettuplesize(cp->cl_bases);
253 for (i = 0; i < n; i++) {
254 if (issubclass(gettupleitem(cp->cl_bases, i), base))
255 return 1;
256 }
257 return 0;
258}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259
Guido van Rossum81daa321993-05-20 14:24:46 +0000260
261/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262
Guido van Rossum81daa321993-05-20 14:24:46 +0000263static int
264addaccess(class, inst)
265 classobject *class;
266 instanceobject *inst;
267{
268 int i, n, pos, ret;
269 object *key, *value, *ac;
270
271 n = gettuplesize(class->cl_bases);
272 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000273 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000274 return -1;
275 }
276
277 pos = 0;
278 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
279 if (!is_accessobject(value))
280 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000281 if (hasaccessvalue(value))
282 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000283 ac = dict2lookup(inst->in_dict, key);
284 if (ac != NULL && is_accessobject(ac)) {
285 err_setval(ConflictError, key);
286 return -1;
287 }
288 ac = cloneaccessobject(value);
289 if (ac == NULL)
290 return -1;
291 ret = dict2insert(inst->in_dict, key, ac);
292 DECREF(ac);
293 if (ret != 0)
294 return -1;
295 }
296 return 0;
297}
298
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299object *
Guido van Rossuma83f2701995-07-26 18:07:32 +0000300newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000301 object *class;
302 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000303 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304{
Guido van Rossume8122f11991-05-05 20:03:07 +0000305 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000306 object *init;
Guido van Rossum2878a691996-08-09 20:53:24 +0000307 static object *initstr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000309 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 return NULL;
311 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000312 inst = NEWOBJ(instanceobject, &Instancetype);
313 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 return NULL;
315 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000316 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000317 inst->in_dict = newdictobject();
318 if (inst->in_dict == NULL ||
319 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000320 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 return NULL;
322 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000323 if (initstr == NULL)
324 initstr = newstringobject("__init__");
325 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000326 if (init == NULL) {
327 err_clear();
Guido van Rossuma83f2701995-07-26 18:07:32 +0000328 if (arg != NULL && (!is_tupleobject(arg) ||
329 gettuplesize(arg) != 0) || kw != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000330 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000331 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000332 DECREF(inst);
333 inst = NULL;
334 }
335 }
336 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000337 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000338 DECREF(init);
339 if (res == NULL) {
340 DECREF(inst);
341 inst = NULL;
342 }
343 else {
344 if (res != None) {
345 err_setstr(TypeError,
346 "__init__() should return None");
347 DECREF(inst);
348 inst = NULL;
349 }
350 DECREF(res);
351 }
352 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000353 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354}
355
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000356/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357
358static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000359instance_dealloc(inst)
360 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000362 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000363 object *del;
Guido van Rossum2878a691996-08-09 20:53:24 +0000364 static object *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000365 /* Call the __del__ method if it exists. First temporarily
366 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000367#ifdef Py_TRACE_REFS
368 /* much too complicated if Py_TRACE_REFS defined */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000369 extern long ref_total;
370 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000371 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000372 ref_total--; /* compensate for increment in NEWREF */
373#ifdef COUNT_ALLOCS
374 inst->ob_type->tp_alloc--; /* ditto */
375#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000376#else /* !Py_TRACE_REFS */
Guido van Rossum25831651993-05-19 14:50:45 +0000377 INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000378#endif /* !Py_TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000379 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000380 if (delstr == NULL)
381 delstr = newstringobject("__del__");
382 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000383 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000384 DECREF(del);
385 XDECREF(res);
386 /* XXX If __del__ raised an exception, it is ignored! */
387 }
388 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000389 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000390 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000391 if (--inst->ob_refcnt > 0) {
392#ifdef COUNT_ALLOCS
393 inst->ob_type->tp_free--;
394#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000395 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000396 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000397#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000398#ifdef COUNT_ALLOCS
399 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
400#endif
401 UNREF(inst);
402 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000403#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000404 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000405 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000406 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407}
408
Guido van Rossume7737541994-09-05 07:31:41 +0000409static object *
410instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000411 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000412 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413{
Guido van Rossum94308391991-10-20 20:11:48 +0000414 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000415 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000416 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000417 if (sname[0] == '_' && sname[1] == '_') {
418 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000419 if (getrestricted()) {
420 err_setstr(RuntimeError,
421 "instance.__dict__ not accessible in restricted mode");
422 return NULL;
423 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000424 INCREF(inst->in_dict);
425 return inst->in_dict;
426 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000427 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000428 INCREF(inst->in_class);
429 return (object *)inst->in_class;
430 }
Guido van Rossum94308391991-10-20 20:11:48 +0000431 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000432 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000433 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000434 if (v == NULL) {
435 v = class_lookup(inst->in_class, name, &class);
436 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000437 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000438 return NULL;
439 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000441 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000442 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000443 if (v == NULL)
444 return NULL;
445 }
446 else
447 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000448 if (class != NULL) {
449 if (is_funcobject(v)) {
450 object *w = newinstancemethodobject(v, (object *)inst,
451 (object *)class);
452 DECREF(v);
453 v = w;
454 }
455 else if (is_instancemethodobject(v)) {
456 object *im_class = instancemethodgetclass(v);
457 /* Only if classes are compatible */
458 if (issubclass((object *)class, im_class)) {
459 object *im_func = instancemethodgetfunc(v);
460 object *w = newinstancemethodobject(im_func,
461 (object *)inst, im_class);
462 DECREF(v);
463 v = w;
464 }
465 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000466 }
467 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468}
469
Guido van Rossume7737541994-09-05 07:31:41 +0000470static object *
471instance_getattr(inst, name)
472 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000473 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000474{
475 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000476 res = instance_getattr1(inst, name);
477 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
478 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000479 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000480 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000481 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000482 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000483 res = call_object(func, args);
484 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000485 }
486 return res;
487}
488
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489static int
Guido van Rossume7737541994-09-05 07:31:41 +0000490instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000491 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000492 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493 object *v;
494{
Guido van Rossum25831651993-05-19 14:50:45 +0000495 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000496 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000497 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000498 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000499 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000500 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000501 if (rv < 0)
502 err_setstr(AttributeError,
503 "delete non-existing instance attribute");
504 return rv;
505 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000506 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000507 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508}
509
Guido van Rossume7737541994-09-05 07:31:41 +0000510static int
511instance_setattr(inst, name, v)
512 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000513 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000514 object *v;
515{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000516 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000517 char *sname = getstringvalue(name);
518 if (sname[0] == '_' && sname[1] == '_'
519 && (strcmp(sname, "__dict__") == 0 ||
520 strcmp(sname, "__class__") == 0)) {
521 int n = strlen(sname);
522 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000523 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000524 return -1;
525 }
Guido van Rossume7737541994-09-05 07:31:41 +0000526 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000527 if (v == NULL)
528 func = inst->in_class->cl_delattr;
529 else
530 func = inst->in_class->cl_setattr;
531 if (func == NULL)
532 return instance_setattr1(inst, name, v);
533 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000534 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000535 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000536 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000537 if (args == NULL)
538 return -1;
539 res = call_object(func, args);
540 DECREF(args);
541 if (res == NULL)
542 return -1;
543 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000544 return 0;
545}
546
Guido van Rossum9bfef441993-03-29 10:43:31 +0000547static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000548instance_repr(inst)
549 instanceobject *inst;
550{
551 object *func;
552 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000553 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000554
Guido van Rossum2878a691996-08-09 20:53:24 +0000555 if (reprstr == NULL)
556 reprstr = newstringobject("__repr__");
557 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000558 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000559 char buf[140];
560 object *classname = inst->in_class->cl_name;
561 char *cname;
562 if (classname != NULL && is_stringobject(classname))
563 cname = getstringvalue(classname);
564 else
565 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000566 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000567 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000568 return newstringobject(buf);
569 }
570 res = call_object(func, (object *)NULL);
571 DECREF(func);
572 return res;
573}
574
Guido van Rossume7d444f1995-01-07 12:35:18 +0000575static object *
576instance_compare1(inst, other)
577 object *inst, *other;
578{
579 return instancebinop(inst, other, "__cmp__", "__rcmp__",
580 instance_compare1);
581}
582
Guido van Rossum9bfef441993-03-29 10:43:31 +0000583static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000584instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000585 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000586{
Guido van Rossum03093a21994-09-28 15:51:32 +0000587 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000588 long outcome;
589 result = instance_compare1(inst, other);
590 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000591 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000592 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000593 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000594 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000595 outcome = getintvalue(result);
596 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000597 if (outcome < 0)
598 return -1;
599 else if (outcome > 0)
600 return 1;
601 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000602}
603
Guido van Rossum9bfef441993-03-29 10:43:31 +0000604static long
605instance_hash(inst)
606 instanceobject *inst;
607{
608 object *func;
609 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000610 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000611 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000612
Guido van Rossum2878a691996-08-09 20:53:24 +0000613 if (hashstr == NULL)
614 hashstr = newstringobject("__hash__");
615 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000616 if (func == NULL) {
617 /* If there is no __cmp__ method, we hash on the address.
618 If a __cmp__ method exists, there must be a __hash__. */
619 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000620 if (cmpstr == NULL)
621 cmpstr = newstringobject("__cmp__");
622 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000623 if (func == NULL) {
624 err_clear();
625 outcome = (long)inst;
626 if (outcome == -1)
627 outcome = -2;
628 return outcome;
629 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630 err_setstr(TypeError, "unhashable instance");
631 return -1;
632 }
633 res = call_object(func, (object *)NULL);
634 DECREF(func);
635 if (res == NULL)
636 return -1;
637 if (is_intobject(res)) {
638 outcome = getintvalue(res);
639 if (outcome == -1)
640 outcome = -2;
641 }
642 else {
643 err_setstr(TypeError, "__hash__() should return an int");
644 outcome = -1;
645 }
646 DECREF(res);
647 return outcome;
648}
649
Guido van Rossum2878a691996-08-09 20:53:24 +0000650static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
651
Guido van Rossum9bfef441993-03-29 10:43:31 +0000652static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000653instance_length(inst)
654 instanceobject *inst;
655{
656 object *func;
657 object *res;
658 int outcome;
659
Guido van Rossum2878a691996-08-09 20:53:24 +0000660 if (lenstr == NULL)
661 lenstr = newstringobject("__len__");
662 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000663 if (func == NULL)
664 return -1;
665 res = call_object(func, (object *)NULL);
666 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000667 if (res == NULL)
668 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000669 if (is_intobject(res)) {
670 outcome = getintvalue(res);
671 if (outcome < 0)
672 err_setstr(ValueError, "__len__() should return >= 0");
673 }
674 else {
675 err_setstr(TypeError, "__len__() should return an int");
676 outcome = -1;
677 }
678 DECREF(res);
679 return outcome;
680}
681
Guido van Rossum9bfef441993-03-29 10:43:31 +0000682static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000683instance_subscript(inst, key)
684 instanceobject *inst;
685 object *key;
686{
687 object *func;
688 object *arg;
689 object *res;
690
Guido van Rossum2878a691996-08-09 20:53:24 +0000691 if (getitemstr == NULL)
692 getitemstr = newstringobject("__getitem__");
693 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000694 if (func == NULL)
695 return NULL;
696 arg = mkvalue("(O)", key);
697 if (arg == NULL) {
698 DECREF(func);
699 return NULL;
700 }
701 res = call_object(func, arg);
702 DECREF(func);
703 DECREF(arg);
704 return res;
705}
706
Guido van Rossum9bfef441993-03-29 10:43:31 +0000707static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000708instance_ass_subscript(inst, key, value)
709 instanceobject*inst;
710 object *key;
711 object *value;
712{
713 object *func;
714 object *arg;
715 object *res;
716
Guido van Rossum2878a691996-08-09 20:53:24 +0000717 if (value == NULL) {
718 if (delitemstr == NULL)
719 delitemstr = newstringobject("__delitem__");
720 func = instance_getattr(inst, delitemstr);
721 }
722 else {
723 if (setitemstr == NULL)
724 setitemstr = newstringobject("__setitem__");
725 func = instance_getattr(inst, setitemstr);
726 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000727 if (func == NULL)
728 return -1;
729 if (value == NULL)
730 arg = mkvalue("(O)", key);
731 else
732 arg = mkvalue("(OO)", key, value);
733 if (arg == NULL) {
734 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000735 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000736 }
737 res = call_object(func, arg);
738 DECREF(func);
739 DECREF(arg);
740 if (res == NULL)
741 return -1;
742 DECREF(res);
743 return 0;
744}
745
Guido van Rossum9bfef441993-03-29 10:43:31 +0000746static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000747 (inquiry)instance_length, /*mp_length*/
748 (binaryfunc)instance_subscript, /*mp_subscript*/
749 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000750};
751
752static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000753instance_item(inst, i)
754 instanceobject *inst;
755 int i;
756{
757 object *func, *arg, *res;
758
Guido van Rossum2878a691996-08-09 20:53:24 +0000759 if (getitemstr == NULL)
760 getitemstr = newstringobject("__getitem__");
761 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000762 if (func == NULL)
763 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000764 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000765 if (arg == NULL) {
766 DECREF(func);
767 return NULL;
768 }
769 res = call_object(func, arg);
770 DECREF(func);
771 DECREF(arg);
772 return res;
773}
774
775static object *
776instance_slice(inst, i, j)
777 instanceobject *inst;
778 int i, j;
779{
780 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000781 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782
Guido van Rossum2878a691996-08-09 20:53:24 +0000783 if (getslicestr == NULL)
784 getslicestr = newstringobject("__getslice__");
785 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000786 if (func == NULL)
787 return NULL;
788 arg = mkvalue("(ii)", i, j);
789 if (arg == NULL) {
790 DECREF(func);
791 return NULL;
792 }
793 res = call_object(func, arg);
794 DECREF(func);
795 DECREF(arg);
796 return res;
797}
798
799static int
800instance_ass_item(inst, i, item)
801 instanceobject *inst;
802 int i;
803 object *item;
804{
805 object *func, *arg, *res;
806
Guido van Rossum2878a691996-08-09 20:53:24 +0000807 if (item == NULL) {
808 if (delitemstr == NULL)
809 delitemstr = newstringobject("__delitem__");
810 func = instance_getattr(inst, delitemstr);
811 }
812 else {
813 if (setitemstr == NULL)
814 setitemstr = newstringobject("__setitem__");
815 func = instance_getattr(inst, setitemstr);
816 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000817 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000818 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000819 if (item == NULL)
820 arg = mkvalue("i", i);
821 else
822 arg = mkvalue("(iO)", i, item);
823 if (arg == NULL) {
824 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000825 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826 }
827 res = call_object(func, arg);
828 DECREF(func);
829 DECREF(arg);
830 if (res == NULL)
831 return -1;
832 DECREF(res);
833 return 0;
834}
835
836static int
837instance_ass_slice(inst, i, j, value)
838 instanceobject *inst;
839 int i, j;
840 object *value;
841{
842 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000843 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000844
Guido van Rossum2878a691996-08-09 20:53:24 +0000845 if (value == NULL) {
846 if (delslicestr == NULL)
847 delslicestr = newstringobject("__delslice__");
848 func = instance_getattr(inst, delslicestr);
849 }
850 else {
851 if (setslicestr == NULL)
852 setslicestr = newstringobject("__setslice__");
853 func = instance_getattr(inst, setslicestr);
854 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000856 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000857 if (value == NULL)
858 arg = mkvalue("(ii)", i, j);
859 else
860 arg = mkvalue("(iiO)", i, j, value);
861 if (arg == NULL) {
862 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000863 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000864 }
865 res = call_object(func, arg);
866 DECREF(func);
867 DECREF(arg);
868 if (res == NULL)
869 return -1;
870 DECREF(res);
871 return 0;
872}
873
874static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000875 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000876 0, /*sq_concat*/
877 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000878 (intargfunc)instance_item, /*sq_item*/
879 (intintargfunc)instance_slice, /*sq_slice*/
880 (intobjargproc)instance_ass_item, /*sq_ass_item*/
881 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000882};
883
884static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885generic_unary_op(self, methodname)
886 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000887 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888{
889 object *func, *res;
890
891 if ((func = instance_getattr(self, methodname)) == NULL)
892 return NULL;
893 res = call_object(func, (object *)NULL);
894 DECREF(func);
895 return res;
896}
897
Guido van Rossum03093a21994-09-28 15:51:32 +0000898
899/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000900static int halfbinop Py_PROTO((object *, object *, char *, object **,
901 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000902
903
904/* Implement a binary operator involving at least one class instance. */
905
906object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000907instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000908 object *v;
909 object *w;
910 char *opname;
911 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000912 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000913{
914 char buf[256];
915 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000916 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000917 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000918 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000919 return result;
920 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
921 err_setstr(TypeError, buf);
922 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923}
924
Guido van Rossum03093a21994-09-28 15:51:32 +0000925
926/* Try one half of a binary operator involving a class instance.
927 Return value:
928 -1 if an exception is to be reported right away
929 0 if we have a valid result
930 1 if we could try another operation
931*/
932
Guido van Rossum2878a691996-08-09 20:53:24 +0000933static object *coerce_obj;
934
Guido van Rossum03093a21994-09-28 15:51:32 +0000935static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000936halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000937 object *v;
938 object *w;
939 char *opname;
940 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000941 object * (*thisfunc) PROTO((object *, object *));
942 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000943{
944 object *func;
945 object *args;
946 object *coerce;
947 object *coerced = NULL;
948 object *v1;
949
950 if (!is_instanceobject(v))
951 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000952 if (coerce_obj == NULL) {
953 coerce_obj = newstringobject("__coerce__");
954 if (coerce_obj == NULL)
955 return -1;
956 }
957 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +0000958 if (coerce == NULL) {
959 err_clear();
960 }
961 else {
962 args = mkvalue("(O)", w);
963 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000964 return -1;
965 }
966 coerced = call_object(coerce, args);
967 DECREF(args);
968 DECREF(coerce);
969 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000970 return -1;
971 }
972 if (coerced == None) {
973 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000974 return 1;
975 }
976 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
977 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000978 err_setstr(TypeError,
979 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000980 return -1;
981 }
982 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000983 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000984 if (v1 != v) {
985 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000986 if (!is_instanceobject(v) && !is_instanceobject(w)) {
987 if (swapped)
988 *r_result = (*thisfunc)(w, v);
989 else
990 *r_result = (*thisfunc)(v, w);
991 DECREF(coerced);
992 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000993 }
994 }
995 w = gettupleitem(coerced, 1);
996 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000997 func = getattr(v, opname);
998 if (func == NULL) {
999 XDECREF(coerced);
1000 if (err_occurred() != AttributeError)
1001 return -1;
1002 err_clear();
1003 return 1;
1004 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001005 args = mkvalue("(O)", w);
1006 if (args == NULL) {
1007 DECREF(func);
1008 XDECREF(coerced);
1009 return -1;
1010 }
1011 *r_result = call_object(func, args);
1012 DECREF(args);
1013 DECREF(func);
1014 XDECREF(coerced);
1015 return *r_result == NULL ? -1 : 0;
1016}
1017
Guido van Rossum879c5811995-01-10 15:24:06 +00001018static int
1019instance_coerce(pv, pw)
1020 object **pv;
1021 object **pw;
1022{
1023 object *v = *pv;
1024 object *w = *pw;
1025 object *coerce;
1026 object *args;
1027 object *coerced;
1028
Guido van Rossum2878a691996-08-09 20:53:24 +00001029 if (coerce_obj == NULL) {
1030 coerce_obj = newstringobject("__coerce__");
1031 if (coerce_obj == NULL)
1032 return -1;
1033 }
1034 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001035 if (coerce == NULL) {
1036 /* No __coerce__ method: always OK */
1037 err_clear();
1038 INCREF(v);
1039 INCREF(w);
1040 return 0;
1041 }
1042 /* Has __coerce__ method: call it */
1043 args = mkvalue("(O)", w);
1044 if (args == NULL) {
1045 return -1;
1046 }
1047 coerced = call_object(coerce, args);
1048 DECREF(args);
1049 DECREF(coerce);
1050 if (coerced == NULL) {
1051 /* __coerce__ call raised an exception */
1052 return -1;
1053 }
1054 if (coerced == None) {
1055 /* __coerce__ says "I can't do it" */
1056 DECREF(coerced);
1057 return 1;
1058 }
1059 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1060 /* __coerce__ return value is malformed */
1061 DECREF(coerced);
1062 err_setstr(TypeError,
1063 "coercion should return None or 2-tuple");
1064 return -1;
1065 }
1066 /* __coerce__ returned two new values */
1067 *pv = gettupleitem(coerced, 0);
1068 *pw = gettupleitem(coerced, 1);
1069 INCREF(*pv);
1070 INCREF(*pw);
1071 DECREF(coerced);
1072 return 0;
1073}
1074
Guido van Rossum03093a21994-09-28 15:51:32 +00001075
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076#define UNARY(funcname, methodname) \
1077static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001078 static object *o; \
1079 if (o == NULL) o = newstringobject(methodname); \
1080 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001081}
1082
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083UNARY(instance_neg, "__neg__")
1084UNARY(instance_pos, "__pos__")
1085UNARY(instance_abs, "__abs__")
1086
Guido van Rossum9bfef441993-03-29 10:43:31 +00001087static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001088instance_nonzero(self)
1089 instanceobject *self;
1090{
1091 object *func, *res;
1092 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001093 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001094
Guido van Rossum2878a691996-08-09 20:53:24 +00001095 if (nonzerostr == NULL)
1096 nonzerostr = newstringobject("__nonzero__");
1097 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001099 if (lenstr == NULL)
1100 lenstr = newstringobject("__len__");
1101 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001102 err_clear();
1103 /* Fall back to the default behavior:
1104 all instances are nonzero */
1105 return 1;
1106 }
1107 }
1108 res = call_object(func, (object *)NULL);
1109 DECREF(func);
1110 if (res == NULL)
1111 return -1;
1112 if (!is_intobject(res)) {
1113 DECREF(res);
1114 err_setstr(TypeError, "__nonzero__ should return an int");
1115 return -1;
1116 }
1117 outcome = getintvalue(res);
1118 DECREF(res);
1119 if (outcome < 0) {
1120 err_setstr(ValueError, "__nonzero__ should return >= 0");
1121 return -1;
1122 }
1123 return outcome > 0;
1124}
1125
1126UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001127UNARY(instance_int, "__int__")
1128UNARY(instance_long, "__long__")
1129UNARY(instance_float, "__float__")
1130UNARY(instance_oct, "__oct__")
1131UNARY(instance_hex, "__hex__")
1132
Guido van Rossum03093a21994-09-28 15:51:32 +00001133/* This version is for ternary calls only (z != None) */
1134static object *
1135instance_pow(v, w, z)
1136 object *v;
1137 object *w;
1138 object *z;
1139{
1140 /* XXX Doesn't do coercions... */
1141 object *func;
1142 object *args;
1143 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001144 static object *powstr;
1145
1146 if (powstr == NULL)
1147 powstr = newstringobject("__pow__");
1148 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001149 if (func == NULL)
1150 return NULL;
1151 args = mkvalue("(OO)", w, z);
1152 if (args == NULL) {
1153 DECREF(func);
1154 return NULL;
1155 }
1156 result = call_object(func, args);
1157 DECREF(func);
1158 DECREF(args);
1159 return result;
1160}
1161
Guido van Rossum04691fc1992-08-12 15:35:34 +00001162static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001163 0, /*nb_add*/
1164 0, /*nb_subtract*/
1165 0, /*nb_multiply*/
1166 0, /*nb_divide*/
1167 0, /*nb_remainder*/
1168 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001169 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001170 (unaryfunc)instance_neg, /*nb_negative*/
1171 (unaryfunc)instance_pos, /*nb_positive*/
1172 (unaryfunc)instance_abs, /*nb_absolute*/
1173 (inquiry)instance_nonzero, /*nb_nonzero*/
1174 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001175 0, /*nb_lshift*/
1176 0, /*nb_rshift*/
1177 0, /*nb_and*/
1178 0, /*nb_xor*/
1179 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001180 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001181 (unaryfunc)instance_int, /*nb_int*/
1182 (unaryfunc)instance_long, /*nb_long*/
1183 (unaryfunc)instance_float, /*nb_float*/
1184 (unaryfunc)instance_oct, /*nb_oct*/
1185 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186};
1187
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001188typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001189 OB_HEAD_INIT(&Typetype)
1190 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001191 "instance",
1192 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001194 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001195 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001196 0, /*tp_getattr*/
1197 0, /*tp_setattr*/
1198 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001199 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001200 &instance_as_number, /*tp_as_number*/
1201 &instance_as_sequence, /*tp_as_sequence*/
1202 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001203 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001204 0, /*tp_call*/
1205 0, /*tp_str*/
1206 (getattrofunc)instance_getattr, /*tp_getattro*/
1207 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001208};
1209
1210
Guido van Rossum81daa321993-05-20 14:24:46 +00001211/* Instance method objects are used for two purposes:
1212 (a) as bound instance methods (returned by instancename.methodname)
1213 (b) as unbound methods (returned by ClassName.methodname)
1214 In case (b), im_self is NULL
1215*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001216
1217typedef struct {
1218 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001219 object *im_func; /* The function implementing the method */
1220 object *im_self; /* The instance it is bound to, or NULL */
1221 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001222} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001223
1224object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001225newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001226 object *func;
1227 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001228 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001229{
Guido van Rossume8122f11991-05-05 20:03:07 +00001230 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001231 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001232 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001233 return NULL;
1234 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001235 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1236 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001237 return NULL;
1238 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001239 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001240 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001241 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001242 INCREF(class);
1243 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001244 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001245}
1246
1247object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001248instancemethodgetfunc(im)
1249 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001250{
Guido van Rossume8122f11991-05-05 20:03:07 +00001251 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001252 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001253 return NULL;
1254 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001255 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001256}
1257
1258object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001259instancemethodgetself(im)
1260 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001261{
Guido van Rossume8122f11991-05-05 20:03:07 +00001262 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001263 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001264 return NULL;
1265 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001266 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001267}
1268
Guido van Rossum81daa321993-05-20 14:24:46 +00001269object *
1270instancemethodgetclass(im)
1271 register object *im;
1272{
1273 if (!is_instancemethodobject(im)) {
1274 err_badcall();
1275 return NULL;
1276 }
1277 return ((instancemethodobject *)im)->im_class;
1278}
1279
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001280/* Class method methods */
1281
Guido van Rossume8122f11991-05-05 20:03:07 +00001282#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001283
Guido van Rossume8122f11991-05-05 20:03:07 +00001284static struct memberlist instancemethod_memberlist[] = {
1285 {"im_func", T_OBJECT, OFF(im_func)},
1286 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001287 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001288 /* Dummies that are not handled by getattr() except for __members__ */
1289 {"__doc__", T_INT, 0},
1290 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001291 {NULL} /* Sentinel */
1292};
1293
1294static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001295instancemethod_getattr(im, name)
1296 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001297 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001298{
Guido van Rossum2878a691996-08-09 20:53:24 +00001299 char *sname = getstringvalue(name);
1300 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001301 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001302 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001303 INCREF(func->func_name);
1304 return func->func_name;
1305 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001306 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001307 INCREF(func->func_doc);
1308 return func->func_doc;
1309 }
1310 }
1311 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001312 err_setstr(RuntimeError,
1313 "instance-method attributes not accessible in restricted mode");
1314 return NULL;
1315 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001316 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001317}
1318
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001319static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001320instancemethod_dealloc(im)
1321 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001322{
Guido van Rossume8122f11991-05-05 20:03:07 +00001323 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001324 XDECREF(im->im_self);
1325 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001326 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001327}
1328
Guido van Rossumebc8c511992-09-03 20:39:51 +00001329static int
1330instancemethod_compare(a, b)
1331 instancemethodobject *a, *b;
1332{
Guido van Rossume9df7271995-04-06 14:46:51 +00001333 if (a->im_self != b->im_self)
1334 return (a->im_self < b->im_self) ? -1 : 1;
1335 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001336}
1337
Guido van Rossum25831651993-05-19 14:50:45 +00001338static object *
1339instancemethod_repr(a)
1340 instancemethodobject *a;
1341{
1342 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001343 instanceobject *self = (instanceobject *)(a->im_self);
1344 funcobject *func = (funcobject *)(a->im_func);
1345 classobject *class = (classobject *)(a->im_class);
1346 object *fclassname, *iclassname, *funcname;
1347 char *fcname, *icname, *fname;
1348 fclassname = class->cl_name;
1349 funcname = func->func_name;
1350 if (fclassname != NULL && is_stringobject(fclassname))
1351 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001352 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001353 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001354 if (funcname != NULL && is_stringobject(funcname))
1355 fname = getstringvalue(funcname);
1356 else
1357 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001358 if (self == NULL)
1359 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1360 else {
1361 iclassname = self->in_class->cl_name;
1362 if (iclassname != NULL && is_stringobject(iclassname))
1363 icname = getstringvalue(iclassname);
1364 else
1365 icname = "?";
1366 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1367 fcname, fname, icname, (long)self);
1368 }
Guido van Rossum25831651993-05-19 14:50:45 +00001369 return newstringobject(buf);
1370}
1371
Guido van Rossum9bfef441993-03-29 10:43:31 +00001372static long
1373instancemethod_hash(a)
1374 instancemethodobject *a;
1375{
1376 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001377 if (a->im_self == NULL)
1378 x = hashobject(None);
1379 else
1380 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001381 if (x == -1)
1382 return -1;
1383 y = hashobject(a->im_func);
1384 if (y == -1)
1385 return -1;
1386 return x ^ y;
1387}
1388
Guido van Rossume8122f11991-05-05 20:03:07 +00001389typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001390 OB_HEAD_INIT(&Typetype)
1391 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001392 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001393 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001394 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001395 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001396 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001397 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001398 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001399 (cmpfunc)instancemethod_compare, /*tp_compare*/
1400 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001401 0, /*tp_as_number*/
1402 0, /*tp_as_sequence*/
1403 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001404 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001405 0, /*tp_call*/
1406 0, /*tp_str*/
1407 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1408 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001409};