blob: b67265b1c353723fa997e82b4a520c54d06e3e4b [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;
Guido van Rossum04d73c41997-10-07 14:54:11 +000046 PyObject *name;
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;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000050 static PyObject *docstr, *modstr, *namestr;
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 Rossum7cc56eb1997-09-12 20:04:46 +000056 if (modstr == NULL) {
57 modstr= PyString_InternFromString("__module__");
58 if (modstr == NULL)
59 return NULL;
60 }
61 if (namestr == NULL) {
62 namestr= PyString_InternFromString("__name__");
63 if (namestr == NULL)
64 return NULL;
65 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000066 if (name == NULL || !PyString_Check(name)) {
67 PyErr_SetString(PyExc_SystemError,
68 "PyClass_New: name must be a string");
69 return NULL;
70 }
71 if (dict == NULL || !PyDict_Check(dict)) {
72 PyErr_SetString(PyExc_SystemError,
73 "PyClass_New: dict must be a dictionary");
74 return NULL;
75 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 if (PyDict_GetItem(dict, docstr) == NULL) {
77 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000078 return NULL;
79 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000080 if (PyDict_GetItem(dict, modstr) == NULL) {
81 PyObject *globals = PyEval_GetGlobals();
82 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000083 PyObject *modname = PyDict_GetItem(globals, namestr);
84 if (modname != NULL) {
85 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000086 return NULL;
87 }
88 }
89 }
Guido van Rossume2966a61991-12-10 13:53:23 +000090 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000092 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000093 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000094 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000095 else {
96 int i;
97 if (!PyTuple_Check(bases)) {
98 PyErr_SetString(PyExc_SystemError,
99 "PyClass_New: bases must be a tuple");
100 return NULL;
101 }
102 i = PyTuple_Size(bases);
103 while (--i >= 0) {
104 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
105 PyErr_SetString(PyExc_SystemError,
106 "PyClass_New: base must be a class");
107 return NULL;
108 }
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +0000111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000113 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000116 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000119 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000121 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000122 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000123 getattrstr = PyString_InternFromString("__getattr__");
124 setattrstr = PyString_InternFromString("__setattr__");
125 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000126 }
127 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
128 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
129 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 Py_XINCREF(op->cl_getattr);
131 Py_XINCREF(op->cl_setattr);
132 Py_XINCREF(op->cl_delattr);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134}
135
136/* Class methods */
137
138static void
139class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 Py_DECREF(op->cl_bases);
143 Py_DECREF(op->cl_dict);
144 Py_XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 free((ANY *)op);
146}
147
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000149class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 PyClassObject *cp;
151 PyObject *name;
152 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000153{
154 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000156 if (value != NULL) {
157 *pclass = cp;
158 return value;
159 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000161 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000162 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 PyObject *v = class_lookup(
164 (PyClassObject *)
165 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000166 if (v != NULL)
167 return v;
168 }
169 return NULL;
170}
171
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000172static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 register PyClassObject *op;
175 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 register PyObject *v;
178 register char *sname = PyString_AsString(name);
179 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000180 if (sname[0] == '_' && sname[1] == '_') {
181 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 if (PyEval_GetRestricted()) {
183 PyErr_SetString(PyExc_RuntimeError,
184 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000185 return NULL;
186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000188 return op->cl_dict;
189 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000190 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000192 return op->cl_bases;
193 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000194 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000195 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000197 else
198 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000200 return v;
201 }
Guido van Rossum94308391991-10-20 20:11:48 +0000202 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000203 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000204 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000206 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000208 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 if (PyFunction_Check(v)) {
210 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
211 (PyObject *)class);
212 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000213 v = w;
214 }
215 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216}
217
Guido van Rossum94308391991-10-20 20:11:48 +0000218static int
219class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 PyClassObject *op;
221 PyObject *name;
222 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000223{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000224 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 if (PyEval_GetRestricted()) {
226 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000227 "classes are read-only in restricted mode");
228 return -1;
229 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000230 sname = PyString_AsString(name);
231 if (sname[0] == '_' && sname[1] == '_') {
232 int n = PyString_Size(name);
233 if (sname[n-1] == '_' && sname[n-2] == '_') {
234 if (strcmp(sname, "__dict__") == 0 ||
235 strcmp(sname, "__bases__") == 0 ||
236 strcmp(sname, "__name__") == 0 ||
237 strcmp(sname, "__getattr__") == 0 ||
238 strcmp(sname, "__setattr__") == 0 ||
239 strcmp(sname, "__delattr__") == 0)
240 {
241 /* XXX In unrestricted mode, we should
242 XXX allow this -- with a type check */
243 PyErr_SetString(PyExc_TypeError,
244 "read-only special attribute");
245 return -1;
246 }
247 }
248 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000249 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000251 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000253 "delete non-existing class attribute");
254 return rv;
255 }
Guido van Rossum94308391991-10-20 20:11:48 +0000256 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000258}
259
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000261class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000263{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000264 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000265 char buf[140];
266 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000268 name = "?";
269 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000270 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000271 if (mod == NULL || !PyString_Check(mod))
272 sprintf(buf, "<class ?.%.100s at %lx>", name, (long)op);
273 else
274 sprintf(buf, "<class %.50s.%.50s at %lx>",
275 PyString_AsString(mod),
276 name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000277 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000278}
279
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000280static PyObject *
281class_str(op)
282 PyClassObject *op;
283{
284 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
285 PyObject *name = op->cl_name;
286 PyObject *res;
287 int m, n;
288
289 if (name == NULL || !PyString_Check(name))
290 return class_repr(op);
291 if (mod == NULL || !PyString_Check(mod)) {
292 Py_INCREF(name);
293 return name;
294 }
295 m = PyString_Size(mod);
296 n = PyString_Size(name);
297 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
298 if (res != NULL) {
299 char *s = PyString_AsString(res);
300 memcpy(s, PyString_AsString(mod), m);
301 s += m;
302 *s++ = '.';
303 memcpy(s, PyString_AsString(name), n);
304 }
305 return res;
306}
307
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308PyTypeObject PyClass_Type = {
309 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 0,
311 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000314 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000316 0, /*tp_getattr*/
317 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000319 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 0, /*tp_as_number*/
321 0, /*tp_as_sequence*/
322 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000323 0, /*tp_hash*/
324 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000325 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000326 (getattrofunc)class_getattr, /*tp_getattro*/
327 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328};
329
Guido van Rossum81daa321993-05-20 14:24:46 +0000330int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331PyClass_IsSubclass(class, base)
332 PyObject *class;
333 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000334{
335 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000337 if (class == base)
338 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000340 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 cp = (PyClassObject *)class;
342 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000343 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000345 return 1;
346 }
347 return 0;
348}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349
Guido van Rossum81daa321993-05-20 14:24:46 +0000350
351/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353PyObject *
354PyInstance_New(class, arg, kw)
355 PyObject *class;
356 PyObject *arg;
357 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 register PyInstanceObject *inst;
360 PyObject *init;
361 static PyObject *initstr;
362 if (!PyClass_Check(class)) {
363 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 return NULL;
365 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000367 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 Py_INCREF(class);
370 inst->in_class = (PyClassObject *)class;
371 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000372 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 return NULL;
375 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000376 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000377 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000378 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000379 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 PyErr_Clear();
381 if ((arg != NULL && (!PyTuple_Check(arg) ||
382 PyTuple_Size(arg) != 0))
383 || (kw != NULL && (!PyDict_Check(kw) ||
384 PyDict_Size(kw) != 0))) {
385 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000386 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000388 inst = NULL;
389 }
390 }
391 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
393 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000394 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000396 inst = NULL;
397 }
398 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 if (res != Py_None) {
400 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000401 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000403 inst = NULL;
404 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000406 }
407 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409}
410
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000411/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412
413static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000414instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 PyObject *error_type, *error_value, *error_traceback;
418 PyObject *del;
419 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000420 /* Call the __del__ method if it exists. First temporarily
421 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000422#ifdef Py_TRACE_REFS
423 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 extern long _Py_RefTotal;
425 inst->ob_type = &PyInstance_Type;
426 _Py_NewReference(inst);
427 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000428#ifdef COUNT_ALLOCS
429 inst->ob_type->tp_alloc--; /* ditto */
430#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000431#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000433#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000435 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000436 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000437 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000439 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 PyObject *f, *t, *v, *tb;
441 PyErr_Fetch(&t, &v, &tb);
442 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000443 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000445 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 PyFile_WriteObject(t, f, Py_PRINT_RAW);
447 if (v && v != Py_None) {
448 PyFile_WriteString(": ", f);
449 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000450 }
451 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 PyFile_WriteString(" in ", f);
453 PyFile_WriteObject(del, f, 0);
454 PyFile_WriteString(" ignored\n", f);
455 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000456 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000457 Py_XDECREF(t);
458 Py_XDECREF(v);
459 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000460 }
461 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 Py_DECREF(res);
463 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000464 }
465 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000467 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000468 if (--inst->ob_refcnt > 0) {
469#ifdef COUNT_ALLOCS
470 inst->ob_type->tp_free--;
471#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000472 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000473 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000474#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000475#ifdef COUNT_ALLOCS
476 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
477#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000479 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000480#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 Py_DECREF(inst->in_class);
482 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000483 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}
485
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000487instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 register PyInstanceObject *inst;
489 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 register PyObject *v;
492 register char *sname = PyString_AsString(name);
493 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000494 if (sname[0] == '_' && sname[1] == '_') {
495 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 if (PyEval_GetRestricted()) {
497 PyErr_SetString(PyExc_RuntimeError,
498 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000499 return NULL;
500 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000502 return inst->in_dict;
503 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000504 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 Py_INCREF(inst->in_class);
506 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000507 }
Guido van Rossum94308391991-10-20 20:11:48 +0000508 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000509 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000511 if (v == NULL) {
512 v = class_lookup(inst->in_class, name, &class);
513 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000515 return NULL;
516 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000517 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000518 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000519 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 if (PyFunction_Check(v)) {
521 PyObject *w = PyMethod_New(v, (PyObject *)inst,
522 (PyObject *)class);
523 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000524 v = w;
525 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 else if (PyMethod_Check(v)) {
527 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000528 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
530 PyObject *im_func = PyMethod_Function(v);
531 PyObject *w = PyMethod_New(im_func,
532 (PyObject *)inst, im_class);
533 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000534 v = w;
535 }
536 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000537 }
538 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000539}
540
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000542instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 register PyInstanceObject *inst;
544 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000545{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000547 res = instance_getattr1(inst, name);
548 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 PyObject *args;
550 PyErr_Clear();
551 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000552 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000553 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 res = PyEval_CallObject(func, args);
555 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000556 }
557 return res;
558}
559
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560static int
Guido van Rossume7737541994-09-05 07:31:41 +0000561instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyInstanceObject *inst;
563 PyObject *name;
564 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565{
Guido van Rossum94472a01992-09-04 09:45:18 +0000566 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000568 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000570 "delete non-existing instance attribute");
571 return rv;
572 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000575}
576
Guido van Rossume7737541994-09-05 07:31:41 +0000577static int
578instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 PyInstanceObject *inst;
580 PyObject *name;
581 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000582{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000583 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000585 if (sname[0] == '_' && sname[1] == '_') {
586 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000587 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000588 if (strcmp(sname, "__dict__") == 0) {
589 if (PyEval_GetRestricted()) {
590 PyErr_SetString(PyExc_RuntimeError,
591 "__dict__ not accessible in restricted mode");
592 return -1;
593 }
594 if (v == NULL || !PyDict_Check(v)) {
595 PyErr_SetString(PyExc_TypeError,
596 "__dict__ must be set to a dictionary");
597 return -1;
598 }
599 tmp = inst->in_dict;
600 Py_INCREF(v);
601 inst->in_dict = v;
602 Py_DECREF(tmp);
603 return 0;
604 }
605 if (strcmp(sname, "__class__") == 0) {
606 if (PyEval_GetRestricted()) {
607 PyErr_SetString(PyExc_RuntimeError,
608 "__class__ not accessible in restricted mode");
609 return -1;
610 }
611 if (v == NULL || !PyClass_Check(v)) {
612 PyErr_SetString(PyExc_TypeError,
613 "__class__ must be set to a class");
614 return -1;
615 }
616 tmp = (PyObject *)(inst->in_class);
617 Py_INCREF(v);
618 inst->in_class = (PyClassObject *)v;
619 Py_DECREF(tmp);
620 return 0;
621 }
Guido van Rossume7737541994-09-05 07:31:41 +0000622 }
Guido van Rossume7737541994-09-05 07:31:41 +0000623 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000624 if (v == NULL)
625 func = inst->in_class->cl_delattr;
626 else
627 func = inst->in_class->cl_setattr;
628 if (func == NULL)
629 return instance_setattr1(inst, name, v);
630 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000632 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000634 if (args == NULL)
635 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 res = PyEval_CallObject(func, args);
637 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000638 if (res == NULL)
639 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000641 return 0;
642}
643
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000645instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000647{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 PyObject *func;
649 PyObject *res;
650 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000651
Guido van Rossum2878a691996-08-09 20:53:24 +0000652 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000653 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000654 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000655 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000656 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 PyObject *classname = inst->in_class->cl_name;
Guido van Rossum25831651993-05-19 14:50:45 +0000658 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 if (classname != NULL && PyString_Check(classname))
660 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000661 else
662 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 PyErr_Clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000664 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000666 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 res = PyEval_CallObject(func, (PyObject *)NULL);
668 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000669 return res;
670}
671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000673instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000675{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000677 instance_compare1);
678}
679
Guido van Rossum9bfef441993-03-29 10:43:31 +0000680static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000681instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000683{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000685 long outcome;
686 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000687 if (result == NULL)
688 return -1;
689 if (!PyInt_Check(result)) {
690 Py_DECREF(result);
691 PyErr_SetString(PyExc_TypeError,
692 "comparison did not return an int");
693 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000694 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 outcome = PyInt_AsLong(result);
696 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000697 if (outcome < 0)
698 return -1;
699 else if (outcome > 0)
700 return 1;
701 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000702}
703
Guido van Rossum9bfef441993-03-29 10:43:31 +0000704static long
705instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000707{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 PyObject *func;
709 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000710 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000712
Guido van Rossum2878a691996-08-09 20:53:24 +0000713 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000714 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000715 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000716 if (func == NULL) {
717 /* If there is no __cmp__ method, we hash on the address.
718 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000720 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000721 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000722 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000723 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000725 outcome = (long)inst;
726 if (outcome == -1)
727 outcome = -2;
728 return outcome;
729 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000730 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000731 return -1;
732 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733 res = PyEval_CallObject(func, (PyObject *)NULL);
734 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000735 if (res == NULL)
736 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 if (PyInt_Check(res)) {
738 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000739 if (outcome == -1)
740 outcome = -2;
741 }
742 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 PyErr_SetString(PyExc_TypeError,
744 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000745 outcome = -1;
746 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000748 return outcome;
749}
750
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000752
Guido van Rossum9bfef441993-03-29 10:43:31 +0000753static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000754instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 PyObject *func;
758 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759 int outcome;
760
Guido van Rossum2878a691996-08-09 20:53:24 +0000761 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000762 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000763 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000764 if (func == NULL)
765 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 res = PyEval_CallObject(func, (PyObject *)NULL);
767 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000768 if (res == NULL)
769 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 if (PyInt_Check(res)) {
771 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000772 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 PyErr_SetString(PyExc_ValueError,
774 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000775 }
776 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 PyErr_SetString(PyExc_TypeError,
778 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000779 outcome = -1;
780 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782 return outcome;
783}
784
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000786instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 PyInstanceObject *inst;
788 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000789{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790 PyObject *func;
791 PyObject *arg;
792 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000793
Guido van Rossum2878a691996-08-09 20:53:24 +0000794 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000795 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000796 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 if (func == NULL)
798 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000802 return NULL;
803 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 res = PyEval_CallObject(func, arg);
805 Py_DECREF(func);
806 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000807 return res;
808}
809
Guido van Rossum9bfef441993-03-29 10:43:31 +0000810static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 PyInstanceObject*inst;
813 PyObject *key;
814 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000815{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 PyObject *func;
817 PyObject *arg;
818 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000819
Guido van Rossum2878a691996-08-09 20:53:24 +0000820 if (value == NULL) {
821 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000822 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000823 func = instance_getattr(inst, delitemstr);
824 }
825 else {
826 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000827 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000828 func = instance_getattr(inst, setitemstr);
829 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000830 if (func == NULL)
831 return -1;
832 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000834 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000836 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000838 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000839 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 res = PyEval_CallObject(func, arg);
841 Py_DECREF(func);
842 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000843 if (res == NULL)
844 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846 return 0;
847}
848
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000850 (inquiry)instance_length, /*mp_length*/
851 (binaryfunc)instance_subscript, /*mp_subscript*/
852 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000853};
854
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858 int i;
859{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861
Guido van Rossum2878a691996-08-09 20:53:24 +0000862 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000863 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000864 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 if (func == NULL)
866 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000868 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000870 return NULL;
871 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 res = PyEval_CallObject(func, arg);
873 Py_DECREF(func);
874 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875 return res;
876}
877
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000879instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000880 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000881 int i, j;
882{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 PyObject *func, *arg, *res;
884 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885
Guido van Rossum2878a691996-08-09 20:53:24 +0000886 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000887 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000888 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000889 if (func == NULL)
890 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000892 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894 return NULL;
895 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 res = PyEval_CallObject(func, arg);
897 Py_DECREF(func);
898 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000899 return res;
900}
901
902static int
903instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000907{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000909
Guido van Rossum2878a691996-08-09 20:53:24 +0000910 if (item == NULL) {
911 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000912 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000913 func = instance_getattr(inst, delitemstr);
914 }
915 else {
916 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000917 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000918 func = instance_getattr(inst, setitemstr);
919 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000921 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000928 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 res = PyEval_CallObject(func, arg);
931 Py_DECREF(func);
932 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000933 if (res == NULL)
934 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000936 return 0;
937}
938
939static int
940instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945 PyObject *func, *arg, *res;
946 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000947
Guido van Rossum2878a691996-08-09 20:53:24 +0000948 if (value == NULL) {
949 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 delslicestr =
951 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000952 func = instance_getattr(inst, delslicestr);
953 }
954 else {
955 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000956 setslicestr =
957 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000958 func = instance_getattr(inst, setslicestr);
959 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000960 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000961 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000962 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000966 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000968 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000969 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 res = PyEval_CallObject(func, arg);
971 Py_DECREF(func);
972 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000973 if (res == NULL)
974 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000976 return 0;
977}
978
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000980 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000981 0, /*sq_concat*/
982 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000983 (intargfunc)instance_item, /*sq_item*/
984 (intintargfunc)instance_slice, /*sq_slice*/
985 (intobjargproc)instance_ass_item, /*sq_ass_item*/
986 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000987};
988
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyInstanceObject *self;
992 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995
996 if ((func = instance_getattr(self, methodname)) == NULL)
997 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 res = PyEval_CallObject(func, (PyObject *)NULL);
999 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 return res;
1001}
1002
Guido van Rossum03093a21994-09-28 15:51:32 +00001003
1004/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1006 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001007
1008
1009/* Implement a binary operator involving at least one class instance. */
1010
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011PyObject *
1012PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1013 PyObject *v;
1014 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001015 char *opname;
1016 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001018{
1019 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001021 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001022 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001023 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001024 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001025 /* Sigh -- special case for comnparisons */
1026 if (strcmp(opname, "__cmp__") == 0) {
1027 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1028 return PyInt_FromLong(c);
1029 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001030 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001031 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001032 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001033}
1034
Guido van Rossum03093a21994-09-28 15:51:32 +00001035
1036/* Try one half of a binary operator involving a class instance.
1037 Return value:
1038 -1 if an exception is to be reported right away
1039 0 if we have a valid result
1040 1 if we could try another operation
1041*/
1042
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001044
Guido van Rossum03093a21994-09-28 15:51:32 +00001045static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001046halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 PyObject *v;
1048 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001049 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 PyObject **r_result;
1051 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001052 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001053{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 PyObject *func;
1055 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001056 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 PyObject *coerced = NULL;
1058 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001059
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001061 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001062 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001063 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001064 if (coerce_obj == NULL)
1065 return -1;
1066 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001067 coercefunc = PyObject_GetAttr(v, coerce_obj);
1068 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001070 }
1071 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001073 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001074 return -1;
1075 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001076 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001078 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001079 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001080 return -1;
1081 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 if (coerced == Py_None) {
1083 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001084 return 1;
1085 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1087 Py_DECREF(coerced);
1088 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001089 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001090 return -1;
1091 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 v1 = PyTuple_GetItem(coerced, 0);
1093 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001094 if (v1 != v) {
1095 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001097 if (swapped)
1098 *r_result = (*thisfunc)(w, v);
1099 else
1100 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001102 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001103 }
1104 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001106 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001108 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 Py_XDECREF(coerced);
1110 if (PyErr_Occurred() != PyExc_AttributeError)
Guido van Rossume7d444f1995-01-07 12:35:18 +00001111 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001113 return 1;
1114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001116 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 Py_DECREF(func);
1118 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001119 return -1;
1120 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 *r_result = PyEval_CallObject(func, args);
1122 Py_DECREF(args);
1123 Py_DECREF(func);
1124 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001125 return *r_result == NULL ? -1 : 0;
1126}
1127
Guido van Rossum879c5811995-01-10 15:24:06 +00001128static int
1129instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 PyObject **pv;
1131 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001132{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyObject *v = *pv;
1134 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001135 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 PyObject *args;
1137 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001138
Guido van Rossum2878a691996-08-09 20:53:24 +00001139 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001140 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001141 if (coerce_obj == NULL)
1142 return -1;
1143 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001144 coercefunc = PyObject_GetAttr(v, coerce_obj);
1145 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001146 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 PyErr_Clear();
1148 Py_INCREF(v);
1149 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001150 return 0;
1151 }
1152 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001154 if (args == NULL) {
1155 return -1;
1156 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001157 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001159 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001160 if (coerced == NULL) {
1161 /* __coerce__ call raised an exception */
1162 return -1;
1163 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001164 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001165 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001167 return 1;
1168 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001170 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 Py_DECREF(coerced);
1172 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001173 "coercion should return None or 2-tuple");
1174 return -1;
1175 }
1176 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 *pv = PyTuple_GetItem(coerced, 0);
1178 *pw = PyTuple_GetItem(coerced, 1);
1179 Py_INCREF(*pv);
1180 Py_INCREF(*pw);
1181 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001182 return 0;
1183}
1184
Guido van Rossum03093a21994-09-28 15:51:32 +00001185
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187static PyObject *funcname(self) PyInstanceObject *self; { \
1188 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001189 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001190 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001191}
1192
Guido van Rossum04691fc1992-08-12 15:35:34 +00001193UNARY(instance_neg, "__neg__")
1194UNARY(instance_pos, "__pos__")
1195UNARY(instance_abs, "__abs__")
1196
Guido van Rossum9bfef441993-03-29 10:43:31 +00001197static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001198instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001199 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001200{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001202 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001204
Guido van Rossum2878a691996-08-09 20:53:24 +00001205 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001206 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001207 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001209 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001210 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001211 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001213 /* Fall back to the default behavior:
1214 all instances are nonzero */
1215 return 1;
1216 }
1217 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 res = PyEval_CallObject(func, (PyObject *)NULL);
1219 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001220 if (res == NULL)
1221 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 if (!PyInt_Check(res)) {
1223 Py_DECREF(res);
1224 PyErr_SetString(PyExc_TypeError,
1225 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001226 return -1;
1227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 outcome = PyInt_AsLong(res);
1229 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001230 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 PyErr_SetString(PyExc_ValueError,
1232 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001233 return -1;
1234 }
1235 return outcome > 0;
1236}
1237
1238UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001239UNARY(instance_int, "__int__")
1240UNARY(instance_long, "__long__")
1241UNARY(instance_float, "__float__")
1242UNARY(instance_oct, "__oct__")
1243UNARY(instance_hex, "__hex__")
1244
Guido van Rossum03093a21994-09-28 15:51:32 +00001245/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001247instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 PyObject *v;
1249 PyObject *w;
1250 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001251{
1252 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 PyObject *func;
1254 PyObject *args;
1255 PyObject *result;
1256 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001257
1258 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001259 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001261 if (func == NULL)
1262 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001264 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001266 return NULL;
1267 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 result = PyEval_CallObject(func, args);
1269 Py_DECREF(func);
1270 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001271 return result;
1272}
1273
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001275 0, /*nb_add*/
1276 0, /*nb_subtract*/
1277 0, /*nb_multiply*/
1278 0, /*nb_divide*/
1279 0, /*nb_remainder*/
1280 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001281 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001282 (unaryfunc)instance_neg, /*nb_negative*/
1283 (unaryfunc)instance_pos, /*nb_positive*/
1284 (unaryfunc)instance_abs, /*nb_absolute*/
1285 (inquiry)instance_nonzero, /*nb_nonzero*/
1286 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001287 0, /*nb_lshift*/
1288 0, /*nb_rshift*/
1289 0, /*nb_and*/
1290 0, /*nb_xor*/
1291 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001292 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001293 (unaryfunc)instance_int, /*nb_int*/
1294 (unaryfunc)instance_long, /*nb_long*/
1295 (unaryfunc)instance_float, /*nb_float*/
1296 (unaryfunc)instance_oct, /*nb_oct*/
1297 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001298};
1299
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300PyTypeObject PyInstance_Type = {
1301 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001302 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001303 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001305 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001306 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001307 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001308 0, /*tp_getattr*/
1309 0, /*tp_setattr*/
1310 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001311 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001312 &instance_as_number, /*tp_as_number*/
1313 &instance_as_sequence, /*tp_as_sequence*/
1314 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001315 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001316 0, /*tp_call*/
1317 0, /*tp_str*/
1318 (getattrofunc)instance_getattr, /*tp_getattro*/
1319 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001320};
1321
1322
Guido van Rossum81daa321993-05-20 14:24:46 +00001323/* Instance method objects are used for two purposes:
1324 (a) as bound instance methods (returned by instancename.methodname)
1325 (b) as unbound methods (returned by ClassName.methodname)
1326 In case (b), im_self is NULL
1327*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001328
1329typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 PyObject_HEAD
1331 PyObject *im_func; /* The function implementing the method */
1332 PyObject *im_self; /* The instance it is bound to, or NULL */
1333 PyObject *im_class; /* The class that defined the method */
1334} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001335
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001336
1337static PyMethodObject *free_list;
1338
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339PyObject *
1340PyMethod_New(func, self, class)
1341 PyObject *func;
1342 PyObject *self;
1343 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001344{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 register PyMethodObject *im;
1346 if (!PyFunction_Check(func)) {
1347 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001348 return NULL;
1349 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001350 im = free_list;
1351 if (im != NULL) {
1352 free_list = (PyMethodObject *)(im->im_self);
1353 im->ob_type = &PyMethod_Type;
1354 _Py_NewReference(im);
1355 }
1356 else {
1357 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1358 if (im == NULL)
1359 return NULL;
1360 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001362 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001364 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001366 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001368}
1369
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370PyObject *
1371PyMethod_Function(im)
1372 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001373{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 if (!PyMethod_Check(im)) {
1375 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001376 return NULL;
1377 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001379}
1380
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381PyObject *
1382PyMethod_Self(im)
1383 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001384{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 if (!PyMethod_Check(im)) {
1386 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001387 return NULL;
1388 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001390}
1391
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392PyObject *
1393PyMethod_Class(im)
1394 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001395{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 if (!PyMethod_Check(im)) {
1397 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001398 return NULL;
1399 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001401}
1402
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001403/* Class method methods */
1404
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001406
Guido van Rossume8122f11991-05-05 20:03:07 +00001407static struct memberlist instancemethod_memberlist[] = {
1408 {"im_func", T_OBJECT, OFF(im_func)},
1409 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001410 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001411 /* Dummies that are not handled by getattr() except for __members__ */
1412 {"__doc__", T_INT, 0},
1413 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001414 {NULL} /* Sentinel */
1415};
1416
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001418instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 register PyMethodObject *im;
1420 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001422 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001423 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001425 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001427 return func->func_name;
1428 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001429 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001431 return func->func_doc;
1432 }
1433 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434 if (PyEval_GetRestricted()) {
1435 PyErr_SetString(PyExc_RuntimeError,
1436 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001437 return NULL;
1438 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440}
1441
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001442static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001443instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001445{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 Py_DECREF(im->im_func);
1447 Py_XDECREF(im->im_self);
1448 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001449 im->im_self = (PyObject *)free_list;
1450 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001451}
1452
Guido van Rossumebc8c511992-09-03 20:39:51 +00001453static int
1454instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001456{
Guido van Rossume9df7271995-04-06 14:46:51 +00001457 if (a->im_self != b->im_self)
1458 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001460}
1461
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001463instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001465{
1466 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1468 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1469 PyClassObject *class = (PyClassObject *)(a->im_class);
1470 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001471 char *fcname, *icname, *fname;
1472 fclassname = class->cl_name;
1473 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 if (fclassname != NULL && PyString_Check(fclassname))
1475 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001476 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001477 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 if (funcname != NULL && PyString_Check(funcname))
1479 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001480 else
1481 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001482 if (self == NULL)
1483 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1484 else {
1485 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486 if (iclassname != NULL && PyString_Check(iclassname))
1487 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001488 else
1489 icname = "?";
1490 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1491 fcname, fname, icname, (long)self);
1492 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001494}
1495
Guido van Rossum9bfef441993-03-29 10:43:31 +00001496static long
1497instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001499{
1500 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001501 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001503 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001505 if (x == -1)
1506 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001508 if (y == -1)
1509 return -1;
1510 return x ^ y;
1511}
1512
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513PyTypeObject PyMethod_Type = {
1514 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001515 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001516 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001518 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001519 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001520 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001521 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001522 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001523 (cmpfunc)instancemethod_compare, /*tp_compare*/
1524 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001525 0, /*tp_as_number*/
1526 0, /*tp_as_sequence*/
1527 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001528 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001529 0, /*tp_call*/
1530 0, /*tp_str*/
1531 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1532 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001533};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001534
1535/* Clear out the free list */
1536
1537void
1538PyMethod_Fini()
1539{
1540 while (free_list) {
1541 PyMethodObject *v = free_list;
1542 free_list = (PyMethodObject *)(v->im_self);
1543 PyMem_DEL(v);
1544 }
1545}