blob: 551bdce68edfaa8498598a094a0a056c262de077 [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 Rossuma83f2701995-07-26 18:07:32 +0000356 if (arg != NULL && (!is_tupleobject(arg) ||
Guido van Rossum8bcf3691996-10-21 15:12:32 +0000357 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 Rossum25831651993-05-19 14:50:45 +0000414 DECREF(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000415 if (res == NULL) {
Guido van Rossumad899781996-08-22 23:15:42 +0000416 PyObject *f = sysget("stderr");
417 err_clear();
Guido van Rossum22a85e51996-09-11 22:51:57 +0000418 if (f != NULL) {
419 writestring("exception in ", f);
420 writestring(PyString_AsString(
421 inst->in_class->cl_name), f);
422 writestring(".__del__() ignored\n", f);
423 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000424 }
425 else
426 DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000427 }
428 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000429 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000430 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000431 if (--inst->ob_refcnt > 0) {
432#ifdef COUNT_ALLOCS
433 inst->ob_type->tp_free--;
434#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000435 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000436 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000437#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000438#ifdef COUNT_ALLOCS
439 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
440#endif
441 UNREF(inst);
442 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000443#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000444 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000445 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000446 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447}
448
Guido van Rossume7737541994-09-05 07:31:41 +0000449static object *
450instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000451 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000452 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453{
Guido van Rossum94308391991-10-20 20:11:48 +0000454 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000455 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000456 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000457 if (sname[0] == '_' && sname[1] == '_') {
458 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000459 if (getrestricted()) {
460 err_setstr(RuntimeError,
461 "instance.__dict__ not accessible in restricted mode");
462 return NULL;
463 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000464 INCREF(inst->in_dict);
465 return inst->in_dict;
466 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000467 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000468 INCREF(inst->in_class);
469 return (object *)inst->in_class;
470 }
Guido van Rossum94308391991-10-20 20:11:48 +0000471 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000472 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000473 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000474 if (v == NULL) {
475 v = class_lookup(inst->in_class, name, &class);
476 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000477 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000478 return NULL;
479 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000481#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000482 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000483 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000484 if (v == NULL)
485 return NULL;
486 }
487 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000488#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000489 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000490 if (class != NULL) {
491 if (is_funcobject(v)) {
492 object *w = newinstancemethodobject(v, (object *)inst,
493 (object *)class);
494 DECREF(v);
495 v = w;
496 }
497 else if (is_instancemethodobject(v)) {
498 object *im_class = instancemethodgetclass(v);
499 /* Only if classes are compatible */
500 if (issubclass((object *)class, im_class)) {
501 object *im_func = instancemethodgetfunc(v);
502 object *w = newinstancemethodobject(im_func,
503 (object *)inst, im_class);
504 DECREF(v);
505 v = w;
506 }
507 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000508 }
509 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000510}
511
Guido van Rossume7737541994-09-05 07:31:41 +0000512static object *
513instance_getattr(inst, name)
514 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000515 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000516{
517 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000518 res = instance_getattr1(inst, name);
519 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
520 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000521 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000522 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000523 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000524 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000525 res = call_object(func, args);
526 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000527 }
528 return res;
529}
530
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531static int
Guido van Rossume7737541994-09-05 07:31:41 +0000532instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000533 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000534 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000535 object *v;
536{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000537#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000538 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000539 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000540 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000541 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000542#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000543 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000544 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000545 if (rv < 0)
546 err_setstr(AttributeError,
547 "delete non-existing instance attribute");
548 return rv;
549 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000550 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000551 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552}
553
Guido van Rossume7737541994-09-05 07:31:41 +0000554static int
555instance_setattr(inst, name, v)
556 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000557 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000558 object *v;
559{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000560 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000561 char *sname = getstringvalue(name);
562 if (sname[0] == '_' && sname[1] == '_'
563 && (strcmp(sname, "__dict__") == 0 ||
564 strcmp(sname, "__class__") == 0)) {
Guido van Rossume5920bc1996-08-26 14:58:03 +0000565 int n = getstringsize(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000566 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000567 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000568 return -1;
569 }
Guido van Rossume7737541994-09-05 07:31:41 +0000570 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000571 if (v == NULL)
572 func = inst->in_class->cl_delattr;
573 else
574 func = inst->in_class->cl_setattr;
575 if (func == NULL)
576 return instance_setattr1(inst, name, v);
577 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000578 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000579 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000580 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000581 if (args == NULL)
582 return -1;
583 res = call_object(func, args);
584 DECREF(args);
585 if (res == NULL)
586 return -1;
587 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000588 return 0;
589}
590
Guido van Rossum9bfef441993-03-29 10:43:31 +0000591static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000592instance_repr(inst)
593 instanceobject *inst;
594{
595 object *func;
596 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000597 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000598
Guido van Rossum2878a691996-08-09 20:53:24 +0000599 if (reprstr == NULL)
600 reprstr = newstringobject("__repr__");
601 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000602 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000603 char buf[140];
604 object *classname = inst->in_class->cl_name;
605 char *cname;
606 if (classname != NULL && is_stringobject(classname))
607 cname = getstringvalue(classname);
608 else
609 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000610 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000611 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000612 return newstringobject(buf);
613 }
614 res = call_object(func, (object *)NULL);
615 DECREF(func);
616 return res;
617}
618
Guido van Rossume7d444f1995-01-07 12:35:18 +0000619static object *
620instance_compare1(inst, other)
621 object *inst, *other;
622{
623 return instancebinop(inst, other, "__cmp__", "__rcmp__",
624 instance_compare1);
625}
626
Guido van Rossum9bfef441993-03-29 10:43:31 +0000627static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000628instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000629 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000630{
Guido van Rossum03093a21994-09-28 15:51:32 +0000631 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000632 long outcome;
633 result = instance_compare1(inst, other);
634 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000635 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000636 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000637 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000638 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000639 outcome = getintvalue(result);
640 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000641 if (outcome < 0)
642 return -1;
643 else if (outcome > 0)
644 return 1;
645 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000646}
647
Guido van Rossum9bfef441993-03-29 10:43:31 +0000648static long
649instance_hash(inst)
650 instanceobject *inst;
651{
652 object *func;
653 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000654 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000655 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000656
Guido van Rossum2878a691996-08-09 20:53:24 +0000657 if (hashstr == NULL)
658 hashstr = newstringobject("__hash__");
659 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000660 if (func == NULL) {
661 /* If there is no __cmp__ method, we hash on the address.
662 If a __cmp__ method exists, there must be a __hash__. */
663 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000664 if (cmpstr == NULL)
665 cmpstr = newstringobject("__cmp__");
666 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000667 if (func == NULL) {
668 err_clear();
669 outcome = (long)inst;
670 if (outcome == -1)
671 outcome = -2;
672 return outcome;
673 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000674 err_setstr(TypeError, "unhashable instance");
675 return -1;
676 }
677 res = call_object(func, (object *)NULL);
678 DECREF(func);
679 if (res == NULL)
680 return -1;
681 if (is_intobject(res)) {
682 outcome = getintvalue(res);
683 if (outcome == -1)
684 outcome = -2;
685 }
686 else {
687 err_setstr(TypeError, "__hash__() should return an int");
688 outcome = -1;
689 }
690 DECREF(res);
691 return outcome;
692}
693
Guido van Rossum2878a691996-08-09 20:53:24 +0000694static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
695
Guido van Rossum9bfef441993-03-29 10:43:31 +0000696static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000697instance_length(inst)
698 instanceobject *inst;
699{
700 object *func;
701 object *res;
702 int outcome;
703
Guido van Rossum2878a691996-08-09 20:53:24 +0000704 if (lenstr == NULL)
705 lenstr = newstringobject("__len__");
706 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000707 if (func == NULL)
708 return -1;
709 res = call_object(func, (object *)NULL);
710 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000711 if (res == NULL)
712 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000713 if (is_intobject(res)) {
714 outcome = getintvalue(res);
715 if (outcome < 0)
716 err_setstr(ValueError, "__len__() should return >= 0");
717 }
718 else {
719 err_setstr(TypeError, "__len__() should return an int");
720 outcome = -1;
721 }
722 DECREF(res);
723 return outcome;
724}
725
Guido van Rossum9bfef441993-03-29 10:43:31 +0000726static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000727instance_subscript(inst, key)
728 instanceobject *inst;
729 object *key;
730{
731 object *func;
732 object *arg;
733 object *res;
734
Guido van Rossum2878a691996-08-09 20:53:24 +0000735 if (getitemstr == NULL)
736 getitemstr = newstringobject("__getitem__");
737 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000738 if (func == NULL)
739 return NULL;
740 arg = mkvalue("(O)", key);
741 if (arg == NULL) {
742 DECREF(func);
743 return NULL;
744 }
745 res = call_object(func, arg);
746 DECREF(func);
747 DECREF(arg);
748 return res;
749}
750
Guido van Rossum9bfef441993-03-29 10:43:31 +0000751static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000752instance_ass_subscript(inst, key, value)
753 instanceobject*inst;
754 object *key;
755 object *value;
756{
757 object *func;
758 object *arg;
759 object *res;
760
Guido van Rossum2878a691996-08-09 20:53:24 +0000761 if (value == NULL) {
762 if (delitemstr == NULL)
763 delitemstr = newstringobject("__delitem__");
764 func = instance_getattr(inst, delitemstr);
765 }
766 else {
767 if (setitemstr == NULL)
768 setitemstr = newstringobject("__setitem__");
769 func = instance_getattr(inst, setitemstr);
770 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000771 if (func == NULL)
772 return -1;
773 if (value == NULL)
774 arg = mkvalue("(O)", key);
775 else
776 arg = mkvalue("(OO)", key, value);
777 if (arg == NULL) {
778 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000779 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000780 }
781 res = call_object(func, arg);
782 DECREF(func);
783 DECREF(arg);
784 if (res == NULL)
785 return -1;
786 DECREF(res);
787 return 0;
788}
789
Guido van Rossum9bfef441993-03-29 10:43:31 +0000790static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000791 (inquiry)instance_length, /*mp_length*/
792 (binaryfunc)instance_subscript, /*mp_subscript*/
793 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794};
795
796static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797instance_item(inst, i)
798 instanceobject *inst;
799 int i;
800{
801 object *func, *arg, *res;
802
Guido van Rossum2878a691996-08-09 20:53:24 +0000803 if (getitemstr == NULL)
804 getitemstr = newstringobject("__getitem__");
805 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000806 if (func == NULL)
807 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000808 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809 if (arg == NULL) {
810 DECREF(func);
811 return NULL;
812 }
813 res = call_object(func, arg);
814 DECREF(func);
815 DECREF(arg);
816 return res;
817}
818
819static object *
820instance_slice(inst, i, j)
821 instanceobject *inst;
822 int i, j;
823{
824 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000825 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826
Guido van Rossum2878a691996-08-09 20:53:24 +0000827 if (getslicestr == NULL)
828 getslicestr = newstringobject("__getslice__");
829 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000830 if (func == NULL)
831 return NULL;
832 arg = mkvalue("(ii)", i, j);
833 if (arg == NULL) {
834 DECREF(func);
835 return NULL;
836 }
837 res = call_object(func, arg);
838 DECREF(func);
839 DECREF(arg);
840 return res;
841}
842
843static int
844instance_ass_item(inst, i, item)
845 instanceobject *inst;
846 int i;
847 object *item;
848{
849 object *func, *arg, *res;
850
Guido van Rossum2878a691996-08-09 20:53:24 +0000851 if (item == NULL) {
852 if (delitemstr == NULL)
853 delitemstr = newstringobject("__delitem__");
854 func = instance_getattr(inst, delitemstr);
855 }
856 else {
857 if (setitemstr == NULL)
858 setitemstr = newstringobject("__setitem__");
859 func = instance_getattr(inst, setitemstr);
860 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000862 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000863 if (item == NULL)
864 arg = mkvalue("i", i);
865 else
866 arg = mkvalue("(iO)", i, item);
867 if (arg == NULL) {
868 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000869 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000870 }
871 res = call_object(func, arg);
872 DECREF(func);
873 DECREF(arg);
874 if (res == NULL)
875 return -1;
876 DECREF(res);
877 return 0;
878}
879
880static int
881instance_ass_slice(inst, i, j, value)
882 instanceobject *inst;
883 int i, j;
884 object *value;
885{
886 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000887 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888
Guido van Rossum2878a691996-08-09 20:53:24 +0000889 if (value == NULL) {
890 if (delslicestr == NULL)
891 delslicestr = newstringobject("__delslice__");
892 func = instance_getattr(inst, delslicestr);
893 }
894 else {
895 if (setslicestr == NULL)
896 setslicestr = newstringobject("__setslice__");
897 func = instance_getattr(inst, setslicestr);
898 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000899 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000900 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 if (value == NULL)
902 arg = mkvalue("(ii)", i, j);
903 else
904 arg = mkvalue("(iiO)", i, j, value);
905 if (arg == NULL) {
906 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000907 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908 }
909 res = call_object(func, arg);
910 DECREF(func);
911 DECREF(arg);
912 if (res == NULL)
913 return -1;
914 DECREF(res);
915 return 0;
916}
917
918static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000919 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000920 0, /*sq_concat*/
921 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000922 (intargfunc)instance_item, /*sq_item*/
923 (intintargfunc)instance_slice, /*sq_slice*/
924 (intobjargproc)instance_ass_item, /*sq_ass_item*/
925 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926};
927
928static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929generic_unary_op(self, methodname)
930 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000931 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932{
933 object *func, *res;
934
935 if ((func = instance_getattr(self, methodname)) == NULL)
936 return NULL;
937 res = call_object(func, (object *)NULL);
938 DECREF(func);
939 return res;
940}
941
Guido van Rossum03093a21994-09-28 15:51:32 +0000942
943/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000944static int halfbinop Py_PROTO((object *, object *, char *, object **,
945 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000946
947
948/* Implement a binary operator involving at least one class instance. */
949
950object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000951instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000952 object *v;
953 object *w;
954 char *opname;
955 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000956 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000957{
958 char buf[256];
959 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000960 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000961 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000962 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000963 return result;
964 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
965 err_setstr(TypeError, buf);
966 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967}
968
Guido van Rossum03093a21994-09-28 15:51:32 +0000969
970/* Try one half of a binary operator involving a class instance.
971 Return value:
972 -1 if an exception is to be reported right away
973 0 if we have a valid result
974 1 if we could try another operation
975*/
976
Guido van Rossum2878a691996-08-09 20:53:24 +0000977static object *coerce_obj;
978
Guido van Rossum03093a21994-09-28 15:51:32 +0000979static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000980halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000981 object *v;
982 object *w;
983 char *opname;
984 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000985 object * (*thisfunc) PROTO((object *, object *));
986 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000987{
988 object *func;
989 object *args;
990 object *coerce;
991 object *coerced = NULL;
992 object *v1;
993
994 if (!is_instanceobject(v))
995 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000996 if (coerce_obj == NULL) {
997 coerce_obj = newstringobject("__coerce__");
998 if (coerce_obj == NULL)
999 return -1;
1000 }
1001 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +00001002 if (coerce == NULL) {
1003 err_clear();
1004 }
1005 else {
1006 args = mkvalue("(O)", w);
1007 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001008 return -1;
1009 }
1010 coerced = call_object(coerce, args);
1011 DECREF(args);
1012 DECREF(coerce);
1013 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001014 return -1;
1015 }
1016 if (coerced == None) {
1017 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001018 return 1;
1019 }
1020 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1021 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001022 err_setstr(TypeError,
1023 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001024 return -1;
1025 }
1026 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001027 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001028 if (v1 != v) {
1029 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001030 if (!is_instanceobject(v) && !is_instanceobject(w)) {
1031 if (swapped)
1032 *r_result = (*thisfunc)(w, v);
1033 else
1034 *r_result = (*thisfunc)(v, w);
1035 DECREF(coerced);
1036 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001037 }
1038 }
1039 w = gettupleitem(coerced, 1);
1040 }
Guido van Rossume7d444f1995-01-07 12:35:18 +00001041 func = getattr(v, opname);
1042 if (func == NULL) {
1043 XDECREF(coerced);
1044 if (err_occurred() != AttributeError)
1045 return -1;
1046 err_clear();
1047 return 1;
1048 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001049 args = mkvalue("(O)", w);
1050 if (args == NULL) {
1051 DECREF(func);
1052 XDECREF(coerced);
1053 return -1;
1054 }
1055 *r_result = call_object(func, args);
1056 DECREF(args);
1057 DECREF(func);
1058 XDECREF(coerced);
1059 return *r_result == NULL ? -1 : 0;
1060}
1061
Guido van Rossum879c5811995-01-10 15:24:06 +00001062static int
1063instance_coerce(pv, pw)
1064 object **pv;
1065 object **pw;
1066{
1067 object *v = *pv;
1068 object *w = *pw;
1069 object *coerce;
1070 object *args;
1071 object *coerced;
1072
Guido van Rossum2878a691996-08-09 20:53:24 +00001073 if (coerce_obj == NULL) {
1074 coerce_obj = newstringobject("__coerce__");
1075 if (coerce_obj == NULL)
1076 return -1;
1077 }
1078 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001079 if (coerce == NULL) {
1080 /* No __coerce__ method: always OK */
1081 err_clear();
1082 INCREF(v);
1083 INCREF(w);
1084 return 0;
1085 }
1086 /* Has __coerce__ method: call it */
1087 args = mkvalue("(O)", w);
1088 if (args == NULL) {
1089 return -1;
1090 }
1091 coerced = call_object(coerce, args);
1092 DECREF(args);
1093 DECREF(coerce);
1094 if (coerced == NULL) {
1095 /* __coerce__ call raised an exception */
1096 return -1;
1097 }
1098 if (coerced == None) {
1099 /* __coerce__ says "I can't do it" */
1100 DECREF(coerced);
1101 return 1;
1102 }
1103 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1104 /* __coerce__ return value is malformed */
1105 DECREF(coerced);
1106 err_setstr(TypeError,
1107 "coercion should return None or 2-tuple");
1108 return -1;
1109 }
1110 /* __coerce__ returned two new values */
1111 *pv = gettupleitem(coerced, 0);
1112 *pw = gettupleitem(coerced, 1);
1113 INCREF(*pv);
1114 INCREF(*pw);
1115 DECREF(coerced);
1116 return 0;
1117}
1118
Guido van Rossum03093a21994-09-28 15:51:32 +00001119
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120#define UNARY(funcname, methodname) \
1121static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001122 static object *o; \
1123 if (o == NULL) o = newstringobject(methodname); \
1124 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125}
1126
Guido van Rossum04691fc1992-08-12 15:35:34 +00001127UNARY(instance_neg, "__neg__")
1128UNARY(instance_pos, "__pos__")
1129UNARY(instance_abs, "__abs__")
1130
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001132instance_nonzero(self)
1133 instanceobject *self;
1134{
1135 object *func, *res;
1136 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001137 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001138
Guido van Rossum2878a691996-08-09 20:53:24 +00001139 if (nonzerostr == NULL)
1140 nonzerostr = newstringobject("__nonzero__");
1141 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001142 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001143 if (lenstr == NULL)
1144 lenstr = newstringobject("__len__");
1145 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001146 err_clear();
1147 /* Fall back to the default behavior:
1148 all instances are nonzero */
1149 return 1;
1150 }
1151 }
1152 res = call_object(func, (object *)NULL);
1153 DECREF(func);
1154 if (res == NULL)
1155 return -1;
1156 if (!is_intobject(res)) {
1157 DECREF(res);
1158 err_setstr(TypeError, "__nonzero__ should return an int");
1159 return -1;
1160 }
1161 outcome = getintvalue(res);
1162 DECREF(res);
1163 if (outcome < 0) {
1164 err_setstr(ValueError, "__nonzero__ should return >= 0");
1165 return -1;
1166 }
1167 return outcome > 0;
1168}
1169
1170UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001171UNARY(instance_int, "__int__")
1172UNARY(instance_long, "__long__")
1173UNARY(instance_float, "__float__")
1174UNARY(instance_oct, "__oct__")
1175UNARY(instance_hex, "__hex__")
1176
Guido van Rossum03093a21994-09-28 15:51:32 +00001177/* This version is for ternary calls only (z != None) */
1178static object *
1179instance_pow(v, w, z)
1180 object *v;
1181 object *w;
1182 object *z;
1183{
1184 /* XXX Doesn't do coercions... */
1185 object *func;
1186 object *args;
1187 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001188 static object *powstr;
1189
1190 if (powstr == NULL)
1191 powstr = newstringobject("__pow__");
1192 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001193 if (func == NULL)
1194 return NULL;
1195 args = mkvalue("(OO)", w, z);
1196 if (args == NULL) {
1197 DECREF(func);
1198 return NULL;
1199 }
1200 result = call_object(func, args);
1201 DECREF(func);
1202 DECREF(args);
1203 return result;
1204}
1205
Guido van Rossum04691fc1992-08-12 15:35:34 +00001206static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 0, /*nb_add*/
1208 0, /*nb_subtract*/
1209 0, /*nb_multiply*/
1210 0, /*nb_divide*/
1211 0, /*nb_remainder*/
1212 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001213 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001214 (unaryfunc)instance_neg, /*nb_negative*/
1215 (unaryfunc)instance_pos, /*nb_positive*/
1216 (unaryfunc)instance_abs, /*nb_absolute*/
1217 (inquiry)instance_nonzero, /*nb_nonzero*/
1218 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001219 0, /*nb_lshift*/
1220 0, /*nb_rshift*/
1221 0, /*nb_and*/
1222 0, /*nb_xor*/
1223 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001224 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001225 (unaryfunc)instance_int, /*nb_int*/
1226 (unaryfunc)instance_long, /*nb_long*/
1227 (unaryfunc)instance_float, /*nb_float*/
1228 (unaryfunc)instance_oct, /*nb_oct*/
1229 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001230};
1231
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001232typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001233 OB_HEAD_INIT(&Typetype)
1234 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001235 "instance",
1236 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001237 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001238 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001239 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001240 0, /*tp_getattr*/
1241 0, /*tp_setattr*/
1242 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001243 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001244 &instance_as_number, /*tp_as_number*/
1245 &instance_as_sequence, /*tp_as_sequence*/
1246 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001247 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001248 0, /*tp_call*/
1249 0, /*tp_str*/
1250 (getattrofunc)instance_getattr, /*tp_getattro*/
1251 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001252};
1253
1254
Guido van Rossum81daa321993-05-20 14:24:46 +00001255/* Instance method objects are used for two purposes:
1256 (a) as bound instance methods (returned by instancename.methodname)
1257 (b) as unbound methods (returned by ClassName.methodname)
1258 In case (b), im_self is NULL
1259*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001260
1261typedef struct {
1262 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001263 object *im_func; /* The function implementing the method */
1264 object *im_self; /* The instance it is bound to, or NULL */
1265 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001266} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001267
1268object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001269newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001270 object *func;
1271 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001272 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001273{
Guido van Rossume8122f11991-05-05 20:03:07 +00001274 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001275 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001276 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001277 return NULL;
1278 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001279 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1280 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001281 return NULL;
1282 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001283 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001284 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001285 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001286 INCREF(class);
1287 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001288 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001289}
1290
1291object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001292instancemethodgetfunc(im)
1293 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001294{
Guido van Rossume8122f11991-05-05 20:03:07 +00001295 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001296 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001297 return NULL;
1298 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001299 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001300}
1301
1302object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001303instancemethodgetself(im)
1304 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001305{
Guido van Rossume8122f11991-05-05 20:03:07 +00001306 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001307 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001308 return NULL;
1309 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001310 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001311}
1312
Guido van Rossum81daa321993-05-20 14:24:46 +00001313object *
1314instancemethodgetclass(im)
1315 register object *im;
1316{
1317 if (!is_instancemethodobject(im)) {
1318 err_badcall();
1319 return NULL;
1320 }
1321 return ((instancemethodobject *)im)->im_class;
1322}
1323
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001324/* Class method methods */
1325
Guido van Rossume8122f11991-05-05 20:03:07 +00001326#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001327
Guido van Rossume8122f11991-05-05 20:03:07 +00001328static struct memberlist instancemethod_memberlist[] = {
1329 {"im_func", T_OBJECT, OFF(im_func)},
1330 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001331 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001332 /* Dummies that are not handled by getattr() except for __members__ */
1333 {"__doc__", T_INT, 0},
1334 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335 {NULL} /* Sentinel */
1336};
1337
1338static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001339instancemethod_getattr(im, name)
1340 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001341 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001342{
Guido van Rossum2878a691996-08-09 20:53:24 +00001343 char *sname = getstringvalue(name);
1344 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001345 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001346 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001347 INCREF(func->func_name);
1348 return func->func_name;
1349 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001350 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001351 INCREF(func->func_doc);
1352 return func->func_doc;
1353 }
1354 }
1355 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001356 err_setstr(RuntimeError,
1357 "instance-method attributes not accessible in restricted mode");
1358 return NULL;
1359 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001360 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001361}
1362
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001363static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001364instancemethod_dealloc(im)
1365 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001366{
Guido van Rossume8122f11991-05-05 20:03:07 +00001367 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001368 XDECREF(im->im_self);
1369 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001370 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001371}
1372
Guido van Rossumebc8c511992-09-03 20:39:51 +00001373static int
1374instancemethod_compare(a, b)
1375 instancemethodobject *a, *b;
1376{
Guido van Rossume9df7271995-04-06 14:46:51 +00001377 if (a->im_self != b->im_self)
1378 return (a->im_self < b->im_self) ? -1 : 1;
1379 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001380}
1381
Guido van Rossum25831651993-05-19 14:50:45 +00001382static object *
1383instancemethod_repr(a)
1384 instancemethodobject *a;
1385{
1386 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001387 instanceobject *self = (instanceobject *)(a->im_self);
1388 funcobject *func = (funcobject *)(a->im_func);
1389 classobject *class = (classobject *)(a->im_class);
1390 object *fclassname, *iclassname, *funcname;
1391 char *fcname, *icname, *fname;
1392 fclassname = class->cl_name;
1393 funcname = func->func_name;
1394 if (fclassname != NULL && is_stringobject(fclassname))
1395 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001396 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001397 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001398 if (funcname != NULL && is_stringobject(funcname))
1399 fname = getstringvalue(funcname);
1400 else
1401 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001402 if (self == NULL)
1403 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1404 else {
1405 iclassname = self->in_class->cl_name;
1406 if (iclassname != NULL && is_stringobject(iclassname))
1407 icname = getstringvalue(iclassname);
1408 else
1409 icname = "?";
1410 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1411 fcname, fname, icname, (long)self);
1412 }
Guido van Rossum25831651993-05-19 14:50:45 +00001413 return newstringobject(buf);
1414}
1415
Guido van Rossum9bfef441993-03-29 10:43:31 +00001416static long
1417instancemethod_hash(a)
1418 instancemethodobject *a;
1419{
1420 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001421 if (a->im_self == NULL)
1422 x = hashobject(None);
1423 else
1424 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001425 if (x == -1)
1426 return -1;
1427 y = hashobject(a->im_func);
1428 if (y == -1)
1429 return -1;
1430 return x ^ y;
1431}
1432
Guido van Rossume8122f11991-05-05 20:03:07 +00001433typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001434 OB_HEAD_INIT(&Typetype)
1435 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001436 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001437 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001438 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001439 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001440 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001441 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001442 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001443 (cmpfunc)instancemethod_compare, /*tp_compare*/
1444 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001445 0, /*tp_as_number*/
1446 0, /*tp_as_sequence*/
1447 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001448 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001449 0, /*tp_call*/
1450 0, /*tp_str*/
1451 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1452 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001453};