blob: 95b85f52a42ad1f4c2614b2dc49b147a3c78dbc6 [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
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)
Guido van Rossume5372401993-03-16 12:15:04 +000052 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000053 }
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 +0000264object *
265instance_repr(inst)
266 instanceobject *inst;
267{
268 object *func;
269 object *res;
270
271 func = instance_getattr(inst, "__repr__");
272 if (func == NULL) {
273 char buf[80];
274 err_clear();
275 sprintf(buf, "<instance object at %lx>", (long)inst);
276 return newstringobject(buf);
277 }
278 res = call_object(func, (object *)NULL);
279 DECREF(func);
280 return res;
281}
282
283int
284instance_compare(inst, other)
285 instanceobject *inst, *other;
286{
287 object *func;
288 object *res;
289 int outcome;
290
291 func = instance_getattr(inst, "__cmp__");
292 if (func == NULL) {
293 err_clear();
294 if (inst < other)
295 return -1;
296 if (inst > other)
297 return 1;
298 return 0;
299 }
300 res = call_object(func, (object *)other);
301 DECREF(func);
302 if (res == NULL) {
303 err_clear(); /* XXX Should report the error, bot how...??? */
304 return 0;
305 }
306 if (is_intobject(res))
307 outcome = getintvalue(res);
308 else
309 outcome = 0; /* XXX Should report the error, bot how...??? */
310 DECREF(res);
311 return outcome;
312}
313
314int
315instance_length(inst)
316 instanceobject *inst;
317{
318 object *func;
319 object *res;
320 int outcome;
321
322 func = instance_getattr(inst, "__len__");
323 if (func == NULL)
324 return -1;
325 res = call_object(func, (object *)NULL);
326 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000327 if (res == NULL)
328 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000329 if (is_intobject(res)) {
330 outcome = getintvalue(res);
331 if (outcome < 0)
332 err_setstr(ValueError, "__len__() should return >= 0");
333 }
334 else {
335 err_setstr(TypeError, "__len__() should return an int");
336 outcome = -1;
337 }
338 DECREF(res);
339 return outcome;
340}
341
342object *
343instance_subscript(inst, key)
344 instanceobject *inst;
345 object *key;
346{
347 object *func;
348 object *arg;
349 object *res;
350
351 func = instance_getattr(inst, "__getitem__");
352 if (func == NULL)
353 return NULL;
354 arg = mkvalue("(O)", key);
355 if (arg == NULL) {
356 DECREF(func);
357 return NULL;
358 }
359 res = call_object(func, arg);
360 DECREF(func);
361 DECREF(arg);
362 return res;
363}
364
365int
366instance_ass_subscript(inst, key, value)
367 instanceobject*inst;
368 object *key;
369 object *value;
370{
371 object *func;
372 object *arg;
373 object *res;
374
375 if (value == NULL)
376 func = instance_getattr(inst, "__delitem__");
377 else
378 func = instance_getattr(inst, "__setitem__");
379 if (func == NULL)
380 return -1;
381 if (value == NULL)
382 arg = mkvalue("(O)", key);
383 else
384 arg = mkvalue("(OO)", key, value);
385 if (arg == NULL) {
386 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000387 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000388 }
389 res = call_object(func, arg);
390 DECREF(func);
391 DECREF(arg);
392 if (res == NULL)
393 return -1;
394 DECREF(res);
395 return 0;
396}
397
398mapping_methods instance_as_mapping = {
399 instance_length, /*mp_length*/
400 instance_subscript, /*mp_subscript*/
401 instance_ass_subscript, /*mp_ass_subscript*/
402};
403
404static object *
405instance_concat(inst, other)
406 instanceobject *inst, *other;
407{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000408 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000409
410 func = instance_getattr(inst, "__add__");
411 if (func == NULL)
412 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000413 arg = mkvalue("(O)", other);
414 if (arg == NULL) {
415 DECREF(func);
416 return NULL;
417 }
418 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000419 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000420 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000421 return res;
422}
423
424static object *
425instance_repeat(inst, count)
426 instanceobject *inst;
427 int count;
428{
429 object *func, *arg, *res;
430
431 func = instance_getattr(inst, "__mul__");
432 if (func == NULL)
433 return NULL;
434 arg = newintobject((long)count);
435 if (arg == NULL) {
436 DECREF(func);
437 return NULL;
438 }
439 res = call_object(func, arg);
440 DECREF(func);
441 DECREF(arg);
442 return res;
443}
444
445static object *
446instance_item(inst, i)
447 instanceobject *inst;
448 int i;
449{
450 object *func, *arg, *res;
451
452 func = instance_getattr(inst, "__getitem__");
453 if (func == NULL)
454 return NULL;
455 arg = newintobject((long)i);
456 if (arg == NULL) {
457 DECREF(func);
458 return NULL;
459 }
460 res = call_object(func, arg);
461 DECREF(func);
462 DECREF(arg);
463 return res;
464}
465
466static object *
467instance_slice(inst, i, j)
468 instanceobject *inst;
469 int i, j;
470{
471 object *func, *arg, *res;
472
473 func = instance_getattr(inst, "__getslice__");
474 if (func == NULL)
475 return NULL;
476 arg = mkvalue("(ii)", i, j);
477 if (arg == NULL) {
478 DECREF(func);
479 return NULL;
480 }
481 res = call_object(func, arg);
482 DECREF(func);
483 DECREF(arg);
484 return res;
485}
486
487static int
488instance_ass_item(inst, i, item)
489 instanceobject *inst;
490 int i;
491 object *item;
492{
493 object *func, *arg, *res;
494
495 if (item == NULL)
496 func = instance_getattr(inst, "__delitem__");
497 else
498 func = instance_getattr(inst, "__setitem__");
499 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000500 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000501 if (item == NULL)
502 arg = mkvalue("i", i);
503 else
504 arg = mkvalue("(iO)", i, item);
505 if (arg == NULL) {
506 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000507 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000508 }
509 res = call_object(func, arg);
510 DECREF(func);
511 DECREF(arg);
512 if (res == NULL)
513 return -1;
514 DECREF(res);
515 return 0;
516}
517
518static int
519instance_ass_slice(inst, i, j, value)
520 instanceobject *inst;
521 int i, j;
522 object *value;
523{
524 object *func, *arg, *res;
525
526 if (value == NULL)
527 func = instance_getattr(inst, "__delslice__");
528 else
529 func = instance_getattr(inst, "__setslice__");
530 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000531 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000532 if (value == NULL)
533 arg = mkvalue("(ii)", i, j);
534 else
535 arg = mkvalue("(iiO)", i, j, value);
536 if (arg == NULL) {
537 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000538 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000539 }
540 res = call_object(func, arg);
541 DECREF(func);
542 DECREF(arg);
543 if (res == NULL)
544 return -1;
545 DECREF(res);
546 return 0;
547}
548
549static sequence_methods instance_as_sequence = {
550 instance_length, /*sq_length*/
551 instance_concat, /*sq_concat*/
552 instance_repeat, /*sq_repeat*/
553 instance_item, /*sq_item*/
554 instance_slice, /*sq_slice*/
555 instance_ass_item, /*sq_ass_item*/
556 instance_ass_slice, /*sq_ass_slice*/
557};
558
559static object *
560generic_binary_op(self, other, methodname)
561 instanceobject *self;
562 object *other;
563 char *methodname;
564{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000565 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000566
567 if ((func = instance_getattr(self, methodname)) == NULL)
568 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000569 arg = mkvalue("O", other);
570 if (arg == NULL) {
571 DECREF(func);
572 return NULL;
573 }
574 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000575 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000576 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000577 return res;
578}
579
580static object *
581generic_unary_op(self, methodname)
582 instanceobject *self;
583 char *methodname;
584{
585 object *func, *res;
586
587 if ((func = instance_getattr(self, methodname)) == NULL)
588 return NULL;
589 res = call_object(func, (object *)NULL);
590 DECREF(func);
591 return res;
592}
593
594#define BINARY(funcname, methodname) \
595static object * funcname(self, other) instanceobject *self; object *other; { \
596 return generic_binary_op(self, other, methodname); \
597}
598
599#define UNARY(funcname, methodname) \
600static object *funcname(self) instanceobject *self; { \
601 return generic_unary_op(self, methodname); \
602}
603
604BINARY(instance_add, "__add__")
605BINARY(instance_sub, "__sub__")
606BINARY(instance_mul, "__mul__")
607BINARY(instance_div, "__div__")
608BINARY(instance_mod, "__mod__")
609BINARY(instance_divmod, "__divmod__")
610BINARY(instance_pow, "__pow__")
611UNARY(instance_neg, "__neg__")
612UNARY(instance_pos, "__pos__")
613UNARY(instance_abs, "__abs__")
614
615int
616instance_nonzero(self)
617 instanceobject *self;
618{
619 object *func, *res;
620 long outcome;
621
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000622 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000623 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000624 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000625 err_clear();
626 /* Fall back to the default behavior:
627 all instances are nonzero */
628 return 1;
629 }
630 }
631 res = call_object(func, (object *)NULL);
632 DECREF(func);
633 if (res == NULL)
634 return -1;
635 if (!is_intobject(res)) {
636 DECREF(res);
637 err_setstr(TypeError, "__nonzero__ should return an int");
638 return -1;
639 }
640 outcome = getintvalue(res);
641 DECREF(res);
642 if (outcome < 0) {
643 err_setstr(ValueError, "__nonzero__ should return >= 0");
644 return -1;
645 }
646 return outcome > 0;
647}
648
649UNARY(instance_invert, "__invert__")
650BINARY(instance_lshift, "__lshift__")
651BINARY(instance_rshift, "__rshift__")
652BINARY(instance_and, "__and__")
653BINARY(instance_xor, "__xor__")
654BINARY(instance_or, "__or__")
655
Guido van Rossume6eefc21992-08-14 12:06:52 +0000656static int
657instance_coerce(pv, pw)
658 object **pv, **pw;
659{
660 object *v = *pv;
661 object *w = *pw;
662 object *func;
663 object *res;
664 int outcome;
665
666 if (!is_instanceobject(v))
667 return 1; /* XXX shouldn't be possible */
668 func = instance_getattr((instanceobject *)v, "__coerce__");
669 if (func == NULL) {
670 err_clear();
671 return 1;
672 }
673 res = call_object(func, w);
674 if (res == NULL)
675 return -1;
676 if (res == None) {
677 DECREF(res);
678 return 1;
679 }
680 outcome = getargs(res, "(OO)", &v, &w);
681 if (!outcome || v->ob_type != w->ob_type ||
682 v->ob_type->tp_as_number == NULL) {
683 DECREF(res);
684 err_setstr(TypeError, "bad __coerce__ result");
685 return -1;
686 }
687 INCREF(v);
688 INCREF(w);
689 DECREF(res);
690 *pv = v;
691 *pw = w;
692 return 0;
693}
694
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000695UNARY(instance_int, "__int__")
696UNARY(instance_long, "__long__")
697UNARY(instance_float, "__float__")
698UNARY(instance_oct, "__oct__")
699UNARY(instance_hex, "__hex__")
700
Guido van Rossum04691fc1992-08-12 15:35:34 +0000701static number_methods instance_as_number = {
702 instance_add, /*nb_add*/
703 instance_sub, /*nb_subtract*/
704 instance_mul, /*nb_multiply*/
705 instance_div, /*nb_divide*/
706 instance_mod, /*nb_remainder*/
707 instance_divmod, /*nb_divmod*/
708 instance_pow, /*nb_power*/
709 instance_neg, /*nb_negative*/
710 instance_pos, /*nb_positive*/
711 instance_abs, /*nb_absolute*/
712 instance_nonzero, /*nb_nonzero*/
713 instance_invert, /*nb_invert*/
714 instance_lshift, /*nb_lshift*/
715 instance_rshift, /*nb_rshift*/
716 instance_and, /*nb_and*/
717 instance_xor, /*nb_xor*/
718 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000719 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000720 instance_int, /*nb_int*/
721 instance_long, /*nb_long*/
722 instance_float, /*nb_float*/
723 instance_oct, /*nb_oct*/
724 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725};
726
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000727typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000728 OB_HEAD_INIT(&Typetype)
729 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000730 "instance",
731 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000732 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000733 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000734 0, /*tp_print*/
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000735 instance_getattr, /*tp_getattr*/
736 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000737 instance_compare, /*tp_compare*/
738 instance_repr, /*tp_repr*/
739 &instance_as_number, /*tp_as_number*/
740 &instance_as_sequence, /*tp_as_sequence*/
741 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000742};
743
Guido van Rossum04691fc1992-08-12 15:35:34 +0000744object *
745instance_convert(inst, methodname)
746 object *inst;
747 char *methodname;
748{
749 return generic_unary_op((instanceobject *)inst, methodname);
750}
751
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000752
Guido van Rossum94308391991-10-20 20:11:48 +0000753/* And finally, here are instance method objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000754
755typedef struct {
756 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000757 object *im_func; /* The method function */
758 object *im_self; /* The object to which this applies */
759} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000760
761object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000762newinstancemethodobject(func, self)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000763 object *func;
764 object *self;
765{
Guido van Rossume8122f11991-05-05 20:03:07 +0000766 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000767 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000768 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769 return NULL;
770 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000771 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
772 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773 return NULL;
774 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000775 im->im_func = func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000776 INCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000777 im->im_self = self;
778 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000779}
780
781object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000782instancemethodgetfunc(im)
783 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784{
Guido van Rossume8122f11991-05-05 20:03:07 +0000785 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000786 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000787 return NULL;
788 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000789 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000790}
791
792object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000793instancemethodgetself(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_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000801}
802
803/* Class method methods */
804
Guido van Rossume8122f11991-05-05 20:03:07 +0000805#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000806
Guido van Rossume8122f11991-05-05 20:03:07 +0000807static struct memberlist instancemethod_memberlist[] = {
808 {"im_func", T_OBJECT, OFF(im_func)},
809 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000810 {NULL} /* Sentinel */
811};
812
813static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000814instancemethod_getattr(im, name)
815 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000816 char *name;
817{
Guido van Rossume8122f11991-05-05 20:03:07 +0000818 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000819}
820
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000821static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000822instancemethod_dealloc(im)
823 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000824{
Guido van Rossume8122f11991-05-05 20:03:07 +0000825 DECREF(im->im_func);
826 DECREF(im->im_self);
827 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000828}
829
Guido van Rossumebc8c511992-09-03 20:39:51 +0000830static int
831instancemethod_compare(a, b)
832 instancemethodobject *a, *b;
833{
834 int cmp = cmpobject(a->im_self, b->im_self);
835 if (cmp == 0)
836 cmp = cmpobject(a->im_func, b->im_func);
837 return cmp;
838}
839
Guido van Rossume8122f11991-05-05 20:03:07 +0000840typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000841 OB_HEAD_INIT(&Typetype)
842 0,
Guido van Rossum569fce71991-04-16 08:38:43 +0000843 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +0000844 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000845 0,
Guido van Rossume8122f11991-05-05 20:03:07 +0000846 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000847 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +0000848 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000849 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +0000850 instancemethod_compare, /*tp_compare*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000851 0, /*tp_repr*/
852 0, /*tp_as_number*/
853 0, /*tp_as_sequence*/
854 0, /*tp_as_mapping*/
855};