blob: 514869c568d1a13c561ffe1417d957ef471637d1 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum8dd79cf1992-04-05 14:24:32 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
4
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
32extern typeobject MappingInstancetype;
33extern typeobject SequenceInstancetype;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034
35typedef struct {
36 OB_HEAD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037 object *cl_bases; /* A tuple */
38 object *cl_methods; /* A dictionary */
Guido van Rossum94308391991-10-20 20:11:48 +000039 object *cl_name; /* A string */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040} classobject;
41
42object *
Guido van Rossum94308391991-10-20 20:11:48 +000043newclassobject(bases, methods, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044 object *bases; /* NULL or tuple of classobjects! */
45 object *methods;
Guido van Rossum94308391991-10-20 20:11:48 +000046 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
48 classobject *op;
Guido van Rossume2966a61991-12-10 13:53:23 +000049 if (bases == NULL) {
50 bases = newtupleobject(0);
51 if (bases == NULL)
52 return err_nomem();
53 }
54 else
55 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000057 if (op == NULL) {
58 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000060 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061 op->cl_bases = bases;
62 INCREF(methods);
63 op->cl_methods = methods;
Guido van Rossum94308391991-10-20 20:11:48 +000064 XINCREF(name);
65 op->cl_name = name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 return (object *) op;
67}
68
69/* Class methods */
70
71static void
72class_dealloc(op)
73 classobject *op;
74{
Guido van Rossume2966a61991-12-10 13:53:23 +000075 DECREF(op->cl_bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 DECREF(op->cl_methods);
Guido van Rossum94308391991-10-20 20:11:48 +000077 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 free((ANY *)op);
79}
80
81static object *
82class_getattr(op, name)
83 register classobject *op;
84 register char *name;
85{
86 register object *v;
Guido van Rossum94308391991-10-20 20:11:48 +000087 if (strcmp(name, "__dict__") == 0) {
88 INCREF(op->cl_methods);
89 return op->cl_methods;
90 }
91 if (strcmp(name, "__bases__") == 0) {
Guido van Rossum94308391991-10-20 20:11:48 +000092 INCREF(op->cl_bases);
93 return op->cl_bases;
94 }
95 if (strcmp(name, "__name__") == 0) {
96 if (op->cl_name == NULL)
97 v = None;
98 else
99 v = op->cl_name;
100 INCREF(v);
101 return v;
102 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 v = dictlookup(op->cl_methods, name);
104 if (v != NULL) {
105 INCREF(v);
106 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 Rossum8dd79cf1992-04-05 14:24:32 +0000129 if (name[0] == '_' && name[1] == '_') {
130 int n = strlen(name);
131 if (name[n-1] == '_' && name[n-2] == '_') {
132 err_setstr(TypeError, "read-only special attribute");
133 return -1;
134 }
135 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000136 if (v == NULL) {
137 int rv = dictremove(op->cl_methods, name);
138 if (rv < 0)
139 err_setstr(AttributeError,
140 "delete non-existing class attribute");
141 return rv;
142 }
Guido van Rossum94308391991-10-20 20:11:48 +0000143 else
144 return dictinsert(op->cl_methods, name, v);
145}
146
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147typeobject Classtype = {
148 OB_HEAD_INIT(&Typetype)
149 0,
150 "class",
151 sizeof(classobject),
152 0,
153 class_dealloc, /*tp_dealloc*/
154 0, /*tp_print*/
155 class_getattr, /*tp_getattr*/
Guido van Rossum94308391991-10-20 20:11:48 +0000156 class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 0, /*tp_compare*/
158 0, /*tp_repr*/
159 0, /*tp_as_number*/
160 0, /*tp_as_sequence*/
161 0, /*tp_as_mapping*/
162};
163
164
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000165/* We're not done yet: next, we define instance objects... */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166
167typedef struct {
168 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000169 classobject *in_class; /* The class object */
170 object *in_attr; /* A dictionary */
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000171} instanceobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172
173object *
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000174newinstanceobject(class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175 register object *class;
176{
Guido van Rossume8122f11991-05-05 20:03:07 +0000177 register instanceobject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000178 object *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000180 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 return NULL;
182 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000183 inst = NEWOBJ(instanceobject, &Instancetype);
184 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185 return NULL;
186 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000187 inst->in_class = (classobject *)class;
188 inst->in_attr = newdictobject();
189 if (inst->in_attr == NULL) {
190 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191 return NULL;
192 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000193 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194}
195
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000196/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197
198static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000199instance_dealloc(inst)
200 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201{
Guido van Rossume8122f11991-05-05 20:03:07 +0000202 DECREF(inst->in_class);
203 if (inst->in_attr != NULL)
204 DECREF(inst->in_attr);
205 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206}
207
208static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000209instance_getattr(inst, name)
210 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 register char *name;
212{
Guido van Rossum94308391991-10-20 20:11:48 +0000213 register object *v;
214 if (strcmp(name, "__dict__") == 0) {
215 INCREF(inst->in_attr);
216 return inst->in_attr;
217 }
218 if (strcmp(name, "__class__") == 0) {
219 INCREF(inst->in_class);
220 return (object *)inst->in_class;
221 }
222 v = dictlookup(inst->in_attr, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 if (v != NULL) {
224 INCREF(v);
225 return v;
226 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000227 v = class_getattr(inst->in_class, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 if (v == NULL)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000229 return v; /* class_getattr() has set the error */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 if (is_funcobject(v)) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000231 object *w = newinstancemethodobject(v, (object *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 DECREF(v);
233 return w;
234 }
235 DECREF(v);
Guido van Rossume2966a61991-12-10 13:53:23 +0000236 err_setstr(AttributeError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 return NULL;
238}
239
240static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000241instance_setattr(inst, name, v)
242 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 char *name;
244 object *v;
245{
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000246 if (name[0] == '_' && name[1] == '_') {
247 int n = strlen(name);
248 if (name[n-1] == '_' && name[n-2] == '_') {
249 err_setstr(TypeError, "read-only special attribute");
250 return -1;
251 }
252 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000253 if (v == NULL) {
254 int rv = dictremove(inst->in_attr, name);
255 if (rv < 0)
256 err_setstr(AttributeError,
257 "delete non-existing instance attribute");
258 return rv;
259 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260 else
Guido van Rossume8122f11991-05-05 20:03:07 +0000261 return dictinsert(inst->in_attr, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262}
263
Guido van Rossum04691fc1992-08-12 15:35:34 +0000264int
265instance_print(inst, fp, flags)
266 instanceobject *inst;
267 FILE *fp;
268 int flags;
269{
270 object *func, *repr;
271 int ret;
272
273 func = instance_getattr(inst, "__repr__");
274 if (func == NULL) {
275 err_clear();
276 fprintf(fp, "<instance object at %lx>", (long)inst);
277 return 0;
278 }
279 repr = call_object(func, (object *)NULL);
280 DECREF(func);
281 if (repr == NULL)
282 return -1;
283 ret = printobject(repr, fp, flags | PRINT_RAW);
284 DECREF(repr);
285 return ret;
286}
287
288object *
289instance_repr(inst)
290 instanceobject *inst;
291{
292 object *func;
293 object *res;
294
295 func = instance_getattr(inst, "__repr__");
296 if (func == NULL) {
297 char buf[80];
298 err_clear();
299 sprintf(buf, "<instance object at %lx>", (long)inst);
300 return newstringobject(buf);
301 }
302 res = call_object(func, (object *)NULL);
303 DECREF(func);
304 return res;
305}
306
307int
308instance_compare(inst, other)
309 instanceobject *inst, *other;
310{
311 object *func;
312 object *res;
313 int outcome;
314
315 func = instance_getattr(inst, "__cmp__");
316 if (func == NULL) {
317 err_clear();
318 if (inst < other)
319 return -1;
320 if (inst > other)
321 return 1;
322 return 0;
323 }
324 res = call_object(func, (object *)other);
325 DECREF(func);
326 if (res == NULL) {
327 err_clear(); /* XXX Should report the error, bot how...??? */
328 return 0;
329 }
330 if (is_intobject(res))
331 outcome = getintvalue(res);
332 else
333 outcome = 0; /* XXX Should report the error, bot how...??? */
334 DECREF(res);
335 return outcome;
336}
337
338int
339instance_length(inst)
340 instanceobject *inst;
341{
342 object *func;
343 object *res;
344 int outcome;
345
346 func = instance_getattr(inst, "__len__");
347 if (func == NULL)
348 return -1;
349 res = call_object(func, (object *)NULL);
350 DECREF(func);
351 if (is_intobject(res)) {
352 outcome = getintvalue(res);
353 if (outcome < 0)
354 err_setstr(ValueError, "__len__() should return >= 0");
355 }
356 else {
357 err_setstr(TypeError, "__len__() should return an int");
358 outcome = -1;
359 }
360 DECREF(res);
361 return outcome;
362}
363
364object *
365instance_subscript(inst, key)
366 instanceobject *inst;
367 object *key;
368{
369 object *func;
370 object *arg;
371 object *res;
372
373 func = instance_getattr(inst, "__getitem__");
374 if (func == NULL)
375 return NULL;
376 arg = mkvalue("(O)", key);
377 if (arg == NULL) {
378 DECREF(func);
379 return NULL;
380 }
381 res = call_object(func, arg);
382 DECREF(func);
383 DECREF(arg);
384 return res;
385}
386
387int
388instance_ass_subscript(inst, key, value)
389 instanceobject*inst;
390 object *key;
391 object *value;
392{
393 object *func;
394 object *arg;
395 object *res;
396
397 if (value == NULL)
398 func = instance_getattr(inst, "__delitem__");
399 else
400 func = instance_getattr(inst, "__setitem__");
401 if (func == NULL)
402 return -1;
403 if (value == NULL)
404 arg = mkvalue("(O)", key);
405 else
406 arg = mkvalue("(OO)", key, value);
407 if (arg == NULL) {
408 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000409 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000410 }
411 res = call_object(func, arg);
412 DECREF(func);
413 DECREF(arg);
414 if (res == NULL)
415 return -1;
416 DECREF(res);
417 return 0;
418}
419
420mapping_methods instance_as_mapping = {
421 instance_length, /*mp_length*/
422 instance_subscript, /*mp_subscript*/
423 instance_ass_subscript, /*mp_ass_subscript*/
424};
425
426static object *
427instance_concat(inst, other)
428 instanceobject *inst, *other;
429{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000430 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000431
432 func = instance_getattr(inst, "__add__");
433 if (func == NULL)
434 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000435 arg = mkvalue("(O)", other);
436 if (arg == NULL) {
437 DECREF(func);
438 return NULL;
439 }
440 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000441 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000442 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000443 return res;
444}
445
446static object *
447instance_repeat(inst, count)
448 instanceobject *inst;
449 int count;
450{
451 object *func, *arg, *res;
452
453 func = instance_getattr(inst, "__mul__");
454 if (func == NULL)
455 return NULL;
456 arg = newintobject((long)count);
457 if (arg == NULL) {
458 DECREF(func);
459 return NULL;
460 }
461 res = call_object(func, arg);
462 DECREF(func);
463 DECREF(arg);
464 return res;
465}
466
467static object *
468instance_item(inst, i)
469 instanceobject *inst;
470 int i;
471{
472 object *func, *arg, *res;
473
474 func = instance_getattr(inst, "__getitem__");
475 if (func == NULL)
476 return NULL;
477 arg = newintobject((long)i);
478 if (arg == NULL) {
479 DECREF(func);
480 return NULL;
481 }
482 res = call_object(func, arg);
483 DECREF(func);
484 DECREF(arg);
485 return res;
486}
487
488static object *
489instance_slice(inst, i, j)
490 instanceobject *inst;
491 int i, j;
492{
493 object *func, *arg, *res;
494
495 func = instance_getattr(inst, "__getslice__");
496 if (func == NULL)
497 return NULL;
498 arg = mkvalue("(ii)", i, j);
499 if (arg == NULL) {
500 DECREF(func);
501 return NULL;
502 }
503 res = call_object(func, arg);
504 DECREF(func);
505 DECREF(arg);
506 return res;
507}
508
509static int
510instance_ass_item(inst, i, item)
511 instanceobject *inst;
512 int i;
513 object *item;
514{
515 object *func, *arg, *res;
516
517 if (item == NULL)
518 func = instance_getattr(inst, "__delitem__");
519 else
520 func = instance_getattr(inst, "__setitem__");
521 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000522 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000523 if (item == NULL)
524 arg = mkvalue("i", i);
525 else
526 arg = mkvalue("(iO)", i, item);
527 if (arg == NULL) {
528 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000529 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000530 }
531 res = call_object(func, arg);
532 DECREF(func);
533 DECREF(arg);
534 if (res == NULL)
535 return -1;
536 DECREF(res);
537 return 0;
538}
539
540static int
541instance_ass_slice(inst, i, j, value)
542 instanceobject *inst;
543 int i, j;
544 object *value;
545{
546 object *func, *arg, *res;
547
548 if (value == NULL)
549 func = instance_getattr(inst, "__delslice__");
550 else
551 func = instance_getattr(inst, "__setslice__");
552 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000553 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000554 if (value == NULL)
555 arg = mkvalue("(ii)", i, j);
556 else
557 arg = mkvalue("(iiO)", i, j, value);
558 if (arg == NULL) {
559 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000560 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000561 }
562 res = call_object(func, arg);
563 DECREF(func);
564 DECREF(arg);
565 if (res == NULL)
566 return -1;
567 DECREF(res);
568 return 0;
569}
570
571static sequence_methods instance_as_sequence = {
572 instance_length, /*sq_length*/
573 instance_concat, /*sq_concat*/
574 instance_repeat, /*sq_repeat*/
575 instance_item, /*sq_item*/
576 instance_slice, /*sq_slice*/
577 instance_ass_item, /*sq_ass_item*/
578 instance_ass_slice, /*sq_ass_slice*/
579};
580
581static object *
582generic_binary_op(self, other, methodname)
583 instanceobject *self;
584 object *other;
585 char *methodname;
586{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000587 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000588
589 if ((func = instance_getattr(self, methodname)) == NULL)
590 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000591 arg = mkvalue("O", other);
592 if (arg == NULL) {
593 DECREF(func);
594 return NULL;
595 }
596 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000597 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000598 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000599 return res;
600}
601
602static object *
603generic_unary_op(self, methodname)
604 instanceobject *self;
605 char *methodname;
606{
607 object *func, *res;
608
609 if ((func = instance_getattr(self, methodname)) == NULL)
610 return NULL;
611 res = call_object(func, (object *)NULL);
612 DECREF(func);
613 return res;
614}
615
616#define BINARY(funcname, methodname) \
617static object * funcname(self, other) instanceobject *self; object *other; { \
618 return generic_binary_op(self, other, methodname); \
619}
620
621#define UNARY(funcname, methodname) \
622static object *funcname(self) instanceobject *self; { \
623 return generic_unary_op(self, methodname); \
624}
625
626BINARY(instance_add, "__add__")
627BINARY(instance_sub, "__sub__")
628BINARY(instance_mul, "__mul__")
629BINARY(instance_div, "__div__")
630BINARY(instance_mod, "__mod__")
631BINARY(instance_divmod, "__divmod__")
632BINARY(instance_pow, "__pow__")
633UNARY(instance_neg, "__neg__")
634UNARY(instance_pos, "__pos__")
635UNARY(instance_abs, "__abs__")
636
637int
638instance_nonzero(self)
639 instanceobject *self;
640{
641 object *func, *res;
642 long outcome;
643
644 if ((func = instance_getattr(self, "__len__")) == NULL) {
645 err_clear();
646 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
647 err_clear();
648 /* Fall back to the default behavior:
649 all instances are nonzero */
650 return 1;
651 }
652 }
653 res = call_object(func, (object *)NULL);
654 DECREF(func);
655 if (res == NULL)
656 return -1;
657 if (!is_intobject(res)) {
658 DECREF(res);
659 err_setstr(TypeError, "__nonzero__ should return an int");
660 return -1;
661 }
662 outcome = getintvalue(res);
663 DECREF(res);
664 if (outcome < 0) {
665 err_setstr(ValueError, "__nonzero__ should return >= 0");
666 return -1;
667 }
668 return outcome > 0;
669}
670
671UNARY(instance_invert, "__invert__")
672BINARY(instance_lshift, "__lshift__")
673BINARY(instance_rshift, "__rshift__")
674BINARY(instance_and, "__and__")
675BINARY(instance_xor, "__xor__")
676BINARY(instance_or, "__or__")
677
Guido van Rossume6eefc21992-08-14 12:06:52 +0000678static int
679instance_coerce(pv, pw)
680 object **pv, **pw;
681{
682 object *v = *pv;
683 object *w = *pw;
684 object *func;
685 object *res;
686 int outcome;
687
688 if (!is_instanceobject(v))
689 return 1; /* XXX shouldn't be possible */
690 func = instance_getattr((instanceobject *)v, "__coerce__");
691 if (func == NULL) {
692 err_clear();
693 return 1;
694 }
695 res = call_object(func, w);
696 if (res == NULL)
697 return -1;
698 if (res == None) {
699 DECREF(res);
700 return 1;
701 }
702 outcome = getargs(res, "(OO)", &v, &w);
703 if (!outcome || v->ob_type != w->ob_type ||
704 v->ob_type->tp_as_number == NULL) {
705 DECREF(res);
706 err_setstr(TypeError, "bad __coerce__ result");
707 return -1;
708 }
709 INCREF(v);
710 INCREF(w);
711 DECREF(res);
712 *pv = v;
713 *pw = w;
714 return 0;
715}
716
Guido van Rossum04691fc1992-08-12 15:35:34 +0000717static number_methods instance_as_number = {
718 instance_add, /*nb_add*/
719 instance_sub, /*nb_subtract*/
720 instance_mul, /*nb_multiply*/
721 instance_div, /*nb_divide*/
722 instance_mod, /*nb_remainder*/
723 instance_divmod, /*nb_divmod*/
724 instance_pow, /*nb_power*/
725 instance_neg, /*nb_negative*/
726 instance_pos, /*nb_positive*/
727 instance_abs, /*nb_absolute*/
728 instance_nonzero, /*nb_nonzero*/
729 instance_invert, /*nb_invert*/
730 instance_lshift, /*nb_lshift*/
731 instance_rshift, /*nb_rshift*/
732 instance_and, /*nb_and*/
733 instance_xor, /*nb_xor*/
734 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000735 instance_coerce, /*nb_coerce*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000736};
737
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000738typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000739 OB_HEAD_INIT(&Typetype)
740 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000741 "instance",
742 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000743 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000744 instance_dealloc, /*tp_dealloc*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000745 instance_print, /*tp_print*/
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000746 instance_getattr, /*tp_getattr*/
747 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000748 instance_compare, /*tp_compare*/
749 instance_repr, /*tp_repr*/
750 &instance_as_number, /*tp_as_number*/
751 &instance_as_sequence, /*tp_as_sequence*/
752 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000753};
754
Guido van Rossum04691fc1992-08-12 15:35:34 +0000755object *
756instance_convert(inst, methodname)
757 object *inst;
758 char *methodname;
759{
760 return generic_unary_op((instanceobject *)inst, methodname);
761}
762
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000763
Guido van Rossum94308391991-10-20 20:11:48 +0000764/* And finally, here are instance method objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000765
766typedef struct {
767 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000768 object *im_func; /* The method function */
769 object *im_self; /* The object to which this applies */
770} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771
772object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000773newinstancemethodobject(func, self)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000774 object *func;
775 object *self;
776{
Guido van Rossume8122f11991-05-05 20:03:07 +0000777 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000778 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000779 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000780 return NULL;
781 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000782 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
783 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784 return NULL;
785 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000786 im->im_func = func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000787 INCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000788 im->im_self = self;
789 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000790}
791
792object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000793instancemethodgetfunc(im)
794 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000795{
Guido van Rossume8122f11991-05-05 20:03:07 +0000796 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000797 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000798 return NULL;
799 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000800 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000801}
802
803object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000804instancemethodgetself(im)
805 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000806{
Guido van Rossume8122f11991-05-05 20:03:07 +0000807 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000808 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000809 return NULL;
810 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000811 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000812}
813
814/* Class method methods */
815
Guido van Rossume8122f11991-05-05 20:03:07 +0000816#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817
Guido van Rossume8122f11991-05-05 20:03:07 +0000818static struct memberlist instancemethod_memberlist[] = {
819 {"im_func", T_OBJECT, OFF(im_func)},
820 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000821 {NULL} /* Sentinel */
822};
823
824static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000825instancemethod_getattr(im, name)
826 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000827 char *name;
828{
Guido van Rossume8122f11991-05-05 20:03:07 +0000829 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000830}
831
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000832static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000833instancemethod_dealloc(im)
834 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000835{
Guido van Rossume8122f11991-05-05 20:03:07 +0000836 DECREF(im->im_func);
837 DECREF(im->im_self);
838 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839}
840
Guido van Rossumebc8c511992-09-03 20:39:51 +0000841static int
842instancemethod_compare(a, b)
843 instancemethodobject *a, *b;
844{
845 int cmp = cmpobject(a->im_self, b->im_self);
846 if (cmp == 0)
847 cmp = cmpobject(a->im_func, b->im_func);
848 return cmp;
849}
850
Guido van Rossume8122f11991-05-05 20:03:07 +0000851typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000852 OB_HEAD_INIT(&Typetype)
853 0,
Guido van Rossum569fce71991-04-16 08:38:43 +0000854 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +0000855 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000856 0,
Guido van Rossume8122f11991-05-05 20:03:07 +0000857 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000858 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +0000859 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000860 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +0000861 instancemethod_compare, /*tp_compare*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000862 0, /*tp_repr*/
863 0, /*tp_as_number*/
864 0, /*tp_as_sequence*/
865 0, /*tp_as_mapping*/
866};