blob: 48ea2e7b1efef8f1054dff83952674af4aed9273 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The 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 Rossum3f5da241990-12-20 15:06:42 +000028#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000029
Guido van Rossum52ca98a1994-09-05 07:32:29 +000030/* Forward */
31static object *class_lookup PROTO((classobject *, char *, classobject **));
32static object *instance_getattr1 PROTO((instanceobject *, char *));
33
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034object *
Guido van Rossum81daa321993-05-20 14:24:46 +000035newclassobject(bases, dict, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 object *bases; /* NULL or tuple of classobjects! */
Guido van Rossum81daa321993-05-20 14:24:46 +000037 object *dict;
Guido van Rossum94308391991-10-20 20:11:48 +000038 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039{
Guido van Rossum81daa321993-05-20 14:24:46 +000040 int pos;
41 object *key, *value;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000042 classobject *op, *dummy;
Guido van Rossume7d444f1995-01-07 12:35:18 +000043 if (dictlookup(dict, "__doc__") == NULL) {
44 if (dictinsert(dict, "__doc__", None) < 0)
45 return NULL;
46 }
Guido van Rossume2966a61991-12-10 13:53:23 +000047 if (bases == NULL) {
48 bases = newtupleobject(0);
49 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000050 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000051 }
52 else
53 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000055 if (op == NULL) {
56 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000058 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000060 INCREF(dict);
61 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000062 XINCREF(name);
63 op->cl_name = name;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000064 op->cl_getattr = class_lookup(op, "__getattr__", &dummy);
65 op->cl_setattr = class_lookup(op, "__setattr__", &dummy);
66 op->cl_delattr = class_lookup(op, "__delattr__", &dummy);
67 XINCREF(op->cl_getattr);
68 XINCREF(op->cl_setattr);
69 XINCREF(op->cl_delattr);
Guido van Rossum81daa321993-05-20 14:24:46 +000070 pos = 0;
71 while (mappinggetnext(dict, &pos, &key, &value)) {
72 if (is_accessobject(value))
73 setaccessowner(value, (object *)op);
74 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 return (object *) op;
76}
77
78/* Class methods */
79
80static void
81class_dealloc(op)
82 classobject *op;
83{
Guido van Rossume2966a61991-12-10 13:53:23 +000084 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +000085 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +000086 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 free((ANY *)op);
88}
89
90static object *
Guido van Rossum81daa321993-05-20 14:24:46 +000091class_lookup(cp, name, pclass)
92 classobject *cp;
93 char *name;
94 classobject **pclass;
95{
96 int i, n;
97 object *value = dictlookup(cp->cl_dict, name);
98 if (value != NULL) {
99 *pclass = cp;
100 return value;
101 }
102 n = gettuplesize(cp->cl_bases);
103 for (i = 0; i < n; i++) {
104 object *v = class_lookup((classobject *)
105 gettupleitem(cp->cl_bases, i), name, pclass);
106 if (v != NULL)
107 return v;
108 }
109 return NULL;
110}
111
112static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113class_getattr(op, name)
114 register classobject *op;
115 register char *name;
116{
117 register object *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118 classobject *class;
Guido van Rossum10393b11995-01-10 10:39:49 +0000119 if (name[0] == '_' && name[1] == '_') {
120 if (strcmp(name, "__dict__") == 0) {
121 if (getrestricted()) {
122 err_setstr(RuntimeError,
123 "class.__dict__ not accessible in restricted mode");
124 return NULL;
125 }
126 INCREF(op->cl_dict);
127 return op->cl_dict;
128 }
129 if (strcmp(name, "__bases__") == 0) {
130 INCREF(op->cl_bases);
131 return op->cl_bases;
132 }
133 if (strcmp(name, "__name__") == 0) {
134 if (op->cl_name == NULL)
135 v = None;
136 else
137 v = op->cl_name;
138 INCREF(v);
139 return v;
140 }
Guido van Rossum94308391991-10-20 20:11:48 +0000141 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000142 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000143 if (v == NULL) {
144 err_setstr(AttributeError, name);
145 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000147 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000148 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000149 if (v == NULL)
150 return NULL;
151 }
152 else
153 INCREF(v);
154 if (is_funcobject(v)) {
155 object *w = newinstancemethodobject(v, (object *)NULL,
156 (object *)class);
157 DECREF(v);
158 v = w;
159 }
160 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161}
162
Guido van Rossum94308391991-10-20 20:11:48 +0000163static int
164class_setattr(op, name, v)
165 classobject *op;
166 char *name;
167 object *v;
168{
Guido van Rossum25831651993-05-19 14:50:45 +0000169 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000170 if (name[0] == '_' && name[1] == '_') {
171 int n = strlen(name);
172 if (name[n-1] == '_' && name[n-2] == '_') {
173 err_setstr(TypeError, "read-only special attribute");
174 return -1;
175 }
176 }
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000177 if (getrestricted()) {
178 err_setstr(RuntimeError,
179 "classes are read-only in restricted mode");
180 return -1;
181 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000182 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000183 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000184 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000185 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000186 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000187 if (rv < 0)
188 err_setstr(AttributeError,
189 "delete non-existing class attribute");
190 return rv;
191 }
Guido van Rossum94308391991-10-20 20:11:48 +0000192 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000193 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000194}
195
Guido van Rossum25831651993-05-19 14:50:45 +0000196static object *
197class_repr(op)
198 classobject *op;
199{
200 char buf[140];
201 char *name;
202 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
203 name = "?";
204 else
205 name = getstringvalue(op->cl_name);
206 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
207 return newstringobject(buf);
208}
209
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210typeobject Classtype = {
211 OB_HEAD_INIT(&Typetype)
212 0,
213 "class",
214 sizeof(classobject),
215 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000216 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000218 (getattrfunc)class_getattr, /*tp_getattr*/
219 (setattrfunc)class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 0, /*tp_as_number*/
223 0, /*tp_as_sequence*/
224 0, /*tp_as_mapping*/
225};
226
Guido van Rossum81daa321993-05-20 14:24:46 +0000227int
228issubclass(class, base)
229 object *class;
230 object *base;
231{
232 int i, n;
233 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000234 if (class == base)
235 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000236 if (class == NULL || !is_classobject(class))
237 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000238 cp = (classobject *)class;
239 n = gettuplesize(cp->cl_bases);
240 for (i = 0; i < n; i++) {
241 if (issubclass(gettupleitem(cp->cl_bases, i), base))
242 return 1;
243 }
244 return 0;
245}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246
Guido van Rossum81daa321993-05-20 14:24:46 +0000247
248/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249
Guido van Rossum81daa321993-05-20 14:24:46 +0000250static int
251addaccess(class, inst)
252 classobject *class;
253 instanceobject *inst;
254{
255 int i, n, pos, ret;
256 object *key, *value, *ac;
257
258 n = gettuplesize(class->cl_bases);
259 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000261 return -1;
262 }
263
264 pos = 0;
265 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
266 if (!is_accessobject(value))
267 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000268 if (hasaccessvalue(value))
269 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000270 ac = dict2lookup(inst->in_dict, key);
271 if (ac != NULL && is_accessobject(ac)) {
272 err_setval(ConflictError, key);
273 return -1;
274 }
275 ac = cloneaccessobject(value);
276 if (ac == NULL)
277 return -1;
278 ret = dict2insert(inst->in_dict, key, ac);
279 DECREF(ac);
280 if (ret != 0)
281 return -1;
282 }
283 return 0;
284}
285
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286object *
Guido van Rossuma83f2701995-07-26 18:07:32 +0000287newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000288 object *class;
289 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000290 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291{
Guido van Rossume8122f11991-05-05 20:03:07 +0000292 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000293 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000295 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 return NULL;
297 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000298 inst = NEWOBJ(instanceobject, &Instancetype);
299 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return NULL;
301 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000302 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000303 inst->in_dict = newdictobject();
304 if (inst->in_dict == NULL ||
305 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000306 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 return NULL;
308 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000309 init = instance_getattr1(inst, "__init__");
Guido van Rossum25831651993-05-19 14:50:45 +0000310 if (init == NULL) {
311 err_clear();
Guido van Rossuma83f2701995-07-26 18:07:32 +0000312 if (arg != NULL && (!is_tupleobject(arg) ||
313 gettuplesize(arg) != 0) || kw != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000314 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000315 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000316 DECREF(inst);
317 inst = NULL;
318 }
319 }
320 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000321 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000322 DECREF(init);
323 if (res == NULL) {
324 DECREF(inst);
325 inst = NULL;
326 }
327 else {
328 if (res != None) {
329 err_setstr(TypeError,
330 "__init__() should return None");
331 DECREF(inst);
332 inst = NULL;
333 }
334 DECREF(res);
335 }
336 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000337 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338}
339
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000340/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341
342static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000343instance_dealloc(inst)
344 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000346 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000347 object *del;
348 /* Call the __del__ method if it exists. First temporarily
349 revive the object and save the current exception, if any. */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000350#ifdef TRACE_REFS
351 /* much too complicated if TRACE_REFS defined */
352 extern long ref_total;
353 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000354 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000355 ref_total--; /* compensate for increment in NEWREF */
356#ifdef COUNT_ALLOCS
357 inst->ob_type->tp_alloc--; /* ditto */
358#endif
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000359#else
Guido van Rossum25831651993-05-19 14:50:45 +0000360 INCREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000361#endif /* TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000362 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000363 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000364 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000365 DECREF(del);
366 XDECREF(res);
367 /* XXX If __del__ raised an exception, it is ignored! */
368 }
369 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000370 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000371 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000372 if (--inst->ob_refcnt > 0) {
373#ifdef COUNT_ALLOCS
374 inst->ob_type->tp_free--;
375#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000376 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000377 }
378#ifdef TRACE_REFS
379#ifdef COUNT_ALLOCS
380 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
381#endif
382 UNREF(inst);
383 inst->ob_type = NULL;
384#endif /* TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000385 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000386 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000387 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388}
389
Guido van Rossume7737541994-09-05 07:31:41 +0000390static object *
391instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000392 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 register char *name;
394{
Guido van Rossum94308391991-10-20 20:11:48 +0000395 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000396 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000397 if (name[0] == '_' && name[1] == '_') {
398 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000399 if (getrestricted()) {
400 err_setstr(RuntimeError,
401 "instance.__dict__ not accessible in restricted mode");
402 return NULL;
403 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000404 INCREF(inst->in_dict);
405 return inst->in_dict;
406 }
407 if (strcmp(name, "__class__") == 0) {
408 INCREF(inst->in_class);
409 return (object *)inst->in_class;
410 }
Guido van Rossum94308391991-10-20 20:11:48 +0000411 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000412 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000413 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000414 if (v == NULL) {
415 v = class_lookup(inst->in_class, name, &class);
416 if (v == NULL) {
417 err_setstr(AttributeError, name);
418 return NULL;
419 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000421 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000422 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000423 if (v == NULL)
424 return NULL;
425 }
426 else
427 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000428 if (class != NULL) {
429 if (is_funcobject(v)) {
430 object *w = newinstancemethodobject(v, (object *)inst,
431 (object *)class);
432 DECREF(v);
433 v = w;
434 }
435 else if (is_instancemethodobject(v)) {
436 object *im_class = instancemethodgetclass(v);
437 /* Only if classes are compatible */
438 if (issubclass((object *)class, im_class)) {
439 object *im_func = instancemethodgetfunc(v);
440 object *w = newinstancemethodobject(im_func,
441 (object *)inst, im_class);
442 DECREF(v);
443 v = w;
444 }
445 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000446 }
447 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448}
449
Guido van Rossume7737541994-09-05 07:31:41 +0000450static object *
451instance_getattr(inst, name)
452 register instanceobject *inst;
453 register char *name;
454{
455 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000456 res = instance_getattr1(inst, name);
457 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
458 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000459 err_clear();
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000460 args = mkvalue("(Os)", inst, name);
461 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000462 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000463 res = call_object(func, args);
464 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000465 }
466 return res;
467}
468
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469static int
Guido van Rossume7737541994-09-05 07:31:41 +0000470instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000471 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 char *name;
473 object *v;
474{
Guido van Rossum25831651993-05-19 14:50:45 +0000475 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000476 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000477 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000478 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000479 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000480 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000481 if (rv < 0)
482 err_setstr(AttributeError,
483 "delete non-existing instance attribute");
484 return rv;
485 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000487 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488}
489
Guido van Rossume7737541994-09-05 07:31:41 +0000490static int
491instance_setattr(inst, name, v)
492 instanceobject *inst;
493 char *name;
494 object *v;
495{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000496 object *func, *args, *res;
497 if (name[0] == '_' && name[1] == '_') {
498 int n = strlen(name);
499 if (name[n-1] == '_' && name[n-2] == '_') {
500 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000501 return -1;
502 }
Guido van Rossume7737541994-09-05 07:31:41 +0000503 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000504 if (v == NULL)
505 func = inst->in_class->cl_delattr;
506 else
507 func = inst->in_class->cl_setattr;
508 if (func == NULL)
509 return instance_setattr1(inst, name, v);
510 if (v == NULL)
511 args = mkvalue("(Os)", inst, name);
512 else
513 args = mkvalue("(OsO)", inst, name, v);
514 if (args == NULL)
515 return -1;
516 res = call_object(func, args);
517 DECREF(args);
518 if (res == NULL)
519 return -1;
520 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000521 return 0;
522}
523
Guido van Rossum9bfef441993-03-29 10:43:31 +0000524static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000525instance_repr(inst)
526 instanceobject *inst;
527{
528 object *func;
529 object *res;
530
531 func = instance_getattr(inst, "__repr__");
532 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000533 char buf[140];
534 object *classname = inst->in_class->cl_name;
535 char *cname;
536 if (classname != NULL && is_stringobject(classname))
537 cname = getstringvalue(classname);
538 else
539 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000540 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000541 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000542 return newstringobject(buf);
543 }
544 res = call_object(func, (object *)NULL);
545 DECREF(func);
546 return res;
547}
548
Guido van Rossume7d444f1995-01-07 12:35:18 +0000549static object *
550instance_compare1(inst, other)
551 object *inst, *other;
552{
553 return instancebinop(inst, other, "__cmp__", "__rcmp__",
554 instance_compare1);
555}
556
Guido van Rossum9bfef441993-03-29 10:43:31 +0000557static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000558instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000559 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000560{
Guido van Rossum03093a21994-09-28 15:51:32 +0000561 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000562 long outcome;
563 result = instance_compare1(inst, other);
564 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000565 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000566 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000567 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000568 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000569 outcome = getintvalue(result);
570 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000571 if (outcome < 0)
572 return -1;
573 else if (outcome > 0)
574 return 1;
575 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000576}
577
Guido van Rossum9bfef441993-03-29 10:43:31 +0000578static long
579instance_hash(inst)
580 instanceobject *inst;
581{
582 object *func;
583 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000584 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000585
586 func = instance_getattr(inst, "__hash__");
587 if (func == NULL) {
588 /* If there is no __cmp__ method, we hash on the address.
589 If a __cmp__ method exists, there must be a __hash__. */
590 err_clear();
591 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000592 if (func == NULL) {
593 err_clear();
594 outcome = (long)inst;
595 if (outcome == -1)
596 outcome = -2;
597 return outcome;
598 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000599 err_setstr(TypeError, "unhashable instance");
600 return -1;
601 }
602 res = call_object(func, (object *)NULL);
603 DECREF(func);
604 if (res == NULL)
605 return -1;
606 if (is_intobject(res)) {
607 outcome = getintvalue(res);
608 if (outcome == -1)
609 outcome = -2;
610 }
611 else {
612 err_setstr(TypeError, "__hash__() should return an int");
613 outcome = -1;
614 }
615 DECREF(res);
616 return outcome;
617}
618
619static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000620instance_length(inst)
621 instanceobject *inst;
622{
623 object *func;
624 object *res;
625 int outcome;
626
627 func = instance_getattr(inst, "__len__");
628 if (func == NULL)
629 return -1;
630 res = call_object(func, (object *)NULL);
631 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000632 if (res == NULL)
633 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000634 if (is_intobject(res)) {
635 outcome = getintvalue(res);
636 if (outcome < 0)
637 err_setstr(ValueError, "__len__() should return >= 0");
638 }
639 else {
640 err_setstr(TypeError, "__len__() should return an int");
641 outcome = -1;
642 }
643 DECREF(res);
644 return outcome;
645}
646
Guido van Rossum9bfef441993-03-29 10:43:31 +0000647static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000648instance_subscript(inst, key)
649 instanceobject *inst;
650 object *key;
651{
652 object *func;
653 object *arg;
654 object *res;
655
656 func = instance_getattr(inst, "__getitem__");
657 if (func == NULL)
658 return NULL;
659 arg = mkvalue("(O)", key);
660 if (arg == NULL) {
661 DECREF(func);
662 return NULL;
663 }
664 res = call_object(func, arg);
665 DECREF(func);
666 DECREF(arg);
667 return res;
668}
669
Guido van Rossum9bfef441993-03-29 10:43:31 +0000670static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000671instance_ass_subscript(inst, key, value)
672 instanceobject*inst;
673 object *key;
674 object *value;
675{
676 object *func;
677 object *arg;
678 object *res;
679
680 if (value == NULL)
681 func = instance_getattr(inst, "__delitem__");
682 else
683 func = instance_getattr(inst, "__setitem__");
684 if (func == NULL)
685 return -1;
686 if (value == NULL)
687 arg = mkvalue("(O)", key);
688 else
689 arg = mkvalue("(OO)", key, value);
690 if (arg == NULL) {
691 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000692 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000693 }
694 res = call_object(func, arg);
695 DECREF(func);
696 DECREF(arg);
697 if (res == NULL)
698 return -1;
699 DECREF(res);
700 return 0;
701}
702
Guido van Rossum9bfef441993-03-29 10:43:31 +0000703static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000704 (inquiry)instance_length, /*mp_length*/
705 (binaryfunc)instance_subscript, /*mp_subscript*/
706 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000707};
708
709static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000710instance_item(inst, i)
711 instanceobject *inst;
712 int i;
713{
714 object *func, *arg, *res;
715
716 func = instance_getattr(inst, "__getitem__");
717 if (func == NULL)
718 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000719 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720 if (arg == NULL) {
721 DECREF(func);
722 return NULL;
723 }
724 res = call_object(func, arg);
725 DECREF(func);
726 DECREF(arg);
727 return res;
728}
729
730static object *
731instance_slice(inst, i, j)
732 instanceobject *inst;
733 int i, j;
734{
735 object *func, *arg, *res;
736
737 func = instance_getattr(inst, "__getslice__");
738 if (func == NULL)
739 return NULL;
740 arg = mkvalue("(ii)", i, j);
741 if (arg == NULL) {
742 DECREF(func);
743 return NULL;
744 }
745 res = call_object(func, arg);
746 DECREF(func);
747 DECREF(arg);
748 return res;
749}
750
751static int
752instance_ass_item(inst, i, item)
753 instanceobject *inst;
754 int i;
755 object *item;
756{
757 object *func, *arg, *res;
758
759 if (item == NULL)
760 func = instance_getattr(inst, "__delitem__");
761 else
762 func = instance_getattr(inst, "__setitem__");
763 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000764 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000765 if (item == NULL)
766 arg = mkvalue("i", i);
767 else
768 arg = mkvalue("(iO)", i, item);
769 if (arg == NULL) {
770 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000771 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000772 }
773 res = call_object(func, arg);
774 DECREF(func);
775 DECREF(arg);
776 if (res == NULL)
777 return -1;
778 DECREF(res);
779 return 0;
780}
781
782static int
783instance_ass_slice(inst, i, j, value)
784 instanceobject *inst;
785 int i, j;
786 object *value;
787{
788 object *func, *arg, *res;
789
790 if (value == NULL)
791 func = instance_getattr(inst, "__delslice__");
792 else
793 func = instance_getattr(inst, "__setslice__");
794 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000795 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000796 if (value == NULL)
797 arg = mkvalue("(ii)", i, j);
798 else
799 arg = mkvalue("(iiO)", i, j, value);
800 if (arg == NULL) {
801 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000802 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000803 }
804 res = call_object(func, arg);
805 DECREF(func);
806 DECREF(arg);
807 if (res == NULL)
808 return -1;
809 DECREF(res);
810 return 0;
811}
812
813static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000814 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000815 0, /*sq_concat*/
816 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000817 (intargfunc)instance_item, /*sq_item*/
818 (intintargfunc)instance_slice, /*sq_slice*/
819 (intobjargproc)instance_ass_item, /*sq_ass_item*/
820 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000821};
822
823static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000824generic_unary_op(self, methodname)
825 instanceobject *self;
826 char *methodname;
827{
828 object *func, *res;
829
830 if ((func = instance_getattr(self, methodname)) == NULL)
831 return NULL;
832 res = call_object(func, (object *)NULL);
833 DECREF(func);
834 return res;
835}
836
Guido van Rossum03093a21994-09-28 15:51:32 +0000837
838/* Forward */
Guido van Rossume7d444f1995-01-07 12:35:18 +0000839static int halfbinop PROTO((object *, object *, char *, object **,
840 object * (*) PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000841
842
843/* Implement a binary operator involving at least one class instance. */
844
845object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000846instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000847 object *v;
848 object *w;
849 char *opname;
850 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000851 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000852{
853 char buf[256];
854 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000855 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000856 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000857 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000858 return result;
859 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
860 err_setstr(TypeError, buf);
861 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000862}
863
Guido van Rossum03093a21994-09-28 15:51:32 +0000864
865/* Try one half of a binary operator involving a class instance.
866 Return value:
867 -1 if an exception is to be reported right away
868 0 if we have a valid result
869 1 if we could try another operation
870*/
871
872static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000873halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000874 object *v;
875 object *w;
876 char *opname;
877 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000878 object * (*thisfunc) PROTO((object *, object *));
879 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000880{
881 object *func;
882 object *args;
883 object *coerce;
884 object *coerced = NULL;
885 object *v1;
886
887 if (!is_instanceobject(v))
888 return 1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000889 coerce = getattr(v, "__coerce__");
890 if (coerce == NULL) {
891 err_clear();
892 }
893 else {
894 args = mkvalue("(O)", w);
895 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000896 return -1;
897 }
898 coerced = call_object(coerce, args);
899 DECREF(args);
900 DECREF(coerce);
901 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000902 return -1;
903 }
904 if (coerced == None) {
905 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000906 return 1;
907 }
908 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
909 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000910 err_setstr(TypeError,
911 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000912 return -1;
913 }
914 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000915 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000916 if (v1 != v) {
917 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000918 if (!is_instanceobject(v) && !is_instanceobject(w)) {
919 if (swapped)
920 *r_result = (*thisfunc)(w, v);
921 else
922 *r_result = (*thisfunc)(v, w);
923 DECREF(coerced);
924 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000925 }
926 }
927 w = gettupleitem(coerced, 1);
928 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000929 func = getattr(v, opname);
930 if (func == NULL) {
931 XDECREF(coerced);
932 if (err_occurred() != AttributeError)
933 return -1;
934 err_clear();
935 return 1;
936 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000937 args = mkvalue("(O)", w);
938 if (args == NULL) {
939 DECREF(func);
940 XDECREF(coerced);
941 return -1;
942 }
943 *r_result = call_object(func, args);
944 DECREF(args);
945 DECREF(func);
946 XDECREF(coerced);
947 return *r_result == NULL ? -1 : 0;
948}
949
Guido van Rossum879c5811995-01-10 15:24:06 +0000950static int
951instance_coerce(pv, pw)
952 object **pv;
953 object **pw;
954{
955 object *v = *pv;
956 object *w = *pw;
957 object *coerce;
958 object *args;
959 object *coerced;
960
961 coerce = getattr(v, "__coerce__");
962 if (coerce == NULL) {
963 /* No __coerce__ method: always OK */
964 err_clear();
965 INCREF(v);
966 INCREF(w);
967 return 0;
968 }
969 /* Has __coerce__ method: call it */
970 args = mkvalue("(O)", w);
971 if (args == NULL) {
972 return -1;
973 }
974 coerced = call_object(coerce, args);
975 DECREF(args);
976 DECREF(coerce);
977 if (coerced == NULL) {
978 /* __coerce__ call raised an exception */
979 return -1;
980 }
981 if (coerced == None) {
982 /* __coerce__ says "I can't do it" */
983 DECREF(coerced);
984 return 1;
985 }
986 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
987 /* __coerce__ return value is malformed */
988 DECREF(coerced);
989 err_setstr(TypeError,
990 "coercion should return None or 2-tuple");
991 return -1;
992 }
993 /* __coerce__ returned two new values */
994 *pv = gettupleitem(coerced, 0);
995 *pw = gettupleitem(coerced, 1);
996 INCREF(*pv);
997 INCREF(*pw);
998 DECREF(coerced);
999 return 0;
1000}
1001
Guido van Rossum03093a21994-09-28 15:51:32 +00001002
Guido van Rossum04691fc1992-08-12 15:35:34 +00001003#define UNARY(funcname, methodname) \
1004static object *funcname(self) instanceobject *self; { \
1005 return generic_unary_op(self, methodname); \
1006}
1007
Guido van Rossum04691fc1992-08-12 15:35:34 +00001008UNARY(instance_neg, "__neg__")
1009UNARY(instance_pos, "__pos__")
1010UNARY(instance_abs, "__abs__")
1011
Guido van Rossum9bfef441993-03-29 10:43:31 +00001012static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013instance_nonzero(self)
1014 instanceobject *self;
1015{
1016 object *func, *res;
1017 long outcome;
1018
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001019 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001021 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 err_clear();
1023 /* Fall back to the default behavior:
1024 all instances are nonzero */
1025 return 1;
1026 }
1027 }
1028 res = call_object(func, (object *)NULL);
1029 DECREF(func);
1030 if (res == NULL)
1031 return -1;
1032 if (!is_intobject(res)) {
1033 DECREF(res);
1034 err_setstr(TypeError, "__nonzero__ should return an int");
1035 return -1;
1036 }
1037 outcome = getintvalue(res);
1038 DECREF(res);
1039 if (outcome < 0) {
1040 err_setstr(ValueError, "__nonzero__ should return >= 0");
1041 return -1;
1042 }
1043 return outcome > 0;
1044}
1045
1046UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001047UNARY(instance_int, "__int__")
1048UNARY(instance_long, "__long__")
1049UNARY(instance_float, "__float__")
1050UNARY(instance_oct, "__oct__")
1051UNARY(instance_hex, "__hex__")
1052
Guido van Rossum03093a21994-09-28 15:51:32 +00001053/* This version is for ternary calls only (z != None) */
1054static object *
1055instance_pow(v, w, z)
1056 object *v;
1057 object *w;
1058 object *z;
1059{
1060 /* XXX Doesn't do coercions... */
1061 object *func;
1062 object *args;
1063 object *result;
1064 func = getattr(v, "__pow__");
1065 if (func == NULL)
1066 return NULL;
1067 args = mkvalue("(OO)", w, z);
1068 if (args == NULL) {
1069 DECREF(func);
1070 return NULL;
1071 }
1072 result = call_object(func, args);
1073 DECREF(func);
1074 DECREF(args);
1075 return result;
1076}
1077
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001079 0, /*nb_add*/
1080 0, /*nb_subtract*/
1081 0, /*nb_multiply*/
1082 0, /*nb_divide*/
1083 0, /*nb_remainder*/
1084 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001085 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001086 (unaryfunc)instance_neg, /*nb_negative*/
1087 (unaryfunc)instance_pos, /*nb_positive*/
1088 (unaryfunc)instance_abs, /*nb_absolute*/
1089 (inquiry)instance_nonzero, /*nb_nonzero*/
1090 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001091 0, /*nb_lshift*/
1092 0, /*nb_rshift*/
1093 0, /*nb_and*/
1094 0, /*nb_xor*/
1095 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001096 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001097 (unaryfunc)instance_int, /*nb_int*/
1098 (unaryfunc)instance_long, /*nb_long*/
1099 (unaryfunc)instance_float, /*nb_float*/
1100 (unaryfunc)instance_oct, /*nb_oct*/
1101 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001102};
1103
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001104typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001105 OB_HEAD_INIT(&Typetype)
1106 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001107 "instance",
1108 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001109 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001110 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001111 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001112 (getattrfunc)instance_getattr, /*tp_getattr*/
1113 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001114 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001115 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001116 &instance_as_number, /*tp_as_number*/
1117 &instance_as_sequence, /*tp_as_sequence*/
1118 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001119 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001120};
1121
1122
Guido van Rossum81daa321993-05-20 14:24:46 +00001123/* Instance method objects are used for two purposes:
1124 (a) as bound instance methods (returned by instancename.methodname)
1125 (b) as unbound methods (returned by ClassName.methodname)
1126 In case (b), im_self is NULL
1127*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001128
1129typedef struct {
1130 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001131 object *im_func; /* The function implementing the method */
1132 object *im_self; /* The instance it is bound to, or NULL */
1133 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001134} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001135
1136object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001137newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001138 object *func;
1139 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001140 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001141{
Guido van Rossume8122f11991-05-05 20:03:07 +00001142 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001143 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001144 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001145 return NULL;
1146 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001147 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1148 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001149 return NULL;
1150 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001151 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001152 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001153 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001154 INCREF(class);
1155 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001156 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001157}
1158
1159object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001160instancemethodgetfunc(im)
1161 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001162{
Guido van Rossume8122f11991-05-05 20:03:07 +00001163 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001164 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001165 return NULL;
1166 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001167 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001168}
1169
1170object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001171instancemethodgetself(im)
1172 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001173{
Guido van Rossume8122f11991-05-05 20:03:07 +00001174 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001175 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001176 return NULL;
1177 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001178 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001179}
1180
Guido van Rossum81daa321993-05-20 14:24:46 +00001181object *
1182instancemethodgetclass(im)
1183 register object *im;
1184{
1185 if (!is_instancemethodobject(im)) {
1186 err_badcall();
1187 return NULL;
1188 }
1189 return ((instancemethodobject *)im)->im_class;
1190}
1191
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001192/* Class method methods */
1193
Guido van Rossume8122f11991-05-05 20:03:07 +00001194#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195
Guido van Rossume8122f11991-05-05 20:03:07 +00001196static struct memberlist instancemethod_memberlist[] = {
1197 {"im_func", T_OBJECT, OFF(im_func)},
1198 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001199 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001200 /* Dummies that are not handled by getattr() except for __members__ */
1201 {"__doc__", T_INT, 0},
1202 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001203 {NULL} /* Sentinel */
1204};
1205
1206static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001207instancemethod_getattr(im, name)
1208 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001209 char *name;
1210{
Guido van Rossum6dabc981996-05-14 21:54:20 +00001211 if (name[0] == '_') {
1212 funcobject *func = (funcobject *)(im->im_func);
1213 if (strcmp(name, "__name__") == 0) {
1214 INCREF(func->func_name);
1215 return func->func_name;
1216 }
1217 if (strcmp(name, "__doc__") == 0) {
1218 INCREF(func->func_doc);
1219 return func->func_doc;
1220 }
1221 }
1222 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001223 err_setstr(RuntimeError,
1224 "instance-method attributes not accessible in restricted mode");
1225 return NULL;
1226 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001227 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001228}
1229
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001230static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001231instancemethod_dealloc(im)
1232 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001233{
Guido van Rossume8122f11991-05-05 20:03:07 +00001234 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001235 XDECREF(im->im_self);
1236 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001237 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001238}
1239
Guido van Rossumebc8c511992-09-03 20:39:51 +00001240static int
1241instancemethod_compare(a, b)
1242 instancemethodobject *a, *b;
1243{
Guido van Rossume9df7271995-04-06 14:46:51 +00001244 if (a->im_self != b->im_self)
1245 return (a->im_self < b->im_self) ? -1 : 1;
1246 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001247}
1248
Guido van Rossum25831651993-05-19 14:50:45 +00001249static object *
1250instancemethod_repr(a)
1251 instancemethodobject *a;
1252{
1253 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001254 instanceobject *self = (instanceobject *)(a->im_self);
1255 funcobject *func = (funcobject *)(a->im_func);
1256 classobject *class = (classobject *)(a->im_class);
1257 object *fclassname, *iclassname, *funcname;
1258 char *fcname, *icname, *fname;
1259 fclassname = class->cl_name;
1260 funcname = func->func_name;
1261 if (fclassname != NULL && is_stringobject(fclassname))
1262 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001263 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001264 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001265 if (funcname != NULL && is_stringobject(funcname))
1266 fname = getstringvalue(funcname);
1267 else
1268 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001269 if (self == NULL)
1270 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1271 else {
1272 iclassname = self->in_class->cl_name;
1273 if (iclassname != NULL && is_stringobject(iclassname))
1274 icname = getstringvalue(iclassname);
1275 else
1276 icname = "?";
1277 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1278 fcname, fname, icname, (long)self);
1279 }
Guido van Rossum25831651993-05-19 14:50:45 +00001280 return newstringobject(buf);
1281}
1282
Guido van Rossum9bfef441993-03-29 10:43:31 +00001283static long
1284instancemethod_hash(a)
1285 instancemethodobject *a;
1286{
1287 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001288 if (a->im_self == NULL)
1289 x = hashobject(None);
1290 else
1291 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001292 if (x == -1)
1293 return -1;
1294 y = hashobject(a->im_func);
1295 if (y == -1)
1296 return -1;
1297 return x ^ y;
1298}
1299
Guido van Rossume8122f11991-05-05 20:03:07 +00001300typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001301 OB_HEAD_INIT(&Typetype)
1302 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001303 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001304 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001305 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001306 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001307 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001308 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001309 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001310 (cmpfunc)instancemethod_compare, /*tp_compare*/
1311 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001312 0, /*tp_as_number*/
1313 0, /*tp_as_sequence*/
1314 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001315 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001316};