blob: 8b7e4dad649e5baade048b48dd860d5b77427059 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumb6775db1994-08-01 11:34:53 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossume5372401993-03-16 12:15:04 +00003Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Class object implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000028#include "modsupport.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000029#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000030#include "ceval.h"
31
Guido van Rossum52ca98a1994-09-05 07:32:29 +000032/* Forward */
33static object *class_lookup PROTO((classobject *, char *, classobject **));
34static object *instance_getattr1 PROTO((instanceobject *, char *));
35
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036object *
Guido van Rossum81daa321993-05-20 14:24:46 +000037newclassobject(bases, dict, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038 object *bases; /* NULL or tuple of classobjects! */
Guido van Rossum81daa321993-05-20 14:24:46 +000039 object *dict;
Guido van Rossum94308391991-10-20 20:11:48 +000040 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041{
Guido van Rossum81daa321993-05-20 14:24:46 +000042 int pos;
43 object *key, *value;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000044 classobject *op, *dummy;
Guido van Rossume2966a61991-12-10 13:53:23 +000045 if (bases == NULL) {
46 bases = newtupleobject(0);
47 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000048 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000049 }
50 else
51 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000053 if (op == NULL) {
54 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000056 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000058 INCREF(dict);
59 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000060 XINCREF(name);
61 op->cl_name = name;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000062 op->cl_getattr = class_lookup(op, "__getattr__", &dummy);
63 op->cl_setattr = class_lookup(op, "__setattr__", &dummy);
64 op->cl_delattr = class_lookup(op, "__delattr__", &dummy);
65 XINCREF(op->cl_getattr);
66 XINCREF(op->cl_setattr);
67 XINCREF(op->cl_delattr);
Guido van Rossum81daa321993-05-20 14:24:46 +000068 pos = 0;
69 while (mappinggetnext(dict, &pos, &key, &value)) {
70 if (is_accessobject(value))
71 setaccessowner(value, (object *)op);
72 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 return (object *) op;
74}
75
76/* Class methods */
77
78static void
79class_dealloc(op)
80 classobject *op;
81{
Guido van Rossume2966a61991-12-10 13:53:23 +000082 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +000083 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +000084 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 free((ANY *)op);
86}
87
88static object *
Guido van Rossum81daa321993-05-20 14:24:46 +000089class_lookup(cp, name, pclass)
90 classobject *cp;
91 char *name;
92 classobject **pclass;
93{
94 int i, n;
95 object *value = dictlookup(cp->cl_dict, name);
96 if (value != NULL) {
97 *pclass = cp;
98 return value;
99 }
100 n = gettuplesize(cp->cl_bases);
101 for (i = 0; i < n; i++) {
102 object *v = class_lookup((classobject *)
103 gettupleitem(cp->cl_bases, i), name, pclass);
104 if (v != NULL)
105 return v;
106 }
107 return NULL;
108}
109
110static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111class_getattr(op, name)
112 register classobject *op;
113 register char *name;
114{
115 register object *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000116 classobject *class;
Guido van Rossume7737541994-09-05 07:31:41 +0000117 if (strcmp(name, "__dict__") == 0) {
118 INCREF(op->cl_dict);
119 return op->cl_dict;
120 }
121 if (strcmp(name, "__bases__") == 0) {
122 INCREF(op->cl_bases);
123 return op->cl_bases;
124 }
125 if (strcmp(name, "__name__") == 0) {
126 if (op->cl_name == NULL)
127 v = None;
128 else
129 v = op->cl_name;
130 INCREF(v);
131 return v;
Guido van Rossum94308391991-10-20 20:11:48 +0000132 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000133 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000134 if (v == NULL) {
135 err_setstr(AttributeError, name);
136 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000138 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000139 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000140 if (v == NULL)
141 return NULL;
142 }
143 else
144 INCREF(v);
145 if (is_funcobject(v)) {
146 object *w = newinstancemethodobject(v, (object *)NULL,
147 (object *)class);
148 DECREF(v);
149 v = w;
150 }
151 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152}
153
Guido van Rossum94308391991-10-20 20:11:48 +0000154static int
155class_setattr(op, name, v)
156 classobject *op;
157 char *name;
158 object *v;
159{
Guido van Rossum25831651993-05-19 14:50:45 +0000160 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000161 if (name[0] == '_' && name[1] == '_') {
162 int n = strlen(name);
163 if (name[n-1] == '_' && name[n-2] == '_') {
164 err_setstr(TypeError, "read-only special attribute");
165 return -1;
166 }
167 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000168 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000169 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000170 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000171 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000172 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000173 if (rv < 0)
174 err_setstr(AttributeError,
175 "delete non-existing class attribute");
176 return rv;
177 }
Guido van Rossum94308391991-10-20 20:11:48 +0000178 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000179 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000180}
181
Guido van Rossum25831651993-05-19 14:50:45 +0000182static object *
183class_repr(op)
184 classobject *op;
185{
186 char buf[140];
187 char *name;
188 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
189 name = "?";
190 else
191 name = getstringvalue(op->cl_name);
192 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
193 return newstringobject(buf);
194}
195
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196typeobject Classtype = {
197 OB_HEAD_INIT(&Typetype)
198 0,
199 "class",
200 sizeof(classobject),
201 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000204 (getattrfunc)class_getattr, /*tp_getattr*/
205 (setattrfunc)class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000207 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 0, /*tp_as_number*/
209 0, /*tp_as_sequence*/
210 0, /*tp_as_mapping*/
211};
212
Guido van Rossum81daa321993-05-20 14:24:46 +0000213int
214issubclass(class, base)
215 object *class;
216 object *base;
217{
218 int i, n;
219 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000220 if (class == base)
221 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000222 if (class == NULL || !is_classobject(class))
223 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000224 cp = (classobject *)class;
225 n = gettuplesize(cp->cl_bases);
226 for (i = 0; i < n; i++) {
227 if (issubclass(gettupleitem(cp->cl_bases, i), base))
228 return 1;
229 }
230 return 0;
231}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232
Guido van Rossum81daa321993-05-20 14:24:46 +0000233
234/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235
Guido van Rossum81daa321993-05-20 14:24:46 +0000236static int
237addaccess(class, inst)
238 classobject *class;
239 instanceobject *inst;
240{
241 int i, n, pos, ret;
242 object *key, *value, *ac;
243
244 n = gettuplesize(class->cl_bases);
245 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000246 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000247 return -1;
248 }
249
250 pos = 0;
251 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
Guido van Rossumb3f72581993-05-21 19:56:10 +0000252 object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000253 if (!is_accessobject(value))
254 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000255 if (hasaccessvalue(value))
256 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000257 ac = dict2lookup(inst->in_dict, key);
258 if (ac != NULL && is_accessobject(ac)) {
259 err_setval(ConflictError, key);
260 return -1;
261 }
262 ac = cloneaccessobject(value);
263 if (ac == NULL)
264 return -1;
265 ret = dict2insert(inst->in_dict, key, ac);
266 DECREF(ac);
267 if (ret != 0)
268 return -1;
269 }
270 return 0;
271}
272
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273object *
Guido van Rossum25831651993-05-19 14:50:45 +0000274newinstanceobject(class, arg)
275 object *class;
276 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277{
Guido van Rossume8122f11991-05-05 20:03:07 +0000278 register instanceobject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000279 object *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000280 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000282 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 return NULL;
284 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000285 inst = NEWOBJ(instanceobject, &Instancetype);
286 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 return NULL;
288 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000289 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000290 inst->in_dict = newdictobject();
291 if (inst->in_dict == NULL ||
292 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000293 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return NULL;
295 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000296 init = instance_getattr1(inst, "__init__");
Guido van Rossum25831651993-05-19 14:50:45 +0000297 if (init == NULL) {
298 err_clear();
299 if (arg != NULL && !(is_tupleobject(arg) &&
300 gettuplesize(arg) == 0)) {
301 err_setstr(TypeError,
302 "this classobject() takes no arguments");
303 DECREF(inst);
304 inst = NULL;
305 }
306 }
307 else {
308 object *res = call_object(init, arg);
309 DECREF(init);
310 if (res == NULL) {
311 DECREF(inst);
312 inst = NULL;
313 }
314 else {
315 if (res != None) {
316 err_setstr(TypeError,
317 "__init__() should return None");
318 DECREF(inst);
319 inst = NULL;
320 }
321 DECREF(res);
322 }
323 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000324 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325}
326
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000327/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328
329static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000330instance_dealloc(inst)
331 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332{
Guido van Rossum25831651993-05-19 14:50:45 +0000333 object *error_type, *error_value;
334 object *del;
335 /* Call the __del__ method if it exists. First temporarily
336 revive the object and save the current exception, if any. */
337 INCREF(inst);
338 err_get(&error_type, &error_value);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000339 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000340 object *args = newtupleobject(0);
341 object *res = args;
342 if (res != NULL)
343 res = call_object(del, args);
344 XDECREF(args);
345 DECREF(del);
346 XDECREF(res);
347 /* XXX If __del__ raised an exception, it is ignored! */
348 }
349 /* Restore the saved exception and undo the temporary revival */
350 err_setval(error_type, error_value);
351 /* Can't use DECREF here, it would cause a recursive call */
352 if (--inst->ob_refcnt > 0)
353 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000354 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000355 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000356 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357}
358
Guido van Rossume7737541994-09-05 07:31:41 +0000359static object *
360instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000361 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 register char *name;
363{
Guido van Rossum94308391991-10-20 20:11:48 +0000364 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000365 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000366 if (name[0] == '_' && name[1] == '_') {
367 if (strcmp(name, "__dict__") == 0) {
368 INCREF(inst->in_dict);
369 return inst->in_dict;
370 }
371 if (strcmp(name, "__class__") == 0) {
372 INCREF(inst->in_class);
373 return (object *)inst->in_class;
374 }
Guido van Rossum94308391991-10-20 20:11:48 +0000375 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000376 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000377 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000378 if (v == NULL) {
379 v = class_lookup(inst->in_class, name, &class);
380 if (v == NULL) {
381 err_setstr(AttributeError, name);
382 return NULL;
383 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000385 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000386 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000387 if (v == NULL)
388 return NULL;
389 }
390 else
391 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000392 if (class != NULL) {
393 if (is_funcobject(v)) {
394 object *w = newinstancemethodobject(v, (object *)inst,
395 (object *)class);
396 DECREF(v);
397 v = w;
398 }
399 else if (is_instancemethodobject(v)) {
400 object *im_class = instancemethodgetclass(v);
401 /* Only if classes are compatible */
402 if (issubclass((object *)class, im_class)) {
403 object *im_func = instancemethodgetfunc(v);
404 object *w = newinstancemethodobject(im_func,
405 (object *)inst, im_class);
406 DECREF(v);
407 v = w;
408 }
409 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000410 }
411 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412}
413
Guido van Rossume7737541994-09-05 07:31:41 +0000414static object *
415instance_getattr(inst, name)
416 register instanceobject *inst;
417 register char *name;
418{
419 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000420 res = instance_getattr1(inst, name);
421 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
422 object *args;
423#if 0
424 if (name[0] == '_' && name[1] == '_') {
425 int n = strlen(name);
426 if (name[n-1] == '_' && name[n-2] == '_') {
427 /* Don't mess with system attributes */
428 return NULL;
429 }
Guido van Rossume7737541994-09-05 07:31:41 +0000430 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000431#endif
432 args = mkvalue("(Os)", inst, name);
433 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000434 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000435 res = call_object(func, args);
436 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000437 }
438 return res;
439}
440
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441static int
Guido van Rossume7737541994-09-05 07:31:41 +0000442instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000443 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444 char *name;
445 object *v;
446{
Guido van Rossum25831651993-05-19 14:50:45 +0000447 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000448 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000449 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000450 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000451 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000452 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000453 if (rv < 0)
454 err_setstr(AttributeError,
455 "delete non-existing instance attribute");
456 return rv;
457 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000459 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460}
461
Guido van Rossume7737541994-09-05 07:31:41 +0000462static int
463instance_setattr(inst, name, v)
464 instanceobject *inst;
465 char *name;
466 object *v;
467{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000468 object *func, *args, *res;
469 if (name[0] == '_' && name[1] == '_') {
470 int n = strlen(name);
471 if (name[n-1] == '_' && name[n-2] == '_') {
472 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000473 return -1;
474 }
Guido van Rossume7737541994-09-05 07:31:41 +0000475 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000476 if (v == NULL)
477 func = inst->in_class->cl_delattr;
478 else
479 func = inst->in_class->cl_setattr;
480 if (func == NULL)
481 return instance_setattr1(inst, name, v);
482 if (v == NULL)
483 args = mkvalue("(Os)", inst, name);
484 else
485 args = mkvalue("(OsO)", inst, name, v);
486 if (args == NULL)
487 return -1;
488 res = call_object(func, args);
489 DECREF(args);
490 if (res == NULL)
491 return -1;
492 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000493 return 0;
494}
495
Guido van Rossum9bfef441993-03-29 10:43:31 +0000496static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000497instance_repr(inst)
498 instanceobject *inst;
499{
500 object *func;
501 object *res;
502
503 func = instance_getattr(inst, "__repr__");
504 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000505 char buf[140];
506 object *classname = inst->in_class->cl_name;
507 char *cname;
508 if (classname != NULL && is_stringobject(classname))
509 cname = getstringvalue(classname);
510 else
511 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000512 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000513 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000514 return newstringobject(buf);
515 }
516 res = call_object(func, (object *)NULL);
517 DECREF(func);
518 return res;
519}
520
Guido van Rossum9bfef441993-03-29 10:43:31 +0000521static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000522instance_compare(inst, other)
523 instanceobject *inst, *other;
524{
525 object *func;
526 object *res;
527 int outcome;
528
529 func = instance_getattr(inst, "__cmp__");
530 if (func == NULL) {
531 err_clear();
532 if (inst < other)
533 return -1;
534 if (inst > other)
535 return 1;
536 return 0;
537 }
538 res = call_object(func, (object *)other);
539 DECREF(func);
540 if (res == NULL) {
541 err_clear(); /* XXX Should report the error, bot how...??? */
542 return 0;
543 }
544 if (is_intobject(res))
545 outcome = getintvalue(res);
546 else
547 outcome = 0; /* XXX Should report the error, bot how...??? */
548 DECREF(res);
549 return outcome;
550}
551
Guido van Rossum9bfef441993-03-29 10:43:31 +0000552static long
553instance_hash(inst)
554 instanceobject *inst;
555{
556 object *func;
557 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000558 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000559
560 func = instance_getattr(inst, "__hash__");
561 if (func == NULL) {
562 /* If there is no __cmp__ method, we hash on the address.
563 If a __cmp__ method exists, there must be a __hash__. */
564 err_clear();
565 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000566 if (func == NULL) {
567 err_clear();
568 outcome = (long)inst;
569 if (outcome == -1)
570 outcome = -2;
571 return outcome;
572 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000573 err_setstr(TypeError, "unhashable instance");
574 return -1;
575 }
576 res = call_object(func, (object *)NULL);
577 DECREF(func);
578 if (res == NULL)
579 return -1;
580 if (is_intobject(res)) {
581 outcome = getintvalue(res);
582 if (outcome == -1)
583 outcome = -2;
584 }
585 else {
586 err_setstr(TypeError, "__hash__() should return an int");
587 outcome = -1;
588 }
589 DECREF(res);
590 return outcome;
591}
592
593static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000594instance_length(inst)
595 instanceobject *inst;
596{
597 object *func;
598 object *res;
599 int outcome;
600
601 func = instance_getattr(inst, "__len__");
602 if (func == NULL)
603 return -1;
604 res = call_object(func, (object *)NULL);
605 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000606 if (res == NULL)
607 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000608 if (is_intobject(res)) {
609 outcome = getintvalue(res);
610 if (outcome < 0)
611 err_setstr(ValueError, "__len__() should return >= 0");
612 }
613 else {
614 err_setstr(TypeError, "__len__() should return an int");
615 outcome = -1;
616 }
617 DECREF(res);
618 return outcome;
619}
620
Guido van Rossum9bfef441993-03-29 10:43:31 +0000621static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000622instance_subscript(inst, key)
623 instanceobject *inst;
624 object *key;
625{
626 object *func;
627 object *arg;
628 object *res;
629
630 func = instance_getattr(inst, "__getitem__");
631 if (func == NULL)
632 return NULL;
633 arg = mkvalue("(O)", key);
634 if (arg == NULL) {
635 DECREF(func);
636 return NULL;
637 }
638 res = call_object(func, arg);
639 DECREF(func);
640 DECREF(arg);
641 return res;
642}
643
Guido van Rossum9bfef441993-03-29 10:43:31 +0000644static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000645instance_ass_subscript(inst, key, value)
646 instanceobject*inst;
647 object *key;
648 object *value;
649{
650 object *func;
651 object *arg;
652 object *res;
653
654 if (value == NULL)
655 func = instance_getattr(inst, "__delitem__");
656 else
657 func = instance_getattr(inst, "__setitem__");
658 if (func == NULL)
659 return -1;
660 if (value == NULL)
661 arg = mkvalue("(O)", key);
662 else
663 arg = mkvalue("(OO)", key, value);
664 if (arg == NULL) {
665 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000666 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000667 }
668 res = call_object(func, arg);
669 DECREF(func);
670 DECREF(arg);
671 if (res == NULL)
672 return -1;
673 DECREF(res);
674 return 0;
675}
676
Guido van Rossum9bfef441993-03-29 10:43:31 +0000677static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000678 (inquiry)instance_length, /*mp_length*/
679 (binaryfunc)instance_subscript, /*mp_subscript*/
680 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000681};
682
683static object *
684instance_concat(inst, other)
685 instanceobject *inst, *other;
686{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000687 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000688
689 func = instance_getattr(inst, "__add__");
690 if (func == NULL)
691 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000692 arg = mkvalue("(O)", other);
693 if (arg == NULL) {
694 DECREF(func);
695 return NULL;
696 }
697 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000698 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000699 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000700 return res;
701}
702
703static object *
704instance_repeat(inst, count)
705 instanceobject *inst;
706 int count;
707{
708 object *func, *arg, *res;
709
710 func = instance_getattr(inst, "__mul__");
711 if (func == NULL)
712 return NULL;
713 arg = newintobject((long)count);
714 if (arg == NULL) {
715 DECREF(func);
716 return NULL;
717 }
718 res = call_object(func, arg);
719 DECREF(func);
720 DECREF(arg);
721 return res;
722}
723
724static object *
725instance_item(inst, i)
726 instanceobject *inst;
727 int i;
728{
729 object *func, *arg, *res;
730
731 func = instance_getattr(inst, "__getitem__");
732 if (func == NULL)
733 return NULL;
734 arg = newintobject((long)i);
735 if (arg == NULL) {
736 DECREF(func);
737 return NULL;
738 }
739 res = call_object(func, arg);
740 DECREF(func);
741 DECREF(arg);
742 return res;
743}
744
745static object *
746instance_slice(inst, i, j)
747 instanceobject *inst;
748 int i, j;
749{
750 object *func, *arg, *res;
751
752 func = instance_getattr(inst, "__getslice__");
753 if (func == NULL)
754 return NULL;
755 arg = mkvalue("(ii)", i, j);
756 if (arg == NULL) {
757 DECREF(func);
758 return NULL;
759 }
760 res = call_object(func, arg);
761 DECREF(func);
762 DECREF(arg);
763 return res;
764}
765
766static int
767instance_ass_item(inst, i, item)
768 instanceobject *inst;
769 int i;
770 object *item;
771{
772 object *func, *arg, *res;
773
774 if (item == NULL)
775 func = instance_getattr(inst, "__delitem__");
776 else
777 func = instance_getattr(inst, "__setitem__");
778 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000779 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000780 if (item == NULL)
781 arg = mkvalue("i", i);
782 else
783 arg = mkvalue("(iO)", i, item);
784 if (arg == NULL) {
785 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000786 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000787 }
788 res = call_object(func, arg);
789 DECREF(func);
790 DECREF(arg);
791 if (res == NULL)
792 return -1;
793 DECREF(res);
794 return 0;
795}
796
797static int
798instance_ass_slice(inst, i, j, value)
799 instanceobject *inst;
800 int i, j;
801 object *value;
802{
803 object *func, *arg, *res;
804
805 if (value == NULL)
806 func = instance_getattr(inst, "__delslice__");
807 else
808 func = instance_getattr(inst, "__setslice__");
809 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000810 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811 if (value == NULL)
812 arg = mkvalue("(ii)", i, j);
813 else
814 arg = mkvalue("(iiO)", i, j, value);
815 if (arg == NULL) {
816 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000817 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000818 }
819 res = call_object(func, arg);
820 DECREF(func);
821 DECREF(arg);
822 if (res == NULL)
823 return -1;
824 DECREF(res);
825 return 0;
826}
827
828static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000829 (inquiry)instance_length, /*sq_length*/
830 (binaryfunc)instance_concat, /*sq_concat*/
831 (intargfunc)instance_repeat, /*sq_repeat*/
832 (intargfunc)instance_item, /*sq_item*/
833 (intintargfunc)instance_slice, /*sq_slice*/
834 (intobjargproc)instance_ass_item, /*sq_ass_item*/
835 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000836};
837
838static object *
839generic_binary_op(self, other, methodname)
840 instanceobject *self;
841 object *other;
842 char *methodname;
843{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000844 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000845
846 if ((func = instance_getattr(self, methodname)) == NULL)
847 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000848 arg = mkvalue("O", other);
849 if (arg == NULL) {
850 DECREF(func);
851 return NULL;
852 }
853 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000854 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000855 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856 return res;
857}
858
859static object *
860generic_unary_op(self, methodname)
861 instanceobject *self;
862 char *methodname;
863{
864 object *func, *res;
865
866 if ((func = instance_getattr(self, methodname)) == NULL)
867 return NULL;
868 res = call_object(func, (object *)NULL);
869 DECREF(func);
870 return res;
871}
872
873#define BINARY(funcname, methodname) \
874static object * funcname(self, other) instanceobject *self; object *other; { \
875 return generic_binary_op(self, other, methodname); \
876}
877
878#define UNARY(funcname, methodname) \
879static object *funcname(self) instanceobject *self; { \
880 return generic_unary_op(self, methodname); \
881}
882
883BINARY(instance_add, "__add__")
884BINARY(instance_sub, "__sub__")
885BINARY(instance_mul, "__mul__")
886BINARY(instance_div, "__div__")
887BINARY(instance_mod, "__mod__")
888BINARY(instance_divmod, "__divmod__")
Guido van Rossume7737541994-09-05 07:31:41 +0000889BINARY(instance_pow, "__pow__")
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890UNARY(instance_neg, "__neg__")
891UNARY(instance_pos, "__pos__")
892UNARY(instance_abs, "__abs__")
893
Guido van Rossum9bfef441993-03-29 10:43:31 +0000894static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000895instance_nonzero(self)
896 instanceobject *self;
897{
898 object *func, *res;
899 long outcome;
900
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000901 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000902 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000903 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000904 err_clear();
905 /* Fall back to the default behavior:
906 all instances are nonzero */
907 return 1;
908 }
909 }
910 res = call_object(func, (object *)NULL);
911 DECREF(func);
912 if (res == NULL)
913 return -1;
914 if (!is_intobject(res)) {
915 DECREF(res);
916 err_setstr(TypeError, "__nonzero__ should return an int");
917 return -1;
918 }
919 outcome = getintvalue(res);
920 DECREF(res);
921 if (outcome < 0) {
922 err_setstr(ValueError, "__nonzero__ should return >= 0");
923 return -1;
924 }
925 return outcome > 0;
926}
927
928UNARY(instance_invert, "__invert__")
929BINARY(instance_lshift, "__lshift__")
930BINARY(instance_rshift, "__rshift__")
931BINARY(instance_and, "__and__")
932BINARY(instance_xor, "__xor__")
933BINARY(instance_or, "__or__")
934
Guido van Rossume6eefc21992-08-14 12:06:52 +0000935static int
936instance_coerce(pv, pw)
937 object **pv, **pw;
938{
939 object *v = *pv;
940 object *w = *pw;
941 object *func;
942 object *res;
943 int outcome;
944
945 if (!is_instanceobject(v))
946 return 1; /* XXX shouldn't be possible */
947 func = instance_getattr((instanceobject *)v, "__coerce__");
948 if (func == NULL) {
949 err_clear();
950 return 1;
951 }
952 res = call_object(func, w);
953 if (res == NULL)
954 return -1;
955 if (res == None) {
956 DECREF(res);
957 return 1;
958 }
959 outcome = getargs(res, "(OO)", &v, &w);
960 if (!outcome || v->ob_type != w->ob_type ||
961 v->ob_type->tp_as_number == NULL) {
962 DECREF(res);
963 err_setstr(TypeError, "bad __coerce__ result");
964 return -1;
965 }
966 INCREF(v);
967 INCREF(w);
968 DECREF(res);
969 *pv = v;
970 *pw = w;
971 return 0;
972}
973
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000974UNARY(instance_int, "__int__")
975UNARY(instance_long, "__long__")
976UNARY(instance_float, "__float__")
977UNARY(instance_oct, "__oct__")
978UNARY(instance_hex, "__hex__")
979
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980static number_methods instance_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000981 (binaryfunc)instance_add, /*nb_add*/
982 (binaryfunc)instance_sub, /*nb_subtract*/
983 (binaryfunc)instance_mul, /*nb_multiply*/
984 (binaryfunc)instance_div, /*nb_divide*/
985 (binaryfunc)instance_mod, /*nb_remainder*/
986 (binaryfunc)instance_divmod, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000987 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000988 (unaryfunc)instance_neg, /*nb_negative*/
989 (unaryfunc)instance_pos, /*nb_positive*/
990 (unaryfunc)instance_abs, /*nb_absolute*/
991 (inquiry)instance_nonzero, /*nb_nonzero*/
992 (unaryfunc)instance_invert, /*nb_invert*/
993 (binaryfunc)instance_lshift, /*nb_lshift*/
994 (binaryfunc)instance_rshift, /*nb_rshift*/
995 (binaryfunc)instance_and, /*nb_and*/
996 (binaryfunc)instance_xor, /*nb_xor*/
997 (binaryfunc)instance_or, /*nb_or*/
998 (coercion)instance_coerce, /*nb_coerce*/
999 (unaryfunc)instance_int, /*nb_int*/
1000 (unaryfunc)instance_long, /*nb_long*/
1001 (unaryfunc)instance_float, /*nb_float*/
1002 (unaryfunc)instance_oct, /*nb_oct*/
1003 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001004};
1005
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001006typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001007 OB_HEAD_INIT(&Typetype)
1008 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001009 "instance",
1010 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001011 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001013 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +00001014 (object * (*) FPROTO((object *, char *)))
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015 (getattrfunc)instance_getattr, /*tp_getattr*/
1016 (setattrfunc)instance_setattr, /*tp_setattr*/
1017 (cmpfunc)instance_compare, /*tp_compare*/
1018 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 &instance_as_number, /*tp_as_number*/
1020 &instance_as_sequence, /*tp_as_sequence*/
1021 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001022 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001023};
1024
1025
Guido van Rossum81daa321993-05-20 14:24:46 +00001026/* Instance method objects are used for two purposes:
1027 (a) as bound instance methods (returned by instancename.methodname)
1028 (b) as unbound methods (returned by ClassName.methodname)
1029 In case (b), im_self is NULL
1030*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001031
1032typedef struct {
1033 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001034 object *im_func; /* The function implementing the method */
1035 object *im_self; /* The instance it is bound to, or NULL */
1036 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001037} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001038
1039object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001040newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001041 object *func;
1042 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001043 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001044{
Guido van Rossume8122f11991-05-05 20:03:07 +00001045 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001046 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001047 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001048 return NULL;
1049 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001050 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1051 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001052 return NULL;
1053 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001054 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001055 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001056 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001057 INCREF(class);
1058 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001059 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001060}
1061
1062object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001063instancemethodgetfunc(im)
1064 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001065{
Guido van Rossume8122f11991-05-05 20:03:07 +00001066 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001067 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001068 return NULL;
1069 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001070 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001071}
1072
1073object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001074instancemethodgetself(im)
1075 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001076{
Guido van Rossume8122f11991-05-05 20:03:07 +00001077 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001078 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001079 return NULL;
1080 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001081 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001082}
1083
Guido van Rossum81daa321993-05-20 14:24:46 +00001084object *
1085instancemethodgetclass(im)
1086 register object *im;
1087{
1088 if (!is_instancemethodobject(im)) {
1089 err_badcall();
1090 return NULL;
1091 }
1092 return ((instancemethodobject *)im)->im_class;
1093}
1094
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001095/* Class method methods */
1096
Guido van Rossume8122f11991-05-05 20:03:07 +00001097#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001098
Guido van Rossume8122f11991-05-05 20:03:07 +00001099static struct memberlist instancemethod_memberlist[] = {
1100 {"im_func", T_OBJECT, OFF(im_func)},
1101 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001102 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001103 {NULL} /* Sentinel */
1104};
1105
1106static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001107instancemethod_getattr(im, name)
1108 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001109 char *name;
1110{
Guido van Rossume8122f11991-05-05 20:03:07 +00001111 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112}
1113
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001114static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001115instancemethod_dealloc(im)
1116 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001117{
Guido van Rossume8122f11991-05-05 20:03:07 +00001118 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001119 XDECREF(im->im_self);
1120 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001121 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001122}
1123
Guido van Rossumebc8c511992-09-03 20:39:51 +00001124static int
1125instancemethod_compare(a, b)
1126 instancemethodobject *a, *b;
1127{
1128 int cmp = cmpobject(a->im_self, b->im_self);
1129 if (cmp == 0)
1130 cmp = cmpobject(a->im_func, b->im_func);
1131 return cmp;
1132}
1133
Guido van Rossum25831651993-05-19 14:50:45 +00001134static object *
1135instancemethod_repr(a)
1136 instancemethodobject *a;
1137{
1138 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001139 instanceobject *self = (instanceobject *)(a->im_self);
1140 funcobject *func = (funcobject *)(a->im_func);
1141 classobject *class = (classobject *)(a->im_class);
1142 object *fclassname, *iclassname, *funcname;
1143 char *fcname, *icname, *fname;
1144 fclassname = class->cl_name;
1145 funcname = func->func_name;
1146 if (fclassname != NULL && is_stringobject(fclassname))
1147 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001148 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001149 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001150 if (funcname != NULL && is_stringobject(funcname))
1151 fname = getstringvalue(funcname);
1152 else
1153 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001154 if (self == NULL)
1155 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1156 else {
1157 iclassname = self->in_class->cl_name;
1158 if (iclassname != NULL && is_stringobject(iclassname))
1159 icname = getstringvalue(iclassname);
1160 else
1161 icname = "?";
1162 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1163 fcname, fname, icname, (long)self);
1164 }
Guido van Rossum25831651993-05-19 14:50:45 +00001165 return newstringobject(buf);
1166}
1167
Guido van Rossum9bfef441993-03-29 10:43:31 +00001168static long
1169instancemethod_hash(a)
1170 instancemethodobject *a;
1171{
1172 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001173 if (a->im_self == NULL)
1174 x = hashobject(None);
1175 else
1176 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001177 if (x == -1)
1178 return -1;
1179 y = hashobject(a->im_func);
1180 if (y == -1)
1181 return -1;
1182 return x ^ y;
1183}
1184
Guido van Rossume8122f11991-05-05 20:03:07 +00001185typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001186 OB_HEAD_INIT(&Typetype)
1187 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001188 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001189 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001190 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001191 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001192 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001193 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001194 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001195 (cmpfunc)instancemethod_compare, /*tp_compare*/
1196 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197 0, /*tp_as_number*/
1198 0, /*tp_as_sequence*/
1199 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001200 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001201};