blob: e3b12c68f6e05901456119304844591bc9858654 [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 +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);
327 if (is_intobject(res)) {
328 outcome = getintvalue(res);
329 if (outcome < 0)
330 err_setstr(ValueError, "__len__() should return >= 0");
331 }
332 else {
333 err_setstr(TypeError, "__len__() should return an int");
334 outcome = -1;
335 }
336 DECREF(res);
337 return outcome;
338}
339
340object *
341instance_subscript(inst, key)
342 instanceobject *inst;
343 object *key;
344{
345 object *func;
346 object *arg;
347 object *res;
348
349 func = instance_getattr(inst, "__getitem__");
350 if (func == NULL)
351 return NULL;
352 arg = mkvalue("(O)", key);
353 if (arg == NULL) {
354 DECREF(func);
355 return NULL;
356 }
357 res = call_object(func, arg);
358 DECREF(func);
359 DECREF(arg);
360 return res;
361}
362
363int
364instance_ass_subscript(inst, key, value)
365 instanceobject*inst;
366 object *key;
367 object *value;
368{
369 object *func;
370 object *arg;
371 object *res;
372
373 if (value == NULL)
374 func = instance_getattr(inst, "__delitem__");
375 else
376 func = instance_getattr(inst, "__setitem__");
377 if (func == NULL)
378 return -1;
379 if (value == NULL)
380 arg = mkvalue("(O)", key);
381 else
382 arg = mkvalue("(OO)", key, value);
383 if (arg == NULL) {
384 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000385 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000386 }
387 res = call_object(func, arg);
388 DECREF(func);
389 DECREF(arg);
390 if (res == NULL)
391 return -1;
392 DECREF(res);
393 return 0;
394}
395
396mapping_methods instance_as_mapping = {
397 instance_length, /*mp_length*/
398 instance_subscript, /*mp_subscript*/
399 instance_ass_subscript, /*mp_ass_subscript*/
400};
401
402static object *
403instance_concat(inst, other)
404 instanceobject *inst, *other;
405{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000406 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000407
408 func = instance_getattr(inst, "__add__");
409 if (func == NULL)
410 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000411 arg = mkvalue("(O)", other);
412 if (arg == NULL) {
413 DECREF(func);
414 return NULL;
415 }
416 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000417 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000418 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000419 return res;
420}
421
422static object *
423instance_repeat(inst, count)
424 instanceobject *inst;
425 int count;
426{
427 object *func, *arg, *res;
428
429 func = instance_getattr(inst, "__mul__");
430 if (func == NULL)
431 return NULL;
432 arg = newintobject((long)count);
433 if (arg == NULL) {
434 DECREF(func);
435 return NULL;
436 }
437 res = call_object(func, arg);
438 DECREF(func);
439 DECREF(arg);
440 return res;
441}
442
443static object *
444instance_item(inst, i)
445 instanceobject *inst;
446 int i;
447{
448 object *func, *arg, *res;
449
450 func = instance_getattr(inst, "__getitem__");
451 if (func == NULL)
452 return NULL;
453 arg = newintobject((long)i);
454 if (arg == NULL) {
455 DECREF(func);
456 return NULL;
457 }
458 res = call_object(func, arg);
459 DECREF(func);
460 DECREF(arg);
461 return res;
462}
463
464static object *
465instance_slice(inst, i, j)
466 instanceobject *inst;
467 int i, j;
468{
469 object *func, *arg, *res;
470
471 func = instance_getattr(inst, "__getslice__");
472 if (func == NULL)
473 return NULL;
474 arg = mkvalue("(ii)", i, j);
475 if (arg == NULL) {
476 DECREF(func);
477 return NULL;
478 }
479 res = call_object(func, arg);
480 DECREF(func);
481 DECREF(arg);
482 return res;
483}
484
485static int
486instance_ass_item(inst, i, item)
487 instanceobject *inst;
488 int i;
489 object *item;
490{
491 object *func, *arg, *res;
492
493 if (item == NULL)
494 func = instance_getattr(inst, "__delitem__");
495 else
496 func = instance_getattr(inst, "__setitem__");
497 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000498 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000499 if (item == NULL)
500 arg = mkvalue("i", i);
501 else
502 arg = mkvalue("(iO)", i, item);
503 if (arg == NULL) {
504 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000505 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000506 }
507 res = call_object(func, arg);
508 DECREF(func);
509 DECREF(arg);
510 if (res == NULL)
511 return -1;
512 DECREF(res);
513 return 0;
514}
515
516static int
517instance_ass_slice(inst, i, j, value)
518 instanceobject *inst;
519 int i, j;
520 object *value;
521{
522 object *func, *arg, *res;
523
524 if (value == NULL)
525 func = instance_getattr(inst, "__delslice__");
526 else
527 func = instance_getattr(inst, "__setslice__");
528 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000529 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000530 if (value == NULL)
531 arg = mkvalue("(ii)", i, j);
532 else
533 arg = mkvalue("(iiO)", i, j, value);
534 if (arg == NULL) {
535 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000536 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000537 }
538 res = call_object(func, arg);
539 DECREF(func);
540 DECREF(arg);
541 if (res == NULL)
542 return -1;
543 DECREF(res);
544 return 0;
545}
546
547static sequence_methods instance_as_sequence = {
548 instance_length, /*sq_length*/
549 instance_concat, /*sq_concat*/
550 instance_repeat, /*sq_repeat*/
551 instance_item, /*sq_item*/
552 instance_slice, /*sq_slice*/
553 instance_ass_item, /*sq_ass_item*/
554 instance_ass_slice, /*sq_ass_slice*/
555};
556
557static object *
558generic_binary_op(self, other, methodname)
559 instanceobject *self;
560 object *other;
561 char *methodname;
562{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000563 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000564
565 if ((func = instance_getattr(self, methodname)) == NULL)
566 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000567 arg = mkvalue("O", other);
568 if (arg == NULL) {
569 DECREF(func);
570 return NULL;
571 }
572 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000573 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000574 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000575 return res;
576}
577
578static object *
579generic_unary_op(self, methodname)
580 instanceobject *self;
581 char *methodname;
582{
583 object *func, *res;
584
585 if ((func = instance_getattr(self, methodname)) == NULL)
586 return NULL;
587 res = call_object(func, (object *)NULL);
588 DECREF(func);
589 return res;
590}
591
592#define BINARY(funcname, methodname) \
593static object * funcname(self, other) instanceobject *self; object *other; { \
594 return generic_binary_op(self, other, methodname); \
595}
596
597#define UNARY(funcname, methodname) \
598static object *funcname(self) instanceobject *self; { \
599 return generic_unary_op(self, methodname); \
600}
601
602BINARY(instance_add, "__add__")
603BINARY(instance_sub, "__sub__")
604BINARY(instance_mul, "__mul__")
605BINARY(instance_div, "__div__")
606BINARY(instance_mod, "__mod__")
607BINARY(instance_divmod, "__divmod__")
608BINARY(instance_pow, "__pow__")
609UNARY(instance_neg, "__neg__")
610UNARY(instance_pos, "__pos__")
611UNARY(instance_abs, "__abs__")
612
613int
614instance_nonzero(self)
615 instanceobject *self;
616{
617 object *func, *res;
618 long outcome;
619
620 if ((func = instance_getattr(self, "__len__")) == NULL) {
621 err_clear();
622 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
623 err_clear();
624 /* Fall back to the default behavior:
625 all instances are nonzero */
626 return 1;
627 }
628 }
629 res = call_object(func, (object *)NULL);
630 DECREF(func);
631 if (res == NULL)
632 return -1;
633 if (!is_intobject(res)) {
634 DECREF(res);
635 err_setstr(TypeError, "__nonzero__ should return an int");
636 return -1;
637 }
638 outcome = getintvalue(res);
639 DECREF(res);
640 if (outcome < 0) {
641 err_setstr(ValueError, "__nonzero__ should return >= 0");
642 return -1;
643 }
644 return outcome > 0;
645}
646
647UNARY(instance_invert, "__invert__")
648BINARY(instance_lshift, "__lshift__")
649BINARY(instance_rshift, "__rshift__")
650BINARY(instance_and, "__and__")
651BINARY(instance_xor, "__xor__")
652BINARY(instance_or, "__or__")
653
Guido van Rossume6eefc21992-08-14 12:06:52 +0000654static int
655instance_coerce(pv, pw)
656 object **pv, **pw;
657{
658 object *v = *pv;
659 object *w = *pw;
660 object *func;
661 object *res;
662 int outcome;
663
664 if (!is_instanceobject(v))
665 return 1; /* XXX shouldn't be possible */
666 func = instance_getattr((instanceobject *)v, "__coerce__");
667 if (func == NULL) {
668 err_clear();
669 return 1;
670 }
671 res = call_object(func, w);
672 if (res == NULL)
673 return -1;
674 if (res == None) {
675 DECREF(res);
676 return 1;
677 }
678 outcome = getargs(res, "(OO)", &v, &w);
679 if (!outcome || v->ob_type != w->ob_type ||
680 v->ob_type->tp_as_number == NULL) {
681 DECREF(res);
682 err_setstr(TypeError, "bad __coerce__ result");
683 return -1;
684 }
685 INCREF(v);
686 INCREF(w);
687 DECREF(res);
688 *pv = v;
689 *pw = w;
690 return 0;
691}
692
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000693UNARY(instance_int, "__int__")
694UNARY(instance_long, "__long__")
695UNARY(instance_float, "__float__")
696UNARY(instance_oct, "__oct__")
697UNARY(instance_hex, "__hex__")
698
Guido van Rossum04691fc1992-08-12 15:35:34 +0000699static number_methods instance_as_number = {
700 instance_add, /*nb_add*/
701 instance_sub, /*nb_subtract*/
702 instance_mul, /*nb_multiply*/
703 instance_div, /*nb_divide*/
704 instance_mod, /*nb_remainder*/
705 instance_divmod, /*nb_divmod*/
706 instance_pow, /*nb_power*/
707 instance_neg, /*nb_negative*/
708 instance_pos, /*nb_positive*/
709 instance_abs, /*nb_absolute*/
710 instance_nonzero, /*nb_nonzero*/
711 instance_invert, /*nb_invert*/
712 instance_lshift, /*nb_lshift*/
713 instance_rshift, /*nb_rshift*/
714 instance_and, /*nb_and*/
715 instance_xor, /*nb_xor*/
716 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000717 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000718 instance_int, /*nb_int*/
719 instance_long, /*nb_long*/
720 instance_float, /*nb_float*/
721 instance_oct, /*nb_oct*/
722 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000723};
724
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000725typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726 OB_HEAD_INIT(&Typetype)
727 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000728 "instance",
729 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000731 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000732 0, /*tp_print*/
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000733 instance_getattr, /*tp_getattr*/
734 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000735 instance_compare, /*tp_compare*/
736 instance_repr, /*tp_repr*/
737 &instance_as_number, /*tp_as_number*/
738 &instance_as_sequence, /*tp_as_sequence*/
739 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000740};
741
Guido van Rossum04691fc1992-08-12 15:35:34 +0000742object *
743instance_convert(inst, methodname)
744 object *inst;
745 char *methodname;
746{
747 return generic_unary_op((instanceobject *)inst, methodname);
748}
749
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000750
Guido van Rossum94308391991-10-20 20:11:48 +0000751/* And finally, here are instance method objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000752
753typedef struct {
754 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000755 object *im_func; /* The method function */
756 object *im_self; /* The object to which this applies */
757} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758
759object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000760newinstancemethodobject(func, self)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000761 object *func;
762 object *self;
763{
Guido van Rossume8122f11991-05-05 20:03:07 +0000764 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000765 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000766 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000767 return NULL;
768 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000769 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
770 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771 return NULL;
772 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000773 im->im_func = func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000774 INCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000775 im->im_self = self;
776 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000777}
778
779object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000780instancemethodgetfunc(im)
781 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000782{
Guido van Rossume8122f11991-05-05 20:03:07 +0000783 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000784 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000785 return NULL;
786 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000787 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000788}
789
790object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000791instancemethodgetself(im)
792 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000793{
Guido van Rossume8122f11991-05-05 20:03:07 +0000794 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000795 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000796 return NULL;
797 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000798 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000799}
800
801/* Class method methods */
802
Guido van Rossume8122f11991-05-05 20:03:07 +0000803#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000804
Guido van Rossume8122f11991-05-05 20:03:07 +0000805static struct memberlist instancemethod_memberlist[] = {
806 {"im_func", T_OBJECT, OFF(im_func)},
807 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000808 {NULL} /* Sentinel */
809};
810
811static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000812instancemethod_getattr(im, name)
813 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000814 char *name;
815{
Guido van Rossume8122f11991-05-05 20:03:07 +0000816 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817}
818
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000819static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000820instancemethod_dealloc(im)
821 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000822{
Guido van Rossume8122f11991-05-05 20:03:07 +0000823 DECREF(im->im_func);
824 DECREF(im->im_self);
825 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000826}
827
Guido van Rossumebc8c511992-09-03 20:39:51 +0000828static int
829instancemethod_compare(a, b)
830 instancemethodobject *a, *b;
831{
832 int cmp = cmpobject(a->im_self, b->im_self);
833 if (cmp == 0)
834 cmp = cmpobject(a->im_func, b->im_func);
835 return cmp;
836}
837
Guido van Rossume8122f11991-05-05 20:03:07 +0000838typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839 OB_HEAD_INIT(&Typetype)
840 0,
Guido van Rossum569fce71991-04-16 08:38:43 +0000841 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +0000842 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000843 0,
Guido van Rossume8122f11991-05-05 20:03:07 +0000844 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000845 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +0000846 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000847 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +0000848 instancemethod_compare, /*tp_compare*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000849 0, /*tp_repr*/
850 0, /*tp_as_number*/
851 0, /*tp_as_sequence*/
852 0, /*tp_as_mapping*/
853};