blob: 57768988cd8b813ce14590ad59b5411f1d3920f2 [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 Rossum019f4241996-08-21 14:54:28 +000046 static object *docstr;
47 if (docstr == NULL) {
48 docstr= newstringobject("__doc__");
49 if (docstr == NULL)
50 return NULL;
51 }
52 if (mappinglookup(dict, docstr) == NULL) {
53 if (mappinginsert(dict, docstr, None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000054 return NULL;
55 }
Guido van Rossume2966a61991-12-10 13:53:23 +000056 if (bases == NULL) {
57 bases = newtupleobject(0);
58 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000059 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000060 }
61 else
62 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000064 if (op == NULL) {
65 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000067 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000069 INCREF(dict);
70 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000071 XINCREF(name);
72 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000073 if (getattrstr == NULL) {
74 getattrstr = newstringobject("__getattr__");
75 setattrstr = newstringobject("__setattr__");
76 delattrstr = newstringobject("__delattr__");
77 }
78 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
79 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
80 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000081 XINCREF(op->cl_getattr);
82 XINCREF(op->cl_setattr);
83 XINCREF(op->cl_delattr);
Guido van Rossum0dfcf751996-08-12 22:00:53 +000084#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000085 pos = 0;
86 while (mappinggetnext(dict, &pos, &key, &value)) {
87 if (is_accessobject(value))
88 setaccessowner(value, (object *)op);
89 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +000090#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091 return (object *) op;
92}
93
94/* Class methods */
95
96static void
97class_dealloc(op)
98 classobject *op;
99{
Guido van Rossume2966a61991-12-10 13:53:23 +0000100 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000101 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +0000102 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 free((ANY *)op);
104}
105
106static object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000107class_lookup(cp, name, pclass)
108 classobject *cp;
Guido van Rossum2878a691996-08-09 20:53:24 +0000109 object *name;
Guido van Rossum81daa321993-05-20 14:24:46 +0000110 classobject **pclass;
111{
112 int i, n;
Guido van Rossum2878a691996-08-09 20:53:24 +0000113 object *value = mappinglookup(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000114 if (value != NULL) {
115 *pclass = cp;
116 return value;
117 }
118 n = gettuplesize(cp->cl_bases);
119 for (i = 0; i < n; i++) {
120 object *v = class_lookup((classobject *)
121 gettupleitem(cp->cl_bases, i), name, pclass);
122 if (v != NULL)
123 return v;
124 }
125 return NULL;
126}
127
128static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129class_getattr(op, name)
130 register classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000131 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132{
133 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000134 register char *sname = getstringvalue(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000136 if (sname[0] == '_' && sname[1] == '_') {
137 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000138 if (getrestricted()) {
139 err_setstr(RuntimeError,
140 "class.__dict__ not accessible in restricted mode");
141 return NULL;
142 }
143 INCREF(op->cl_dict);
144 return op->cl_dict;
145 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000146 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000147 INCREF(op->cl_bases);
148 return op->cl_bases;
149 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000150 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000151 if (op->cl_name == NULL)
152 v = None;
153 else
154 v = op->cl_name;
155 INCREF(v);
156 return v;
157 }
Guido van Rossum94308391991-10-20 20:11:48 +0000158 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000159 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000160 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000161 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000162 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000164#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000165 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000166 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000167 if (v == NULL)
168 return NULL;
169 }
170 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000171#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000172 INCREF(v);
173 if (is_funcobject(v)) {
174 object *w = newinstancemethodobject(v, (object *)NULL,
175 (object *)class);
176 DECREF(v);
177 v = w;
178 }
179 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180}
181
Guido van Rossum94308391991-10-20 20:11:48 +0000182static int
183class_setattr(op, name, v)
184 classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000185 object *name;
Guido van Rossum94308391991-10-20 20:11:48 +0000186 object *v;
187{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000188#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000189 object *ac;
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000190#endif
Guido van Rossum2878a691996-08-09 20:53:24 +0000191 char *sname = getstringvalue(name);
192 if (sname[0] == '_' && sname[1] == '_') {
193 int n = getstringsize(name);
194 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000195 err_setstr(TypeError, "read-only special attribute");
196 return -1;
197 }
198 }
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000199 if (getrestricted()) {
200 err_setstr(RuntimeError,
201 "classes are read-only in restricted mode");
202 return -1;
203 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000204#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum2878a691996-08-09 20:53:24 +0000205 ac = mappinglookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000206 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000207 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000208#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000209 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000210 int rv = mappingremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000211 if (rv < 0)
212 err_setstr(AttributeError,
213 "delete non-existing class attribute");
214 return rv;
215 }
Guido van Rossum94308391991-10-20 20:11:48 +0000216 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000217 return mappinginsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000218}
219
Guido van Rossum25831651993-05-19 14:50:45 +0000220static object *
221class_repr(op)
222 classobject *op;
223{
224 char buf[140];
225 char *name;
226 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
227 name = "?";
228 else
229 name = getstringvalue(op->cl_name);
230 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
231 return newstringobject(buf);
232}
233
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234typeobject Classtype = {
235 OB_HEAD_INIT(&Typetype)
236 0,
237 "class",
238 sizeof(classobject),
239 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000240 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000242 0, /*tp_getattr*/
243 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000245 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 0, /*tp_as_number*/
247 0, /*tp_as_sequence*/
248 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000249 0, /*tp_hash*/
250 0, /*tp_call*/
251 0, /*tp_str*/
252 (getattrofunc)class_getattr, /*tp_getattro*/
253 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254};
255
Guido van Rossum81daa321993-05-20 14:24:46 +0000256int
257issubclass(class, base)
258 object *class;
259 object *base;
260{
261 int i, n;
262 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000263 if (class == base)
264 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000265 if (class == NULL || !is_classobject(class))
266 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000267 cp = (classobject *)class;
268 n = gettuplesize(cp->cl_bases);
269 for (i = 0; i < n; i++) {
270 if (issubclass(gettupleitem(cp->cl_bases, i), base))
271 return 1;
272 }
273 return 0;
274}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275
Guido van Rossum81daa321993-05-20 14:24:46 +0000276
277/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000279#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +0000280static int
281addaccess(class, inst)
282 classobject *class;
283 instanceobject *inst;
284{
285 int i, n, pos, ret;
286 object *key, *value, *ac;
287
288 n = gettuplesize(class->cl_bases);
289 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000290 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000291 return -1;
292 }
293
294 pos = 0;
295 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
296 if (!is_accessobject(value))
297 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000298 if (hasaccessvalue(value))
299 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000300 ac = dict2lookup(inst->in_dict, key);
301 if (ac != NULL && is_accessobject(ac)) {
302 err_setval(ConflictError, key);
303 return -1;
304 }
305 ac = cloneaccessobject(value);
306 if (ac == NULL)
307 return -1;
308 ret = dict2insert(inst->in_dict, key, ac);
309 DECREF(ac);
310 if (ret != 0)
311 return -1;
312 }
313 return 0;
314}
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000315#endif
Guido van Rossum81daa321993-05-20 14:24:46 +0000316
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317object *
Guido van Rossuma83f2701995-07-26 18:07:32 +0000318newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000319 object *class;
320 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000321 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322{
Guido van Rossume8122f11991-05-05 20:03:07 +0000323 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000324 object *init;
Guido van Rossum2878a691996-08-09 20:53:24 +0000325 static object *initstr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000327 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 return NULL;
329 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000330 inst = NEWOBJ(instanceobject, &Instancetype);
331 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 return NULL;
333 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000334 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000335 inst->in_dict = newdictobject();
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000336 if (inst->in_dict == NULL
337#ifdef SUPPORT_OBSOLETE_ACCESS
338 || addaccess((classobject *)class, inst) != 0
339#endif
340 ) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000341 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342 return NULL;
343 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000344 if (initstr == NULL)
345 initstr = newstringobject("__init__");
346 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000347 if (init == NULL) {
348 err_clear();
Guido van Rossuma83f2701995-07-26 18:07:32 +0000349 if (arg != NULL && (!is_tupleobject(arg) ||
350 gettuplesize(arg) != 0) || kw != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000351 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000352 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000353 DECREF(inst);
354 inst = NULL;
355 }
356 }
357 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000358 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000359 DECREF(init);
360 if (res == NULL) {
361 DECREF(inst);
362 inst = NULL;
363 }
364 else {
365 if (res != None) {
366 err_setstr(TypeError,
367 "__init__() should return None");
368 DECREF(inst);
369 inst = NULL;
370 }
371 DECREF(res);
372 }
373 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000374 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375}
376
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000377/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378
379static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000380instance_dealloc(inst)
381 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000383 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000384 object *del;
Guido van Rossum2878a691996-08-09 20:53:24 +0000385 static object *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000386 /* Call the __del__ method if it exists. First temporarily
387 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000388#ifdef Py_TRACE_REFS
389 /* much too complicated if Py_TRACE_REFS defined */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000390 extern long ref_total;
391 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000392 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000393 ref_total--; /* compensate for increment in NEWREF */
394#ifdef COUNT_ALLOCS
395 inst->ob_type->tp_alloc--; /* ditto */
396#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000397#else /* !Py_TRACE_REFS */
Guido van Rossum25831651993-05-19 14:50:45 +0000398 INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000399#endif /* !Py_TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000400 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000401 if (delstr == NULL)
402 delstr = newstringobject("__del__");
403 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000404 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000405 DECREF(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000406 if (res == NULL) {
407 writestring("exception in __del__ method ignored\n",
Guido van Rossum89227eb1996-08-20 19:54:29 +0000408 sysget("stderr"));
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000409 }
410 else
411 DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000412 }
413 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000414 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000415 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000416 if (--inst->ob_refcnt > 0) {
417#ifdef COUNT_ALLOCS
418 inst->ob_type->tp_free--;
419#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000420 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000421 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000422#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000423#ifdef COUNT_ALLOCS
424 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
425#endif
426 UNREF(inst);
427 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000428#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000429 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000430 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000431 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432}
433
Guido van Rossume7737541994-09-05 07:31:41 +0000434static object *
435instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000436 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000437 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438{
Guido van Rossum94308391991-10-20 20:11:48 +0000439 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000440 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000441 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000442 if (sname[0] == '_' && sname[1] == '_') {
443 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000444 if (getrestricted()) {
445 err_setstr(RuntimeError,
446 "instance.__dict__ not accessible in restricted mode");
447 return NULL;
448 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000449 INCREF(inst->in_dict);
450 return inst->in_dict;
451 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000452 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000453 INCREF(inst->in_class);
454 return (object *)inst->in_class;
455 }
Guido van Rossum94308391991-10-20 20:11:48 +0000456 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000457 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000458 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000459 if (v == NULL) {
460 v = class_lookup(inst->in_class, name, &class);
461 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000462 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000463 return NULL;
464 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000466#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000467 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000468 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000469 if (v == NULL)
470 return NULL;
471 }
472 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000473#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000474 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000475 if (class != NULL) {
476 if (is_funcobject(v)) {
477 object *w = newinstancemethodobject(v, (object *)inst,
478 (object *)class);
479 DECREF(v);
480 v = w;
481 }
482 else if (is_instancemethodobject(v)) {
483 object *im_class = instancemethodgetclass(v);
484 /* Only if classes are compatible */
485 if (issubclass((object *)class, im_class)) {
486 object *im_func = instancemethodgetfunc(v);
487 object *w = newinstancemethodobject(im_func,
488 (object *)inst, im_class);
489 DECREF(v);
490 v = w;
491 }
492 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000493 }
494 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495}
496
Guido van Rossume7737541994-09-05 07:31:41 +0000497static object *
498instance_getattr(inst, name)
499 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000500 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000501{
502 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000503 res = instance_getattr1(inst, name);
504 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
505 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000506 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000507 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000508 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000509 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000510 res = call_object(func, args);
511 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000512 }
513 return res;
514}
515
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000516static int
Guido van Rossume7737541994-09-05 07:31:41 +0000517instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000518 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000519 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520 object *v;
521{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000522#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000523 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000524 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000525 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000526 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000527#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000528 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000529 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000530 if (rv < 0)
531 err_setstr(AttributeError,
532 "delete non-existing instance attribute");
533 return rv;
534 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000535 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000536 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537}
538
Guido van Rossume7737541994-09-05 07:31:41 +0000539static int
540instance_setattr(inst, name, v)
541 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000542 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000543 object *v;
544{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000545 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000546 char *sname = getstringvalue(name);
547 if (sname[0] == '_' && sname[1] == '_'
548 && (strcmp(sname, "__dict__") == 0 ||
549 strcmp(sname, "__class__") == 0)) {
550 int n = strlen(sname);
551 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000552 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000553 return -1;
554 }
Guido van Rossume7737541994-09-05 07:31:41 +0000555 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000556 if (v == NULL)
557 func = inst->in_class->cl_delattr;
558 else
559 func = inst->in_class->cl_setattr;
560 if (func == NULL)
561 return instance_setattr1(inst, name, v);
562 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000563 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000564 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000565 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000566 if (args == NULL)
567 return -1;
568 res = call_object(func, args);
569 DECREF(args);
570 if (res == NULL)
571 return -1;
572 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000573 return 0;
574}
575
Guido van Rossum9bfef441993-03-29 10:43:31 +0000576static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000577instance_repr(inst)
578 instanceobject *inst;
579{
580 object *func;
581 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000582 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000583
Guido van Rossum2878a691996-08-09 20:53:24 +0000584 if (reprstr == NULL)
585 reprstr = newstringobject("__repr__");
586 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000587 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000588 char buf[140];
589 object *classname = inst->in_class->cl_name;
590 char *cname;
591 if (classname != NULL && is_stringobject(classname))
592 cname = getstringvalue(classname);
593 else
594 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000595 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000596 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000597 return newstringobject(buf);
598 }
599 res = call_object(func, (object *)NULL);
600 DECREF(func);
601 return res;
602}
603
Guido van Rossume7d444f1995-01-07 12:35:18 +0000604static object *
605instance_compare1(inst, other)
606 object *inst, *other;
607{
608 return instancebinop(inst, other, "__cmp__", "__rcmp__",
609 instance_compare1);
610}
611
Guido van Rossum9bfef441993-03-29 10:43:31 +0000612static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000613instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000614 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000615{
Guido van Rossum03093a21994-09-28 15:51:32 +0000616 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000617 long outcome;
618 result = instance_compare1(inst, other);
619 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000620 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000621 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000622 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000623 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000624 outcome = getintvalue(result);
625 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000626 if (outcome < 0)
627 return -1;
628 else if (outcome > 0)
629 return 1;
630 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000631}
632
Guido van Rossum9bfef441993-03-29 10:43:31 +0000633static long
634instance_hash(inst)
635 instanceobject *inst;
636{
637 object *func;
638 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000639 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000640 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000641
Guido van Rossum2878a691996-08-09 20:53:24 +0000642 if (hashstr == NULL)
643 hashstr = newstringobject("__hash__");
644 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000645 if (func == NULL) {
646 /* If there is no __cmp__ method, we hash on the address.
647 If a __cmp__ method exists, there must be a __hash__. */
648 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000649 if (cmpstr == NULL)
650 cmpstr = newstringobject("__cmp__");
651 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000652 if (func == NULL) {
653 err_clear();
654 outcome = (long)inst;
655 if (outcome == -1)
656 outcome = -2;
657 return outcome;
658 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000659 err_setstr(TypeError, "unhashable instance");
660 return -1;
661 }
662 res = call_object(func, (object *)NULL);
663 DECREF(func);
664 if (res == NULL)
665 return -1;
666 if (is_intobject(res)) {
667 outcome = getintvalue(res);
668 if (outcome == -1)
669 outcome = -2;
670 }
671 else {
672 err_setstr(TypeError, "__hash__() should return an int");
673 outcome = -1;
674 }
675 DECREF(res);
676 return outcome;
677}
678
Guido van Rossum2878a691996-08-09 20:53:24 +0000679static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
680
Guido van Rossum9bfef441993-03-29 10:43:31 +0000681static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000682instance_length(inst)
683 instanceobject *inst;
684{
685 object *func;
686 object *res;
687 int outcome;
688
Guido van Rossum2878a691996-08-09 20:53:24 +0000689 if (lenstr == NULL)
690 lenstr = newstringobject("__len__");
691 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000692 if (func == NULL)
693 return -1;
694 res = call_object(func, (object *)NULL);
695 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000696 if (res == NULL)
697 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000698 if (is_intobject(res)) {
699 outcome = getintvalue(res);
700 if (outcome < 0)
701 err_setstr(ValueError, "__len__() should return >= 0");
702 }
703 else {
704 err_setstr(TypeError, "__len__() should return an int");
705 outcome = -1;
706 }
707 DECREF(res);
708 return outcome;
709}
710
Guido van Rossum9bfef441993-03-29 10:43:31 +0000711static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000712instance_subscript(inst, key)
713 instanceobject *inst;
714 object *key;
715{
716 object *func;
717 object *arg;
718 object *res;
719
Guido van Rossum2878a691996-08-09 20:53:24 +0000720 if (getitemstr == NULL)
721 getitemstr = newstringobject("__getitem__");
722 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000723 if (func == NULL)
724 return NULL;
725 arg = mkvalue("(O)", key);
726 if (arg == NULL) {
727 DECREF(func);
728 return NULL;
729 }
730 res = call_object(func, arg);
731 DECREF(func);
732 DECREF(arg);
733 return res;
734}
735
Guido van Rossum9bfef441993-03-29 10:43:31 +0000736static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000737instance_ass_subscript(inst, key, value)
738 instanceobject*inst;
739 object *key;
740 object *value;
741{
742 object *func;
743 object *arg;
744 object *res;
745
Guido van Rossum2878a691996-08-09 20:53:24 +0000746 if (value == NULL) {
747 if (delitemstr == NULL)
748 delitemstr = newstringobject("__delitem__");
749 func = instance_getattr(inst, delitemstr);
750 }
751 else {
752 if (setitemstr == NULL)
753 setitemstr = newstringobject("__setitem__");
754 func = instance_getattr(inst, setitemstr);
755 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756 if (func == NULL)
757 return -1;
758 if (value == NULL)
759 arg = mkvalue("(O)", key);
760 else
761 arg = mkvalue("(OO)", key, value);
762 if (arg == NULL) {
763 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000764 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000765 }
766 res = call_object(func, arg);
767 DECREF(func);
768 DECREF(arg);
769 if (res == NULL)
770 return -1;
771 DECREF(res);
772 return 0;
773}
774
Guido van Rossum9bfef441993-03-29 10:43:31 +0000775static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000776 (inquiry)instance_length, /*mp_length*/
777 (binaryfunc)instance_subscript, /*mp_subscript*/
778 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000779};
780
781static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782instance_item(inst, i)
783 instanceobject *inst;
784 int i;
785{
786 object *func, *arg, *res;
787
Guido van Rossum2878a691996-08-09 20:53:24 +0000788 if (getitemstr == NULL)
789 getitemstr = newstringobject("__getitem__");
790 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000791 if (func == NULL)
792 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000793 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794 if (arg == NULL) {
795 DECREF(func);
796 return NULL;
797 }
798 res = call_object(func, arg);
799 DECREF(func);
800 DECREF(arg);
801 return res;
802}
803
804static object *
805instance_slice(inst, i, j)
806 instanceobject *inst;
807 int i, j;
808{
809 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000810 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811
Guido van Rossum2878a691996-08-09 20:53:24 +0000812 if (getslicestr == NULL)
813 getslicestr = newstringobject("__getslice__");
814 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000815 if (func == NULL)
816 return NULL;
817 arg = mkvalue("(ii)", i, j);
818 if (arg == NULL) {
819 DECREF(func);
820 return NULL;
821 }
822 res = call_object(func, arg);
823 DECREF(func);
824 DECREF(arg);
825 return res;
826}
827
828static int
829instance_ass_item(inst, i, item)
830 instanceobject *inst;
831 int i;
832 object *item;
833{
834 object *func, *arg, *res;
835
Guido van Rossum2878a691996-08-09 20:53:24 +0000836 if (item == NULL) {
837 if (delitemstr == NULL)
838 delitemstr = newstringobject("__delitem__");
839 func = instance_getattr(inst, delitemstr);
840 }
841 else {
842 if (setitemstr == NULL)
843 setitemstr = newstringobject("__setitem__");
844 func = instance_getattr(inst, setitemstr);
845 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000847 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000848 if (item == NULL)
849 arg = mkvalue("i", i);
850 else
851 arg = mkvalue("(iO)", i, item);
852 if (arg == NULL) {
853 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000854 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855 }
856 res = call_object(func, arg);
857 DECREF(func);
858 DECREF(arg);
859 if (res == NULL)
860 return -1;
861 DECREF(res);
862 return 0;
863}
864
865static int
866instance_ass_slice(inst, i, j, value)
867 instanceobject *inst;
868 int i, j;
869 object *value;
870{
871 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000872 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000873
Guido van Rossum2878a691996-08-09 20:53:24 +0000874 if (value == NULL) {
875 if (delslicestr == NULL)
876 delslicestr = newstringobject("__delslice__");
877 func = instance_getattr(inst, delslicestr);
878 }
879 else {
880 if (setslicestr == NULL)
881 setslicestr = newstringobject("__setslice__");
882 func = instance_getattr(inst, setslicestr);
883 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000884 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000885 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000886 if (value == NULL)
887 arg = mkvalue("(ii)", i, j);
888 else
889 arg = mkvalue("(iiO)", i, j, value);
890 if (arg == NULL) {
891 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000892 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000893 }
894 res = call_object(func, arg);
895 DECREF(func);
896 DECREF(arg);
897 if (res == NULL)
898 return -1;
899 DECREF(res);
900 return 0;
901}
902
903static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000905 0, /*sq_concat*/
906 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000907 (intargfunc)instance_item, /*sq_item*/
908 (intintargfunc)instance_slice, /*sq_slice*/
909 (intobjargproc)instance_ass_item, /*sq_ass_item*/
910 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000911};
912
913static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914generic_unary_op(self, methodname)
915 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000916 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917{
918 object *func, *res;
919
920 if ((func = instance_getattr(self, methodname)) == NULL)
921 return NULL;
922 res = call_object(func, (object *)NULL);
923 DECREF(func);
924 return res;
925}
926
Guido van Rossum03093a21994-09-28 15:51:32 +0000927
928/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000929static int halfbinop Py_PROTO((object *, object *, char *, object **,
930 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000931
932
933/* Implement a binary operator involving at least one class instance. */
934
935object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000936instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000937 object *v;
938 object *w;
939 char *opname;
940 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000941 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000942{
943 char buf[256];
944 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000945 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000946 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000947 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000948 return result;
949 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
950 err_setstr(TypeError, buf);
951 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952}
953
Guido van Rossum03093a21994-09-28 15:51:32 +0000954
955/* Try one half of a binary operator involving a class instance.
956 Return value:
957 -1 if an exception is to be reported right away
958 0 if we have a valid result
959 1 if we could try another operation
960*/
961
Guido van Rossum2878a691996-08-09 20:53:24 +0000962static object *coerce_obj;
963
Guido van Rossum03093a21994-09-28 15:51:32 +0000964static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000965halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000966 object *v;
967 object *w;
968 char *opname;
969 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000970 object * (*thisfunc) PROTO((object *, object *));
971 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000972{
973 object *func;
974 object *args;
975 object *coerce;
976 object *coerced = NULL;
977 object *v1;
978
979 if (!is_instanceobject(v))
980 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000981 if (coerce_obj == NULL) {
982 coerce_obj = newstringobject("__coerce__");
983 if (coerce_obj == NULL)
984 return -1;
985 }
986 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +0000987 if (coerce == NULL) {
988 err_clear();
989 }
990 else {
991 args = mkvalue("(O)", w);
992 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000993 return -1;
994 }
995 coerced = call_object(coerce, args);
996 DECREF(args);
997 DECREF(coerce);
998 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000999 return -1;
1000 }
1001 if (coerced == None) {
1002 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001003 return 1;
1004 }
1005 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1006 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001007 err_setstr(TypeError,
1008 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001009 return -1;
1010 }
1011 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001012 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001013 if (v1 != v) {
1014 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001015 if (!is_instanceobject(v) && !is_instanceobject(w)) {
1016 if (swapped)
1017 *r_result = (*thisfunc)(w, v);
1018 else
1019 *r_result = (*thisfunc)(v, w);
1020 DECREF(coerced);
1021 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001022 }
1023 }
1024 w = gettupleitem(coerced, 1);
1025 }
Guido van Rossume7d444f1995-01-07 12:35:18 +00001026 func = getattr(v, opname);
1027 if (func == NULL) {
1028 XDECREF(coerced);
1029 if (err_occurred() != AttributeError)
1030 return -1;
1031 err_clear();
1032 return 1;
1033 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001034 args = mkvalue("(O)", w);
1035 if (args == NULL) {
1036 DECREF(func);
1037 XDECREF(coerced);
1038 return -1;
1039 }
1040 *r_result = call_object(func, args);
1041 DECREF(args);
1042 DECREF(func);
1043 XDECREF(coerced);
1044 return *r_result == NULL ? -1 : 0;
1045}
1046
Guido van Rossum879c5811995-01-10 15:24:06 +00001047static int
1048instance_coerce(pv, pw)
1049 object **pv;
1050 object **pw;
1051{
1052 object *v = *pv;
1053 object *w = *pw;
1054 object *coerce;
1055 object *args;
1056 object *coerced;
1057
Guido van Rossum2878a691996-08-09 20:53:24 +00001058 if (coerce_obj == NULL) {
1059 coerce_obj = newstringobject("__coerce__");
1060 if (coerce_obj == NULL)
1061 return -1;
1062 }
1063 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001064 if (coerce == NULL) {
1065 /* No __coerce__ method: always OK */
1066 err_clear();
1067 INCREF(v);
1068 INCREF(w);
1069 return 0;
1070 }
1071 /* Has __coerce__ method: call it */
1072 args = mkvalue("(O)", w);
1073 if (args == NULL) {
1074 return -1;
1075 }
1076 coerced = call_object(coerce, args);
1077 DECREF(args);
1078 DECREF(coerce);
1079 if (coerced == NULL) {
1080 /* __coerce__ call raised an exception */
1081 return -1;
1082 }
1083 if (coerced == None) {
1084 /* __coerce__ says "I can't do it" */
1085 DECREF(coerced);
1086 return 1;
1087 }
1088 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1089 /* __coerce__ return value is malformed */
1090 DECREF(coerced);
1091 err_setstr(TypeError,
1092 "coercion should return None or 2-tuple");
1093 return -1;
1094 }
1095 /* __coerce__ returned two new values */
1096 *pv = gettupleitem(coerced, 0);
1097 *pw = gettupleitem(coerced, 1);
1098 INCREF(*pv);
1099 INCREF(*pw);
1100 DECREF(coerced);
1101 return 0;
1102}
1103
Guido van Rossum03093a21994-09-28 15:51:32 +00001104
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105#define UNARY(funcname, methodname) \
1106static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001107 static object *o; \
1108 if (o == NULL) o = newstringobject(methodname); \
1109 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001110}
1111
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112UNARY(instance_neg, "__neg__")
1113UNARY(instance_pos, "__pos__")
1114UNARY(instance_abs, "__abs__")
1115
Guido van Rossum9bfef441993-03-29 10:43:31 +00001116static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001117instance_nonzero(self)
1118 instanceobject *self;
1119{
1120 object *func, *res;
1121 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001122 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001123
Guido van Rossum2878a691996-08-09 20:53:24 +00001124 if (nonzerostr == NULL)
1125 nonzerostr = newstringobject("__nonzero__");
1126 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001127 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001128 if (lenstr == NULL)
1129 lenstr = newstringobject("__len__");
1130 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001131 err_clear();
1132 /* Fall back to the default behavior:
1133 all instances are nonzero */
1134 return 1;
1135 }
1136 }
1137 res = call_object(func, (object *)NULL);
1138 DECREF(func);
1139 if (res == NULL)
1140 return -1;
1141 if (!is_intobject(res)) {
1142 DECREF(res);
1143 err_setstr(TypeError, "__nonzero__ should return an int");
1144 return -1;
1145 }
1146 outcome = getintvalue(res);
1147 DECREF(res);
1148 if (outcome < 0) {
1149 err_setstr(ValueError, "__nonzero__ should return >= 0");
1150 return -1;
1151 }
1152 return outcome > 0;
1153}
1154
1155UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001156UNARY(instance_int, "__int__")
1157UNARY(instance_long, "__long__")
1158UNARY(instance_float, "__float__")
1159UNARY(instance_oct, "__oct__")
1160UNARY(instance_hex, "__hex__")
1161
Guido van Rossum03093a21994-09-28 15:51:32 +00001162/* This version is for ternary calls only (z != None) */
1163static object *
1164instance_pow(v, w, z)
1165 object *v;
1166 object *w;
1167 object *z;
1168{
1169 /* XXX Doesn't do coercions... */
1170 object *func;
1171 object *args;
1172 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001173 static object *powstr;
1174
1175 if (powstr == NULL)
1176 powstr = newstringobject("__pow__");
1177 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001178 if (func == NULL)
1179 return NULL;
1180 args = mkvalue("(OO)", w, z);
1181 if (args == NULL) {
1182 DECREF(func);
1183 return NULL;
1184 }
1185 result = call_object(func, args);
1186 DECREF(func);
1187 DECREF(args);
1188 return result;
1189}
1190
Guido van Rossum04691fc1992-08-12 15:35:34 +00001191static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001192 0, /*nb_add*/
1193 0, /*nb_subtract*/
1194 0, /*nb_multiply*/
1195 0, /*nb_divide*/
1196 0, /*nb_remainder*/
1197 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001198 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001199 (unaryfunc)instance_neg, /*nb_negative*/
1200 (unaryfunc)instance_pos, /*nb_positive*/
1201 (unaryfunc)instance_abs, /*nb_absolute*/
1202 (inquiry)instance_nonzero, /*nb_nonzero*/
1203 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001204 0, /*nb_lshift*/
1205 0, /*nb_rshift*/
1206 0, /*nb_and*/
1207 0, /*nb_xor*/
1208 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001209 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001210 (unaryfunc)instance_int, /*nb_int*/
1211 (unaryfunc)instance_long, /*nb_long*/
1212 (unaryfunc)instance_float, /*nb_float*/
1213 (unaryfunc)instance_oct, /*nb_oct*/
1214 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001215};
1216
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001217typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001218 OB_HEAD_INIT(&Typetype)
1219 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001220 "instance",
1221 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001222 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001223 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001224 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001225 0, /*tp_getattr*/
1226 0, /*tp_setattr*/
1227 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001228 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001229 &instance_as_number, /*tp_as_number*/
1230 &instance_as_sequence, /*tp_as_sequence*/
1231 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001232 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001233 0, /*tp_call*/
1234 0, /*tp_str*/
1235 (getattrofunc)instance_getattr, /*tp_getattro*/
1236 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001237};
1238
1239
Guido van Rossum81daa321993-05-20 14:24:46 +00001240/* Instance method objects are used for two purposes:
1241 (a) as bound instance methods (returned by instancename.methodname)
1242 (b) as unbound methods (returned by ClassName.methodname)
1243 In case (b), im_self is NULL
1244*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001245
1246typedef struct {
1247 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001248 object *im_func; /* The function implementing the method */
1249 object *im_self; /* The instance it is bound to, or NULL */
1250 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001251} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001252
1253object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001254newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001255 object *func;
1256 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001257 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001258{
Guido van Rossume8122f11991-05-05 20:03:07 +00001259 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001260 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001261 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001262 return NULL;
1263 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001264 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1265 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001266 return NULL;
1267 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001268 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001269 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001270 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001271 INCREF(class);
1272 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001273 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001274}
1275
1276object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001277instancemethodgetfunc(im)
1278 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001279{
Guido van Rossume8122f11991-05-05 20:03:07 +00001280 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001281 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001282 return NULL;
1283 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001284 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285}
1286
1287object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001288instancemethodgetself(im)
1289 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001290{
Guido van Rossume8122f11991-05-05 20:03:07 +00001291 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001292 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001293 return NULL;
1294 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001295 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001296}
1297
Guido van Rossum81daa321993-05-20 14:24:46 +00001298object *
1299instancemethodgetclass(im)
1300 register object *im;
1301{
1302 if (!is_instancemethodobject(im)) {
1303 err_badcall();
1304 return NULL;
1305 }
1306 return ((instancemethodobject *)im)->im_class;
1307}
1308
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001309/* Class method methods */
1310
Guido van Rossume8122f11991-05-05 20:03:07 +00001311#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001312
Guido van Rossume8122f11991-05-05 20:03:07 +00001313static struct memberlist instancemethod_memberlist[] = {
1314 {"im_func", T_OBJECT, OFF(im_func)},
1315 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001316 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001317 /* Dummies that are not handled by getattr() except for __members__ */
1318 {"__doc__", T_INT, 0},
1319 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001320 {NULL} /* Sentinel */
1321};
1322
1323static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001324instancemethod_getattr(im, name)
1325 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001326 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001327{
Guido van Rossum2878a691996-08-09 20:53:24 +00001328 char *sname = getstringvalue(name);
1329 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001330 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001331 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001332 INCREF(func->func_name);
1333 return func->func_name;
1334 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001335 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001336 INCREF(func->func_doc);
1337 return func->func_doc;
1338 }
1339 }
1340 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001341 err_setstr(RuntimeError,
1342 "instance-method attributes not accessible in restricted mode");
1343 return NULL;
1344 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001345 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001346}
1347
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001348static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001349instancemethod_dealloc(im)
1350 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001351{
Guido van Rossume8122f11991-05-05 20:03:07 +00001352 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001353 XDECREF(im->im_self);
1354 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001355 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001356}
1357
Guido van Rossumebc8c511992-09-03 20:39:51 +00001358static int
1359instancemethod_compare(a, b)
1360 instancemethodobject *a, *b;
1361{
Guido van Rossume9df7271995-04-06 14:46:51 +00001362 if (a->im_self != b->im_self)
1363 return (a->im_self < b->im_self) ? -1 : 1;
1364 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001365}
1366
Guido van Rossum25831651993-05-19 14:50:45 +00001367static object *
1368instancemethod_repr(a)
1369 instancemethodobject *a;
1370{
1371 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001372 instanceobject *self = (instanceobject *)(a->im_self);
1373 funcobject *func = (funcobject *)(a->im_func);
1374 classobject *class = (classobject *)(a->im_class);
1375 object *fclassname, *iclassname, *funcname;
1376 char *fcname, *icname, *fname;
1377 fclassname = class->cl_name;
1378 funcname = func->func_name;
1379 if (fclassname != NULL && is_stringobject(fclassname))
1380 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001381 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001382 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001383 if (funcname != NULL && is_stringobject(funcname))
1384 fname = getstringvalue(funcname);
1385 else
1386 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001387 if (self == NULL)
1388 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1389 else {
1390 iclassname = self->in_class->cl_name;
1391 if (iclassname != NULL && is_stringobject(iclassname))
1392 icname = getstringvalue(iclassname);
1393 else
1394 icname = "?";
1395 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1396 fcname, fname, icname, (long)self);
1397 }
Guido van Rossum25831651993-05-19 14:50:45 +00001398 return newstringobject(buf);
1399}
1400
Guido van Rossum9bfef441993-03-29 10:43:31 +00001401static long
1402instancemethod_hash(a)
1403 instancemethodobject *a;
1404{
1405 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001406 if (a->im_self == NULL)
1407 x = hashobject(None);
1408 else
1409 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001410 if (x == -1)
1411 return -1;
1412 y = hashobject(a->im_func);
1413 if (y == -1)
1414 return -1;
1415 return x ^ y;
1416}
1417
Guido van Rossume8122f11991-05-05 20:03:07 +00001418typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001419 OB_HEAD_INIT(&Typetype)
1420 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001421 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001422 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001423 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001424 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001425 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001426 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001427 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001428 (cmpfunc)instancemethod_compare, /*tp_compare*/
1429 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001430 0, /*tp_as_number*/
1431 0, /*tp_as_sequence*/
1432 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001433 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001434 0, /*tp_call*/
1435 0, /*tp_str*/
1436 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1437 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001438};