blob: d10cbe671c681dfe9688702945c47b75bd8fc33b [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{
264 char buf[140];
265 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000267 name = "?";
268 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 name = PyString_AsString(op->cl_name);
Guido van Rossum25831651993-05-19 14:50:45 +0000270 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000272}
273
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274PyTypeObject PyClass_Type = {
275 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 0,
277 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000280 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000282 0, /*tp_getattr*/
283 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000285 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 0, /*tp_as_number*/
287 0, /*tp_as_sequence*/
288 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000289 0, /*tp_hash*/
290 0, /*tp_call*/
291 0, /*tp_str*/
292 (getattrofunc)class_getattr, /*tp_getattro*/
293 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294};
295
Guido van Rossum81daa321993-05-20 14:24:46 +0000296int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297PyClass_IsSubclass(class, base)
298 PyObject *class;
299 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000300{
301 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000303 if (class == base)
304 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000306 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 cp = (PyClassObject *)class;
308 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000309 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000311 return 1;
312 }
313 return 0;
314}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315
Guido van Rossum81daa321993-05-20 14:24:46 +0000316
317/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319PyObject *
320PyInstance_New(class, arg, kw)
321 PyObject *class;
322 PyObject *arg;
323 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 register PyInstanceObject *inst;
326 PyObject *init;
327 static PyObject *initstr;
328 if (!PyClass_Check(class)) {
329 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 return NULL;
331 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000333 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 Py_INCREF(class);
336 inst->in_class = (PyClassObject *)class;
337 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000338 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340 return NULL;
341 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000342 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000343 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000344 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000345 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 PyErr_Clear();
347 if ((arg != NULL && (!PyTuple_Check(arg) ||
348 PyTuple_Size(arg) != 0))
349 || (kw != NULL && (!PyDict_Check(kw) ||
350 PyDict_Size(kw) != 0))) {
351 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000352 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000354 inst = NULL;
355 }
356 }
357 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
359 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000360 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000362 inst = NULL;
363 }
364 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 if (res != Py_None) {
366 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000367 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000369 inst = NULL;
370 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000372 }
373 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375}
376
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000377/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378
379static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000380instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 PyObject *error_type, *error_value, *error_traceback;
384 PyObject *del;
385 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000386 /* Call the __del__ method if it exists. First temporarily
387 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000388#ifdef Py_TRACE_REFS
389 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 extern long _Py_RefTotal;
391 inst->ob_type = &PyInstance_Type;
392 _Py_NewReference(inst);
393 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000394#ifdef COUNT_ALLOCS
395 inst->ob_type->tp_alloc--; /* ditto */
396#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000397#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000399#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000401 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000402 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000403 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000405 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 PyObject *f, *t, *v, *tb;
407 PyErr_Fetch(&t, &v, &tb);
408 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000409 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000411 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 PyFile_WriteObject(t, f, Py_PRINT_RAW);
413 if (v && v != Py_None) {
414 PyFile_WriteString(": ", f);
415 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000416 }
417 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 PyFile_WriteString(" in ", f);
419 PyFile_WriteObject(del, f, 0);
420 PyFile_WriteString(" ignored\n", f);
421 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000422 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000423 Py_XDECREF(t);
424 Py_XDECREF(v);
425 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000426 }
427 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 Py_DECREF(res);
429 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000430 }
431 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000433 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000434 if (--inst->ob_refcnt > 0) {
435#ifdef COUNT_ALLOCS
436 inst->ob_type->tp_free--;
437#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000438 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000439 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000440#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000441#ifdef COUNT_ALLOCS
442 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
443#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000445 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000446#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 Py_DECREF(inst->in_class);
448 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000449 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450}
451
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000453instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 register PyInstanceObject *inst;
455 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 register PyObject *v;
458 register char *sname = PyString_AsString(name);
459 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000460 if (sname[0] == '_' && sname[1] == '_') {
461 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 if (PyEval_GetRestricted()) {
463 PyErr_SetString(PyExc_RuntimeError,
464 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000465 return NULL;
466 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000468 return inst->in_dict;
469 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000470 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 Py_INCREF(inst->in_class);
472 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000473 }
Guido van Rossum94308391991-10-20 20:11:48 +0000474 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000475 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000477 if (v == NULL) {
478 v = class_lookup(inst->in_class, name, &class);
479 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000481 return NULL;
482 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000484 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000485 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 if (PyFunction_Check(v)) {
487 PyObject *w = PyMethod_New(v, (PyObject *)inst,
488 (PyObject *)class);
489 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000490 v = w;
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 else if (PyMethod_Check(v)) {
493 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000494 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
496 PyObject *im_func = PyMethod_Function(v);
497 PyObject *w = PyMethod_New(im_func,
498 (PyObject *)inst, im_class);
499 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000500 v = w;
501 }
502 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000503 }
504 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000505}
506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000508instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 register PyInstanceObject *inst;
510 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000511{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000513 res = instance_getattr1(inst, name);
514 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyObject *args;
516 PyErr_Clear();
517 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000518 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000519 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 res = PyEval_CallObject(func, args);
521 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000522 }
523 return res;
524}
525
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526static int
Guido van Rossume7737541994-09-05 07:31:41 +0000527instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyInstanceObject *inst;
529 PyObject *name;
530 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531{
Guido van Rossum94472a01992-09-04 09:45:18 +0000532 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000534 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000536 "delete non-existing instance attribute");
537 return rv;
538 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000539 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541}
542
Guido van Rossume7737541994-09-05 07:31:41 +0000543static int
544instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 PyInstanceObject *inst;
546 PyObject *name;
547 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000548{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000549 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000551 if (sname[0] == '_' && sname[1] == '_') {
552 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000553 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000554 if (strcmp(sname, "__dict__") == 0) {
555 if (PyEval_GetRestricted()) {
556 PyErr_SetString(PyExc_RuntimeError,
557 "__dict__ not accessible in restricted mode");
558 return -1;
559 }
560 if (v == NULL || !PyDict_Check(v)) {
561 PyErr_SetString(PyExc_TypeError,
562 "__dict__ must be set to a dictionary");
563 return -1;
564 }
565 tmp = inst->in_dict;
566 Py_INCREF(v);
567 inst->in_dict = v;
568 Py_DECREF(tmp);
569 return 0;
570 }
571 if (strcmp(sname, "__class__") == 0) {
572 if (PyEval_GetRestricted()) {
573 PyErr_SetString(PyExc_RuntimeError,
574 "__class__ not accessible in restricted mode");
575 return -1;
576 }
577 if (v == NULL || !PyClass_Check(v)) {
578 PyErr_SetString(PyExc_TypeError,
579 "__class__ must be set to a class");
580 return -1;
581 }
582 tmp = (PyObject *)(inst->in_class);
583 Py_INCREF(v);
584 inst->in_class = (PyClassObject *)v;
585 Py_DECREF(tmp);
586 return 0;
587 }
Guido van Rossume7737541994-09-05 07:31:41 +0000588 }
Guido van Rossume7737541994-09-05 07:31:41 +0000589 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000590 if (v == NULL)
591 func = inst->in_class->cl_delattr;
592 else
593 func = inst->in_class->cl_setattr;
594 if (func == NULL)
595 return instance_setattr1(inst, name, v);
596 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000598 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000600 if (args == NULL)
601 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 res = PyEval_CallObject(func, args);
603 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000604 if (res == NULL)
605 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000607 return 0;
608}
609
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000611instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000613{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 PyObject *func;
615 PyObject *res;
616 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000617
Guido van Rossum2878a691996-08-09 20:53:24 +0000618 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000619 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000620 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000621 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000622 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 PyObject *classname = inst->in_class->cl_name;
Guido van Rossum25831651993-05-19 14:50:45 +0000624 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 if (classname != NULL && PyString_Check(classname))
626 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000627 else
628 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 PyErr_Clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000630 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000632 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 res = PyEval_CallObject(func, (PyObject *)NULL);
634 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000635 return res;
636}
637
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000639instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000641{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000643 instance_compare1);
644}
645
Guido van Rossum9bfef441993-03-29 10:43:31 +0000646static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000647instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000649{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000651 long outcome;
652 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000653 if (result == NULL)
654 return -1;
655 if (!PyInt_Check(result)) {
656 Py_DECREF(result);
657 PyErr_SetString(PyExc_TypeError,
658 "comparison did not return an int");
659 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000660 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 outcome = PyInt_AsLong(result);
662 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000663 if (outcome < 0)
664 return -1;
665 else if (outcome > 0)
666 return 1;
667 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000668}
669
Guido van Rossum9bfef441993-03-29 10:43:31 +0000670static long
671instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000673{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyObject *func;
675 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000676 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000678
Guido van Rossum2878a691996-08-09 20:53:24 +0000679 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000680 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000681 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000682 if (func == NULL) {
683 /* If there is no __cmp__ method, we hash on the address.
684 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000686 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000687 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000688 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000689 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000691 outcome = (long)inst;
692 if (outcome == -1)
693 outcome = -2;
694 return outcome;
695 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000697 return -1;
698 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 res = PyEval_CallObject(func, (PyObject *)NULL);
700 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000701 if (res == NULL)
702 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 if (PyInt_Check(res)) {
704 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000705 if (outcome == -1)
706 outcome = -2;
707 }
708 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 PyErr_SetString(PyExc_TypeError,
710 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000711 outcome = -1;
712 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000714 return outcome;
715}
716
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000718
Guido van Rossum9bfef441993-03-29 10:43:31 +0000719static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000722{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 PyObject *func;
724 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725 int outcome;
726
Guido van Rossum2878a691996-08-09 20:53:24 +0000727 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000728 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000729 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000730 if (func == NULL)
731 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 res = PyEval_CallObject(func, (PyObject *)NULL);
733 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000734 if (res == NULL)
735 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 if (PyInt_Check(res)) {
737 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000738 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 PyErr_SetString(PyExc_ValueError,
740 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000741 }
742 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 PyErr_SetString(PyExc_TypeError,
744 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000745 outcome = -1;
746 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000748 return outcome;
749}
750
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000752instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 PyInstanceObject *inst;
754 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000755{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 PyObject *func;
757 PyObject *arg;
758 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759
Guido van Rossum2878a691996-08-09 20:53:24 +0000760 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000761 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000762 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000763 if (func == NULL)
764 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768 return NULL;
769 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 res = PyEval_CallObject(func, arg);
771 Py_DECREF(func);
772 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000773 return res;
774}
775
Guido van Rossum9bfef441993-03-29 10:43:31 +0000776static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000777instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 PyInstanceObject*inst;
779 PyObject *key;
780 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000781{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 PyObject *func;
783 PyObject *arg;
784 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785
Guido van Rossum2878a691996-08-09 20:53:24 +0000786 if (value == NULL) {
787 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000788 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000789 func = instance_getattr(inst, delitemstr);
790 }
791 else {
792 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000793 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000794 func = instance_getattr(inst, setitemstr);
795 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000796 if (func == NULL)
797 return -1;
798 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000802 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000804 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000805 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 res = PyEval_CallObject(func, arg);
807 Py_DECREF(func);
808 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809 if (res == NULL)
810 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000812 return 0;
813}
814
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000816 (inquiry)instance_length, /*mp_length*/
817 (binaryfunc)instance_subscript, /*mp_subscript*/
818 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000819};
820
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000822instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000824 int i;
825{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000827
Guido van Rossum2878a691996-08-09 20:53:24 +0000828 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000829 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000830 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000831 if (func == NULL)
832 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000834 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000836 return NULL;
837 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 res = PyEval_CallObject(func, arg);
839 Py_DECREF(func);
840 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000841 return res;
842}
843
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000845instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000847 int i, j;
848{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 PyObject *func, *arg, *res;
850 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000851
Guido van Rossum2878a691996-08-09 20:53:24 +0000852 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000853 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000854 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855 if (func == NULL)
856 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000860 return NULL;
861 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 res = PyEval_CallObject(func, arg);
863 Py_DECREF(func);
864 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 return res;
866}
867
868static int
869instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000871 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000873{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875
Guido van Rossum2878a691996-08-09 20:53:24 +0000876 if (item == NULL) {
877 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000878 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000879 func = instance_getattr(inst, delitemstr);
880 }
881 else {
882 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000883 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000884 func = instance_getattr(inst, setitemstr);
885 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000886 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000887 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 arg = Py_BuildValue("(iO)", i, item);
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 Rossum6d946f91992-08-14 13:49:30 +0000894 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000895 }
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 if (res == NULL)
900 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000902 return 0;
903}
904
905static int
906instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 PyObject *func, *arg, *res;
912 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000913
Guido van Rossum2878a691996-08-09 20:53:24 +0000914 if (value == NULL) {
915 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 delslicestr =
917 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000918 func = instance_getattr(inst, delslicestr);
919 }
920 else {
921 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 setslicestr =
923 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 func = instance_getattr(inst, setslicestr);
925 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000927 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000930 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000934 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 res = PyEval_CallObject(func, arg);
937 Py_DECREF(func);
938 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000939 if (res == NULL)
940 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942 return 0;
943}
944
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000946 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000947 0, /*sq_concat*/
948 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000949 (intargfunc)instance_item, /*sq_item*/
950 (intintargfunc)instance_slice, /*sq_slice*/
951 (intobjargproc)instance_ass_item, /*sq_ass_item*/
952 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000953};
954
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000956generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 PyInstanceObject *self;
958 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000959{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961
962 if ((func = instance_getattr(self, methodname)) == NULL)
963 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 res = PyEval_CallObject(func, (PyObject *)NULL);
965 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000966 return res;
967}
968
Guido van Rossum03093a21994-09-28 15:51:32 +0000969
970/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
972 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000973
974
975/* Implement a binary operator involving at least one class instance. */
976
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977PyObject *
978PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
979 PyObject *v;
980 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000981 char *opname;
982 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000984{
985 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000987 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000988 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000989 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000990 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000991 /* Sigh -- special case for comnparisons */
992 if (strcmp(opname, "__cmp__") == 0) {
993 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
994 return PyInt_FromLong(c);
995 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000996 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +0000998 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000999}
1000
Guido van Rossum03093a21994-09-28 15:51:32 +00001001
1002/* Try one half of a binary operator involving a class instance.
1003 Return value:
1004 -1 if an exception is to be reported right away
1005 0 if we have a valid result
1006 1 if we could try another operation
1007*/
1008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001010
Guido van Rossum03093a21994-09-28 15:51:32 +00001011static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001012halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyObject *v;
1014 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001015 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 PyObject **r_result;
1017 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001018 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001019{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 PyObject *func;
1021 PyObject *args;
1022 PyObject *PyNumber_Coerce;
1023 PyObject *coerced = NULL;
1024 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001025
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001027 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001028 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001029 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001030 if (coerce_obj == NULL)
1031 return -1;
1032 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1034 if (PyNumber_Coerce == NULL) {
1035 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001036 }
1037 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001039 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001040 return -1;
1041 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1043 Py_DECREF(args);
1044 Py_DECREF(PyNumber_Coerce);
Guido van Rossum03093a21994-09-28 15:51:32 +00001045 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001046 return -1;
1047 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 if (coerced == Py_None) {
1049 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001050 return 1;
1051 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1053 Py_DECREF(coerced);
1054 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001055 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001056 return -1;
1057 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 v1 = PyTuple_GetItem(coerced, 0);
1059 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001060 if (v1 != v) {
1061 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001063 if (swapped)
1064 *r_result = (*thisfunc)(w, v);
1065 else
1066 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001068 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001069 }
1070 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001072 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001074 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 Py_XDECREF(coerced);
1076 if (PyErr_Occurred() != PyExc_AttributeError)
Guido van Rossume7d444f1995-01-07 12:35:18 +00001077 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001079 return 1;
1080 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001082 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 Py_DECREF(func);
1084 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001085 return -1;
1086 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 *r_result = PyEval_CallObject(func, args);
1088 Py_DECREF(args);
1089 Py_DECREF(func);
1090 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001091 return *r_result == NULL ? -1 : 0;
1092}
1093
Guido van Rossum879c5811995-01-10 15:24:06 +00001094static int
1095instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 PyObject **pv;
1097 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 PyObject *v = *pv;
1100 PyObject *w = *pw;
1101 PyObject *PyNumber_Coerce;
1102 PyObject *args;
1103 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001104
Guido van Rossum2878a691996-08-09 20:53:24 +00001105 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001106 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001107 if (coerce_obj == NULL)
1108 return -1;
1109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1111 if (PyNumber_Coerce == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001112 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113 PyErr_Clear();
1114 Py_INCREF(v);
1115 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001116 return 0;
1117 }
1118 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001119 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001120 if (args == NULL) {
1121 return -1;
1122 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1124 Py_DECREF(args);
1125 Py_DECREF(PyNumber_Coerce);
Guido van Rossum879c5811995-01-10 15:24:06 +00001126 if (coerced == NULL) {
1127 /* __coerce__ call raised an exception */
1128 return -1;
1129 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001131 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001133 return 1;
1134 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001136 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 Py_DECREF(coerced);
1138 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001139 "coercion should return None or 2-tuple");
1140 return -1;
1141 }
1142 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 *pv = PyTuple_GetItem(coerced, 0);
1144 *pw = PyTuple_GetItem(coerced, 1);
1145 Py_INCREF(*pv);
1146 Py_INCREF(*pw);
1147 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001148 return 0;
1149}
1150
Guido van Rossum03093a21994-09-28 15:51:32 +00001151
Guido van Rossum04691fc1992-08-12 15:35:34 +00001152#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153static PyObject *funcname(self) PyInstanceObject *self; { \
1154 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001155 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001156 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001157}
1158
Guido van Rossum04691fc1992-08-12 15:35:34 +00001159UNARY(instance_neg, "__neg__")
1160UNARY(instance_pos, "__pos__")
1161UNARY(instance_abs, "__abs__")
1162
Guido van Rossum9bfef441993-03-29 10:43:31 +00001163static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001164instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001165 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001166{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001168 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001170
Guido van Rossum2878a691996-08-09 20:53:24 +00001171 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001172 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001173 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001175 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001176 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001177 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001178 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001179 /* Fall back to the default behavior:
1180 all instances are nonzero */
1181 return 1;
1182 }
1183 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 res = PyEval_CallObject(func, (PyObject *)NULL);
1185 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186 if (res == NULL)
1187 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 if (!PyInt_Check(res)) {
1189 Py_DECREF(res);
1190 PyErr_SetString(PyExc_TypeError,
1191 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001192 return -1;
1193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 outcome = PyInt_AsLong(res);
1195 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001196 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 PyErr_SetString(PyExc_ValueError,
1198 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001199 return -1;
1200 }
1201 return outcome > 0;
1202}
1203
1204UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001205UNARY(instance_int, "__int__")
1206UNARY(instance_long, "__long__")
1207UNARY(instance_float, "__float__")
1208UNARY(instance_oct, "__oct__")
1209UNARY(instance_hex, "__hex__")
1210
Guido van Rossum03093a21994-09-28 15:51:32 +00001211/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001213instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214 PyObject *v;
1215 PyObject *w;
1216 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001217{
1218 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 PyObject *func;
1220 PyObject *args;
1221 PyObject *result;
1222 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001223
1224 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001225 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001227 if (func == NULL)
1228 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001230 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001232 return NULL;
1233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 result = PyEval_CallObject(func, args);
1235 Py_DECREF(func);
1236 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001237 return result;
1238}
1239
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001240static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001241 0, /*nb_add*/
1242 0, /*nb_subtract*/
1243 0, /*nb_multiply*/
1244 0, /*nb_divide*/
1245 0, /*nb_remainder*/
1246 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001247 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001248 (unaryfunc)instance_neg, /*nb_negative*/
1249 (unaryfunc)instance_pos, /*nb_positive*/
1250 (unaryfunc)instance_abs, /*nb_absolute*/
1251 (inquiry)instance_nonzero, /*nb_nonzero*/
1252 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001253 0, /*nb_lshift*/
1254 0, /*nb_rshift*/
1255 0, /*nb_and*/
1256 0, /*nb_xor*/
1257 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001258 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001259 (unaryfunc)instance_int, /*nb_int*/
1260 (unaryfunc)instance_long, /*nb_long*/
1261 (unaryfunc)instance_float, /*nb_float*/
1262 (unaryfunc)instance_oct, /*nb_oct*/
1263 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001264};
1265
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266PyTypeObject PyInstance_Type = {
1267 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001268 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001269 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001271 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001272 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001273 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001274 0, /*tp_getattr*/
1275 0, /*tp_setattr*/
1276 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001277 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001278 &instance_as_number, /*tp_as_number*/
1279 &instance_as_sequence, /*tp_as_sequence*/
1280 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001281 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001282 0, /*tp_call*/
1283 0, /*tp_str*/
1284 (getattrofunc)instance_getattr, /*tp_getattro*/
1285 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001286};
1287
1288
Guido van Rossum81daa321993-05-20 14:24:46 +00001289/* Instance method objects are used for two purposes:
1290 (a) as bound instance methods (returned by instancename.methodname)
1291 (b) as unbound methods (returned by ClassName.methodname)
1292 In case (b), im_self is NULL
1293*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001294
1295typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 PyObject_HEAD
1297 PyObject *im_func; /* The function implementing the method */
1298 PyObject *im_self; /* The instance it is bound to, or NULL */
1299 PyObject *im_class; /* The class that defined the method */
1300} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001301
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001302
1303static PyMethodObject *free_list;
1304
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305PyObject *
1306PyMethod_New(func, self, class)
1307 PyObject *func;
1308 PyObject *self;
1309 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001310{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 register PyMethodObject *im;
1312 if (!PyFunction_Check(func)) {
1313 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001314 return NULL;
1315 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001316 im = free_list;
1317 if (im != NULL) {
1318 free_list = (PyMethodObject *)(im->im_self);
1319 im->ob_type = &PyMethod_Type;
1320 _Py_NewReference(im);
1321 }
1322 else {
1323 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1324 if (im == NULL)
1325 return NULL;
1326 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001328 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001330 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001332 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001334}
1335
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336PyObject *
1337PyMethod_Function(im)
1338 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001339{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 if (!PyMethod_Check(im)) {
1341 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001342 return NULL;
1343 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001345}
1346
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347PyObject *
1348PyMethod_Self(im)
1349 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001350{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 if (!PyMethod_Check(im)) {
1352 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001353 return NULL;
1354 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001356}
1357
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358PyObject *
1359PyMethod_Class(im)
1360 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001361{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 if (!PyMethod_Check(im)) {
1363 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001364 return NULL;
1365 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001367}
1368
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001369/* Class method methods */
1370
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001372
Guido van Rossume8122f11991-05-05 20:03:07 +00001373static struct memberlist instancemethod_memberlist[] = {
1374 {"im_func", T_OBJECT, OFF(im_func)},
1375 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001376 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001377 /* Dummies that are not handled by getattr() except for __members__ */
1378 {"__doc__", T_INT, 0},
1379 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001380 {NULL} /* Sentinel */
1381};
1382
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001384instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 register PyMethodObject *im;
1386 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001387{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001389 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001391 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001393 return func->func_name;
1394 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001395 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001397 return func->func_doc;
1398 }
1399 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 if (PyEval_GetRestricted()) {
1401 PyErr_SetString(PyExc_RuntimeError,
1402 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001403 return NULL;
1404 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001406}
1407
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001408static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001409instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001411{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 Py_DECREF(im->im_func);
1413 Py_XDECREF(im->im_self);
1414 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001415 im->im_self = (PyObject *)free_list;
1416 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001417}
1418
Guido van Rossumebc8c511992-09-03 20:39:51 +00001419static int
1420instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001422{
Guido van Rossume9df7271995-04-06 14:46:51 +00001423 if (a->im_self != b->im_self)
1424 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001426}
1427
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001429instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001431{
1432 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1434 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1435 PyClassObject *class = (PyClassObject *)(a->im_class);
1436 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001437 char *fcname, *icname, *fname;
1438 fclassname = class->cl_name;
1439 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 if (fclassname != NULL && PyString_Check(fclassname))
1441 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001442 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001443 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 if (funcname != NULL && PyString_Check(funcname))
1445 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001446 else
1447 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001448 if (self == NULL)
1449 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1450 else {
1451 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 if (iclassname != NULL && PyString_Check(iclassname))
1453 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001454 else
1455 icname = "?";
1456 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1457 fcname, fname, icname, (long)self);
1458 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001460}
1461
Guido van Rossum9bfef441993-03-29 10:43:31 +00001462static long
1463instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001465{
1466 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001467 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001468 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001469 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001471 if (x == -1)
1472 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001474 if (y == -1)
1475 return -1;
1476 return x ^ y;
1477}
1478
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479PyTypeObject PyMethod_Type = {
1480 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001481 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001482 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001484 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001485 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001486 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001487 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001488 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001489 (cmpfunc)instancemethod_compare, /*tp_compare*/
1490 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001491 0, /*tp_as_number*/
1492 0, /*tp_as_sequence*/
1493 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001494 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001495 0, /*tp_call*/
1496 0, /*tp_str*/
1497 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1498 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001499};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001500
1501/* Clear out the free list */
1502
1503void
1504PyMethod_Fini()
1505{
1506 while (free_list) {
1507 PyMethodObject *v = free_list;
1508 free_list = (PyMethodObject *)(v->im_self);
1509 PyMem_DEL(v);
1510 }
1511}