blob: 6eb453fdab49c0aa10d227a2f4627340a9e84451 [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 */
Guido van Rossum2878a691996-08-09 20:53:24 +000031static object *class_lookup PROTO((classobject *, object *, classobject **));
32static object *instance_getattr1 PROTO((instanceobject *, object *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000033
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 Rossum0dfcf751996-08-12 22:00:53 +000040#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000041 int pos;
42 object *key, *value;
Guido van Rossum0dfcf751996-08-12 22:00:53 +000043#endif
Guido van Rossum52ca98a1994-09-05 07:32:29 +000044 classobject *op, *dummy;
Guido van Rossum2878a691996-08-09 20:53:24 +000045 static object *getattrstr, *setattrstr, *delattrstr;
Guido van Rossume7d444f1995-01-07 12:35:18 +000046 if (dictlookup(dict, "__doc__") == NULL) {
47 if (dictinsert(dict, "__doc__", None) < 0)
48 return NULL;
49 }
Guido van Rossume2966a61991-12-10 13:53:23 +000050 if (bases == NULL) {
51 bases = newtupleobject(0);
52 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000053 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000054 }
55 else
56 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000058 if (op == NULL) {
59 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000061 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000063 INCREF(dict);
64 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000065 XINCREF(name);
66 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000067 if (getattrstr == NULL) {
68 getattrstr = newstringobject("__getattr__");
69 setattrstr = newstringobject("__setattr__");
70 delattrstr = newstringobject("__delattr__");
71 }
72 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
73 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
74 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000075 XINCREF(op->cl_getattr);
76 XINCREF(op->cl_setattr);
77 XINCREF(op->cl_delattr);
Guido van Rossum0dfcf751996-08-12 22:00:53 +000078#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000079 pos = 0;
80 while (mappinggetnext(dict, &pos, &key, &value)) {
81 if (is_accessobject(value))
82 setaccessowner(value, (object *)op);
83 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +000084#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 return (object *) op;
86}
87
88/* Class methods */
89
90static void
91class_dealloc(op)
92 classobject *op;
93{
Guido van Rossume2966a61991-12-10 13:53:23 +000094 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +000095 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +000096 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 free((ANY *)op);
98}
99
100static object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000101class_lookup(cp, name, pclass)
102 classobject *cp;
Guido van Rossum2878a691996-08-09 20:53:24 +0000103 object *name;
Guido van Rossum81daa321993-05-20 14:24:46 +0000104 classobject **pclass;
105{
106 int i, n;
Guido van Rossum2878a691996-08-09 20:53:24 +0000107 object *value = mappinglookup(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000108 if (value != NULL) {
109 *pclass = cp;
110 return value;
111 }
112 n = gettuplesize(cp->cl_bases);
113 for (i = 0; i < n; i++) {
114 object *v = class_lookup((classobject *)
115 gettupleitem(cp->cl_bases, i), name, pclass);
116 if (v != NULL)
117 return v;
118 }
119 return NULL;
120}
121
122static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123class_getattr(op, name)
124 register classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000125 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126{
127 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000128 register char *sname = getstringvalue(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000129 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000130 if (sname[0] == '_' && sname[1] == '_') {
131 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000132 if (getrestricted()) {
133 err_setstr(RuntimeError,
134 "class.__dict__ not accessible in restricted mode");
135 return NULL;
136 }
137 INCREF(op->cl_dict);
138 return op->cl_dict;
139 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000140 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000141 INCREF(op->cl_bases);
142 return op->cl_bases;
143 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000144 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000145 if (op->cl_name == NULL)
146 v = None;
147 else
148 v = op->cl_name;
149 INCREF(v);
150 return v;
151 }
Guido van Rossum94308391991-10-20 20:11:48 +0000152 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000153 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000154 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000155 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000156 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000158#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000159 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000160 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000161 if (v == NULL)
162 return NULL;
163 }
164 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000165#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000166 INCREF(v);
167 if (is_funcobject(v)) {
168 object *w = newinstancemethodobject(v, (object *)NULL,
169 (object *)class);
170 DECREF(v);
171 v = w;
172 }
173 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174}
175
Guido van Rossum94308391991-10-20 20:11:48 +0000176static int
177class_setattr(op, name, v)
178 classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000179 object *name;
Guido van Rossum94308391991-10-20 20:11:48 +0000180 object *v;
181{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000182#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000183 object *ac;
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000184#endif
Guido van Rossum2878a691996-08-09 20:53:24 +0000185 char *sname = getstringvalue(name);
186 if (sname[0] == '_' && sname[1] == '_') {
187 int n = getstringsize(name);
188 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000189 err_setstr(TypeError, "read-only special attribute");
190 return -1;
191 }
192 }
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000193 if (getrestricted()) {
194 err_setstr(RuntimeError,
195 "classes are read-only in restricted mode");
196 return -1;
197 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000198#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum2878a691996-08-09 20:53:24 +0000199 ac = mappinglookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000200 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000201 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000202#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000203 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000204 int rv = mappingremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000205 if (rv < 0)
206 err_setstr(AttributeError,
207 "delete non-existing class attribute");
208 return rv;
209 }
Guido van Rossum94308391991-10-20 20:11:48 +0000210 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000211 return mappinginsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000212}
213
Guido van Rossum25831651993-05-19 14:50:45 +0000214static object *
215class_repr(op)
216 classobject *op;
217{
218 char buf[140];
219 char *name;
220 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
221 name = "?";
222 else
223 name = getstringvalue(op->cl_name);
224 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
225 return newstringobject(buf);
226}
227
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228typeobject Classtype = {
229 OB_HEAD_INIT(&Typetype)
230 0,
231 "class",
232 sizeof(classobject),
233 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000234 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000236 0, /*tp_getattr*/
237 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000239 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 0, /*tp_as_number*/
241 0, /*tp_as_sequence*/
242 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000243 0, /*tp_hash*/
244 0, /*tp_call*/
245 0, /*tp_str*/
246 (getattrofunc)class_getattr, /*tp_getattro*/
247 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248};
249
Guido van Rossum81daa321993-05-20 14:24:46 +0000250int
251issubclass(class, base)
252 object *class;
253 object *base;
254{
255 int i, n;
256 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000257 if (class == base)
258 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000259 if (class == NULL || !is_classobject(class))
260 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000261 cp = (classobject *)class;
262 n = gettuplesize(cp->cl_bases);
263 for (i = 0; i < n; i++) {
264 if (issubclass(gettupleitem(cp->cl_bases, i), base))
265 return 1;
266 }
267 return 0;
268}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269
Guido van Rossum81daa321993-05-20 14:24:46 +0000270
271/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000273#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +0000274static int
275addaccess(class, inst)
276 classobject *class;
277 instanceobject *inst;
278{
279 int i, n, pos, ret;
280 object *key, *value, *ac;
281
282 n = gettuplesize(class->cl_bases);
283 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000284 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000285 return -1;
286 }
287
288 pos = 0;
289 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
290 if (!is_accessobject(value))
291 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000292 if (hasaccessvalue(value))
293 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000294 ac = dict2lookup(inst->in_dict, key);
295 if (ac != NULL && is_accessobject(ac)) {
296 err_setval(ConflictError, key);
297 return -1;
298 }
299 ac = cloneaccessobject(value);
300 if (ac == NULL)
301 return -1;
302 ret = dict2insert(inst->in_dict, key, ac);
303 DECREF(ac);
304 if (ret != 0)
305 return -1;
306 }
307 return 0;
308}
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000309#endif
Guido van Rossum81daa321993-05-20 14:24:46 +0000310
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311object *
Guido van Rossuma83f2701995-07-26 18:07:32 +0000312newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000313 object *class;
314 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000315 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316{
Guido van Rossume8122f11991-05-05 20:03:07 +0000317 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000318 object *init;
Guido van Rossum2878a691996-08-09 20:53:24 +0000319 static object *initstr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000321 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 return NULL;
323 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000324 inst = NEWOBJ(instanceobject, &Instancetype);
325 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326 return NULL;
327 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000328 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000329 inst->in_dict = newdictobject();
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000330 if (inst->in_dict == NULL
331#ifdef SUPPORT_OBSOLETE_ACCESS
332 || addaccess((classobject *)class, inst) != 0
333#endif
334 ) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000335 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 return NULL;
337 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000338 if (initstr == NULL)
339 initstr = newstringobject("__init__");
340 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000341 if (init == NULL) {
342 err_clear();
Guido van Rossuma83f2701995-07-26 18:07:32 +0000343 if (arg != NULL && (!is_tupleobject(arg) ||
344 gettuplesize(arg) != 0) || kw != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000345 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000346 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000347 DECREF(inst);
348 inst = NULL;
349 }
350 }
351 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000352 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000353 DECREF(init);
354 if (res == NULL) {
355 DECREF(inst);
356 inst = NULL;
357 }
358 else {
359 if (res != None) {
360 err_setstr(TypeError,
361 "__init__() should return None");
362 DECREF(inst);
363 inst = NULL;
364 }
365 DECREF(res);
366 }
367 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000368 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369}
370
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000371/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372
373static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000374instance_dealloc(inst)
375 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000377 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000378 object *del;
Guido van Rossum2878a691996-08-09 20:53:24 +0000379 static object *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000380 /* Call the __del__ method if it exists. First temporarily
381 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000382#ifdef Py_TRACE_REFS
383 /* much too complicated if Py_TRACE_REFS defined */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000384 extern long ref_total;
385 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000386 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000387 ref_total--; /* compensate for increment in NEWREF */
388#ifdef COUNT_ALLOCS
389 inst->ob_type->tp_alloc--; /* ditto */
390#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000391#else /* !Py_TRACE_REFS */
Guido van Rossum25831651993-05-19 14:50:45 +0000392 INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000393#endif /* !Py_TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000394 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000395 if (delstr == NULL)
396 delstr = newstringobject("__del__");
397 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000398 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000399 DECREF(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000400 if (res == NULL) {
401 writestring("exception in __del__ method ignored\n",
402 sysget("stdout"));
403 }
404 else
405 DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000406 }
407 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000408 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000409 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000410 if (--inst->ob_refcnt > 0) {
411#ifdef COUNT_ALLOCS
412 inst->ob_type->tp_free--;
413#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000414 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000415 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000416#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000417#ifdef COUNT_ALLOCS
418 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
419#endif
420 UNREF(inst);
421 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000422#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000423 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000424 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000425 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426}
427
Guido van Rossume7737541994-09-05 07:31:41 +0000428static object *
429instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000430 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000431 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432{
Guido van Rossum94308391991-10-20 20:11:48 +0000433 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000434 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000435 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000436 if (sname[0] == '_' && sname[1] == '_') {
437 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000438 if (getrestricted()) {
439 err_setstr(RuntimeError,
440 "instance.__dict__ not accessible in restricted mode");
441 return NULL;
442 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000443 INCREF(inst->in_dict);
444 return inst->in_dict;
445 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000446 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000447 INCREF(inst->in_class);
448 return (object *)inst->in_class;
449 }
Guido van Rossum94308391991-10-20 20:11:48 +0000450 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000451 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000452 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000453 if (v == NULL) {
454 v = class_lookup(inst->in_class, name, &class);
455 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000456 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000457 return NULL;
458 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000460#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000461 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000462 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000463 if (v == NULL)
464 return NULL;
465 }
466 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000467#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000468 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000469 if (class != NULL) {
470 if (is_funcobject(v)) {
471 object *w = newinstancemethodobject(v, (object *)inst,
472 (object *)class);
473 DECREF(v);
474 v = w;
475 }
476 else if (is_instancemethodobject(v)) {
477 object *im_class = instancemethodgetclass(v);
478 /* Only if classes are compatible */
479 if (issubclass((object *)class, im_class)) {
480 object *im_func = instancemethodgetfunc(v);
481 object *w = newinstancemethodobject(im_func,
482 (object *)inst, im_class);
483 DECREF(v);
484 v = w;
485 }
486 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000487 }
488 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489}
490
Guido van Rossume7737541994-09-05 07:31:41 +0000491static object *
492instance_getattr(inst, name)
493 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000494 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000495{
496 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000497 res = instance_getattr1(inst, name);
498 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
499 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000500 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000501 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000502 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000503 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000504 res = call_object(func, args);
505 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000506 }
507 return res;
508}
509
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000510static int
Guido van Rossume7737541994-09-05 07:31:41 +0000511instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000512 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000513 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000514 object *v;
515{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000516#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000517 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000518 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000519 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000520 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000521#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000522 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000523 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000524 if (rv < 0)
525 err_setstr(AttributeError,
526 "delete non-existing instance attribute");
527 return rv;
528 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000529 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000530 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531}
532
Guido van Rossume7737541994-09-05 07:31:41 +0000533static int
534instance_setattr(inst, name, v)
535 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000536 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000537 object *v;
538{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000539 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000540 char *sname = getstringvalue(name);
541 if (sname[0] == '_' && sname[1] == '_'
542 && (strcmp(sname, "__dict__") == 0 ||
543 strcmp(sname, "__class__") == 0)) {
544 int n = strlen(sname);
545 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000546 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000547 return -1;
548 }
Guido van Rossume7737541994-09-05 07:31:41 +0000549 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000550 if (v == NULL)
551 func = inst->in_class->cl_delattr;
552 else
553 func = inst->in_class->cl_setattr;
554 if (func == NULL)
555 return instance_setattr1(inst, name, v);
556 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000557 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000558 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000559 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000560 if (args == NULL)
561 return -1;
562 res = call_object(func, args);
563 DECREF(args);
564 if (res == NULL)
565 return -1;
566 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000567 return 0;
568}
569
Guido van Rossum9bfef441993-03-29 10:43:31 +0000570static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000571instance_repr(inst)
572 instanceobject *inst;
573{
574 object *func;
575 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000576 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000577
Guido van Rossum2878a691996-08-09 20:53:24 +0000578 if (reprstr == NULL)
579 reprstr = newstringobject("__repr__");
580 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000581 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000582 char buf[140];
583 object *classname = inst->in_class->cl_name;
584 char *cname;
585 if (classname != NULL && is_stringobject(classname))
586 cname = getstringvalue(classname);
587 else
588 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000589 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000590 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000591 return newstringobject(buf);
592 }
593 res = call_object(func, (object *)NULL);
594 DECREF(func);
595 return res;
596}
597
Guido van Rossume7d444f1995-01-07 12:35:18 +0000598static object *
599instance_compare1(inst, other)
600 object *inst, *other;
601{
602 return instancebinop(inst, other, "__cmp__", "__rcmp__",
603 instance_compare1);
604}
605
Guido van Rossum9bfef441993-03-29 10:43:31 +0000606static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000607instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000608 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000609{
Guido van Rossum03093a21994-09-28 15:51:32 +0000610 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000611 long outcome;
612 result = instance_compare1(inst, other);
613 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000614 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000615 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000616 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000617 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000618 outcome = getintvalue(result);
619 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000620 if (outcome < 0)
621 return -1;
622 else if (outcome > 0)
623 return 1;
624 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000625}
626
Guido van Rossum9bfef441993-03-29 10:43:31 +0000627static long
628instance_hash(inst)
629 instanceobject *inst;
630{
631 object *func;
632 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000633 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000634 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000635
Guido van Rossum2878a691996-08-09 20:53:24 +0000636 if (hashstr == NULL)
637 hashstr = newstringobject("__hash__");
638 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000639 if (func == NULL) {
640 /* If there is no __cmp__ method, we hash on the address.
641 If a __cmp__ method exists, there must be a __hash__. */
642 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000643 if (cmpstr == NULL)
644 cmpstr = newstringobject("__cmp__");
645 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000646 if (func == NULL) {
647 err_clear();
648 outcome = (long)inst;
649 if (outcome == -1)
650 outcome = -2;
651 return outcome;
652 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000653 err_setstr(TypeError, "unhashable instance");
654 return -1;
655 }
656 res = call_object(func, (object *)NULL);
657 DECREF(func);
658 if (res == NULL)
659 return -1;
660 if (is_intobject(res)) {
661 outcome = getintvalue(res);
662 if (outcome == -1)
663 outcome = -2;
664 }
665 else {
666 err_setstr(TypeError, "__hash__() should return an int");
667 outcome = -1;
668 }
669 DECREF(res);
670 return outcome;
671}
672
Guido van Rossum2878a691996-08-09 20:53:24 +0000673static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
674
Guido van Rossum9bfef441993-03-29 10:43:31 +0000675static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000676instance_length(inst)
677 instanceobject *inst;
678{
679 object *func;
680 object *res;
681 int outcome;
682
Guido van Rossum2878a691996-08-09 20:53:24 +0000683 if (lenstr == NULL)
684 lenstr = newstringobject("__len__");
685 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000686 if (func == NULL)
687 return -1;
688 res = call_object(func, (object *)NULL);
689 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000690 if (res == NULL)
691 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000692 if (is_intobject(res)) {
693 outcome = getintvalue(res);
694 if (outcome < 0)
695 err_setstr(ValueError, "__len__() should return >= 0");
696 }
697 else {
698 err_setstr(TypeError, "__len__() should return an int");
699 outcome = -1;
700 }
701 DECREF(res);
702 return outcome;
703}
704
Guido van Rossum9bfef441993-03-29 10:43:31 +0000705static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000706instance_subscript(inst, key)
707 instanceobject *inst;
708 object *key;
709{
710 object *func;
711 object *arg;
712 object *res;
713
Guido van Rossum2878a691996-08-09 20:53:24 +0000714 if (getitemstr == NULL)
715 getitemstr = newstringobject("__getitem__");
716 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000717 if (func == NULL)
718 return NULL;
719 arg = mkvalue("(O)", key);
720 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
Guido van Rossum9bfef441993-03-29 10:43:31 +0000730static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000731instance_ass_subscript(inst, key, value)
732 instanceobject*inst;
733 object *key;
734 object *value;
735{
736 object *func;
737 object *arg;
738 object *res;
739
Guido van Rossum2878a691996-08-09 20:53:24 +0000740 if (value == NULL) {
741 if (delitemstr == NULL)
742 delitemstr = newstringobject("__delitem__");
743 func = instance_getattr(inst, delitemstr);
744 }
745 else {
746 if (setitemstr == NULL)
747 setitemstr = newstringobject("__setitem__");
748 func = instance_getattr(inst, setitemstr);
749 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000750 if (func == NULL)
751 return -1;
752 if (value == NULL)
753 arg = mkvalue("(O)", key);
754 else
755 arg = mkvalue("(OO)", key, value);
756 if (arg == NULL) {
757 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000758 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759 }
760 res = call_object(func, arg);
761 DECREF(func);
762 DECREF(arg);
763 if (res == NULL)
764 return -1;
765 DECREF(res);
766 return 0;
767}
768
Guido van Rossum9bfef441993-03-29 10:43:31 +0000769static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000770 (inquiry)instance_length, /*mp_length*/
771 (binaryfunc)instance_subscript, /*mp_subscript*/
772 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000773};
774
775static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776instance_item(inst, i)
777 instanceobject *inst;
778 int i;
779{
780 object *func, *arg, *res;
781
Guido van Rossum2878a691996-08-09 20:53:24 +0000782 if (getitemstr == NULL)
783 getitemstr = newstringobject("__getitem__");
784 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785 if (func == NULL)
786 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000787 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000788 if (arg == NULL) {
789 DECREF(func);
790 return NULL;
791 }
792 res = call_object(func, arg);
793 DECREF(func);
794 DECREF(arg);
795 return res;
796}
797
798static object *
799instance_slice(inst, i, j)
800 instanceobject *inst;
801 int i, j;
802{
803 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000804 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000805
Guido van Rossum2878a691996-08-09 20:53:24 +0000806 if (getslicestr == NULL)
807 getslicestr = newstringobject("__getslice__");
808 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809 if (func == NULL)
810 return NULL;
811 arg = mkvalue("(ii)", i, j);
812 if (arg == NULL) {
813 DECREF(func);
814 return NULL;
815 }
816 res = call_object(func, arg);
817 DECREF(func);
818 DECREF(arg);
819 return res;
820}
821
822static int
823instance_ass_item(inst, i, item)
824 instanceobject *inst;
825 int i;
826 object *item;
827{
828 object *func, *arg, *res;
829
Guido van Rossum2878a691996-08-09 20:53:24 +0000830 if (item == NULL) {
831 if (delitemstr == NULL)
832 delitemstr = newstringobject("__delitem__");
833 func = instance_getattr(inst, delitemstr);
834 }
835 else {
836 if (setitemstr == NULL)
837 setitemstr = newstringobject("__setitem__");
838 func = instance_getattr(inst, setitemstr);
839 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000841 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842 if (item == NULL)
843 arg = mkvalue("i", i);
844 else
845 arg = mkvalue("(iO)", i, item);
846 if (arg == NULL) {
847 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000848 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000849 }
850 res = call_object(func, arg);
851 DECREF(func);
852 DECREF(arg);
853 if (res == NULL)
854 return -1;
855 DECREF(res);
856 return 0;
857}
858
859static int
860instance_ass_slice(inst, i, j, value)
861 instanceobject *inst;
862 int i, j;
863 object *value;
864{
865 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000866 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000867
Guido van Rossum2878a691996-08-09 20:53:24 +0000868 if (value == NULL) {
869 if (delslicestr == NULL)
870 delslicestr = newstringobject("__delslice__");
871 func = instance_getattr(inst, delslicestr);
872 }
873 else {
874 if (setslicestr == NULL)
875 setslicestr = newstringobject("__setslice__");
876 func = instance_getattr(inst, setslicestr);
877 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000878 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000879 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000880 if (value == NULL)
881 arg = mkvalue("(ii)", i, j);
882 else
883 arg = mkvalue("(iiO)", i, j, value);
884 if (arg == NULL) {
885 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000886 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000887 }
888 res = call_object(func, arg);
889 DECREF(func);
890 DECREF(arg);
891 if (res == NULL)
892 return -1;
893 DECREF(res);
894 return 0;
895}
896
897static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000898 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000899 0, /*sq_concat*/
900 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000901 (intargfunc)instance_item, /*sq_item*/
902 (intintargfunc)instance_slice, /*sq_slice*/
903 (intobjargproc)instance_ass_item, /*sq_ass_item*/
904 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905};
906
907static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908generic_unary_op(self, methodname)
909 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000910 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000911{
912 object *func, *res;
913
914 if ((func = instance_getattr(self, methodname)) == NULL)
915 return NULL;
916 res = call_object(func, (object *)NULL);
917 DECREF(func);
918 return res;
919}
920
Guido van Rossum03093a21994-09-28 15:51:32 +0000921
922/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000923static int halfbinop Py_PROTO((object *, object *, char *, object **,
924 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000925
926
927/* Implement a binary operator involving at least one class instance. */
928
929object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000930instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000931 object *v;
932 object *w;
933 char *opname;
934 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000935 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000936{
937 char buf[256];
938 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000939 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000940 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000941 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000942 return result;
943 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
944 err_setstr(TypeError, buf);
945 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000946}
947
Guido van Rossum03093a21994-09-28 15:51:32 +0000948
949/* Try one half of a binary operator involving a class instance.
950 Return value:
951 -1 if an exception is to be reported right away
952 0 if we have a valid result
953 1 if we could try another operation
954*/
955
Guido van Rossum2878a691996-08-09 20:53:24 +0000956static object *coerce_obj;
957
Guido van Rossum03093a21994-09-28 15:51:32 +0000958static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000959halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000960 object *v;
961 object *w;
962 char *opname;
963 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000964 object * (*thisfunc) PROTO((object *, object *));
965 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000966{
967 object *func;
968 object *args;
969 object *coerce;
970 object *coerced = NULL;
971 object *v1;
972
973 if (!is_instanceobject(v))
974 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000975 if (coerce_obj == NULL) {
976 coerce_obj = newstringobject("__coerce__");
977 if (coerce_obj == NULL)
978 return -1;
979 }
980 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +0000981 if (coerce == NULL) {
982 err_clear();
983 }
984 else {
985 args = mkvalue("(O)", w);
986 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000987 return -1;
988 }
989 coerced = call_object(coerce, args);
990 DECREF(args);
991 DECREF(coerce);
992 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000993 return -1;
994 }
995 if (coerced == None) {
996 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000997 return 1;
998 }
999 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1000 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001001 err_setstr(TypeError,
1002 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001003 return -1;
1004 }
1005 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001006 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001007 if (v1 != v) {
1008 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001009 if (!is_instanceobject(v) && !is_instanceobject(w)) {
1010 if (swapped)
1011 *r_result = (*thisfunc)(w, v);
1012 else
1013 *r_result = (*thisfunc)(v, w);
1014 DECREF(coerced);
1015 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001016 }
1017 }
1018 w = gettupleitem(coerced, 1);
1019 }
Guido van Rossume7d444f1995-01-07 12:35:18 +00001020 func = getattr(v, opname);
1021 if (func == NULL) {
1022 XDECREF(coerced);
1023 if (err_occurred() != AttributeError)
1024 return -1;
1025 err_clear();
1026 return 1;
1027 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001028 args = mkvalue("(O)", w);
1029 if (args == NULL) {
1030 DECREF(func);
1031 XDECREF(coerced);
1032 return -1;
1033 }
1034 *r_result = call_object(func, args);
1035 DECREF(args);
1036 DECREF(func);
1037 XDECREF(coerced);
1038 return *r_result == NULL ? -1 : 0;
1039}
1040
Guido van Rossum879c5811995-01-10 15:24:06 +00001041static int
1042instance_coerce(pv, pw)
1043 object **pv;
1044 object **pw;
1045{
1046 object *v = *pv;
1047 object *w = *pw;
1048 object *coerce;
1049 object *args;
1050 object *coerced;
1051
Guido van Rossum2878a691996-08-09 20:53:24 +00001052 if (coerce_obj == NULL) {
1053 coerce_obj = newstringobject("__coerce__");
1054 if (coerce_obj == NULL)
1055 return -1;
1056 }
1057 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001058 if (coerce == NULL) {
1059 /* No __coerce__ method: always OK */
1060 err_clear();
1061 INCREF(v);
1062 INCREF(w);
1063 return 0;
1064 }
1065 /* Has __coerce__ method: call it */
1066 args = mkvalue("(O)", w);
1067 if (args == NULL) {
1068 return -1;
1069 }
1070 coerced = call_object(coerce, args);
1071 DECREF(args);
1072 DECREF(coerce);
1073 if (coerced == NULL) {
1074 /* __coerce__ call raised an exception */
1075 return -1;
1076 }
1077 if (coerced == None) {
1078 /* __coerce__ says "I can't do it" */
1079 DECREF(coerced);
1080 return 1;
1081 }
1082 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1083 /* __coerce__ return value is malformed */
1084 DECREF(coerced);
1085 err_setstr(TypeError,
1086 "coercion should return None or 2-tuple");
1087 return -1;
1088 }
1089 /* __coerce__ returned two new values */
1090 *pv = gettupleitem(coerced, 0);
1091 *pw = gettupleitem(coerced, 1);
1092 INCREF(*pv);
1093 INCREF(*pw);
1094 DECREF(coerced);
1095 return 0;
1096}
1097
Guido van Rossum03093a21994-09-28 15:51:32 +00001098
Guido van Rossum04691fc1992-08-12 15:35:34 +00001099#define UNARY(funcname, methodname) \
1100static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001101 static object *o; \
1102 if (o == NULL) o = newstringobject(methodname); \
1103 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001104}
1105
Guido van Rossum04691fc1992-08-12 15:35:34 +00001106UNARY(instance_neg, "__neg__")
1107UNARY(instance_pos, "__pos__")
1108UNARY(instance_abs, "__abs__")
1109
Guido van Rossum9bfef441993-03-29 10:43:31 +00001110static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111instance_nonzero(self)
1112 instanceobject *self;
1113{
1114 object *func, *res;
1115 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001116 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001117
Guido van Rossum2878a691996-08-09 20:53:24 +00001118 if (nonzerostr == NULL)
1119 nonzerostr = newstringobject("__nonzero__");
1120 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001121 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001122 if (lenstr == NULL)
1123 lenstr = newstringobject("__len__");
1124 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125 err_clear();
1126 /* Fall back to the default behavior:
1127 all instances are nonzero */
1128 return 1;
1129 }
1130 }
1131 res = call_object(func, (object *)NULL);
1132 DECREF(func);
1133 if (res == NULL)
1134 return -1;
1135 if (!is_intobject(res)) {
1136 DECREF(res);
1137 err_setstr(TypeError, "__nonzero__ should return an int");
1138 return -1;
1139 }
1140 outcome = getintvalue(res);
1141 DECREF(res);
1142 if (outcome < 0) {
1143 err_setstr(ValueError, "__nonzero__ should return >= 0");
1144 return -1;
1145 }
1146 return outcome > 0;
1147}
1148
1149UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001150UNARY(instance_int, "__int__")
1151UNARY(instance_long, "__long__")
1152UNARY(instance_float, "__float__")
1153UNARY(instance_oct, "__oct__")
1154UNARY(instance_hex, "__hex__")
1155
Guido van Rossum03093a21994-09-28 15:51:32 +00001156/* This version is for ternary calls only (z != None) */
1157static object *
1158instance_pow(v, w, z)
1159 object *v;
1160 object *w;
1161 object *z;
1162{
1163 /* XXX Doesn't do coercions... */
1164 object *func;
1165 object *args;
1166 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001167 static object *powstr;
1168
1169 if (powstr == NULL)
1170 powstr = newstringobject("__pow__");
1171 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001172 if (func == NULL)
1173 return NULL;
1174 args = mkvalue("(OO)", w, z);
1175 if (args == NULL) {
1176 DECREF(func);
1177 return NULL;
1178 }
1179 result = call_object(func, args);
1180 DECREF(func);
1181 DECREF(args);
1182 return result;
1183}
1184
Guido van Rossum04691fc1992-08-12 15:35:34 +00001185static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001186 0, /*nb_add*/
1187 0, /*nb_subtract*/
1188 0, /*nb_multiply*/
1189 0, /*nb_divide*/
1190 0, /*nb_remainder*/
1191 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001192 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001193 (unaryfunc)instance_neg, /*nb_negative*/
1194 (unaryfunc)instance_pos, /*nb_positive*/
1195 (unaryfunc)instance_abs, /*nb_absolute*/
1196 (inquiry)instance_nonzero, /*nb_nonzero*/
1197 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001198 0, /*nb_lshift*/
1199 0, /*nb_rshift*/
1200 0, /*nb_and*/
1201 0, /*nb_xor*/
1202 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001203 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001204 (unaryfunc)instance_int, /*nb_int*/
1205 (unaryfunc)instance_long, /*nb_long*/
1206 (unaryfunc)instance_float, /*nb_float*/
1207 (unaryfunc)instance_oct, /*nb_oct*/
1208 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209};
1210
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001211typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001212 OB_HEAD_INIT(&Typetype)
1213 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001214 "instance",
1215 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001216 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001217 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001218 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001219 0, /*tp_getattr*/
1220 0, /*tp_setattr*/
1221 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001222 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001223 &instance_as_number, /*tp_as_number*/
1224 &instance_as_sequence, /*tp_as_sequence*/
1225 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001226 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001227 0, /*tp_call*/
1228 0, /*tp_str*/
1229 (getattrofunc)instance_getattr, /*tp_getattro*/
1230 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001231};
1232
1233
Guido van Rossum81daa321993-05-20 14:24:46 +00001234/* Instance method objects are used for two purposes:
1235 (a) as bound instance methods (returned by instancename.methodname)
1236 (b) as unbound methods (returned by ClassName.methodname)
1237 In case (b), im_self is NULL
1238*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001239
1240typedef struct {
1241 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001242 object *im_func; /* The function implementing the method */
1243 object *im_self; /* The instance it is bound to, or NULL */
1244 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001245} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001246
1247object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001248newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001249 object *func;
1250 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001251 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001252{
Guido van Rossume8122f11991-05-05 20:03:07 +00001253 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001254 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001255 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001256 return NULL;
1257 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001258 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1259 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001260 return NULL;
1261 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001262 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001263 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001264 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001265 INCREF(class);
1266 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001267 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001268}
1269
1270object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001271instancemethodgetfunc(im)
1272 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001273{
Guido van Rossume8122f11991-05-05 20:03:07 +00001274 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001275 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001276 return NULL;
1277 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001278 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001279}
1280
1281object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001282instancemethodgetself(im)
1283 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001284{
Guido van Rossume8122f11991-05-05 20:03:07 +00001285 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001286 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001287 return NULL;
1288 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001289 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001290}
1291
Guido van Rossum81daa321993-05-20 14:24:46 +00001292object *
1293instancemethodgetclass(im)
1294 register object *im;
1295{
1296 if (!is_instancemethodobject(im)) {
1297 err_badcall();
1298 return NULL;
1299 }
1300 return ((instancemethodobject *)im)->im_class;
1301}
1302
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001303/* Class method methods */
1304
Guido van Rossume8122f11991-05-05 20:03:07 +00001305#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001306
Guido van Rossume8122f11991-05-05 20:03:07 +00001307static struct memberlist instancemethod_memberlist[] = {
1308 {"im_func", T_OBJECT, OFF(im_func)},
1309 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001310 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001311 /* Dummies that are not handled by getattr() except for __members__ */
1312 {"__doc__", T_INT, 0},
1313 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001314 {NULL} /* Sentinel */
1315};
1316
1317static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001318instancemethod_getattr(im, name)
1319 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001320 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001321{
Guido van Rossum2878a691996-08-09 20:53:24 +00001322 char *sname = getstringvalue(name);
1323 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001324 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001325 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001326 INCREF(func->func_name);
1327 return func->func_name;
1328 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001329 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001330 INCREF(func->func_doc);
1331 return func->func_doc;
1332 }
1333 }
1334 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001335 err_setstr(RuntimeError,
1336 "instance-method attributes not accessible in restricted mode");
1337 return NULL;
1338 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001339 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001340}
1341
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001342static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001343instancemethod_dealloc(im)
1344 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001345{
Guido van Rossume8122f11991-05-05 20:03:07 +00001346 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001347 XDECREF(im->im_self);
1348 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001349 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001350}
1351
Guido van Rossumebc8c511992-09-03 20:39:51 +00001352static int
1353instancemethod_compare(a, b)
1354 instancemethodobject *a, *b;
1355{
Guido van Rossume9df7271995-04-06 14:46:51 +00001356 if (a->im_self != b->im_self)
1357 return (a->im_self < b->im_self) ? -1 : 1;
1358 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001359}
1360
Guido van Rossum25831651993-05-19 14:50:45 +00001361static object *
1362instancemethod_repr(a)
1363 instancemethodobject *a;
1364{
1365 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001366 instanceobject *self = (instanceobject *)(a->im_self);
1367 funcobject *func = (funcobject *)(a->im_func);
1368 classobject *class = (classobject *)(a->im_class);
1369 object *fclassname, *iclassname, *funcname;
1370 char *fcname, *icname, *fname;
1371 fclassname = class->cl_name;
1372 funcname = func->func_name;
1373 if (fclassname != NULL && is_stringobject(fclassname))
1374 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001375 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001376 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001377 if (funcname != NULL && is_stringobject(funcname))
1378 fname = getstringvalue(funcname);
1379 else
1380 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001381 if (self == NULL)
1382 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1383 else {
1384 iclassname = self->in_class->cl_name;
1385 if (iclassname != NULL && is_stringobject(iclassname))
1386 icname = getstringvalue(iclassname);
1387 else
1388 icname = "?";
1389 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1390 fcname, fname, icname, (long)self);
1391 }
Guido van Rossum25831651993-05-19 14:50:45 +00001392 return newstringobject(buf);
1393}
1394
Guido van Rossum9bfef441993-03-29 10:43:31 +00001395static long
1396instancemethod_hash(a)
1397 instancemethodobject *a;
1398{
1399 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001400 if (a->im_self == NULL)
1401 x = hashobject(None);
1402 else
1403 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001404 if (x == -1)
1405 return -1;
1406 y = hashobject(a->im_func);
1407 if (y == -1)
1408 return -1;
1409 return x ^ y;
1410}
1411
Guido van Rossume8122f11991-05-05 20:03:07 +00001412typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001413 OB_HEAD_INIT(&Typetype)
1414 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001415 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001416 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001417 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001418 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001419 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001420 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001421 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001422 (cmpfunc)instancemethod_compare, /*tp_compare*/
1423 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001424 0, /*tp_as_number*/
1425 0, /*tp_as_sequence*/
1426 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001427 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001428 0, /*tp_call*/
1429 0, /*tp_str*/
1430 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1431 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001432};