blob: 4ff34beb131e9049f270e198f95f9420d2d20de5 [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
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Class object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000036
Guido van Rossum52ca98a1994-09-05 07:32:29 +000037/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038static PyObject *class_lookup
39 Py_PROTO((PyClassObject *, PyObject *, PyClassObject **));
40static PyObject *instance_getattr1 Py_PROTO((PyInstanceObject *, PyObject *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000041
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042PyObject *
43PyClass_New(bases, dict, name)
44 PyObject *bases; /* NULL or tuple of classobjects! */
45 PyObject *dict;
46 PyObject *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 PyClassObject *op, *dummy;
49 static PyObject *getattrstr, *setattrstr, *delattrstr;
50 static PyObject *docstr;
Guido van Rossum019f4241996-08-21 14:54:28 +000051 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000052 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000053 if (docstr == NULL)
54 return NULL;
55 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056 if (PyDict_GetItem(dict, docstr) == NULL) {
57 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000058 return NULL;
59 }
Guido van Rossume2966a61991-12-10 13:53:23 +000060 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000062 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000063 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000064 }
65 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 Py_INCREF(bases);
67 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000068 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000071 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000074 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000076 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000077 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000078 getattrstr = PyString_InternFromString("__getattr__");
79 setattrstr = PyString_InternFromString("__setattr__");
80 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +000081 }
82 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
83 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
84 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 Py_XINCREF(op->cl_getattr);
86 Py_XINCREF(op->cl_setattr);
87 Py_XINCREF(op->cl_delattr);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089}
90
91/* Class methods */
92
93static void
94class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 Py_DECREF(op->cl_bases);
98 Py_DECREF(op->cl_dict);
99 Py_XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 free((ANY *)op);
101}
102
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000104class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 PyClassObject *cp;
106 PyObject *name;
107 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000108{
109 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000111 if (value != NULL) {
112 *pclass = cp;
113 return value;
114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000116 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 PyObject *v = class_lookup(
118 (PyClassObject *)
119 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000120 if (v != NULL)
121 return v;
122 }
123 return NULL;
124}
125
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 register PyClassObject *op;
129 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 register PyObject *v;
132 register char *sname = PyString_AsString(name);
133 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000134 if (sname[0] == '_' && sname[1] == '_') {
135 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136 if (PyEval_GetRestricted()) {
137 PyErr_SetString(PyExc_RuntimeError,
138 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000139 return NULL;
140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000142 return op->cl_dict;
143 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000144 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000146 return op->cl_bases;
147 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000148 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000149 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000151 else
152 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000154 return v;
155 }
Guido van Rossum94308391991-10-20 20:11:48 +0000156 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000157 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000158 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000160 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000162 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 if (PyFunction_Check(v)) {
164 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
165 (PyObject *)class);
166 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000167 v = w;
168 }
169 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170}
171
Guido van Rossum94308391991-10-20 20:11:48 +0000172static int
173class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 PyClassObject *op;
175 PyObject *name;
176 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000177{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000179 if (sname[0] == '_' && sname[1] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000181 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 PyErr_SetString(PyExc_TypeError,
183 "read-only special attribute");
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000184 return -1;
185 }
186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 if (PyEval_GetRestricted()) {
188 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000189 "classes are read-only in restricted mode");
190 return -1;
191 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000192 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000194 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000196 "delete non-existing class attribute");
197 return rv;
198 }
Guido van Rossum94308391991-10-20 20:11:48 +0000199 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000201}
202
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000204class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000206{
207 char buf[140];
208 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000210 name = "?";
211 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 name = PyString_AsString(op->cl_name);
Guido van Rossum25831651993-05-19 14:50:45 +0000213 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000215}
216
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217PyTypeObject PyClass_Type = {
218 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219 0,
220 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000223 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000225 0, /*tp_getattr*/
226 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000228 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 0, /*tp_as_number*/
230 0, /*tp_as_sequence*/
231 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000232 0, /*tp_hash*/
233 0, /*tp_call*/
234 0, /*tp_str*/
235 (getattrofunc)class_getattr, /*tp_getattro*/
236 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237};
238
Guido van Rossum81daa321993-05-20 14:24:46 +0000239int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240PyClass_IsSubclass(class, base)
241 PyObject *class;
242 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000243{
244 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000246 if (class == base)
247 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000249 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250 cp = (PyClassObject *)class;
251 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000252 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000253 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000254 return 1;
255 }
256 return 0;
257}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258
Guido van Rossum81daa321993-05-20 14:24:46 +0000259
260/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262PyObject *
263PyInstance_New(class, arg, kw)
264 PyObject *class;
265 PyObject *arg;
266 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268 register PyInstanceObject *inst;
269 PyObject *init;
270 static PyObject *initstr;
271 if (!PyClass_Check(class)) {
272 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 return NULL;
274 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000276 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278 Py_INCREF(class);
279 inst->in_class = (PyClassObject *)class;
280 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000281 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 return NULL;
284 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000285 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000286 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000287 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000288 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 PyErr_Clear();
290 if ((arg != NULL && (!PyTuple_Check(arg) ||
291 PyTuple_Size(arg) != 0))
292 || (kw != NULL && (!PyDict_Check(kw) ||
293 PyDict_Size(kw) != 0))) {
294 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000295 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000297 inst = NULL;
298 }
299 }
300 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
302 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000303 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000305 inst = NULL;
306 }
307 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 if (res != Py_None) {
309 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000310 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000312 inst = NULL;
313 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000315 }
316 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318}
319
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000320/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321
322static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000323instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 PyObject *error_type, *error_value, *error_traceback;
327 PyObject *del;
328 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000329 /* Call the __del__ method if it exists. First temporarily
330 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000331#ifdef Py_TRACE_REFS
332 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 extern long _Py_RefTotal;
334 inst->ob_type = &PyInstance_Type;
335 _Py_NewReference(inst);
336 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000337#ifdef COUNT_ALLOCS
338 inst->ob_type->tp_alloc--; /* ditto */
339#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000340#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000342#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000344 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000345 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000346 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000348 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyObject *f, *t, *v, *tb;
350 PyErr_Fetch(&t, &v, &tb);
351 f = PySys_GetObject("stderr");
352 PyErr_Clear();
Guido van Rossum22a85e51996-09-11 22:51:57 +0000353 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000355 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356 PyFile_WriteObject(t, f, Py_PRINT_RAW);
357 if (v && v != Py_None) {
358 PyFile_WriteString(": ", f);
359 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000360 }
361 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 PyFile_WriteString(" in ", f);
363 PyFile_WriteObject(del, f, 0);
364 PyFile_WriteString(" ignored\n", f);
365 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000366 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000367 Py_XDECREF(t);
368 Py_XDECREF(v);
369 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000370 }
371 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 Py_DECREF(res);
373 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000374 }
375 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000377 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000378 if (--inst->ob_refcnt > 0) {
379#ifdef COUNT_ALLOCS
380 inst->ob_type->tp_free--;
381#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000382 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000383 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000384#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000385#ifdef COUNT_ALLOCS
386 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
387#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000389 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000390#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 Py_DECREF(inst->in_class);
392 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000393 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394}
395
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000397instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 register PyInstanceObject *inst;
399 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 register PyObject *v;
402 register char *sname = PyString_AsString(name);
403 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000404 if (sname[0] == '_' && sname[1] == '_') {
405 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 if (PyEval_GetRestricted()) {
407 PyErr_SetString(PyExc_RuntimeError,
408 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000409 return NULL;
410 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000412 return inst->in_dict;
413 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000414 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 Py_INCREF(inst->in_class);
416 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000417 }
Guido van Rossum94308391991-10-20 20:11:48 +0000418 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000419 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000421 if (v == NULL) {
422 v = class_lookup(inst->in_class, name, &class);
423 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000425 return NULL;
426 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000428 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000429 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 if (PyFunction_Check(v)) {
431 PyObject *w = PyMethod_New(v, (PyObject *)inst,
432 (PyObject *)class);
433 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000434 v = w;
435 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 else if (PyMethod_Check(v)) {
437 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000438 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
440 PyObject *im_func = PyMethod_Function(v);
441 PyObject *w = PyMethod_New(im_func,
442 (PyObject *)inst, im_class);
443 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000444 v = w;
445 }
446 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000447 }
448 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449}
450
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000452instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 register PyInstanceObject *inst;
454 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000455{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000457 res = instance_getattr1(inst, name);
458 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 PyObject *args;
460 PyErr_Clear();
461 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000462 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000463 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 res = PyEval_CallObject(func, args);
465 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000466 }
467 return res;
468}
469
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470static int
Guido van Rossume7737541994-09-05 07:31:41 +0000471instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 PyInstanceObject *inst;
473 PyObject *name;
474 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475{
Guido van Rossum94472a01992-09-04 09:45:18 +0000476 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000478 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000480 "delete non-existing instance attribute");
481 return rv;
482 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485}
486
Guido van Rossume7737541994-09-05 07:31:41 +0000487static int
488instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 PyInstanceObject *inst;
490 PyObject *name;
491 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000492{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 PyObject *func, *args, *res;
494 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000495 if (sname[0] == '_' && sname[1] == '_'
496 && (strcmp(sname, "__dict__") == 0 ||
497 strcmp(sname, "__class__") == 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000499 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500 PyErr_SetString(PyExc_TypeError,
501 "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000502 return -1;
503 }
Guido van Rossume7737541994-09-05 07:31:41 +0000504 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000505 if (v == NULL)
506 func = inst->in_class->cl_delattr;
507 else
508 func = inst->in_class->cl_setattr;
509 if (func == NULL)
510 return instance_setattr1(inst, name, v);
511 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000513 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000515 if (args == NULL)
516 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 res = PyEval_CallObject(func, args);
518 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000519 if (res == NULL)
520 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000522 return 0;
523}
524
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000526instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000528{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 PyObject *func;
530 PyObject *res;
531 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000532
Guido van Rossum2878a691996-08-09 20:53:24 +0000533 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000534 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000535 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000536 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000537 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 PyObject *classname = inst->in_class->cl_name;
Guido van Rossum25831651993-05-19 14:50:45 +0000539 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 if (classname != NULL && PyString_Check(classname))
541 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000542 else
543 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 PyErr_Clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000545 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000547 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 res = PyEval_CallObject(func, (PyObject *)NULL);
549 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000550 return res;
551}
552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000554instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000556{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000558 instance_compare1);
559}
560
Guido van Rossum9bfef441993-03-29 10:43:31 +0000561static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000562instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000564{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000566 long outcome;
567 result = instance_compare1(inst, other);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 if (result == NULL || !PyInt_Check(result)) {
569 PyErr_Clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000570 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000571 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 outcome = PyInt_AsLong(result);
573 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000574 if (outcome < 0)
575 return -1;
576 else if (outcome > 0)
577 return 1;
578 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000579}
580
Guido van Rossum9bfef441993-03-29 10:43:31 +0000581static long
582instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000584{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 PyObject *func;
586 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000587 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000589
Guido van Rossum2878a691996-08-09 20:53:24 +0000590 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000591 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000592 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000593 if (func == NULL) {
594 /* If there is no __cmp__ method, we hash on the address.
595 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000597 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000598 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000599 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000600 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000602 outcome = (long)inst;
603 if (outcome == -1)
604 outcome = -2;
605 return outcome;
606 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000608 return -1;
609 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 res = PyEval_CallObject(func, (PyObject *)NULL);
611 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000612 if (res == NULL)
613 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 if (PyInt_Check(res)) {
615 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000616 if (outcome == -1)
617 outcome = -2;
618 }
619 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 PyErr_SetString(PyExc_TypeError,
621 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000622 outcome = -1;
623 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000625 return outcome;
626}
627
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000629
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000631instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000633{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 PyObject *func;
635 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000636 int outcome;
637
Guido van Rossum2878a691996-08-09 20:53:24 +0000638 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000639 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000640 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000641 if (func == NULL)
642 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 res = PyEval_CallObject(func, (PyObject *)NULL);
644 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000645 if (res == NULL)
646 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 if (PyInt_Check(res)) {
648 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000649 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 PyErr_SetString(PyExc_ValueError,
651 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000652 }
653 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 PyErr_SetString(PyExc_TypeError,
655 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000656 outcome = -1;
657 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000659 return outcome;
660}
661
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000663instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 PyInstanceObject *inst;
665 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000666{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 PyObject *func;
668 PyObject *arg;
669 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000670
Guido van Rossum2878a691996-08-09 20:53:24 +0000671 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000672 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000673 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000674 if (func == NULL)
675 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000677 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000679 return NULL;
680 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 res = PyEval_CallObject(func, arg);
682 Py_DECREF(func);
683 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000684 return res;
685}
686
Guido van Rossum9bfef441993-03-29 10:43:31 +0000687static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000688instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyInstanceObject*inst;
690 PyObject *key;
691 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000692{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyObject *func;
694 PyObject *arg;
695 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000696
Guido van Rossum2878a691996-08-09 20:53:24 +0000697 if (value == NULL) {
698 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000699 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000700 func = instance_getattr(inst, delitemstr);
701 }
702 else {
703 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000704 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000705 func = instance_getattr(inst, setitemstr);
706 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000707 if (func == NULL)
708 return -1;
709 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000711 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000713 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000715 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000716 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 res = PyEval_CallObject(func, arg);
718 Py_DECREF(func);
719 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720 if (res == NULL)
721 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000723 return 0;
724}
725
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000727 (inquiry)instance_length, /*mp_length*/
728 (binaryfunc)instance_subscript, /*mp_subscript*/
729 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000730};
731
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000733instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000735 int i;
736{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000738
Guido van Rossum2878a691996-08-09 20:53:24 +0000739 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000740 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000741 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000742 if (func == NULL)
743 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000745 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000747 return NULL;
748 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 res = PyEval_CallObject(func, arg);
750 Py_DECREF(func);
751 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000752 return res;
753}
754
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000758 int i, j;
759{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 PyObject *func, *arg, *res;
761 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000762
Guido van Rossum2878a691996-08-09 20:53:24 +0000763 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000764 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000765 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766 if (func == NULL)
767 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000769 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000771 return NULL;
772 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 res = PyEval_CallObject(func, arg);
774 Py_DECREF(func);
775 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776 return res;
777}
778
779static int
780instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000784{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000786
Guido van Rossum2878a691996-08-09 20:53:24 +0000787 if (item == NULL) {
788 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000789 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000790 func = instance_getattr(inst, delitemstr);
791 }
792 else {
793 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000794 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000795 func = instance_getattr(inst, setitemstr);
796 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000798 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000801 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000803 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000805 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000806 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 res = PyEval_CallObject(func, arg);
808 Py_DECREF(func);
809 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000810 if (res == NULL)
811 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000813 return 0;
814}
815
816static int
817instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000819 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000821{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 PyObject *func, *arg, *res;
823 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000824
Guido van Rossum2878a691996-08-09 20:53:24 +0000825 if (value == NULL) {
826 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 delslicestr =
828 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000829 func = instance_getattr(inst, delslicestr);
830 }
831 else {
832 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 setslicestr =
834 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000835 func = instance_getattr(inst, setslicestr);
836 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000837 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000838 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000839 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000841 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000843 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000845 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 res = PyEval_CallObject(func, arg);
848 Py_DECREF(func);
849 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000850 if (res == NULL)
851 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000853 return 0;
854}
855
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000857 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000858 0, /*sq_concat*/
859 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000860 (intargfunc)instance_item, /*sq_item*/
861 (intintargfunc)instance_slice, /*sq_slice*/
862 (intobjargproc)instance_ass_item, /*sq_ass_item*/
863 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000864};
865
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000867generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 PyInstanceObject *self;
869 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000870{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000872
873 if ((func = instance_getattr(self, methodname)) == NULL)
874 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 res = PyEval_CallObject(func, (PyObject *)NULL);
876 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000877 return res;
878}
879
Guido van Rossum03093a21994-09-28 15:51:32 +0000880
881/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
883 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000884
885
886/* Implement a binary operator involving at least one class instance. */
887
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888PyObject *
889PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
890 PyObject *v;
891 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000892 char *opname;
893 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000895{
896 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000898 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000899 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000900 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000901 return result;
902 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000903 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +0000904 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905}
906
Guido van Rossum03093a21994-09-28 15:51:32 +0000907
908/* Try one half of a binary operator involving a class instance.
909 Return value:
910 -1 if an exception is to be reported right away
911 0 if we have a valid result
912 1 if we could try another operation
913*/
914
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +0000916
Guido van Rossum03093a21994-09-28 15:51:32 +0000917static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000918halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 PyObject *v;
920 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000921 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 PyObject **r_result;
923 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +0000924 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000925{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 PyObject *func;
927 PyObject *args;
928 PyObject *PyNumber_Coerce;
929 PyObject *coerced = NULL;
930 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000931
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +0000933 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000934 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000935 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000936 if (coerce_obj == NULL)
937 return -1;
938 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
940 if (PyNumber_Coerce == NULL) {
941 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +0000942 }
943 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +0000945 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000946 return -1;
947 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 coerced = PyEval_CallObject(PyNumber_Coerce, args);
949 Py_DECREF(args);
950 Py_DECREF(PyNumber_Coerce);
Guido van Rossum03093a21994-09-28 15:51:32 +0000951 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000952 return -1;
953 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 if (coerced == Py_None) {
955 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000956 return 1;
957 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
959 Py_DECREF(coerced);
960 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +0000961 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000962 return -1;
963 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 v1 = PyTuple_GetItem(coerced, 0);
965 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000966 if (v1 != v) {
967 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +0000969 if (swapped)
970 *r_result = (*thisfunc)(w, v);
971 else
972 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000974 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000975 }
976 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000978 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000980 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 Py_XDECREF(coerced);
982 if (PyErr_Occurred() != PyExc_AttributeError)
Guido van Rossume7d444f1995-01-07 12:35:18 +0000983 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +0000985 return 1;
986 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +0000988 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 Py_DECREF(func);
990 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000991 return -1;
992 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 *r_result = PyEval_CallObject(func, args);
994 Py_DECREF(args);
995 Py_DECREF(func);
996 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000997 return *r_result == NULL ? -1 : 0;
998}
999
Guido van Rossum879c5811995-01-10 15:24:06 +00001000static int
1001instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyObject **pv;
1003 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001004{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 PyObject *v = *pv;
1006 PyObject *w = *pw;
1007 PyObject *PyNumber_Coerce;
1008 PyObject *args;
1009 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001010
Guido van Rossum2878a691996-08-09 20:53:24 +00001011 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001012 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001013 if (coerce_obj == NULL)
1014 return -1;
1015 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1017 if (PyNumber_Coerce == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001018 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 PyErr_Clear();
1020 Py_INCREF(v);
1021 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001022 return 0;
1023 }
1024 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001026 if (args == NULL) {
1027 return -1;
1028 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1030 Py_DECREF(args);
1031 Py_DECREF(PyNumber_Coerce);
Guido van Rossum879c5811995-01-10 15:24:06 +00001032 if (coerced == NULL) {
1033 /* __coerce__ call raised an exception */
1034 return -1;
1035 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001037 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001039 return 1;
1040 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001042 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 Py_DECREF(coerced);
1044 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001045 "coercion should return None or 2-tuple");
1046 return -1;
1047 }
1048 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 *pv = PyTuple_GetItem(coerced, 0);
1050 *pw = PyTuple_GetItem(coerced, 1);
1051 Py_INCREF(*pv);
1052 Py_INCREF(*pw);
1053 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001054 return 0;
1055}
1056
Guido van Rossum03093a21994-09-28 15:51:32 +00001057
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059static PyObject *funcname(self) PyInstanceObject *self; { \
1060 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001061 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001062 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063}
1064
Guido van Rossum04691fc1992-08-12 15:35:34 +00001065UNARY(instance_neg, "__neg__")
1066UNARY(instance_pos, "__pos__")
1067UNARY(instance_abs, "__abs__")
1068
Guido van Rossum9bfef441993-03-29 10:43:31 +00001069static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076
Guido van Rossum2878a691996-08-09 20:53:24 +00001077 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001078 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001079 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001081 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001082 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001083 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001085 /* Fall back to the default behavior:
1086 all instances are nonzero */
1087 return 1;
1088 }
1089 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 res = PyEval_CallObject(func, (PyObject *)NULL);
1091 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092 if (res == NULL)
1093 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 if (!PyInt_Check(res)) {
1095 Py_DECREF(res);
1096 PyErr_SetString(PyExc_TypeError,
1097 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098 return -1;
1099 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 outcome = PyInt_AsLong(res);
1101 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001102 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 PyErr_SetString(PyExc_ValueError,
1104 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105 return -1;
1106 }
1107 return outcome > 0;
1108}
1109
1110UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001111UNARY(instance_int, "__int__")
1112UNARY(instance_long, "__long__")
1113UNARY(instance_float, "__float__")
1114UNARY(instance_oct, "__oct__")
1115UNARY(instance_hex, "__hex__")
1116
Guido van Rossum03093a21994-09-28 15:51:32 +00001117/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001119instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 PyObject *v;
1121 PyObject *w;
1122 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001123{
1124 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 PyObject *func;
1126 PyObject *args;
1127 PyObject *result;
1128 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001129
1130 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001131 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001133 if (func == NULL)
1134 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001136 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001138 return NULL;
1139 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 result = PyEval_CallObject(func, args);
1141 Py_DECREF(func);
1142 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001143 return result;
1144}
1145
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001147 0, /*nb_add*/
1148 0, /*nb_subtract*/
1149 0, /*nb_multiply*/
1150 0, /*nb_divide*/
1151 0, /*nb_remainder*/
1152 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001153 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001154 (unaryfunc)instance_neg, /*nb_negative*/
1155 (unaryfunc)instance_pos, /*nb_positive*/
1156 (unaryfunc)instance_abs, /*nb_absolute*/
1157 (inquiry)instance_nonzero, /*nb_nonzero*/
1158 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001159 0, /*nb_lshift*/
1160 0, /*nb_rshift*/
1161 0, /*nb_and*/
1162 0, /*nb_xor*/
1163 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001164 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001165 (unaryfunc)instance_int, /*nb_int*/
1166 (unaryfunc)instance_long, /*nb_long*/
1167 (unaryfunc)instance_float, /*nb_float*/
1168 (unaryfunc)instance_oct, /*nb_oct*/
1169 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001170};
1171
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172PyTypeObject PyInstance_Type = {
1173 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001174 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001175 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001177 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001178 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001179 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001180 0, /*tp_getattr*/
1181 0, /*tp_setattr*/
1182 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001183 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001184 &instance_as_number, /*tp_as_number*/
1185 &instance_as_sequence, /*tp_as_sequence*/
1186 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001187 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001188 0, /*tp_call*/
1189 0, /*tp_str*/
1190 (getattrofunc)instance_getattr, /*tp_getattro*/
1191 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001192};
1193
1194
Guido van Rossum81daa321993-05-20 14:24:46 +00001195/* Instance method objects are used for two purposes:
1196 (a) as bound instance methods (returned by instancename.methodname)
1197 (b) as unbound methods (returned by ClassName.methodname)
1198 In case (b), im_self is NULL
1199*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001200
1201typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 PyObject_HEAD
1203 PyObject *im_func; /* The function implementing the method */
1204 PyObject *im_self; /* The instance it is bound to, or NULL */
1205 PyObject *im_class; /* The class that defined the method */
1206} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001207
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208PyObject *
1209PyMethod_New(func, self, class)
1210 PyObject *func;
1211 PyObject *self;
1212 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001213{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214 register PyMethodObject *im;
1215 if (!PyFunction_Check(func)) {
1216 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001217 return NULL;
1218 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +00001220 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001221 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001223 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001225 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001227 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001229}
1230
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231PyObject *
1232PyMethod_Function(im)
1233 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 if (!PyMethod_Check(im)) {
1236 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001237 return NULL;
1238 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001240}
1241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242PyObject *
1243PyMethod_Self(im)
1244 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001245{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 if (!PyMethod_Check(im)) {
1247 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001248 return NULL;
1249 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001251}
1252
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253PyObject *
1254PyMethod_Class(im)
1255 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001256{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 if (!PyMethod_Check(im)) {
1258 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001259 return NULL;
1260 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001261 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001262}
1263
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001264/* Class method methods */
1265
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001267
Guido van Rossume8122f11991-05-05 20:03:07 +00001268static struct memberlist instancemethod_memberlist[] = {
1269 {"im_func", T_OBJECT, OFF(im_func)},
1270 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001271 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001272 /* Dummies that are not handled by getattr() except for __members__ */
1273 {"__doc__", T_INT, 0},
1274 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275 {NULL} /* Sentinel */
1276};
1277
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001279instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 register PyMethodObject *im;
1281 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001282{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001284 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001286 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001288 return func->func_name;
1289 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001290 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001292 return func->func_doc;
1293 }
1294 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 if (PyEval_GetRestricted()) {
1296 PyErr_SetString(PyExc_RuntimeError,
1297 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001298 return NULL;
1299 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301}
1302
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001303static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001304instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001306{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 Py_DECREF(im->im_func);
1308 Py_XDECREF(im->im_self);
1309 Py_DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001310 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001311}
1312
Guido van Rossumebc8c511992-09-03 20:39:51 +00001313static int
1314instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001316{
Guido van Rossume9df7271995-04-06 14:46:51 +00001317 if (a->im_self != b->im_self)
1318 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001320}
1321
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001323instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001325{
1326 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1328 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1329 PyClassObject *class = (PyClassObject *)(a->im_class);
1330 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001331 char *fcname, *icname, *fname;
1332 fclassname = class->cl_name;
1333 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 if (fclassname != NULL && PyString_Check(fclassname))
1335 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001336 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001337 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 if (funcname != NULL && PyString_Check(funcname))
1339 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001340 else
1341 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001342 if (self == NULL)
1343 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1344 else {
1345 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 if (iclassname != NULL && PyString_Check(iclassname))
1347 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001348 else
1349 icname = "?";
1350 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1351 fcname, fname, icname, (long)self);
1352 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001354}
1355
Guido van Rossum9bfef441993-03-29 10:43:31 +00001356static long
1357instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001359{
1360 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001361 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001363 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001365 if (x == -1)
1366 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001368 if (y == -1)
1369 return -1;
1370 return x ^ y;
1371}
1372
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373PyTypeObject PyMethod_Type = {
1374 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001375 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001376 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001378 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001379 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001380 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001381 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001382 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001383 (cmpfunc)instancemethod_compare, /*tp_compare*/
1384 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001385 0, /*tp_as_number*/
1386 0, /*tp_as_sequence*/
1387 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001388 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001389 0, /*tp_call*/
1390 0, /*tp_str*/
1391 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1392 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001393};