blob: 587d122aeedcbee7731d80e73e31b48e023c4996 [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 Rossum9bfef441993-03-29 10:43:31 +0000264static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000265instance_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
Guido van Rossum9bfef441993-03-29 10:43:31 +0000283static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000284instance_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
Guido van Rossum9bfef441993-03-29 10:43:31 +0000314static long
315instance_hash(inst)
316 instanceobject *inst;
317{
318 object *func;
319 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000320 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000321
322 func = instance_getattr(inst, "__hash__");
323 if (func == NULL) {
324 /* If there is no __cmp__ method, we hash on the address.
325 If a __cmp__ method exists, there must be a __hash__. */
326 err_clear();
327 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000328 if (func == NULL) {
329 err_clear();
330 outcome = (long)inst;
331 if (outcome == -1)
332 outcome = -2;
333 return outcome;
334 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000335 err_setstr(TypeError, "unhashable instance");
336 return -1;
337 }
338 res = call_object(func, (object *)NULL);
339 DECREF(func);
340 if (res == NULL)
341 return -1;
342 if (is_intobject(res)) {
343 outcome = getintvalue(res);
344 if (outcome == -1)
345 outcome = -2;
346 }
347 else {
348 err_setstr(TypeError, "__hash__() should return an int");
349 outcome = -1;
350 }
351 DECREF(res);
352 return outcome;
353}
354
355static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000356instance_length(inst)
357 instanceobject *inst;
358{
359 object *func;
360 object *res;
361 int outcome;
362
363 func = instance_getattr(inst, "__len__");
364 if (func == NULL)
365 return -1;
366 res = call_object(func, (object *)NULL);
367 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000368 if (res == NULL)
369 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000370 if (is_intobject(res)) {
371 outcome = getintvalue(res);
372 if (outcome < 0)
373 err_setstr(ValueError, "__len__() should return >= 0");
374 }
375 else {
376 err_setstr(TypeError, "__len__() should return an int");
377 outcome = -1;
378 }
379 DECREF(res);
380 return outcome;
381}
382
Guido van Rossum9bfef441993-03-29 10:43:31 +0000383static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000384instance_subscript(inst, key)
385 instanceobject *inst;
386 object *key;
387{
388 object *func;
389 object *arg;
390 object *res;
391
392 func = instance_getattr(inst, "__getitem__");
393 if (func == NULL)
394 return NULL;
395 arg = mkvalue("(O)", key);
396 if (arg == NULL) {
397 DECREF(func);
398 return NULL;
399 }
400 res = call_object(func, arg);
401 DECREF(func);
402 DECREF(arg);
403 return res;
404}
405
Guido van Rossum9bfef441993-03-29 10:43:31 +0000406static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000407instance_ass_subscript(inst, key, value)
408 instanceobject*inst;
409 object *key;
410 object *value;
411{
412 object *func;
413 object *arg;
414 object *res;
415
416 if (value == NULL)
417 func = instance_getattr(inst, "__delitem__");
418 else
419 func = instance_getattr(inst, "__setitem__");
420 if (func == NULL)
421 return -1;
422 if (value == NULL)
423 arg = mkvalue("(O)", key);
424 else
425 arg = mkvalue("(OO)", key, value);
426 if (arg == NULL) {
427 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000428 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000429 }
430 res = call_object(func, arg);
431 DECREF(func);
432 DECREF(arg);
433 if (res == NULL)
434 return -1;
435 DECREF(res);
436 return 0;
437}
438
Guido van Rossum9bfef441993-03-29 10:43:31 +0000439static mapping_methods instance_as_mapping = {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000440 instance_length, /*mp_length*/
441 instance_subscript, /*mp_subscript*/
442 instance_ass_subscript, /*mp_ass_subscript*/
443};
444
445static object *
446instance_concat(inst, other)
447 instanceobject *inst, *other;
448{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000449 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000450
451 func = instance_getattr(inst, "__add__");
452 if (func == NULL)
453 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000454 arg = mkvalue("(O)", other);
455 if (arg == NULL) {
456 DECREF(func);
457 return NULL;
458 }
459 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000460 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000461 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000462 return res;
463}
464
465static object *
466instance_repeat(inst, count)
467 instanceobject *inst;
468 int count;
469{
470 object *func, *arg, *res;
471
472 func = instance_getattr(inst, "__mul__");
473 if (func == NULL)
474 return NULL;
475 arg = newintobject((long)count);
476 if (arg == NULL) {
477 DECREF(func);
478 return NULL;
479 }
480 res = call_object(func, arg);
481 DECREF(func);
482 DECREF(arg);
483 return res;
484}
485
486static object *
487instance_item(inst, i)
488 instanceobject *inst;
489 int i;
490{
491 object *func, *arg, *res;
492
493 func = instance_getattr(inst, "__getitem__");
494 if (func == NULL)
495 return NULL;
496 arg = newintobject((long)i);
497 if (arg == NULL) {
498 DECREF(func);
499 return NULL;
500 }
501 res = call_object(func, arg);
502 DECREF(func);
503 DECREF(arg);
504 return res;
505}
506
507static object *
508instance_slice(inst, i, j)
509 instanceobject *inst;
510 int i, j;
511{
512 object *func, *arg, *res;
513
514 func = instance_getattr(inst, "__getslice__");
515 if (func == NULL)
516 return NULL;
517 arg = mkvalue("(ii)", i, j);
518 if (arg == NULL) {
519 DECREF(func);
520 return NULL;
521 }
522 res = call_object(func, arg);
523 DECREF(func);
524 DECREF(arg);
525 return res;
526}
527
528static int
529instance_ass_item(inst, i, item)
530 instanceobject *inst;
531 int i;
532 object *item;
533{
534 object *func, *arg, *res;
535
536 if (item == NULL)
537 func = instance_getattr(inst, "__delitem__");
538 else
539 func = instance_getattr(inst, "__setitem__");
540 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000541 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000542 if (item == NULL)
543 arg = mkvalue("i", i);
544 else
545 arg = mkvalue("(iO)", i, item);
546 if (arg == NULL) {
547 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000548 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000549 }
550 res = call_object(func, arg);
551 DECREF(func);
552 DECREF(arg);
553 if (res == NULL)
554 return -1;
555 DECREF(res);
556 return 0;
557}
558
559static int
560instance_ass_slice(inst, i, j, value)
561 instanceobject *inst;
562 int i, j;
563 object *value;
564{
565 object *func, *arg, *res;
566
567 if (value == NULL)
568 func = instance_getattr(inst, "__delslice__");
569 else
570 func = instance_getattr(inst, "__setslice__");
571 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000572 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000573 if (value == NULL)
574 arg = mkvalue("(ii)", i, j);
575 else
576 arg = mkvalue("(iiO)", i, j, value);
577 if (arg == NULL) {
578 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000579 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000580 }
581 res = call_object(func, arg);
582 DECREF(func);
583 DECREF(arg);
584 if (res == NULL)
585 return -1;
586 DECREF(res);
587 return 0;
588}
589
590static sequence_methods instance_as_sequence = {
591 instance_length, /*sq_length*/
592 instance_concat, /*sq_concat*/
593 instance_repeat, /*sq_repeat*/
594 instance_item, /*sq_item*/
595 instance_slice, /*sq_slice*/
596 instance_ass_item, /*sq_ass_item*/
597 instance_ass_slice, /*sq_ass_slice*/
598};
599
600static object *
601generic_binary_op(self, other, methodname)
602 instanceobject *self;
603 object *other;
604 char *methodname;
605{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000606 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000607
608 if ((func = instance_getattr(self, methodname)) == NULL)
609 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000610 arg = mkvalue("O", other);
611 if (arg == NULL) {
612 DECREF(func);
613 return NULL;
614 }
615 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000616 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000617 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000618 return res;
619}
620
621static object *
622generic_unary_op(self, methodname)
623 instanceobject *self;
624 char *methodname;
625{
626 object *func, *res;
627
628 if ((func = instance_getattr(self, methodname)) == NULL)
629 return NULL;
630 res = call_object(func, (object *)NULL);
631 DECREF(func);
632 return res;
633}
634
635#define BINARY(funcname, methodname) \
636static object * funcname(self, other) instanceobject *self; object *other; { \
637 return generic_binary_op(self, other, methodname); \
638}
639
640#define UNARY(funcname, methodname) \
641static object *funcname(self) instanceobject *self; { \
642 return generic_unary_op(self, methodname); \
643}
644
645BINARY(instance_add, "__add__")
646BINARY(instance_sub, "__sub__")
647BINARY(instance_mul, "__mul__")
648BINARY(instance_div, "__div__")
649BINARY(instance_mod, "__mod__")
650BINARY(instance_divmod, "__divmod__")
651BINARY(instance_pow, "__pow__")
652UNARY(instance_neg, "__neg__")
653UNARY(instance_pos, "__pos__")
654UNARY(instance_abs, "__abs__")
655
Guido van Rossum9bfef441993-03-29 10:43:31 +0000656static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000657instance_nonzero(self)
658 instanceobject *self;
659{
660 object *func, *res;
661 long outcome;
662
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000663 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000664 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000665 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000666 err_clear();
667 /* Fall back to the default behavior:
668 all instances are nonzero */
669 return 1;
670 }
671 }
672 res = call_object(func, (object *)NULL);
673 DECREF(func);
674 if (res == NULL)
675 return -1;
676 if (!is_intobject(res)) {
677 DECREF(res);
678 err_setstr(TypeError, "__nonzero__ should return an int");
679 return -1;
680 }
681 outcome = getintvalue(res);
682 DECREF(res);
683 if (outcome < 0) {
684 err_setstr(ValueError, "__nonzero__ should return >= 0");
685 return -1;
686 }
687 return outcome > 0;
688}
689
690UNARY(instance_invert, "__invert__")
691BINARY(instance_lshift, "__lshift__")
692BINARY(instance_rshift, "__rshift__")
693BINARY(instance_and, "__and__")
694BINARY(instance_xor, "__xor__")
695BINARY(instance_or, "__or__")
696
Guido van Rossume6eefc21992-08-14 12:06:52 +0000697static int
698instance_coerce(pv, pw)
699 object **pv, **pw;
700{
701 object *v = *pv;
702 object *w = *pw;
703 object *func;
704 object *res;
705 int outcome;
706
707 if (!is_instanceobject(v))
708 return 1; /* XXX shouldn't be possible */
709 func = instance_getattr((instanceobject *)v, "__coerce__");
710 if (func == NULL) {
711 err_clear();
712 return 1;
713 }
714 res = call_object(func, w);
715 if (res == NULL)
716 return -1;
717 if (res == None) {
718 DECREF(res);
719 return 1;
720 }
721 outcome = getargs(res, "(OO)", &v, &w);
722 if (!outcome || v->ob_type != w->ob_type ||
723 v->ob_type->tp_as_number == NULL) {
724 DECREF(res);
725 err_setstr(TypeError, "bad __coerce__ result");
726 return -1;
727 }
728 INCREF(v);
729 INCREF(w);
730 DECREF(res);
731 *pv = v;
732 *pw = w;
733 return 0;
734}
735
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000736UNARY(instance_int, "__int__")
737UNARY(instance_long, "__long__")
738UNARY(instance_float, "__float__")
739UNARY(instance_oct, "__oct__")
740UNARY(instance_hex, "__hex__")
741
Guido van Rossum04691fc1992-08-12 15:35:34 +0000742static number_methods instance_as_number = {
743 instance_add, /*nb_add*/
744 instance_sub, /*nb_subtract*/
745 instance_mul, /*nb_multiply*/
746 instance_div, /*nb_divide*/
747 instance_mod, /*nb_remainder*/
748 instance_divmod, /*nb_divmod*/
749 instance_pow, /*nb_power*/
750 instance_neg, /*nb_negative*/
751 instance_pos, /*nb_positive*/
752 instance_abs, /*nb_absolute*/
753 instance_nonzero, /*nb_nonzero*/
754 instance_invert, /*nb_invert*/
755 instance_lshift, /*nb_lshift*/
756 instance_rshift, /*nb_rshift*/
757 instance_and, /*nb_and*/
758 instance_xor, /*nb_xor*/
759 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000760 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000761 instance_int, /*nb_int*/
762 instance_long, /*nb_long*/
763 instance_float, /*nb_float*/
764 instance_oct, /*nb_oct*/
765 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766};
767
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000768typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769 OB_HEAD_INIT(&Typetype)
770 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000771 "instance",
772 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000774 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000775 0, /*tp_print*/
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000776 instance_getattr, /*tp_getattr*/
777 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000778 instance_compare, /*tp_compare*/
779 instance_repr, /*tp_repr*/
780 &instance_as_number, /*tp_as_number*/
781 &instance_as_sequence, /*tp_as_sequence*/
782 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000783 instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784};
785
Guido van Rossum9bfef441993-03-29 10:43:31 +0000786static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000787instance_convert(inst, methodname)
788 object *inst;
789 char *methodname;
790{
791 return generic_unary_op((instanceobject *)inst, methodname);
792}
793
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000794
Guido van Rossum94308391991-10-20 20:11:48 +0000795/* And finally, here are instance method objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000796
797typedef struct {
798 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000799 object *im_func; /* The method function */
800 object *im_self; /* The object to which this applies */
801} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000802
803object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000804newinstancemethodobject(func, self)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000805 object *func;
806 object *self;
807{
Guido van Rossume8122f11991-05-05 20:03:07 +0000808 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000809 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000810 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000811 return NULL;
812 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000813 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
814 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000815 return NULL;
816 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000817 im->im_func = func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000818 INCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000819 im->im_self = self;
820 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000821}
822
823object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000824instancemethodgetfunc(im)
825 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000826{
Guido van Rossume8122f11991-05-05 20:03:07 +0000827 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000828 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000829 return NULL;
830 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000831 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000832}
833
834object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000835instancemethodgetself(im)
836 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000837{
Guido van Rossume8122f11991-05-05 20:03:07 +0000838 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000839 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000840 return NULL;
841 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000842 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000843}
844
845/* Class method methods */
846
Guido van Rossume8122f11991-05-05 20:03:07 +0000847#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000848
Guido van Rossume8122f11991-05-05 20:03:07 +0000849static struct memberlist instancemethod_memberlist[] = {
850 {"im_func", T_OBJECT, OFF(im_func)},
851 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000852 {NULL} /* Sentinel */
853};
854
855static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000856instancemethod_getattr(im, name)
857 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000858 char *name;
859{
Guido van Rossume8122f11991-05-05 20:03:07 +0000860 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000861}
862
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000863static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000864instancemethod_dealloc(im)
865 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000866{
Guido van Rossume8122f11991-05-05 20:03:07 +0000867 DECREF(im->im_func);
868 DECREF(im->im_self);
869 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000870}
871
Guido van Rossumebc8c511992-09-03 20:39:51 +0000872static int
873instancemethod_compare(a, b)
874 instancemethodobject *a, *b;
875{
876 int cmp = cmpobject(a->im_self, b->im_self);
877 if (cmp == 0)
878 cmp = cmpobject(a->im_func, b->im_func);
879 return cmp;
880}
881
Guido van Rossum9bfef441993-03-29 10:43:31 +0000882static long
883instancemethod_hash(a)
884 instancemethodobject *a;
885{
886 long x, y;
887 x = hashobject(a->im_self);
888 if (x == -1)
889 return -1;
890 y = hashobject(a->im_func);
891 if (y == -1)
892 return -1;
893 return x ^ y;
894}
895
Guido van Rossume8122f11991-05-05 20:03:07 +0000896typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000897 OB_HEAD_INIT(&Typetype)
898 0,
Guido van Rossum569fce71991-04-16 08:38:43 +0000899 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +0000900 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000901 0,
Guido van Rossume8122f11991-05-05 20:03:07 +0000902 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000903 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +0000904 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000905 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +0000906 instancemethod_compare, /*tp_compare*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000907 0, /*tp_repr*/
908 0, /*tp_as_number*/
909 0, /*tp_as_sequence*/
910 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000911 instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000912};