blob: 0ae6a61fc47fcab71a5f1dfa341bab6747afe03e [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
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Class object implementation */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "allobjects.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000036
Guido van Rossum52ca98a1994-09-05 07:32:29 +000037/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +000038static object *class_lookup PROTO((classobject *, object *, classobject **));
39static object *instance_getattr1 PROTO((instanceobject *, object *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000040
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041object *
Guido van Rossum81daa321993-05-20 14:24:46 +000042newclassobject(bases, dict, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 object *bases; /* NULL or tuple of classobjects! */
Guido van Rossum81daa321993-05-20 14:24:46 +000044 object *dict;
Guido van Rossum94308391991-10-20 20:11:48 +000045 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046{
Guido van Rossum0dfcf751996-08-12 22:00:53 +000047#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000048 int pos;
49 object *key, *value;
Guido van Rossum0dfcf751996-08-12 22:00:53 +000050#endif
Guido van Rossum52ca98a1994-09-05 07:32:29 +000051 classobject *op, *dummy;
Guido van Rossum2878a691996-08-09 20:53:24 +000052 static object *getattrstr, *setattrstr, *delattrstr;
Guido van Rossum019f4241996-08-21 14:54:28 +000053 static object *docstr;
54 if (docstr == NULL) {
55 docstr= newstringobject("__doc__");
56 if (docstr == NULL)
57 return NULL;
58 }
59 if (mappinglookup(dict, docstr) == NULL) {
60 if (mappinginsert(dict, docstr, None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000061 return NULL;
62 }
Guido van Rossume2966a61991-12-10 13:53:23 +000063 if (bases == NULL) {
64 bases = newtupleobject(0);
65 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000066 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000067 }
68 else
69 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000071 if (op == NULL) {
72 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000074 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000076 INCREF(dict);
77 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000078 XINCREF(name);
79 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000080 if (getattrstr == NULL) {
81 getattrstr = newstringobject("__getattr__");
82 setattrstr = newstringobject("__setattr__");
83 delattrstr = newstringobject("__delattr__");
84 }
85 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
86 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
87 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000088 XINCREF(op->cl_getattr);
89 XINCREF(op->cl_setattr);
90 XINCREF(op->cl_delattr);
Guido van Rossum0dfcf751996-08-12 22:00:53 +000091#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000092 pos = 0;
93 while (mappinggetnext(dict, &pos, &key, &value)) {
94 if (is_accessobject(value))
95 setaccessowner(value, (object *)op);
96 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +000097#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098 return (object *) op;
99}
100
101/* Class methods */
102
103static void
104class_dealloc(op)
105 classobject *op;
106{
Guido van Rossume2966a61991-12-10 13:53:23 +0000107 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000108 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +0000109 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110 free((ANY *)op);
111}
112
113static object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000114class_lookup(cp, name, pclass)
115 classobject *cp;
Guido van Rossum2878a691996-08-09 20:53:24 +0000116 object *name;
Guido van Rossum81daa321993-05-20 14:24:46 +0000117 classobject **pclass;
118{
119 int i, n;
Guido van Rossum2878a691996-08-09 20:53:24 +0000120 object *value = mappinglookup(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000121 if (value != NULL) {
122 *pclass = cp;
123 return value;
124 }
125 n = gettuplesize(cp->cl_bases);
126 for (i = 0; i < n; i++) {
127 object *v = class_lookup((classobject *)
128 gettupleitem(cp->cl_bases, i), name, pclass);
129 if (v != NULL)
130 return v;
131 }
132 return NULL;
133}
134
135static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136class_getattr(op, name)
137 register classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000138 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139{
140 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000141 register char *sname = getstringvalue(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000142 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000143 if (sname[0] == '_' && sname[1] == '_') {
144 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000145 if (getrestricted()) {
146 err_setstr(RuntimeError,
147 "class.__dict__ not accessible in restricted mode");
148 return NULL;
149 }
150 INCREF(op->cl_dict);
151 return op->cl_dict;
152 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000153 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000154 INCREF(op->cl_bases);
155 return op->cl_bases;
156 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000157 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000158 if (op->cl_name == NULL)
159 v = None;
160 else
161 v = op->cl_name;
162 INCREF(v);
163 return v;
164 }
Guido van Rossum94308391991-10-20 20:11:48 +0000165 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000166 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000167 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000168 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000169 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000171#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000172 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000173 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000174 if (v == NULL)
175 return NULL;
176 }
177 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000178#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000179 INCREF(v);
180 if (is_funcobject(v)) {
181 object *w = newinstancemethodobject(v, (object *)NULL,
182 (object *)class);
183 DECREF(v);
184 v = w;
185 }
186 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187}
188
Guido van Rossum94308391991-10-20 20:11:48 +0000189static int
190class_setattr(op, name, v)
191 classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000192 object *name;
Guido van Rossum94308391991-10-20 20:11:48 +0000193 object *v;
194{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000195#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000196 object *ac;
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000197#endif
Guido van Rossum2878a691996-08-09 20:53:24 +0000198 char *sname = getstringvalue(name);
199 if (sname[0] == '_' && sname[1] == '_') {
200 int n = getstringsize(name);
201 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000202 err_setstr(TypeError, "read-only special attribute");
203 return -1;
204 }
205 }
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000206 if (getrestricted()) {
207 err_setstr(RuntimeError,
208 "classes are read-only in restricted mode");
209 return -1;
210 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000211#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum2878a691996-08-09 20:53:24 +0000212 ac = mappinglookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000213 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000214 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000215#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000216 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000217 int rv = mappingremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000218 if (rv < 0)
219 err_setstr(AttributeError,
220 "delete non-existing class attribute");
221 return rv;
222 }
Guido van Rossum94308391991-10-20 20:11:48 +0000223 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000224 return mappinginsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000225}
226
Guido van Rossum25831651993-05-19 14:50:45 +0000227static object *
228class_repr(op)
229 classobject *op;
230{
231 char buf[140];
232 char *name;
233 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
234 name = "?";
235 else
236 name = getstringvalue(op->cl_name);
237 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
238 return newstringobject(buf);
239}
240
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241typeobject Classtype = {
242 OB_HEAD_INIT(&Typetype)
243 0,
244 "class",
245 sizeof(classobject),
246 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000247 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000249 0, /*tp_getattr*/
250 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253 0, /*tp_as_number*/
254 0, /*tp_as_sequence*/
255 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000256 0, /*tp_hash*/
257 0, /*tp_call*/
258 0, /*tp_str*/
259 (getattrofunc)class_getattr, /*tp_getattro*/
260 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261};
262
Guido van Rossum81daa321993-05-20 14:24:46 +0000263int
264issubclass(class, base)
265 object *class;
266 object *base;
267{
268 int i, n;
269 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000270 if (class == base)
271 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000272 if (class == NULL || !is_classobject(class))
273 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000274 cp = (classobject *)class;
275 n = gettuplesize(cp->cl_bases);
276 for (i = 0; i < n; i++) {
277 if (issubclass(gettupleitem(cp->cl_bases, i), base))
278 return 1;
279 }
280 return 0;
281}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282
Guido van Rossum81daa321993-05-20 14:24:46 +0000283
284/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000286#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +0000287static int
288addaccess(class, inst)
289 classobject *class;
290 instanceobject *inst;
291{
292 int i, n, pos, ret;
293 object *key, *value, *ac;
294
295 n = gettuplesize(class->cl_bases);
296 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000297 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000298 return -1;
299 }
300
301 pos = 0;
302 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
303 if (!is_accessobject(value))
304 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000305 if (hasaccessvalue(value))
306 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000307 ac = dict2lookup(inst->in_dict, key);
308 if (ac != NULL && is_accessobject(ac)) {
309 err_setval(ConflictError, key);
310 return -1;
311 }
312 ac = cloneaccessobject(value);
313 if (ac == NULL)
314 return -1;
315 ret = dict2insert(inst->in_dict, key, ac);
316 DECREF(ac);
317 if (ret != 0)
318 return -1;
319 }
320 return 0;
321}
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000322#endif
Guido van Rossum81daa321993-05-20 14:24:46 +0000323
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324object *
Guido van Rossuma83f2701995-07-26 18:07:32 +0000325newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000326 object *class;
327 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000328 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329{
Guido van Rossume8122f11991-05-05 20:03:07 +0000330 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000331 object *init;
Guido van Rossum2878a691996-08-09 20:53:24 +0000332 static object *initstr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000334 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 return NULL;
336 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000337 inst = NEWOBJ(instanceobject, &Instancetype);
338 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 return NULL;
340 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000341 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000342 inst->in_dict = newdictobject();
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000343 if (inst->in_dict == NULL
344#ifdef SUPPORT_OBSOLETE_ACCESS
345 || addaccess((classobject *)class, inst) != 0
346#endif
347 ) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000348 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349 return NULL;
350 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000351 if (initstr == NULL)
352 initstr = newstringobject("__init__");
353 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000354 if (init == NULL) {
355 err_clear();
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000356 if ((arg != NULL && (!is_tupleobject(arg) ||
357 gettuplesize(arg) != 0))
358 || (kw != NULL && (!is_dictobject(kw) ||
359 getdictsize(kw) != 0))) {
Guido van Rossum25831651993-05-19 14:50:45 +0000360 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000361 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000362 DECREF(inst);
363 inst = NULL;
364 }
365 }
366 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000367 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000368 DECREF(init);
369 if (res == NULL) {
370 DECREF(inst);
371 inst = NULL;
372 }
373 else {
374 if (res != None) {
375 err_setstr(TypeError,
376 "__init__() should return None");
377 DECREF(inst);
378 inst = NULL;
379 }
380 DECREF(res);
381 }
382 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000383 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384}
385
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000386/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387
388static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000389instance_dealloc(inst)
390 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000392 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000393 object *del;
Guido van Rossum2878a691996-08-09 20:53:24 +0000394 static object *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000395 /* Call the __del__ method if it exists. First temporarily
396 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000397#ifdef Py_TRACE_REFS
398 /* much too complicated if Py_TRACE_REFS defined */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000399 extern long ref_total;
400 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000401 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000402 ref_total--; /* compensate for increment in NEWREF */
403#ifdef COUNT_ALLOCS
404 inst->ob_type->tp_alloc--; /* ditto */
405#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000406#else /* !Py_TRACE_REFS */
Guido van Rossum25831651993-05-19 14:50:45 +0000407 INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000408#endif /* !Py_TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000409 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000410 if (delstr == NULL)
411 delstr = newstringobject("__del__");
412 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000413 object *res = call_object(del, (object *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000414 if (res == NULL) {
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000415 object *f, *t, *v, *tb;
416 err_fetch(&t, &v, &tb);
417 f = sysget("stderr");
Guido van Rossumad899781996-08-22 23:15:42 +0000418 err_clear();
Guido van Rossum22a85e51996-09-11 22:51:57 +0000419 if (f != NULL) {
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000420 writestring("Exception ", f);
421 if (t) {
422 writeobject(t, f, Py_PRINT_RAW);
423 if (v && v != None) {
424 writestring(": ", f);
425 writeobject(v, f, 0);
426 }
427 }
428 writestring(" in ", f);
429 writeobject(del, f, 0);
430 writestring(" ignored\n", f);
431 err_clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000432 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000433 Py_XDECREF(t);
434 Py_XDECREF(v);
435 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000436 }
437 else
438 DECREF(res);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000439 DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000440 }
441 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000442 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000443 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000444 if (--inst->ob_refcnt > 0) {
445#ifdef COUNT_ALLOCS
446 inst->ob_type->tp_free--;
447#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000448 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000449 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000450#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000451#ifdef COUNT_ALLOCS
452 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
453#endif
454 UNREF(inst);
455 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000456#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000457 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000458 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000459 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460}
461
Guido van Rossume7737541994-09-05 07:31:41 +0000462static object *
463instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000464 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000465 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466{
Guido van Rossum94308391991-10-20 20:11:48 +0000467 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000468 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000469 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000470 if (sname[0] == '_' && sname[1] == '_') {
471 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000472 if (getrestricted()) {
473 err_setstr(RuntimeError,
474 "instance.__dict__ not accessible in restricted mode");
475 return NULL;
476 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000477 INCREF(inst->in_dict);
478 return inst->in_dict;
479 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000480 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000481 INCREF(inst->in_class);
482 return (object *)inst->in_class;
483 }
Guido van Rossum94308391991-10-20 20:11:48 +0000484 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000485 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000486 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000487 if (v == NULL) {
488 v = class_lookup(inst->in_class, name, &class);
489 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000490 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000491 return NULL;
492 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000494#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000495 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000496 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000497 if (v == NULL)
498 return NULL;
499 }
500 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000501#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000502 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000503 if (class != NULL) {
504 if (is_funcobject(v)) {
505 object *w = newinstancemethodobject(v, (object *)inst,
506 (object *)class);
507 DECREF(v);
508 v = w;
509 }
510 else if (is_instancemethodobject(v)) {
511 object *im_class = instancemethodgetclass(v);
512 /* Only if classes are compatible */
513 if (issubclass((object *)class, im_class)) {
514 object *im_func = instancemethodgetfunc(v);
515 object *w = newinstancemethodobject(im_func,
516 (object *)inst, im_class);
517 DECREF(v);
518 v = w;
519 }
520 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000521 }
522 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000523}
524
Guido van Rossume7737541994-09-05 07:31:41 +0000525static object *
526instance_getattr(inst, name)
527 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000528 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000529{
530 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000531 res = instance_getattr1(inst, name);
532 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
533 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000534 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000535 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000536 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000537 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000538 res = call_object(func, args);
539 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000540 }
541 return res;
542}
543
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544static int
Guido van Rossume7737541994-09-05 07:31:41 +0000545instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000546 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000547 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548 object *v;
549{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000550#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000551 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000552 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000553 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000554 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000555#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000556 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000557 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000558 if (rv < 0)
559 err_setstr(AttributeError,
560 "delete non-existing instance attribute");
561 return rv;
562 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000564 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565}
566
Guido van Rossume7737541994-09-05 07:31:41 +0000567static int
568instance_setattr(inst, name, v)
569 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000570 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000571 object *v;
572{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000573 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000574 char *sname = getstringvalue(name);
575 if (sname[0] == '_' && sname[1] == '_'
576 && (strcmp(sname, "__dict__") == 0 ||
577 strcmp(sname, "__class__") == 0)) {
Guido van Rossume5920bc1996-08-26 14:58:03 +0000578 int n = getstringsize(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000579 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000580 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000581 return -1;
582 }
Guido van Rossume7737541994-09-05 07:31:41 +0000583 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000584 if (v == NULL)
585 func = inst->in_class->cl_delattr;
586 else
587 func = inst->in_class->cl_setattr;
588 if (func == NULL)
589 return instance_setattr1(inst, name, v);
590 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000591 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000592 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000593 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000594 if (args == NULL)
595 return -1;
596 res = call_object(func, args);
597 DECREF(args);
598 if (res == NULL)
599 return -1;
600 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000601 return 0;
602}
603
Guido van Rossum9bfef441993-03-29 10:43:31 +0000604static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000605instance_repr(inst)
606 instanceobject *inst;
607{
608 object *func;
609 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000610 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000611
Guido van Rossum2878a691996-08-09 20:53:24 +0000612 if (reprstr == NULL)
613 reprstr = newstringobject("__repr__");
614 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000615 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000616 char buf[140];
617 object *classname = inst->in_class->cl_name;
618 char *cname;
619 if (classname != NULL && is_stringobject(classname))
620 cname = getstringvalue(classname);
621 else
622 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000623 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000624 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000625 return newstringobject(buf);
626 }
627 res = call_object(func, (object *)NULL);
628 DECREF(func);
629 return res;
630}
631
Guido van Rossume7d444f1995-01-07 12:35:18 +0000632static object *
633instance_compare1(inst, other)
634 object *inst, *other;
635{
636 return instancebinop(inst, other, "__cmp__", "__rcmp__",
637 instance_compare1);
638}
639
Guido van Rossum9bfef441993-03-29 10:43:31 +0000640static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000641instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000642 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000643{
Guido van Rossum03093a21994-09-28 15:51:32 +0000644 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000645 long outcome;
646 result = instance_compare1(inst, other);
647 if (result == NULL || !is_intobject(result)) {
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000648 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000649 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000650 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000651 outcome = getintvalue(result);
652 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000653 if (outcome < 0)
654 return -1;
655 else if (outcome > 0)
656 return 1;
657 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000658}
659
Guido van Rossum9bfef441993-03-29 10:43:31 +0000660static long
661instance_hash(inst)
662 instanceobject *inst;
663{
664 object *func;
665 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000666 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000667 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000668
Guido van Rossum2878a691996-08-09 20:53:24 +0000669 if (hashstr == NULL)
670 hashstr = newstringobject("__hash__");
671 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000672 if (func == NULL) {
673 /* If there is no __cmp__ method, we hash on the address.
674 If a __cmp__ method exists, there must be a __hash__. */
675 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000676 if (cmpstr == NULL)
677 cmpstr = newstringobject("__cmp__");
678 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000679 if (func == NULL) {
680 err_clear();
681 outcome = (long)inst;
682 if (outcome == -1)
683 outcome = -2;
684 return outcome;
685 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000686 err_setstr(TypeError, "unhashable instance");
687 return -1;
688 }
689 res = call_object(func, (object *)NULL);
690 DECREF(func);
691 if (res == NULL)
692 return -1;
693 if (is_intobject(res)) {
694 outcome = getintvalue(res);
695 if (outcome == -1)
696 outcome = -2;
697 }
698 else {
699 err_setstr(TypeError, "__hash__() should return an int");
700 outcome = -1;
701 }
702 DECREF(res);
703 return outcome;
704}
705
Guido van Rossum2878a691996-08-09 20:53:24 +0000706static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
707
Guido van Rossum9bfef441993-03-29 10:43:31 +0000708static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000709instance_length(inst)
710 instanceobject *inst;
711{
712 object *func;
713 object *res;
714 int outcome;
715
Guido van Rossum2878a691996-08-09 20:53:24 +0000716 if (lenstr == NULL)
717 lenstr = newstringobject("__len__");
718 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000719 if (func == NULL)
720 return -1;
721 res = call_object(func, (object *)NULL);
722 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000723 if (res == NULL)
724 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725 if (is_intobject(res)) {
726 outcome = getintvalue(res);
727 if (outcome < 0)
728 err_setstr(ValueError, "__len__() should return >= 0");
729 }
730 else {
731 err_setstr(TypeError, "__len__() should return an int");
732 outcome = -1;
733 }
734 DECREF(res);
735 return outcome;
736}
737
Guido van Rossum9bfef441993-03-29 10:43:31 +0000738static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000739instance_subscript(inst, key)
740 instanceobject *inst;
741 object *key;
742{
743 object *func;
744 object *arg;
745 object *res;
746
Guido van Rossum2878a691996-08-09 20:53:24 +0000747 if (getitemstr == NULL)
748 getitemstr = newstringobject("__getitem__");
749 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000750 if (func == NULL)
751 return NULL;
752 arg = mkvalue("(O)", key);
753 if (arg == NULL) {
754 DECREF(func);
755 return NULL;
756 }
757 res = call_object(func, arg);
758 DECREF(func);
759 DECREF(arg);
760 return res;
761}
762
Guido van Rossum9bfef441993-03-29 10:43:31 +0000763static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000764instance_ass_subscript(inst, key, value)
765 instanceobject*inst;
766 object *key;
767 object *value;
768{
769 object *func;
770 object *arg;
771 object *res;
772
Guido van Rossum2878a691996-08-09 20:53:24 +0000773 if (value == NULL) {
774 if (delitemstr == NULL)
775 delitemstr = newstringobject("__delitem__");
776 func = instance_getattr(inst, delitemstr);
777 }
778 else {
779 if (setitemstr == NULL)
780 setitemstr = newstringobject("__setitem__");
781 func = instance_getattr(inst, setitemstr);
782 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000783 if (func == NULL)
784 return -1;
785 if (value == NULL)
786 arg = mkvalue("(O)", key);
787 else
788 arg = mkvalue("(OO)", key, value);
789 if (arg == NULL) {
790 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000791 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000792 }
793 res = call_object(func, arg);
794 DECREF(func);
795 DECREF(arg);
796 if (res == NULL)
797 return -1;
798 DECREF(res);
799 return 0;
800}
801
Guido van Rossum9bfef441993-03-29 10:43:31 +0000802static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000803 (inquiry)instance_length, /*mp_length*/
804 (binaryfunc)instance_subscript, /*mp_subscript*/
805 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000806};
807
808static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809instance_item(inst, i)
810 instanceobject *inst;
811 int i;
812{
813 object *func, *arg, *res;
814
Guido van Rossum2878a691996-08-09 20:53:24 +0000815 if (getitemstr == NULL)
816 getitemstr = newstringobject("__getitem__");
817 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000818 if (func == NULL)
819 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000820 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000821 if (arg == NULL) {
822 DECREF(func);
823 return NULL;
824 }
825 res = call_object(func, arg);
826 DECREF(func);
827 DECREF(arg);
828 return res;
829}
830
831static object *
832instance_slice(inst, i, j)
833 instanceobject *inst;
834 int i, j;
835{
836 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000837 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000838
Guido van Rossum2878a691996-08-09 20:53:24 +0000839 if (getslicestr == NULL)
840 getslicestr = newstringobject("__getslice__");
841 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842 if (func == NULL)
843 return NULL;
844 arg = mkvalue("(ii)", i, j);
845 if (arg == NULL) {
846 DECREF(func);
847 return NULL;
848 }
849 res = call_object(func, arg);
850 DECREF(func);
851 DECREF(arg);
852 return res;
853}
854
855static int
856instance_ass_item(inst, i, item)
857 instanceobject *inst;
858 int i;
859 object *item;
860{
861 object *func, *arg, *res;
862
Guido van Rossum2878a691996-08-09 20:53:24 +0000863 if (item == NULL) {
864 if (delitemstr == NULL)
865 delitemstr = newstringobject("__delitem__");
866 func = instance_getattr(inst, delitemstr);
867 }
868 else {
869 if (setitemstr == NULL)
870 setitemstr = newstringobject("__setitem__");
871 func = instance_getattr(inst, setitemstr);
872 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000873 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000874 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875 if (item == NULL)
876 arg = mkvalue("i", i);
877 else
878 arg = mkvalue("(iO)", i, item);
879 if (arg == NULL) {
880 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000881 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000882 }
883 res = call_object(func, arg);
884 DECREF(func);
885 DECREF(arg);
886 if (res == NULL)
887 return -1;
888 DECREF(res);
889 return 0;
890}
891
892static int
893instance_ass_slice(inst, i, j, value)
894 instanceobject *inst;
895 int i, j;
896 object *value;
897{
898 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000899 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000900
Guido van Rossum2878a691996-08-09 20:53:24 +0000901 if (value == NULL) {
902 if (delslicestr == NULL)
903 delslicestr = newstringobject("__delslice__");
904 func = instance_getattr(inst, delslicestr);
905 }
906 else {
907 if (setslicestr == NULL)
908 setslicestr = newstringobject("__setslice__");
909 func = instance_getattr(inst, setslicestr);
910 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000911 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000912 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913 if (value == NULL)
914 arg = mkvalue("(ii)", i, j);
915 else
916 arg = mkvalue("(iiO)", i, j, value);
917 if (arg == NULL) {
918 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000919 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 }
921 res = call_object(func, arg);
922 DECREF(func);
923 DECREF(arg);
924 if (res == NULL)
925 return -1;
926 DECREF(res);
927 return 0;
928}
929
930static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000931 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000932 0, /*sq_concat*/
933 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000934 (intargfunc)instance_item, /*sq_item*/
935 (intintargfunc)instance_slice, /*sq_slice*/
936 (intobjargproc)instance_ass_item, /*sq_ass_item*/
937 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938};
939
940static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000941generic_unary_op(self, methodname)
942 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000943 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944{
945 object *func, *res;
946
947 if ((func = instance_getattr(self, methodname)) == NULL)
948 return NULL;
949 res = call_object(func, (object *)NULL);
950 DECREF(func);
951 return res;
952}
953
Guido van Rossum03093a21994-09-28 15:51:32 +0000954
955/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000956static int halfbinop Py_PROTO((object *, object *, char *, object **,
957 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000958
959
960/* Implement a binary operator involving at least one class instance. */
961
962object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000963instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000964 object *v;
965 object *w;
966 char *opname;
967 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000968 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000969{
970 char buf[256];
971 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000972 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000973 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000974 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000975 return result;
976 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
977 err_setstr(TypeError, buf);
978 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000979}
980
Guido van Rossum03093a21994-09-28 15:51:32 +0000981
982/* Try one half of a binary operator involving a class instance.
983 Return value:
984 -1 if an exception is to be reported right away
985 0 if we have a valid result
986 1 if we could try another operation
987*/
988
Guido van Rossum2878a691996-08-09 20:53:24 +0000989static object *coerce_obj;
990
Guido van Rossum03093a21994-09-28 15:51:32 +0000991static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000992halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000993 object *v;
994 object *w;
995 char *opname;
996 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000997 object * (*thisfunc) PROTO((object *, object *));
998 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000999{
1000 object *func;
1001 object *args;
1002 object *coerce;
1003 object *coerced = NULL;
1004 object *v1;
1005
1006 if (!is_instanceobject(v))
1007 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001008 if (coerce_obj == NULL) {
1009 coerce_obj = newstringobject("__coerce__");
1010 if (coerce_obj == NULL)
1011 return -1;
1012 }
1013 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +00001014 if (coerce == NULL) {
1015 err_clear();
1016 }
1017 else {
1018 args = mkvalue("(O)", w);
1019 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001020 return -1;
1021 }
1022 coerced = call_object(coerce, args);
1023 DECREF(args);
1024 DECREF(coerce);
1025 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001026 return -1;
1027 }
1028 if (coerced == None) {
1029 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001030 return 1;
1031 }
1032 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1033 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001034 err_setstr(TypeError,
1035 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001036 return -1;
1037 }
1038 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001039 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001040 if (v1 != v) {
1041 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001042 if (!is_instanceobject(v) && !is_instanceobject(w)) {
1043 if (swapped)
1044 *r_result = (*thisfunc)(w, v);
1045 else
1046 *r_result = (*thisfunc)(v, w);
1047 DECREF(coerced);
1048 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001049 }
1050 }
1051 w = gettupleitem(coerced, 1);
1052 }
Guido van Rossume7d444f1995-01-07 12:35:18 +00001053 func = getattr(v, opname);
1054 if (func == NULL) {
1055 XDECREF(coerced);
1056 if (err_occurred() != AttributeError)
1057 return -1;
1058 err_clear();
1059 return 1;
1060 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001061 args = mkvalue("(O)", w);
1062 if (args == NULL) {
1063 DECREF(func);
1064 XDECREF(coerced);
1065 return -1;
1066 }
1067 *r_result = call_object(func, args);
1068 DECREF(args);
1069 DECREF(func);
1070 XDECREF(coerced);
1071 return *r_result == NULL ? -1 : 0;
1072}
1073
Guido van Rossum879c5811995-01-10 15:24:06 +00001074static int
1075instance_coerce(pv, pw)
1076 object **pv;
1077 object **pw;
1078{
1079 object *v = *pv;
1080 object *w = *pw;
1081 object *coerce;
1082 object *args;
1083 object *coerced;
1084
Guido van Rossum2878a691996-08-09 20:53:24 +00001085 if (coerce_obj == NULL) {
1086 coerce_obj = newstringobject("__coerce__");
1087 if (coerce_obj == NULL)
1088 return -1;
1089 }
1090 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001091 if (coerce == NULL) {
1092 /* No __coerce__ method: always OK */
1093 err_clear();
1094 INCREF(v);
1095 INCREF(w);
1096 return 0;
1097 }
1098 /* Has __coerce__ method: call it */
1099 args = mkvalue("(O)", w);
1100 if (args == NULL) {
1101 return -1;
1102 }
1103 coerced = call_object(coerce, args);
1104 DECREF(args);
1105 DECREF(coerce);
1106 if (coerced == NULL) {
1107 /* __coerce__ call raised an exception */
1108 return -1;
1109 }
1110 if (coerced == None) {
1111 /* __coerce__ says "I can't do it" */
1112 DECREF(coerced);
1113 return 1;
1114 }
1115 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1116 /* __coerce__ return value is malformed */
1117 DECREF(coerced);
1118 err_setstr(TypeError,
1119 "coercion should return None or 2-tuple");
1120 return -1;
1121 }
1122 /* __coerce__ returned two new values */
1123 *pv = gettupleitem(coerced, 0);
1124 *pw = gettupleitem(coerced, 1);
1125 INCREF(*pv);
1126 INCREF(*pw);
1127 DECREF(coerced);
1128 return 0;
1129}
1130
Guido van Rossum03093a21994-09-28 15:51:32 +00001131
Guido van Rossum04691fc1992-08-12 15:35:34 +00001132#define UNARY(funcname, methodname) \
1133static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001134 static object *o; \
1135 if (o == NULL) o = newstringobject(methodname); \
1136 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137}
1138
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139UNARY(instance_neg, "__neg__")
1140UNARY(instance_pos, "__pos__")
1141UNARY(instance_abs, "__abs__")
1142
Guido van Rossum9bfef441993-03-29 10:43:31 +00001143static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001144instance_nonzero(self)
1145 instanceobject *self;
1146{
1147 object *func, *res;
1148 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001149 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001150
Guido van Rossum2878a691996-08-09 20:53:24 +00001151 if (nonzerostr == NULL)
1152 nonzerostr = newstringobject("__nonzero__");
1153 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001154 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001155 if (lenstr == NULL)
1156 lenstr = newstringobject("__len__");
1157 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001158 err_clear();
1159 /* Fall back to the default behavior:
1160 all instances are nonzero */
1161 return 1;
1162 }
1163 }
1164 res = call_object(func, (object *)NULL);
1165 DECREF(func);
1166 if (res == NULL)
1167 return -1;
1168 if (!is_intobject(res)) {
1169 DECREF(res);
1170 err_setstr(TypeError, "__nonzero__ should return an int");
1171 return -1;
1172 }
1173 outcome = getintvalue(res);
1174 DECREF(res);
1175 if (outcome < 0) {
1176 err_setstr(ValueError, "__nonzero__ should return >= 0");
1177 return -1;
1178 }
1179 return outcome > 0;
1180}
1181
1182UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001183UNARY(instance_int, "__int__")
1184UNARY(instance_long, "__long__")
1185UNARY(instance_float, "__float__")
1186UNARY(instance_oct, "__oct__")
1187UNARY(instance_hex, "__hex__")
1188
Guido van Rossum03093a21994-09-28 15:51:32 +00001189/* This version is for ternary calls only (z != None) */
1190static object *
1191instance_pow(v, w, z)
1192 object *v;
1193 object *w;
1194 object *z;
1195{
1196 /* XXX Doesn't do coercions... */
1197 object *func;
1198 object *args;
1199 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001200 static object *powstr;
1201
1202 if (powstr == NULL)
1203 powstr = newstringobject("__pow__");
1204 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001205 if (func == NULL)
1206 return NULL;
1207 args = mkvalue("(OO)", w, z);
1208 if (args == NULL) {
1209 DECREF(func);
1210 return NULL;
1211 }
1212 result = call_object(func, args);
1213 DECREF(func);
1214 DECREF(args);
1215 return result;
1216}
1217
Guido van Rossum04691fc1992-08-12 15:35:34 +00001218static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001219 0, /*nb_add*/
1220 0, /*nb_subtract*/
1221 0, /*nb_multiply*/
1222 0, /*nb_divide*/
1223 0, /*nb_remainder*/
1224 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001225 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001226 (unaryfunc)instance_neg, /*nb_negative*/
1227 (unaryfunc)instance_pos, /*nb_positive*/
1228 (unaryfunc)instance_abs, /*nb_absolute*/
1229 (inquiry)instance_nonzero, /*nb_nonzero*/
1230 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001231 0, /*nb_lshift*/
1232 0, /*nb_rshift*/
1233 0, /*nb_and*/
1234 0, /*nb_xor*/
1235 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001236 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001237 (unaryfunc)instance_int, /*nb_int*/
1238 (unaryfunc)instance_long, /*nb_long*/
1239 (unaryfunc)instance_float, /*nb_float*/
1240 (unaryfunc)instance_oct, /*nb_oct*/
1241 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001242};
1243
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001244typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001245 OB_HEAD_INIT(&Typetype)
1246 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001247 "instance",
1248 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001249 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001250 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001251 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001252 0, /*tp_getattr*/
1253 0, /*tp_setattr*/
1254 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001255 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001256 &instance_as_number, /*tp_as_number*/
1257 &instance_as_sequence, /*tp_as_sequence*/
1258 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001259 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001260 0, /*tp_call*/
1261 0, /*tp_str*/
1262 (getattrofunc)instance_getattr, /*tp_getattro*/
1263 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001264};
1265
1266
Guido van Rossum81daa321993-05-20 14:24:46 +00001267/* Instance method objects are used for two purposes:
1268 (a) as bound instance methods (returned by instancename.methodname)
1269 (b) as unbound methods (returned by ClassName.methodname)
1270 In case (b), im_self is NULL
1271*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001272
1273typedef struct {
1274 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001275 object *im_func; /* The function implementing the method */
1276 object *im_self; /* The instance it is bound to, or NULL */
1277 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001278} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001279
1280object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001281newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001282 object *func;
1283 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001284 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285{
Guido van Rossume8122f11991-05-05 20:03:07 +00001286 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001287 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001288 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001289 return NULL;
1290 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001291 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1292 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001293 return NULL;
1294 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001295 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001296 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001297 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001298 INCREF(class);
1299 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001300 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001301}
1302
1303object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001304instancemethodgetfunc(im)
1305 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001306{
Guido van Rossume8122f11991-05-05 20:03:07 +00001307 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001308 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001309 return NULL;
1310 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001311 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001312}
1313
1314object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001315instancemethodgetself(im)
1316 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001317{
Guido van Rossume8122f11991-05-05 20:03:07 +00001318 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001319 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001320 return NULL;
1321 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001322 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001323}
1324
Guido van Rossum81daa321993-05-20 14:24:46 +00001325object *
1326instancemethodgetclass(im)
1327 register object *im;
1328{
1329 if (!is_instancemethodobject(im)) {
1330 err_badcall();
1331 return NULL;
1332 }
1333 return ((instancemethodobject *)im)->im_class;
1334}
1335
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001336/* Class method methods */
1337
Guido van Rossume8122f11991-05-05 20:03:07 +00001338#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001339
Guido van Rossume8122f11991-05-05 20:03:07 +00001340static struct memberlist instancemethod_memberlist[] = {
1341 {"im_func", T_OBJECT, OFF(im_func)},
1342 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001343 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001344 /* Dummies that are not handled by getattr() except for __members__ */
1345 {"__doc__", T_INT, 0},
1346 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 {NULL} /* Sentinel */
1348};
1349
1350static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001351instancemethod_getattr(im, name)
1352 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001353 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001354{
Guido van Rossum2878a691996-08-09 20:53:24 +00001355 char *sname = getstringvalue(name);
1356 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001357 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001358 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001359 INCREF(func->func_name);
1360 return func->func_name;
1361 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001362 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001363 INCREF(func->func_doc);
1364 return func->func_doc;
1365 }
1366 }
1367 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001368 err_setstr(RuntimeError,
1369 "instance-method attributes not accessible in restricted mode");
1370 return NULL;
1371 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001372 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001373}
1374
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001375static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001376instancemethod_dealloc(im)
1377 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001378{
Guido van Rossume8122f11991-05-05 20:03:07 +00001379 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001380 XDECREF(im->im_self);
1381 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001382 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001383}
1384
Guido van Rossumebc8c511992-09-03 20:39:51 +00001385static int
1386instancemethod_compare(a, b)
1387 instancemethodobject *a, *b;
1388{
Guido van Rossume9df7271995-04-06 14:46:51 +00001389 if (a->im_self != b->im_self)
1390 return (a->im_self < b->im_self) ? -1 : 1;
1391 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001392}
1393
Guido van Rossum25831651993-05-19 14:50:45 +00001394static object *
1395instancemethod_repr(a)
1396 instancemethodobject *a;
1397{
1398 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001399 instanceobject *self = (instanceobject *)(a->im_self);
1400 funcobject *func = (funcobject *)(a->im_func);
1401 classobject *class = (classobject *)(a->im_class);
1402 object *fclassname, *iclassname, *funcname;
1403 char *fcname, *icname, *fname;
1404 fclassname = class->cl_name;
1405 funcname = func->func_name;
1406 if (fclassname != NULL && is_stringobject(fclassname))
1407 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001408 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001409 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001410 if (funcname != NULL && is_stringobject(funcname))
1411 fname = getstringvalue(funcname);
1412 else
1413 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001414 if (self == NULL)
1415 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1416 else {
1417 iclassname = self->in_class->cl_name;
1418 if (iclassname != NULL && is_stringobject(iclassname))
1419 icname = getstringvalue(iclassname);
1420 else
1421 icname = "?";
1422 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1423 fcname, fname, icname, (long)self);
1424 }
Guido van Rossum25831651993-05-19 14:50:45 +00001425 return newstringobject(buf);
1426}
1427
Guido van Rossum9bfef441993-03-29 10:43:31 +00001428static long
1429instancemethod_hash(a)
1430 instancemethodobject *a;
1431{
1432 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001433 if (a->im_self == NULL)
1434 x = hashobject(None);
1435 else
1436 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001437 if (x == -1)
1438 return -1;
1439 y = hashobject(a->im_func);
1440 if (y == -1)
1441 return -1;
1442 return x ^ y;
1443}
1444
Guido van Rossume8122f11991-05-05 20:03:07 +00001445typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001446 OB_HEAD_INIT(&Typetype)
1447 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001448 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001449 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001450 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001451 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001452 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001453 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001454 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001455 (cmpfunc)instancemethod_compare, /*tp_compare*/
1456 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001457 0, /*tp_as_number*/
1458 0, /*tp_as_sequence*/
1459 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001460 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001461 0, /*tp_call*/
1462 0, /*tp_str*/
1463 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1464 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001465};