blob: 91307f834c5d00366d8b4285ee944f950d3fc131 [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 Rossumb2173c31997-08-25 21:23:56 +0000178 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 if (PyEval_GetRestricted()) {
180 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000181 "classes are read-only in restricted mode");
182 return -1;
183 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000184 sname = PyString_AsString(name);
185 if (sname[0] == '_' && sname[1] == '_') {
186 int n = PyString_Size(name);
187 if (sname[n-1] == '_' && sname[n-2] == '_') {
188 if (strcmp(sname, "__dict__") == 0 ||
189 strcmp(sname, "__bases__") == 0 ||
190 strcmp(sname, "__name__") == 0 ||
191 strcmp(sname, "__getattr__") == 0 ||
192 strcmp(sname, "__setattr__") == 0 ||
193 strcmp(sname, "__delattr__") == 0)
194 {
195 /* XXX In unrestricted mode, we should
196 XXX allow this -- with a type check */
197 PyErr_SetString(PyExc_TypeError,
198 "read-only special attribute");
199 return -1;
200 }
201 }
202 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000203 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000205 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000207 "delete non-existing class attribute");
208 return rv;
209 }
Guido van Rossum94308391991-10-20 20:11:48 +0000210 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000212}
213
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000215class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000217{
218 char buf[140];
219 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000221 name = "?";
222 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 name = PyString_AsString(op->cl_name);
Guido van Rossum25831651993-05-19 14:50:45 +0000224 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000226}
227
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228PyTypeObject PyClass_Type = {
229 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 0,
231 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000234 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000236 0, /*tp_getattr*/
237 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000239 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 0, /*tp_as_number*/
241 0, /*tp_as_sequence*/
242 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000243 0, /*tp_hash*/
244 0, /*tp_call*/
245 0, /*tp_str*/
246 (getattrofunc)class_getattr, /*tp_getattro*/
247 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248};
249
Guido van Rossum81daa321993-05-20 14:24:46 +0000250int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251PyClass_IsSubclass(class, base)
252 PyObject *class;
253 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000254{
255 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000257 if (class == base)
258 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000259 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000260 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 cp = (PyClassObject *)class;
262 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000263 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000265 return 1;
266 }
267 return 0;
268}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269
Guido van Rossum81daa321993-05-20 14:24:46 +0000270
271/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273PyObject *
274PyInstance_New(class, arg, kw)
275 PyObject *class;
276 PyObject *arg;
277 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 register PyInstanceObject *inst;
280 PyObject *init;
281 static PyObject *initstr;
282 if (!PyClass_Check(class)) {
283 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 return NULL;
285 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000287 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 Py_INCREF(class);
290 inst->in_class = (PyClassObject *)class;
291 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000292 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return NULL;
295 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000296 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000297 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000298 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000299 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 PyErr_Clear();
301 if ((arg != NULL && (!PyTuple_Check(arg) ||
302 PyTuple_Size(arg) != 0))
303 || (kw != NULL && (!PyDict_Check(kw) ||
304 PyDict_Size(kw) != 0))) {
305 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000306 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000308 inst = NULL;
309 }
310 }
311 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
313 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000314 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000316 inst = NULL;
317 }
318 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 if (res != Py_None) {
320 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000321 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000323 inst = NULL;
324 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000326 }
327 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329}
330
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000331/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332
333static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000334instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 PyObject *error_type, *error_value, *error_traceback;
338 PyObject *del;
339 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000340 /* Call the __del__ method if it exists. First temporarily
341 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000342#ifdef Py_TRACE_REFS
343 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 extern long _Py_RefTotal;
345 inst->ob_type = &PyInstance_Type;
346 _Py_NewReference(inst);
347 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000348#ifdef COUNT_ALLOCS
349 inst->ob_type->tp_alloc--; /* ditto */
350#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000351#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000353#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000355 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000356 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000357 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000359 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 PyObject *f, *t, *v, *tb;
361 PyErr_Fetch(&t, &v, &tb);
362 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000363 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000365 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 PyFile_WriteObject(t, f, Py_PRINT_RAW);
367 if (v && v != Py_None) {
368 PyFile_WriteString(": ", f);
369 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000370 }
371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 PyFile_WriteString(" in ", f);
373 PyFile_WriteObject(del, f, 0);
374 PyFile_WriteString(" ignored\n", f);
375 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000376 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000377 Py_XDECREF(t);
378 Py_XDECREF(v);
379 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000380 }
381 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 Py_DECREF(res);
383 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000384 }
385 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000387 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000388 if (--inst->ob_refcnt > 0) {
389#ifdef COUNT_ALLOCS
390 inst->ob_type->tp_free--;
391#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000392 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000393 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000394#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000395#ifdef COUNT_ALLOCS
396 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
397#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000399 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000400#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 Py_DECREF(inst->in_class);
402 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000403 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000407instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408 register PyInstanceObject *inst;
409 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 register PyObject *v;
412 register char *sname = PyString_AsString(name);
413 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000414 if (sname[0] == '_' && sname[1] == '_') {
415 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 if (PyEval_GetRestricted()) {
417 PyErr_SetString(PyExc_RuntimeError,
418 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000419 return NULL;
420 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000422 return inst->in_dict;
423 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000424 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425 Py_INCREF(inst->in_class);
426 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000427 }
Guido van Rossum94308391991-10-20 20:11:48 +0000428 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000429 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000431 if (v == NULL) {
432 v = class_lookup(inst->in_class, name, &class);
433 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000435 return NULL;
436 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000438 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000439 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 if (PyFunction_Check(v)) {
441 PyObject *w = PyMethod_New(v, (PyObject *)inst,
442 (PyObject *)class);
443 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000444 v = w;
445 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 else if (PyMethod_Check(v)) {
447 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000448 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
450 PyObject *im_func = PyMethod_Function(v);
451 PyObject *w = PyMethod_New(im_func,
452 (PyObject *)inst, im_class);
453 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000454 v = w;
455 }
456 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000457 }
458 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459}
460
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000462instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 register PyInstanceObject *inst;
464 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000465{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000467 res = instance_getattr1(inst, name);
468 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 PyObject *args;
470 PyErr_Clear();
471 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000472 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000473 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 res = PyEval_CallObject(func, args);
475 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000476 }
477 return res;
478}
479
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480static int
Guido van Rossume7737541994-09-05 07:31:41 +0000481instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 PyInstanceObject *inst;
483 PyObject *name;
484 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485{
Guido van Rossum94472a01992-09-04 09:45:18 +0000486 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000488 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000490 "delete non-existing instance attribute");
491 return rv;
492 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495}
496
Guido van Rossume7737541994-09-05 07:31:41 +0000497static int
498instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 PyInstanceObject *inst;
500 PyObject *name;
501 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000502{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000503 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000505 if (sname[0] == '_' && sname[1] == '_') {
506 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000507 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000508 if (strcmp(sname, "__dict__") == 0) {
509 if (PyEval_GetRestricted()) {
510 PyErr_SetString(PyExc_RuntimeError,
511 "__dict__ not accessible in restricted mode");
512 return -1;
513 }
514 if (v == NULL || !PyDict_Check(v)) {
515 PyErr_SetString(PyExc_TypeError,
516 "__dict__ must be set to a dictionary");
517 return -1;
518 }
519 tmp = inst->in_dict;
520 Py_INCREF(v);
521 inst->in_dict = v;
522 Py_DECREF(tmp);
523 return 0;
524 }
525 if (strcmp(sname, "__class__") == 0) {
526 if (PyEval_GetRestricted()) {
527 PyErr_SetString(PyExc_RuntimeError,
528 "__class__ not accessible in restricted mode");
529 return -1;
530 }
531 if (v == NULL || !PyClass_Check(v)) {
532 PyErr_SetString(PyExc_TypeError,
533 "__class__ must be set to a class");
534 return -1;
535 }
536 tmp = (PyObject *)(inst->in_class);
537 Py_INCREF(v);
538 inst->in_class = (PyClassObject *)v;
539 Py_DECREF(tmp);
540 return 0;
541 }
Guido van Rossume7737541994-09-05 07:31:41 +0000542 }
Guido van Rossume7737541994-09-05 07:31:41 +0000543 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000544 if (v == NULL)
545 func = inst->in_class->cl_delattr;
546 else
547 func = inst->in_class->cl_setattr;
548 if (func == NULL)
549 return instance_setattr1(inst, name, v);
550 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000552 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000554 if (args == NULL)
555 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 res = PyEval_CallObject(func, args);
557 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000558 if (res == NULL)
559 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000561 return 0;
562}
563
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000565instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000567{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyObject *func;
569 PyObject *res;
570 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000571
Guido van Rossum2878a691996-08-09 20:53:24 +0000572 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000573 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000574 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000575 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000576 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyObject *classname = inst->in_class->cl_name;
Guido van Rossum25831651993-05-19 14:50:45 +0000578 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 if (classname != NULL && PyString_Check(classname))
580 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000581 else
582 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583 PyErr_Clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000584 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000586 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 res = PyEval_CallObject(func, (PyObject *)NULL);
588 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000589 return res;
590}
591
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000593instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000595{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000597 instance_compare1);
598}
599
Guido van Rossum9bfef441993-03-29 10:43:31 +0000600static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000601instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000603{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000605 long outcome;
606 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000607 if (result == NULL)
608 return -1;
609 if (!PyInt_Check(result)) {
610 Py_DECREF(result);
611 PyErr_SetString(PyExc_TypeError,
612 "comparison did not return an int");
613 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000614 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 outcome = PyInt_AsLong(result);
616 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000617 if (outcome < 0)
618 return -1;
619 else if (outcome > 0)
620 return 1;
621 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000622}
623
Guido van Rossum9bfef441993-03-29 10:43:31 +0000624static long
625instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000627{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 PyObject *func;
629 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000630 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000632
Guido van Rossum2878a691996-08-09 20:53:24 +0000633 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000634 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000635 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000636 if (func == NULL) {
637 /* If there is no __cmp__ method, we hash on the address.
638 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000640 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000641 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000642 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000643 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000645 outcome = (long)inst;
646 if (outcome == -1)
647 outcome = -2;
648 return outcome;
649 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000651 return -1;
652 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 res = PyEval_CallObject(func, (PyObject *)NULL);
654 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000655 if (res == NULL)
656 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 if (PyInt_Check(res)) {
658 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000659 if (outcome == -1)
660 outcome = -2;
661 }
662 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 PyErr_SetString(PyExc_TypeError,
664 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000665 outcome = -1;
666 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000668 return outcome;
669}
670
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000672
Guido van Rossum9bfef441993-03-29 10:43:31 +0000673static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000674instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000676{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 PyObject *func;
678 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000679 int outcome;
680
Guido van Rossum2878a691996-08-09 20:53:24 +0000681 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000682 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000683 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000684 if (func == NULL)
685 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686 res = PyEval_CallObject(func, (PyObject *)NULL);
687 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000688 if (res == NULL)
689 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 if (PyInt_Check(res)) {
691 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000692 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyErr_SetString(PyExc_ValueError,
694 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000695 }
696 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 PyErr_SetString(PyExc_TypeError,
698 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000699 outcome = -1;
700 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000702 return outcome;
703}
704
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000706instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 PyInstanceObject *inst;
708 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000709{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 PyObject *func;
711 PyObject *arg;
712 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000713
Guido van Rossum2878a691996-08-09 20:53:24 +0000714 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000715 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000716 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000717 if (func == NULL)
718 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000722 return NULL;
723 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 res = PyEval_CallObject(func, arg);
725 Py_DECREF(func);
726 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000727 return res;
728}
729
Guido van Rossum9bfef441993-03-29 10:43:31 +0000730static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000731instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 PyInstanceObject*inst;
733 PyObject *key;
734 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000735{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 PyObject *func;
737 PyObject *arg;
738 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000739
Guido van Rossum2878a691996-08-09 20:53:24 +0000740 if (value == NULL) {
741 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000742 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000743 func = instance_getattr(inst, delitemstr);
744 }
745 else {
746 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000747 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000748 func = instance_getattr(inst, setitemstr);
749 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000750 if (func == NULL)
751 return -1;
752 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000754 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000758 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 res = PyEval_CallObject(func, arg);
761 Py_DECREF(func);
762 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000763 if (res == NULL)
764 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766 return 0;
767}
768
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000770 (inquiry)instance_length, /*mp_length*/
771 (binaryfunc)instance_subscript, /*mp_subscript*/
772 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000773};
774
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000778 int i;
779{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000781
Guido van Rossum2878a691996-08-09 20:53:24 +0000782 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000783 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000784 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785 if (func == NULL)
786 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000788 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000790 return NULL;
791 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 res = PyEval_CallObject(func, arg);
793 Py_DECREF(func);
794 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000795 return res;
796}
797
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000801 int i, j;
802{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 PyObject *func, *arg, *res;
804 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000805
Guido van Rossum2878a691996-08-09 20:53:24 +0000806 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000807 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000808 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809 if (func == NULL)
810 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000812 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000814 return NULL;
815 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 res = PyEval_CallObject(func, arg);
817 Py_DECREF(func);
818 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000819 return res;
820}
821
822static int
823instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000825 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000827{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000829
Guido van Rossum2878a691996-08-09 20:53:24 +0000830 if (item == NULL) {
831 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000832 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000833 func = instance_getattr(inst, delitemstr);
834 }
835 else {
836 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000837 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000838 func = instance_getattr(inst, setitemstr);
839 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000841 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000844 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000848 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000849 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 res = PyEval_CallObject(func, arg);
851 Py_DECREF(func);
852 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000853 if (res == NULL)
854 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856 return 0;
857}
858
859static int
860instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000862 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000863 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000864{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 PyObject *func, *arg, *res;
866 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000867
Guido van Rossum2878a691996-08-09 20:53:24 +0000868 if (value == NULL) {
869 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 delslicestr =
871 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000872 func = instance_getattr(inst, delslicestr);
873 }
874 else {
875 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 setslicestr =
877 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000878 func = instance_getattr(inst, setslicestr);
879 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000880 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000881 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000882 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000884 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000886 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000888 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000889 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 res = PyEval_CallObject(func, arg);
891 Py_DECREF(func);
892 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000893 if (res == NULL)
894 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000896 return 0;
897}
898
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000900 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000901 0, /*sq_concat*/
902 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903 (intargfunc)instance_item, /*sq_item*/
904 (intintargfunc)instance_slice, /*sq_slice*/
905 (intobjargproc)instance_ass_item, /*sq_ass_item*/
906 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000907};
908
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 PyInstanceObject *self;
912 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915
916 if ((func = instance_getattr(self, methodname)) == NULL)
917 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 res = PyEval_CallObject(func, (PyObject *)NULL);
919 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 return res;
921}
922
Guido van Rossum03093a21994-09-28 15:51:32 +0000923
924/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
926 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000927
928
929/* Implement a binary operator involving at least one class instance. */
930
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931PyObject *
932PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
933 PyObject *v;
934 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000935 char *opname;
936 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000938{
939 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000941 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000942 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000943 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000944 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000945 /* Sigh -- special case for comnparisons */
946 if (strcmp(opname, "__cmp__") == 0) {
947 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
948 return PyInt_FromLong(c);
949 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000950 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +0000952 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000953}
954
Guido van Rossum03093a21994-09-28 15:51:32 +0000955
956/* Try one half of a binary operator involving a class instance.
957 Return value:
958 -1 if an exception is to be reported right away
959 0 if we have a valid result
960 1 if we could try another operation
961*/
962
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +0000964
Guido van Rossum03093a21994-09-28 15:51:32 +0000965static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000966halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 PyObject *v;
968 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000969 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 PyObject **r_result;
971 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +0000972 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000973{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 PyObject *func;
975 PyObject *args;
976 PyObject *PyNumber_Coerce;
977 PyObject *coerced = NULL;
978 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000979
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +0000981 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000982 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000983 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000984 if (coerce_obj == NULL)
985 return -1;
986 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
988 if (PyNumber_Coerce == NULL) {
989 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +0000990 }
991 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +0000993 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000994 return -1;
995 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 coerced = PyEval_CallObject(PyNumber_Coerce, args);
997 Py_DECREF(args);
998 Py_DECREF(PyNumber_Coerce);
Guido van Rossum03093a21994-09-28 15:51:32 +0000999 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001000 return -1;
1001 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 if (coerced == Py_None) {
1003 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001004 return 1;
1005 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1007 Py_DECREF(coerced);
1008 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001009 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001010 return -1;
1011 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 v1 = PyTuple_GetItem(coerced, 0);
1013 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001014 if (v1 != v) {
1015 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001017 if (swapped)
1018 *r_result = (*thisfunc)(w, v);
1019 else
1020 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001022 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001023 }
1024 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001026 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001028 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 Py_XDECREF(coerced);
1030 if (PyErr_Occurred() != PyExc_AttributeError)
Guido van Rossume7d444f1995-01-07 12:35:18 +00001031 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001033 return 1;
1034 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001036 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 Py_DECREF(func);
1038 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001039 return -1;
1040 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 *r_result = PyEval_CallObject(func, args);
1042 Py_DECREF(args);
1043 Py_DECREF(func);
1044 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001045 return *r_result == NULL ? -1 : 0;
1046}
1047
Guido van Rossum879c5811995-01-10 15:24:06 +00001048static int
1049instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 PyObject **pv;
1051 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001052{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyObject *v = *pv;
1054 PyObject *w = *pw;
1055 PyObject *PyNumber_Coerce;
1056 PyObject *args;
1057 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001058
Guido van Rossum2878a691996-08-09 20:53:24 +00001059 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001060 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001061 if (coerce_obj == NULL)
1062 return -1;
1063 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1065 if (PyNumber_Coerce == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001066 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 PyErr_Clear();
1068 Py_INCREF(v);
1069 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001070 return 0;
1071 }
1072 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001074 if (args == NULL) {
1075 return -1;
1076 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1078 Py_DECREF(args);
1079 Py_DECREF(PyNumber_Coerce);
Guido van Rossum879c5811995-01-10 15:24:06 +00001080 if (coerced == NULL) {
1081 /* __coerce__ call raised an exception */
1082 return -1;
1083 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001085 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001087 return 1;
1088 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001090 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091 Py_DECREF(coerced);
1092 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001093 "coercion should return None or 2-tuple");
1094 return -1;
1095 }
1096 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 *pv = PyTuple_GetItem(coerced, 0);
1098 *pw = PyTuple_GetItem(coerced, 1);
1099 Py_INCREF(*pv);
1100 Py_INCREF(*pw);
1101 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001102 return 0;
1103}
1104
Guido van Rossum03093a21994-09-28 15:51:32 +00001105
Guido van Rossum04691fc1992-08-12 15:35:34 +00001106#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107static PyObject *funcname(self) PyInstanceObject *self; { \
1108 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001109 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001110 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111}
1112
Guido van Rossum04691fc1992-08-12 15:35:34 +00001113UNARY(instance_neg, "__neg__")
1114UNARY(instance_pos, "__pos__")
1115UNARY(instance_abs, "__abs__")
1116
Guido van Rossum9bfef441993-03-29 10:43:31 +00001117static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001119 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001124
Guido van Rossum2878a691996-08-09 20:53:24 +00001125 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001126 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001127 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001129 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001130 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001131 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133 /* Fall back to the default behavior:
1134 all instances are nonzero */
1135 return 1;
1136 }
1137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 res = PyEval_CallObject(func, (PyObject *)NULL);
1139 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001140 if (res == NULL)
1141 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001142 if (!PyInt_Check(res)) {
1143 Py_DECREF(res);
1144 PyErr_SetString(PyExc_TypeError,
1145 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001146 return -1;
1147 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148 outcome = PyInt_AsLong(res);
1149 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001150 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151 PyErr_SetString(PyExc_ValueError,
1152 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001153 return -1;
1154 }
1155 return outcome > 0;
1156}
1157
1158UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001159UNARY(instance_int, "__int__")
1160UNARY(instance_long, "__long__")
1161UNARY(instance_float, "__float__")
1162UNARY(instance_oct, "__oct__")
1163UNARY(instance_hex, "__hex__")
1164
Guido van Rossum03093a21994-09-28 15:51:32 +00001165/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001167instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168 PyObject *v;
1169 PyObject *w;
1170 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001171{
1172 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001173 PyObject *func;
1174 PyObject *args;
1175 PyObject *result;
1176 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001177
1178 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001179 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001181 if (func == NULL)
1182 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001184 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001186 return NULL;
1187 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 result = PyEval_CallObject(func, args);
1189 Py_DECREF(func);
1190 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001191 return result;
1192}
1193
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001195 0, /*nb_add*/
1196 0, /*nb_subtract*/
1197 0, /*nb_multiply*/
1198 0, /*nb_divide*/
1199 0, /*nb_remainder*/
1200 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001201 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001202 (unaryfunc)instance_neg, /*nb_negative*/
1203 (unaryfunc)instance_pos, /*nb_positive*/
1204 (unaryfunc)instance_abs, /*nb_absolute*/
1205 (inquiry)instance_nonzero, /*nb_nonzero*/
1206 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 0, /*nb_lshift*/
1208 0, /*nb_rshift*/
1209 0, /*nb_and*/
1210 0, /*nb_xor*/
1211 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001212 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213 (unaryfunc)instance_int, /*nb_int*/
1214 (unaryfunc)instance_long, /*nb_long*/
1215 (unaryfunc)instance_float, /*nb_float*/
1216 (unaryfunc)instance_oct, /*nb_oct*/
1217 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001218};
1219
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220PyTypeObject PyInstance_Type = {
1221 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001222 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001223 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001225 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001226 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001227 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001228 0, /*tp_getattr*/
1229 0, /*tp_setattr*/
1230 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001231 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001232 &instance_as_number, /*tp_as_number*/
1233 &instance_as_sequence, /*tp_as_sequence*/
1234 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001235 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001236 0, /*tp_call*/
1237 0, /*tp_str*/
1238 (getattrofunc)instance_getattr, /*tp_getattro*/
1239 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001240};
1241
1242
Guido van Rossum81daa321993-05-20 14:24:46 +00001243/* Instance method objects are used for two purposes:
1244 (a) as bound instance methods (returned by instancename.methodname)
1245 (b) as unbound methods (returned by ClassName.methodname)
1246 In case (b), im_self is NULL
1247*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001248
1249typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 PyObject_HEAD
1251 PyObject *im_func; /* The function implementing the method */
1252 PyObject *im_self; /* The instance it is bound to, or NULL */
1253 PyObject *im_class; /* The class that defined the method */
1254} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001255
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001256
1257static PyMethodObject *free_list;
1258
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259PyObject *
1260PyMethod_New(func, self, class)
1261 PyObject *func;
1262 PyObject *self;
1263 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001264{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 register PyMethodObject *im;
1266 if (!PyFunction_Check(func)) {
1267 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001268 return NULL;
1269 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001270 im = free_list;
1271 if (im != NULL) {
1272 free_list = (PyMethodObject *)(im->im_self);
1273 im->ob_type = &PyMethod_Type;
1274 _Py_NewReference(im);
1275 }
1276 else {
1277 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1278 if (im == NULL)
1279 return NULL;
1280 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001282 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001284 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001286 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001288}
1289
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290PyObject *
1291PyMethod_Function(im)
1292 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001293{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 if (!PyMethod_Check(im)) {
1295 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001296 return NULL;
1297 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001299}
1300
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301PyObject *
1302PyMethod_Self(im)
1303 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001304{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 if (!PyMethod_Check(im)) {
1306 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001307 return NULL;
1308 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001310}
1311
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312PyObject *
1313PyMethod_Class(im)
1314 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001315{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 if (!PyMethod_Check(im)) {
1317 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001318 return NULL;
1319 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001321}
1322
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001323/* Class method methods */
1324
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001326
Guido van Rossume8122f11991-05-05 20:03:07 +00001327static struct memberlist instancemethod_memberlist[] = {
1328 {"im_func", T_OBJECT, OFF(im_func)},
1329 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001330 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001331 /* Dummies that are not handled by getattr() except for __members__ */
1332 {"__doc__", T_INT, 0},
1333 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001334 {NULL} /* Sentinel */
1335};
1336
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001338instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 register PyMethodObject *im;
1340 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001341{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001343 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001345 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001347 return func->func_name;
1348 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001349 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001351 return func->func_doc;
1352 }
1353 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354 if (PyEval_GetRestricted()) {
1355 PyErr_SetString(PyExc_RuntimeError,
1356 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001357 return NULL;
1358 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001360}
1361
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001362static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001363instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001365{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 Py_DECREF(im->im_func);
1367 Py_XDECREF(im->im_self);
1368 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001369 im->im_self = (PyObject *)free_list;
1370 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001371}
1372
Guido van Rossumebc8c511992-09-03 20:39:51 +00001373static int
1374instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001376{
Guido van Rossume9df7271995-04-06 14:46:51 +00001377 if (a->im_self != b->im_self)
1378 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001380}
1381
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001383instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001385{
1386 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1388 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1389 PyClassObject *class = (PyClassObject *)(a->im_class);
1390 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001391 char *fcname, *icname, *fname;
1392 fclassname = class->cl_name;
1393 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 if (fclassname != NULL && PyString_Check(fclassname))
1395 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001396 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001397 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 if (funcname != NULL && PyString_Check(funcname))
1399 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001400 else
1401 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001402 if (self == NULL)
1403 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1404 else {
1405 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 if (iclassname != NULL && PyString_Check(iclassname))
1407 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001408 else
1409 icname = "?";
1410 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1411 fcname, fname, icname, (long)self);
1412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001414}
1415
Guido van Rossum9bfef441993-03-29 10:43:31 +00001416static long
1417instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001419{
1420 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001421 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001422 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001423 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001425 if (x == -1)
1426 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001428 if (y == -1)
1429 return -1;
1430 return x ^ y;
1431}
1432
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433PyTypeObject PyMethod_Type = {
1434 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001435 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001436 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001438 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001439 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001440 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001441 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001442 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001443 (cmpfunc)instancemethod_compare, /*tp_compare*/
1444 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001445 0, /*tp_as_number*/
1446 0, /*tp_as_sequence*/
1447 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001448 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001449 0, /*tp_call*/
1450 0, /*tp_str*/
1451 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1452 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001453};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001454
1455/* Clear out the free list */
1456
1457void
1458PyMethod_Fini()
1459{
1460 while (free_list) {
1461 PyMethodObject *v = free_list;
1462 free_list = (PyMethodObject *)(v->im_self);
1463 PyMem_DEL(v);
1464 }
1465}