blob: bc61b649c142ae9237feb2206c691124185de0ed [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, 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 Rossum85a5fbb1990-10-14 12:07:46 +000032typedef struct {
33 OB_HEAD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034 object *cl_bases; /* A tuple */
35 object *cl_methods; /* A dictionary */
Guido van Rossum94308391991-10-20 20:11:48 +000036 object *cl_name; /* A string */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037} classobject;
38
39object *
Guido van Rossum94308391991-10-20 20:11:48 +000040newclassobject(bases, methods, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041 object *bases; /* NULL or tuple of classobjects! */
42 object *methods;
Guido van Rossum94308391991-10-20 20:11:48 +000043 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044{
45 classobject *op;
Guido van Rossume2966a61991-12-10 13:53:23 +000046 if (bases == NULL) {
47 bases = newtupleobject(0);
48 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000049 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000050 }
51 else
52 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000054 if (op == NULL) {
55 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000057 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 op->cl_bases = bases;
59 INCREF(methods);
60 op->cl_methods = methods;
Guido van Rossum94308391991-10-20 20:11:48 +000061 XINCREF(name);
62 op->cl_name = name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 return (object *) op;
64}
65
66/* Class methods */
67
68static void
69class_dealloc(op)
70 classobject *op;
71{
Guido van Rossume2966a61991-12-10 13:53:23 +000072 DECREF(op->cl_bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 DECREF(op->cl_methods);
Guido van Rossum94308391991-10-20 20:11:48 +000074 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 free((ANY *)op);
76}
77
78static object *
79class_getattr(op, name)
80 register classobject *op;
81 register char *name;
82{
83 register object *v;
Guido van Rossum94308391991-10-20 20:11:48 +000084 if (strcmp(name, "__dict__") == 0) {
85 INCREF(op->cl_methods);
86 return op->cl_methods;
87 }
88 if (strcmp(name, "__bases__") == 0) {
Guido van Rossum94308391991-10-20 20:11:48 +000089 INCREF(op->cl_bases);
90 return op->cl_bases;
91 }
92 if (strcmp(name, "__name__") == 0) {
93 if (op->cl_name == NULL)
94 v = None;
95 else
96 v = op->cl_name;
97 INCREF(v);
98 return v;
99 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 v = dictlookup(op->cl_methods, name);
101 if (v != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000102 if (is_accessobject(v))
103 v = getaccessvalue(v, (object *)NULL);
104 else
105 INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 return v;
107 }
Guido van Rossume2966a61991-12-10 13:53:23 +0000108 {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109 int n = gettuplesize(op->cl_bases);
110 int i;
111 for (i = 0; i < n; i++) {
Guido van Rossum85998fa1992-03-27 17:23:48 +0000112 v = class_getattr((classobject *)
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000113 gettupleitem(op->cl_bases, i), name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114 if (v != NULL)
115 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000116 err_clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 }
118 }
Guido van Rossume2966a61991-12-10 13:53:23 +0000119 err_setstr(AttributeError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 return NULL;
121}
122
Guido van Rossum94308391991-10-20 20:11:48 +0000123static int
124class_setattr(op, name, v)
125 classobject *op;
126 char *name;
127 object *v;
128{
Guido van Rossum25831651993-05-19 14:50:45 +0000129 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000130 if (name[0] == '_' && name[1] == '_') {
131 int n = strlen(name);
132 if (name[n-1] == '_' && name[n-2] == '_') {
133 err_setstr(TypeError, "read-only special attribute");
134 return -1;
135 }
136 }
Guido van Rossum25831651993-05-19 14:50:45 +0000137 ac = dictlookup(op->cl_methods, name);
138 if (ac != NULL && is_accessobject(ac))
139 return setaccessvalue(ac, (object *)NULL, v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000140 if (v == NULL) {
141 int rv = dictremove(op->cl_methods, name);
142 if (rv < 0)
143 err_setstr(AttributeError,
144 "delete non-existing class attribute");
145 return rv;
146 }
Guido van Rossum94308391991-10-20 20:11:48 +0000147 else
148 return dictinsert(op->cl_methods, name, v);
149}
150
Guido van Rossum25831651993-05-19 14:50:45 +0000151static object *
152class_repr(op)
153 classobject *op;
154{
155 char buf[140];
156 char *name;
157 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
158 name = "?";
159 else
160 name = getstringvalue(op->cl_name);
161 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
162 return newstringobject(buf);
163}
164
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165typeobject Classtype = {
166 OB_HEAD_INIT(&Typetype)
167 0,
168 "class",
169 sizeof(classobject),
170 0,
171 class_dealloc, /*tp_dealloc*/
172 0, /*tp_print*/
173 class_getattr, /*tp_getattr*/
Guido van Rossum94308391991-10-20 20:11:48 +0000174 class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175 0, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +0000176 class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177 0, /*tp_as_number*/
178 0, /*tp_as_sequence*/
179 0, /*tp_as_mapping*/
180};
181
182
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000183/* We're not done yet: next, we define instance objects... */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184
185typedef struct {
186 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000187 classobject *in_class; /* The class object */
188 object *in_attr; /* A dictionary */
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000189} instanceobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190
Guido van Rossum25831651993-05-19 14:50:45 +0000191static object *instance_getattr PROTO((instanceobject *, char *));
192
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193object *
Guido van Rossum25831651993-05-19 14:50:45 +0000194newinstanceobject(class, arg)
195 object *class;
196 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197{
Guido van Rossume8122f11991-05-05 20:03:07 +0000198 register instanceobject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000199 object *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000200 object *init;
201 int pos;
202 object *key, *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000204 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 return NULL;
206 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000207 inst = NEWOBJ(instanceobject, &Instancetype);
208 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 return NULL;
210 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000211 inst->in_class = (classobject *)class;
212 inst->in_attr = newdictobject();
213 if (inst->in_attr == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000214 error:
Guido van Rossume8122f11991-05-05 20:03:07 +0000215 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216 return NULL;
217 }
Guido van Rossum25831651993-05-19 14:50:45 +0000218 pos = 0;
219 while (mappinggetnext(((classobject *)class)->cl_methods,
220 &pos, &key, &value)) {
221 if (is_accessobject(value)) {
222 object *ac = cloneaccessobject(value);
223 int err;
224 if (ac == NULL)
225 goto error;
226 err = dict2insert(inst->in_attr, key, ac);
227 DECREF(ac);
228 if (err)
229 goto error;
230 }
231 }
232 init = instance_getattr(inst, "__init__");
233 if (init == NULL) {
234 err_clear();
235 if (arg != NULL && !(is_tupleobject(arg) &&
236 gettuplesize(arg) == 0)) {
237 err_setstr(TypeError,
238 "this classobject() takes no arguments");
239 DECREF(inst);
240 inst = NULL;
241 }
242 }
243 else {
244 object *res = call_object(init, arg);
245 DECREF(init);
246 if (res == NULL) {
247 DECREF(inst);
248 inst = NULL;
249 }
250 else {
251 if (res != None) {
252 err_setstr(TypeError,
253 "__init__() should return None");
254 DECREF(inst);
255 inst = NULL;
256 }
257 DECREF(res);
258 }
259 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000260 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261}
262
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000263/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264
265static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000266instance_dealloc(inst)
267 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268{
Guido van Rossum25831651993-05-19 14:50:45 +0000269 object *error_type, *error_value;
270 object *del;
271 /* Call the __del__ method if it exists. First temporarily
272 revive the object and save the current exception, if any. */
273 INCREF(inst);
274 err_get(&error_type, &error_value);
275 if ((del = instance_getattr(inst, "__del__")) != NULL) {
276 object *args = newtupleobject(0);
277 object *res = args;
278 if (res != NULL)
279 res = call_object(del, args);
280 XDECREF(args);
281 DECREF(del);
282 XDECREF(res);
283 /* XXX If __del__ raised an exception, it is ignored! */
284 }
285 /* Restore the saved exception and undo the temporary revival */
286 err_setval(error_type, error_value);
287 /* Can't use DECREF here, it would cause a recursive call */
288 if (--inst->ob_refcnt > 0)
289 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000290 DECREF(inst->in_class);
Guido van Rossum25831651993-05-19 14:50:45 +0000291 XDECREF(inst->in_attr);
Guido van Rossume8122f11991-05-05 20:03:07 +0000292 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293}
294
295static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000296instance_getattr(inst, name)
297 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298 register char *name;
299{
Guido van Rossum94308391991-10-20 20:11:48 +0000300 register object *v;
301 if (strcmp(name, "__dict__") == 0) {
302 INCREF(inst->in_attr);
303 return inst->in_attr;
304 }
305 if (strcmp(name, "__class__") == 0) {
306 INCREF(inst->in_class);
307 return (object *)inst->in_class;
308 }
309 v = dictlookup(inst->in_attr, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 if (v != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000311 if (is_accessobject(v))
312 v = getaccessvalue(v, (object *)NULL);
313 else
314 INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 return v;
316 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000317 v = class_getattr(inst->in_class, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 if (v == NULL)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000319 return v; /* class_getattr() has set the error */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 if (is_funcobject(v)) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000321 object *w = newinstancemethodobject(v, (object *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 DECREF(v);
323 return w;
324 }
325 DECREF(v);
Guido van Rossume2966a61991-12-10 13:53:23 +0000326 err_setstr(AttributeError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 return NULL;
328}
329
330static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000331instance_setattr(inst, name, v)
332 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 char *name;
334 object *v;
335{
Guido van Rossum25831651993-05-19 14:50:45 +0000336 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000337 if (name[0] == '_' && name[1] == '_') {
338 int n = strlen(name);
339 if (name[n-1] == '_' && name[n-2] == '_') {
340 err_setstr(TypeError, "read-only special attribute");
341 return -1;
342 }
343 }
Guido van Rossum25831651993-05-19 14:50:45 +0000344 ac = dictlookup(inst->in_attr, name);
345 if (ac != NULL && is_accessobject(ac))
346 return setaccessvalue(ac, (object *)NULL, v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000347 if (v == NULL) {
348 int rv = dictremove(inst->in_attr, name);
349 if (rv < 0)
350 err_setstr(AttributeError,
351 "delete non-existing instance attribute");
352 return rv;
353 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354 else
Guido van Rossume8122f11991-05-05 20:03:07 +0000355 return dictinsert(inst->in_attr, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356}
357
Guido van Rossum9bfef441993-03-29 10:43:31 +0000358static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000359instance_repr(inst)
360 instanceobject *inst;
361{
362 object *func;
363 object *res;
364
365 func = instance_getattr(inst, "__repr__");
366 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000367 char buf[140];
368 object *classname = inst->in_class->cl_name;
369 char *cname;
370 if (classname != NULL && is_stringobject(classname))
371 cname = getstringvalue(classname);
372 else
373 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000374 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000375 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000376 return newstringobject(buf);
377 }
378 res = call_object(func, (object *)NULL);
379 DECREF(func);
380 return res;
381}
382
Guido van Rossum9bfef441993-03-29 10:43:31 +0000383static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000384instance_compare(inst, other)
385 instanceobject *inst, *other;
386{
387 object *func;
388 object *res;
389 int outcome;
390
391 func = instance_getattr(inst, "__cmp__");
392 if (func == NULL) {
393 err_clear();
394 if (inst < other)
395 return -1;
396 if (inst > other)
397 return 1;
398 return 0;
399 }
400 res = call_object(func, (object *)other);
401 DECREF(func);
402 if (res == NULL) {
403 err_clear(); /* XXX Should report the error, bot how...??? */
404 return 0;
405 }
406 if (is_intobject(res))
407 outcome = getintvalue(res);
408 else
409 outcome = 0; /* XXX Should report the error, bot how...??? */
410 DECREF(res);
411 return outcome;
412}
413
Guido van Rossum9bfef441993-03-29 10:43:31 +0000414static long
415instance_hash(inst)
416 instanceobject *inst;
417{
418 object *func;
419 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000420 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000421
422 func = instance_getattr(inst, "__hash__");
423 if (func == NULL) {
424 /* If there is no __cmp__ method, we hash on the address.
425 If a __cmp__ method exists, there must be a __hash__. */
426 err_clear();
427 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000428 if (func == NULL) {
429 err_clear();
430 outcome = (long)inst;
431 if (outcome == -1)
432 outcome = -2;
433 return outcome;
434 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000435 err_setstr(TypeError, "unhashable instance");
436 return -1;
437 }
438 res = call_object(func, (object *)NULL);
439 DECREF(func);
440 if (res == NULL)
441 return -1;
442 if (is_intobject(res)) {
443 outcome = getintvalue(res);
444 if (outcome == -1)
445 outcome = -2;
446 }
447 else {
448 err_setstr(TypeError, "__hash__() should return an int");
449 outcome = -1;
450 }
451 DECREF(res);
452 return outcome;
453}
454
455static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000456instance_length(inst)
457 instanceobject *inst;
458{
459 object *func;
460 object *res;
461 int outcome;
462
463 func = instance_getattr(inst, "__len__");
464 if (func == NULL)
465 return -1;
466 res = call_object(func, (object *)NULL);
467 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000468 if (res == NULL)
469 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000470 if (is_intobject(res)) {
471 outcome = getintvalue(res);
472 if (outcome < 0)
473 err_setstr(ValueError, "__len__() should return >= 0");
474 }
475 else {
476 err_setstr(TypeError, "__len__() should return an int");
477 outcome = -1;
478 }
479 DECREF(res);
480 return outcome;
481}
482
Guido van Rossum9bfef441993-03-29 10:43:31 +0000483static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000484instance_subscript(inst, key)
485 instanceobject *inst;
486 object *key;
487{
488 object *func;
489 object *arg;
490 object *res;
491
492 func = instance_getattr(inst, "__getitem__");
493 if (func == NULL)
494 return NULL;
495 arg = mkvalue("(O)", key);
496 if (arg == NULL) {
497 DECREF(func);
498 return NULL;
499 }
500 res = call_object(func, arg);
501 DECREF(func);
502 DECREF(arg);
503 return res;
504}
505
Guido van Rossum9bfef441993-03-29 10:43:31 +0000506static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000507instance_ass_subscript(inst, key, value)
508 instanceobject*inst;
509 object *key;
510 object *value;
511{
512 object *func;
513 object *arg;
514 object *res;
515
516 if (value == NULL)
517 func = instance_getattr(inst, "__delitem__");
518 else
519 func = instance_getattr(inst, "__setitem__");
520 if (func == NULL)
521 return -1;
522 if (value == NULL)
523 arg = mkvalue("(O)", key);
524 else
525 arg = mkvalue("(OO)", key, value);
526 if (arg == NULL) {
527 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000528 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000529 }
530 res = call_object(func, arg);
531 DECREF(func);
532 DECREF(arg);
533 if (res == NULL)
534 return -1;
535 DECREF(res);
536 return 0;
537}
538
Guido van Rossum9bfef441993-03-29 10:43:31 +0000539static mapping_methods instance_as_mapping = {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000540 instance_length, /*mp_length*/
541 instance_subscript, /*mp_subscript*/
542 instance_ass_subscript, /*mp_ass_subscript*/
543};
544
545static object *
546instance_concat(inst, other)
547 instanceobject *inst, *other;
548{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000549 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000550
551 func = instance_getattr(inst, "__add__");
552 if (func == NULL)
553 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000554 arg = mkvalue("(O)", other);
555 if (arg == NULL) {
556 DECREF(func);
557 return NULL;
558 }
559 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000560 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000561 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000562 return res;
563}
564
565static object *
566instance_repeat(inst, count)
567 instanceobject *inst;
568 int count;
569{
570 object *func, *arg, *res;
571
572 func = instance_getattr(inst, "__mul__");
573 if (func == NULL)
574 return NULL;
575 arg = newintobject((long)count);
576 if (arg == NULL) {
577 DECREF(func);
578 return NULL;
579 }
580 res = call_object(func, arg);
581 DECREF(func);
582 DECREF(arg);
583 return res;
584}
585
586static object *
587instance_item(inst, i)
588 instanceobject *inst;
589 int i;
590{
591 object *func, *arg, *res;
592
593 func = instance_getattr(inst, "__getitem__");
594 if (func == NULL)
595 return NULL;
596 arg = newintobject((long)i);
597 if (arg == NULL) {
598 DECREF(func);
599 return NULL;
600 }
601 res = call_object(func, arg);
602 DECREF(func);
603 DECREF(arg);
604 return res;
605}
606
607static object *
608instance_slice(inst, i, j)
609 instanceobject *inst;
610 int i, j;
611{
612 object *func, *arg, *res;
613
614 func = instance_getattr(inst, "__getslice__");
615 if (func == NULL)
616 return NULL;
617 arg = mkvalue("(ii)", i, j);
618 if (arg == NULL) {
619 DECREF(func);
620 return NULL;
621 }
622 res = call_object(func, arg);
623 DECREF(func);
624 DECREF(arg);
625 return res;
626}
627
628static int
629instance_ass_item(inst, i, item)
630 instanceobject *inst;
631 int i;
632 object *item;
633{
634 object *func, *arg, *res;
635
636 if (item == NULL)
637 func = instance_getattr(inst, "__delitem__");
638 else
639 func = instance_getattr(inst, "__setitem__");
640 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000641 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000642 if (item == NULL)
643 arg = mkvalue("i", i);
644 else
645 arg = mkvalue("(iO)", i, item);
646 if (arg == NULL) {
647 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000648 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000649 }
650 res = call_object(func, arg);
651 DECREF(func);
652 DECREF(arg);
653 if (res == NULL)
654 return -1;
655 DECREF(res);
656 return 0;
657}
658
659static int
660instance_ass_slice(inst, i, j, value)
661 instanceobject *inst;
662 int i, j;
663 object *value;
664{
665 object *func, *arg, *res;
666
667 if (value == NULL)
668 func = instance_getattr(inst, "__delslice__");
669 else
670 func = instance_getattr(inst, "__setslice__");
671 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000672 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000673 if (value == NULL)
674 arg = mkvalue("(ii)", i, j);
675 else
676 arg = mkvalue("(iiO)", i, j, value);
677 if (arg == NULL) {
678 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000679 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000680 }
681 res = call_object(func, arg);
682 DECREF(func);
683 DECREF(arg);
684 if (res == NULL)
685 return -1;
686 DECREF(res);
687 return 0;
688}
689
690static sequence_methods instance_as_sequence = {
691 instance_length, /*sq_length*/
692 instance_concat, /*sq_concat*/
693 instance_repeat, /*sq_repeat*/
694 instance_item, /*sq_item*/
695 instance_slice, /*sq_slice*/
696 instance_ass_item, /*sq_ass_item*/
697 instance_ass_slice, /*sq_ass_slice*/
698};
699
700static object *
701generic_binary_op(self, other, methodname)
702 instanceobject *self;
703 object *other;
704 char *methodname;
705{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000706 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000707
708 if ((func = instance_getattr(self, methodname)) == NULL)
709 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000710 arg = mkvalue("O", other);
711 if (arg == NULL) {
712 DECREF(func);
713 return NULL;
714 }
715 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000716 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000717 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000718 return res;
719}
720
721static object *
722generic_unary_op(self, methodname)
723 instanceobject *self;
724 char *methodname;
725{
726 object *func, *res;
727
728 if ((func = instance_getattr(self, methodname)) == NULL)
729 return NULL;
730 res = call_object(func, (object *)NULL);
731 DECREF(func);
732 return res;
733}
734
735#define BINARY(funcname, methodname) \
736static object * funcname(self, other) instanceobject *self; object *other; { \
737 return generic_binary_op(self, other, methodname); \
738}
739
740#define UNARY(funcname, methodname) \
741static object *funcname(self) instanceobject *self; { \
742 return generic_unary_op(self, methodname); \
743}
744
745BINARY(instance_add, "__add__")
746BINARY(instance_sub, "__sub__")
747BINARY(instance_mul, "__mul__")
748BINARY(instance_div, "__div__")
749BINARY(instance_mod, "__mod__")
750BINARY(instance_divmod, "__divmod__")
751BINARY(instance_pow, "__pow__")
752UNARY(instance_neg, "__neg__")
753UNARY(instance_pos, "__pos__")
754UNARY(instance_abs, "__abs__")
755
Guido van Rossum9bfef441993-03-29 10:43:31 +0000756static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000757instance_nonzero(self)
758 instanceobject *self;
759{
760 object *func, *res;
761 long outcome;
762
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000763 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000764 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000765 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766 err_clear();
767 /* Fall back to the default behavior:
768 all instances are nonzero */
769 return 1;
770 }
771 }
772 res = call_object(func, (object *)NULL);
773 DECREF(func);
774 if (res == NULL)
775 return -1;
776 if (!is_intobject(res)) {
777 DECREF(res);
778 err_setstr(TypeError, "__nonzero__ should return an int");
779 return -1;
780 }
781 outcome = getintvalue(res);
782 DECREF(res);
783 if (outcome < 0) {
784 err_setstr(ValueError, "__nonzero__ should return >= 0");
785 return -1;
786 }
787 return outcome > 0;
788}
789
790UNARY(instance_invert, "__invert__")
791BINARY(instance_lshift, "__lshift__")
792BINARY(instance_rshift, "__rshift__")
793BINARY(instance_and, "__and__")
794BINARY(instance_xor, "__xor__")
795BINARY(instance_or, "__or__")
796
Guido van Rossume6eefc21992-08-14 12:06:52 +0000797static int
798instance_coerce(pv, pw)
799 object **pv, **pw;
800{
801 object *v = *pv;
802 object *w = *pw;
803 object *func;
804 object *res;
805 int outcome;
806
807 if (!is_instanceobject(v))
808 return 1; /* XXX shouldn't be possible */
809 func = instance_getattr((instanceobject *)v, "__coerce__");
810 if (func == NULL) {
811 err_clear();
812 return 1;
813 }
814 res = call_object(func, w);
815 if (res == NULL)
816 return -1;
817 if (res == None) {
818 DECREF(res);
819 return 1;
820 }
821 outcome = getargs(res, "(OO)", &v, &w);
822 if (!outcome || v->ob_type != w->ob_type ||
823 v->ob_type->tp_as_number == NULL) {
824 DECREF(res);
825 err_setstr(TypeError, "bad __coerce__ result");
826 return -1;
827 }
828 INCREF(v);
829 INCREF(w);
830 DECREF(res);
831 *pv = v;
832 *pw = w;
833 return 0;
834}
835
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000836UNARY(instance_int, "__int__")
837UNARY(instance_long, "__long__")
838UNARY(instance_float, "__float__")
839UNARY(instance_oct, "__oct__")
840UNARY(instance_hex, "__hex__")
841
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842static number_methods instance_as_number = {
843 instance_add, /*nb_add*/
844 instance_sub, /*nb_subtract*/
845 instance_mul, /*nb_multiply*/
846 instance_div, /*nb_divide*/
847 instance_mod, /*nb_remainder*/
848 instance_divmod, /*nb_divmod*/
849 instance_pow, /*nb_power*/
850 instance_neg, /*nb_negative*/
851 instance_pos, /*nb_positive*/
852 instance_abs, /*nb_absolute*/
853 instance_nonzero, /*nb_nonzero*/
854 instance_invert, /*nb_invert*/
855 instance_lshift, /*nb_lshift*/
856 instance_rshift, /*nb_rshift*/
857 instance_and, /*nb_and*/
858 instance_xor, /*nb_xor*/
859 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000860 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000861 instance_int, /*nb_int*/
862 instance_long, /*nb_long*/
863 instance_float, /*nb_float*/
864 instance_oct, /*nb_oct*/
865 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000866};
867
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000868typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000869 OB_HEAD_INIT(&Typetype)
870 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000871 "instance",
872 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000873 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000874 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000875 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +0000876 (object * (*) FPROTO((object *, char *)))
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000877 instance_getattr, /*tp_getattr*/
878 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000879 instance_compare, /*tp_compare*/
880 instance_repr, /*tp_repr*/
881 &instance_as_number, /*tp_as_number*/
882 &instance_as_sequence, /*tp_as_sequence*/
883 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000884 instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000885};
886
Guido van Rossum9bfef441993-03-29 10:43:31 +0000887static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888instance_convert(inst, methodname)
889 object *inst;
890 char *methodname;
891{
892 return generic_unary_op((instanceobject *)inst, methodname);
893}
894
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000895
Guido van Rossum94308391991-10-20 20:11:48 +0000896/* And finally, here are instance method objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000897
898typedef struct {
899 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000900 object *im_func; /* The method function */
901 object *im_self; /* The object to which this applies */
902} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000903
904object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000905newinstancemethodobject(func, self)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000906 object *func;
907 object *self;
908{
Guido van Rossume8122f11991-05-05 20:03:07 +0000909 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000910 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000911 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000912 return NULL;
913 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000914 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
915 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000916 return NULL;
917 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000918 im->im_func = func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000919 INCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000920 im->im_self = self;
921 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000922}
923
924object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000925instancemethodgetfunc(im)
926 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000927{
Guido van Rossume8122f11991-05-05 20:03:07 +0000928 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000929 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000930 return NULL;
931 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000932 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000933}
934
935object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000936instancemethodgetself(im)
937 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000938{
Guido van Rossume8122f11991-05-05 20:03:07 +0000939 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000940 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000941 return NULL;
942 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000943 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000944}
945
946/* Class method methods */
947
Guido van Rossume8122f11991-05-05 20:03:07 +0000948#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000949
Guido van Rossume8122f11991-05-05 20:03:07 +0000950static struct memberlist instancemethod_memberlist[] = {
951 {"im_func", T_OBJECT, OFF(im_func)},
952 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000953 {NULL} /* Sentinel */
954};
955
956static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000957instancemethod_getattr(im, name)
958 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000959 char *name;
960{
Guido van Rossume8122f11991-05-05 20:03:07 +0000961 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000962}
963
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000964static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000965instancemethod_dealloc(im)
966 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000967{
Guido van Rossume8122f11991-05-05 20:03:07 +0000968 DECREF(im->im_func);
969 DECREF(im->im_self);
970 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000971}
972
Guido van Rossumebc8c511992-09-03 20:39:51 +0000973static int
974instancemethod_compare(a, b)
975 instancemethodobject *a, *b;
976{
977 int cmp = cmpobject(a->im_self, b->im_self);
978 if (cmp == 0)
979 cmp = cmpobject(a->im_func, b->im_func);
980 return cmp;
981}
982
Guido van Rossum25831651993-05-19 14:50:45 +0000983static object *
984instancemethod_repr(a)
985 instancemethodobject *a;
986{
987 char buf[240];
988 object *classname =
989 ((instanceobject *)(a->im_self))->in_class->cl_name;
990 object *funcname = ((funcobject *)(a->im_func))->func_name;
991 char *cname, *fname;
992 if (classname != NULL && is_stringobject(classname))
993 cname = getstringvalue(classname);
994 else
995 cname = "?";
996 if (funcname != NULL && is_stringobject(funcname))
997 fname = getstringvalue(funcname);
998 else
999 fname = "?";
1000 sprintf(buf, "<method %.100s of %.100s instance at %lx>",
1001 fname, cname, (long)a->im_func);
1002 return newstringobject(buf);
1003}
1004
Guido van Rossum9bfef441993-03-29 10:43:31 +00001005static long
1006instancemethod_hash(a)
1007 instancemethodobject *a;
1008{
1009 long x, y;
1010 x = hashobject(a->im_self);
1011 if (x == -1)
1012 return -1;
1013 y = hashobject(a->im_func);
1014 if (y == -1)
1015 return -1;
1016 return x ^ y;
1017}
1018
Guido van Rossume8122f11991-05-05 20:03:07 +00001019typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001020 OB_HEAD_INIT(&Typetype)
1021 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001022 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001023 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001024 0,
Guido van Rossume8122f11991-05-05 20:03:07 +00001025 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001026 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +00001027 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001028 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +00001029 instancemethod_compare, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +00001030 instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001031 0, /*tp_as_number*/
1032 0, /*tp_as_sequence*/
1033 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001034 instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001035};