blob: 72f8c11b3ba06f580649baefb9509d7705d974a2 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Class object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000036
Guido van Rossum52ca98a1994-09-05 07:32:29 +000037/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038static PyObject *class_lookup
39 Py_PROTO((PyClassObject *, PyObject *, PyClassObject **));
40static PyObject *instance_getattr1 Py_PROTO((PyInstanceObject *, PyObject *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000041
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042PyObject *
43PyClass_New(bases, dict, name)
44 PyObject *bases; /* NULL or tuple of classobjects! */
45 PyObject *dict;
46 PyObject *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Guido van Rossum0dfcf751996-08-12 22:00:53 +000048#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000049 int pos;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 PyObject *key, *value;
Guido van Rossum0dfcf751996-08-12 22:00:53 +000051#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 PyClassObject *op, *dummy;
53 static PyObject *getattrstr, *setattrstr, *delattrstr;
54 static PyObject *docstr;
Guido van Rossum019f4241996-08-21 14:54:28 +000055 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000056 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000057 if (docstr == NULL)
58 return NULL;
59 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 if (PyDict_GetItem(dict, docstr) == NULL) {
61 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000062 return NULL;
63 }
Guido van Rossume2966a61991-12-10 13:53:23 +000064 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000066 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000067 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000068 }
69 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 Py_INCREF(bases);
71 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +000072 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000075 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +000078 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +000080 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000081 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000082 getattrstr = PyString_InternFromString("__getattr__");
83 setattrstr = PyString_InternFromString("__setattr__");
84 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +000085 }
86 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
87 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
88 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 Py_XINCREF(op->cl_getattr);
90 Py_XINCREF(op->cl_setattr);
91 Py_XINCREF(op->cl_delattr);
Guido van Rossum0dfcf751996-08-12 22:00:53 +000092#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000093 pos = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 while (PyDict_Next(dict, &pos, &key, &value)) {
95 if (PyAccess_Check(value))
96 PyAccess_SetOwner(value, (PyObject *)op);
Guido van Rossum81daa321993-05-20 14:24:46 +000097 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +000098#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100}
101
102/* Class methods */
103
104static void
105class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 Py_DECREF(op->cl_bases);
109 Py_DECREF(op->cl_dict);
110 Py_XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 free((ANY *)op);
112}
113
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000115class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 PyClassObject *cp;
117 PyObject *name;
118 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000119{
120 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000122 if (value != NULL) {
123 *pclass = cp;
124 return value;
125 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000127 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 PyObject *v = class_lookup(
129 (PyClassObject *)
130 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000131 if (v != NULL)
132 return v;
133 }
134 return NULL;
135}
136
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 register PyClassObject *op;
140 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 register PyObject *v;
143 register char *sname = PyString_AsString(name);
144 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000145 if (sname[0] == '_' && sname[1] == '_') {
146 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 if (PyEval_GetRestricted()) {
148 PyErr_SetString(PyExc_RuntimeError,
149 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000150 return NULL;
151 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000153 return op->cl_dict;
154 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000155 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000157 return op->cl_bases;
158 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000159 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000160 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000162 else
163 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000165 return v;
166 }
Guido van Rossum94308391991-10-20 20:11:48 +0000167 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000168 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000169 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000171 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000173#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 if (PyAccess_Check(v)) {
175 v = PyAccess_AsValue(v, PyEval_GetOwner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000176 if (v == NULL)
177 return NULL;
178 }
179 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000180#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 Py_INCREF(v);
182 if (PyFunction_Check(v)) {
183 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
184 (PyObject *)class);
185 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000186 v = w;
187 }
188 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189}
190
Guido van Rossum94308391991-10-20 20:11:48 +0000191static int
192class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 PyClassObject *op;
194 PyObject *name;
195 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000196{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000197#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyObject *ac;
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000199#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000201 if (sname[0] == '_' && sname[1] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000203 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyErr_SetString(PyExc_TypeError,
205 "read-only special attribute");
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000206 return -1;
207 }
208 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 if (PyEval_GetRestricted()) {
210 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000211 "classes are read-only in restricted mode");
212 return -1;
213 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000214#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 ac = PyDict_GetItem(op->cl_dict, name);
216 if (ac != NULL && PyAccess_Check(ac))
217 return PyAccess_SetValue(ac, PyEval_GetOwner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000218#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000219 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000221 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000223 "delete non-existing class attribute");
224 return rv;
225 }
Guido van Rossum94308391991-10-20 20:11:48 +0000226 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000228}
229
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000231class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000233{
234 char buf[140];
235 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000237 name = "?";
238 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 name = PyString_AsString(op->cl_name);
Guido van Rossum25831651993-05-19 14:50:45 +0000240 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000242}
243
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244PyTypeObject PyClass_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 0,
247 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000250 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000252 0, /*tp_getattr*/
253 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256 0, /*tp_as_number*/
257 0, /*tp_as_sequence*/
258 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000259 0, /*tp_hash*/
260 0, /*tp_call*/
261 0, /*tp_str*/
262 (getattrofunc)class_getattr, /*tp_getattro*/
263 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264};
265
Guido van Rossum81daa321993-05-20 14:24:46 +0000266int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267PyClass_IsSubclass(class, base)
268 PyObject *class;
269 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000270{
271 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000273 if (class == base)
274 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000276 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000277 cp = (PyClassObject *)class;
278 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000279 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000280 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000281 return 1;
282 }
283 return 0;
284}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285
Guido van Rossum81daa321993-05-20 14:24:46 +0000286
287/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000289#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +0000290static int
291addaccess(class, inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 PyClassObject *class;
293 PyInstanceObject *inst;
Guido van Rossum81daa321993-05-20 14:24:46 +0000294{
295 int i, n, pos, ret;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296 PyObject *key, *value, *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000297
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 n = PyTuple_Size(class->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000299 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 if (addaccess((PyClassObject *)PyTuple_GetItem(
301 class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000302 return -1;
303 }
304
305 pos = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 while (PyDict_Next(class->cl_dict, &pos, &key, &value)) {
307 if (!PyAccess_Check(value))
Guido van Rossum81daa321993-05-20 14:24:46 +0000308 continue;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 if (PyAccess_HasValue(value))
Guido van Rossumb3f72581993-05-21 19:56:10 +0000310 continue;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 ac = PyDict_GetItem(inst->in_dict, key);
312 if (ac != NULL && PyAccess_Check(ac)) {
313 PyErr_SetObject(PyExc_ConflictError, key);
Guido van Rossum81daa321993-05-20 14:24:46 +0000314 return -1;
315 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 ac = PyAccess_Clone(value);
Guido van Rossum81daa321993-05-20 14:24:46 +0000317 if (ac == NULL)
318 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 ret = PyDict_SetItem(inst->in_dict, key, ac);
320 Py_DECREF(ac);
Guido van Rossum81daa321993-05-20 14:24:46 +0000321 if (ret != 0)
322 return -1;
323 }
324 return 0;
325}
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000326#endif
Guido van Rossum81daa321993-05-20 14:24:46 +0000327
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328PyObject *
329PyInstance_New(class, arg, kw)
330 PyObject *class;
331 PyObject *arg;
332 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 register PyInstanceObject *inst;
335 PyObject *init;
336 static PyObject *initstr;
337 if (!PyClass_Check(class)) {
338 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 return NULL;
340 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000342 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 Py_INCREF(class);
345 inst->in_class = (PyClassObject *)class;
346 inst->in_dict = PyDict_New();
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000347 if (inst->in_dict == NULL
348#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 || addaccess((PyClassObject *)class, inst) != 0
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000350#endif
351 ) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 return NULL;
354 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000355 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000356 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000357 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000358 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 PyErr_Clear();
360 if ((arg != NULL && (!PyTuple_Check(arg) ||
361 PyTuple_Size(arg) != 0))
362 || (kw != NULL && (!PyDict_Check(kw) ||
363 PyDict_Size(kw) != 0))) {
364 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000365 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000367 inst = NULL;
368 }
369 }
370 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
372 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000373 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000375 inst = NULL;
376 }
377 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 if (res != Py_None) {
379 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000380 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000382 inst = NULL;
383 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000385 }
386 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388}
389
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000390/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391
392static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000393instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyObject *error_type, *error_value, *error_traceback;
397 PyObject *del;
398 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000399 /* Call the __del__ method if it exists. First temporarily
400 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000401#ifdef Py_TRACE_REFS
402 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 extern long _Py_RefTotal;
404 inst->ob_type = &PyInstance_Type;
405 _Py_NewReference(inst);
406 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000407#ifdef COUNT_ALLOCS
408 inst->ob_type->tp_alloc--; /* ditto */
409#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000410#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000412#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000414 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000415 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000416 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000418 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 PyObject *f, *t, *v, *tb;
420 PyErr_Fetch(&t, &v, &tb);
421 f = PySys_GetObject("stderr");
422 PyErr_Clear();
Guido van Rossum22a85e51996-09-11 22:51:57 +0000423 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000425 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 PyFile_WriteObject(t, f, Py_PRINT_RAW);
427 if (v && v != Py_None) {
428 PyFile_WriteString(": ", f);
429 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000430 }
431 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 PyFile_WriteString(" in ", f);
433 PyFile_WriteObject(del, f, 0);
434 PyFile_WriteString(" ignored\n", f);
435 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000436 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000437 Py_XDECREF(t);
438 Py_XDECREF(v);
439 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000440 }
441 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 Py_DECREF(res);
443 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000444 }
445 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000447 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000448 if (--inst->ob_refcnt > 0) {
449#ifdef COUNT_ALLOCS
450 inst->ob_type->tp_free--;
451#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000452 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000453 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000454#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000455#ifdef COUNT_ALLOCS
456 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
457#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000459 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000460#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 Py_DECREF(inst->in_class);
462 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000463 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464}
465
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000467instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 register PyInstanceObject *inst;
469 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 register PyObject *v;
472 register char *sname = PyString_AsString(name);
473 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000474 if (sname[0] == '_' && sname[1] == '_') {
475 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 if (PyEval_GetRestricted()) {
477 PyErr_SetString(PyExc_RuntimeError,
478 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000479 return NULL;
480 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000482 return inst->in_dict;
483 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000484 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000485 Py_INCREF(inst->in_class);
486 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000487 }
Guido van Rossum94308391991-10-20 20:11:48 +0000488 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000489 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000491 if (v == NULL) {
492 v = class_lookup(inst->in_class, name, &class);
493 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000495 return NULL;
496 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000498#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 if (PyAccess_Check(v)) {
500 v = PyAccess_AsValue(v, PyEval_GetOwner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000501 if (v == NULL)
502 return NULL;
503 }
504 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000505#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000507 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 if (PyFunction_Check(v)) {
509 PyObject *w = PyMethod_New(v, (PyObject *)inst,
510 (PyObject *)class);
511 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000512 v = w;
513 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 else if (PyMethod_Check(v)) {
515 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000516 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
518 PyObject *im_func = PyMethod_Function(v);
519 PyObject *w = PyMethod_New(im_func,
520 (PyObject *)inst, im_class);
521 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000522 v = w;
523 }
524 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000525 }
526 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000527}
528
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000530instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 register PyInstanceObject *inst;
532 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000533{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000535 res = instance_getattr1(inst, name);
536 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 PyObject *args;
538 PyErr_Clear();
539 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000540 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000541 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 res = PyEval_CallObject(func, args);
543 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000544 }
545 return res;
546}
547
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548static int
Guido van Rossume7737541994-09-05 07:31:41 +0000549instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 PyInstanceObject *inst;
551 PyObject *name;
552 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000554#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 PyObject *ac;
556 ac = PyDict_GetItem(inst->in_dict, name);
557 if (ac != NULL && PyAccess_Check(ac))
558 return PyAccess_SetValue(ac, PyEval_GetOwner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000559#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000560 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000562 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000564 "delete non-existing instance attribute");
565 return rv;
566 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569}
570
Guido van Rossume7737541994-09-05 07:31:41 +0000571static int
572instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 PyInstanceObject *inst;
574 PyObject *name;
575 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000576{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyObject *func, *args, *res;
578 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000579 if (sname[0] == '_' && sname[1] == '_'
580 && (strcmp(sname, "__dict__") == 0 ||
581 strcmp(sname, "__class__") == 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000583 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 PyErr_SetString(PyExc_TypeError,
585 "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000586 return -1;
587 }
Guido van Rossume7737541994-09-05 07:31:41 +0000588 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000589 if (v == NULL)
590 func = inst->in_class->cl_delattr;
591 else
592 func = inst->in_class->cl_setattr;
593 if (func == NULL)
594 return instance_setattr1(inst, name, v);
595 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000597 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000599 if (args == NULL)
600 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 res = PyEval_CallObject(func, args);
602 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000603 if (res == NULL)
604 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000606 return 0;
607}
608
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000610instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000612{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 PyObject *func;
614 PyObject *res;
615 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000616
Guido van Rossum2878a691996-08-09 20:53:24 +0000617 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000618 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000619 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000620 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000621 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyObject *classname = inst->in_class->cl_name;
Guido van Rossum25831651993-05-19 14:50:45 +0000623 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 if (classname != NULL && PyString_Check(classname))
625 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000626 else
627 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 PyErr_Clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000629 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000631 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 res = PyEval_CallObject(func, (PyObject *)NULL);
633 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000634 return res;
635}
636
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000638instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000640{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000642 instance_compare1);
643}
644
Guido van Rossum9bfef441993-03-29 10:43:31 +0000645static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000646instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000648{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000650 long outcome;
651 result = instance_compare1(inst, other);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 if (result == NULL || !PyInt_Check(result)) {
653 PyErr_Clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000654 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000655 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 outcome = PyInt_AsLong(result);
657 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000658 if (outcome < 0)
659 return -1;
660 else if (outcome > 0)
661 return 1;
662 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000663}
664
Guido van Rossum9bfef441993-03-29 10:43:31 +0000665static long
666instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000668{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 PyObject *func;
670 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000671 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000673
Guido van Rossum2878a691996-08-09 20:53:24 +0000674 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000675 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000676 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000677 if (func == NULL) {
678 /* If there is no __cmp__ method, we hash on the address.
679 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000681 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000682 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000683 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000684 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000686 outcome = (long)inst;
687 if (outcome == -1)
688 outcome = -2;
689 return outcome;
690 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000692 return -1;
693 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 res = PyEval_CallObject(func, (PyObject *)NULL);
695 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000696 if (res == NULL)
697 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698 if (PyInt_Check(res)) {
699 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000700 if (outcome == -1)
701 outcome = -2;
702 }
703 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 PyErr_SetString(PyExc_TypeError,
705 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000706 outcome = -1;
707 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000709 return outcome;
710}
711
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000713
Guido van Rossum9bfef441993-03-29 10:43:31 +0000714static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000715instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000717{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyObject *func;
719 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720 int outcome;
721
Guido van Rossum2878a691996-08-09 20:53:24 +0000722 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000723 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000724 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725 if (func == NULL)
726 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 res = PyEval_CallObject(func, (PyObject *)NULL);
728 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000729 if (res == NULL)
730 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 if (PyInt_Check(res)) {
732 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000733 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734 PyErr_SetString(PyExc_ValueError,
735 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000736 }
737 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 PyErr_SetString(PyExc_TypeError,
739 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000740 outcome = -1;
741 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000743 return outcome;
744}
745
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000747instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 PyInstanceObject *inst;
749 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000750{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 PyObject *func;
752 PyObject *arg;
753 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000754
Guido van Rossum2878a691996-08-09 20:53:24 +0000755 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000756 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000757 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000758 if (func == NULL)
759 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000761 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000763 return NULL;
764 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 res = PyEval_CallObject(func, arg);
766 Py_DECREF(func);
767 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768 return res;
769}
770
Guido van Rossum9bfef441993-03-29 10:43:31 +0000771static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000772instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 PyInstanceObject*inst;
774 PyObject *key;
775 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 PyObject *func;
778 PyObject *arg;
779 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000780
Guido van Rossum2878a691996-08-09 20:53:24 +0000781 if (value == NULL) {
782 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000783 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000784 func = instance_getattr(inst, delitemstr);
785 }
786 else {
787 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000788 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000789 func = instance_getattr(inst, setitemstr);
790 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000791 if (func == NULL)
792 return -1;
793 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000795 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000799 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 res = PyEval_CallObject(func, arg);
802 Py_DECREF(func);
803 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000804 if (res == NULL)
805 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000807 return 0;
808}
809
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000811 (inquiry)instance_length, /*mp_length*/
812 (binaryfunc)instance_subscript, /*mp_subscript*/
813 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000814};
815
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000817instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000819 int i;
820{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000822
Guido van Rossum2878a691996-08-09 20:53:24 +0000823 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000824 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000825 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826 if (func == NULL)
827 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000829 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000831 return NULL;
832 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 res = PyEval_CallObject(func, arg);
834 Py_DECREF(func);
835 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000836 return res;
837}
838
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842 int i, j;
843{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyObject *func, *arg, *res;
845 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846
Guido van Rossum2878a691996-08-09 20:53:24 +0000847 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000848 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000849 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000850 if (func == NULL)
851 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000853 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855 return NULL;
856 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 res = PyEval_CallObject(func, arg);
858 Py_DECREF(func);
859 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000860 return res;
861}
862
863static int
864instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000866 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000868{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000870
Guido van Rossum2878a691996-08-09 20:53:24 +0000871 if (item == NULL) {
872 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000873 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000874 func = instance_getattr(inst, delitemstr);
875 }
876 else {
877 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000878 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000879 func = instance_getattr(inst, setitemstr);
880 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000881 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000882 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000883 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000887 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000889 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 res = PyEval_CallObject(func, arg);
892 Py_DECREF(func);
893 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894 if (res == NULL)
895 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000897 return 0;
898}
899
900static int
901instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000903 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906 PyObject *func, *arg, *res;
907 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908
Guido van Rossum2878a691996-08-09 20:53:24 +0000909 if (value == NULL) {
910 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 delslicestr =
912 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000913 func = instance_getattr(inst, delslicestr);
914 }
915 else {
916 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 setslicestr =
918 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000919 func = instance_getattr(inst, setslicestr);
920 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000921 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000922 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000929 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000930 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 res = PyEval_CallObject(func, arg);
932 Py_DECREF(func);
933 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000934 if (res == NULL)
935 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000937 return 0;
938}
939
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000941 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000942 0, /*sq_concat*/
943 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000944 (intargfunc)instance_item, /*sq_item*/
945 (intintargfunc)instance_slice, /*sq_slice*/
946 (intobjargproc)instance_ass_item, /*sq_ass_item*/
947 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948};
949
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000951generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 PyInstanceObject *self;
953 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000954{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000956
957 if ((func = instance_getattr(self, methodname)) == NULL)
958 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 res = PyEval_CallObject(func, (PyObject *)NULL);
960 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961 return res;
962}
963
Guido van Rossum03093a21994-09-28 15:51:32 +0000964
965/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
967 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000968
969
970/* Implement a binary operator involving at least one class instance. */
971
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972PyObject *
973PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
974 PyObject *v;
975 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +0000976 char *opname;
977 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000979{
980 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000982 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000983 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000984 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000985 return result;
986 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +0000988 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000989}
990
Guido van Rossum03093a21994-09-28 15:51:32 +0000991
992/* Try one half of a binary operator involving a class instance.
993 Return value:
994 -1 if an exception is to be reported right away
995 0 if we have a valid result
996 1 if we could try another operation
997*/
998
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001000
Guido van Rossum03093a21994-09-28 15:51:32 +00001001static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001002halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 PyObject *v;
1004 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001005 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 PyObject **r_result;
1007 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001008 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001009{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 PyObject *func;
1011 PyObject *args;
1012 PyObject *PyNumber_Coerce;
1013 PyObject *coerced = NULL;
1014 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001015
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001017 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001018 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001019 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001020 if (coerce_obj == NULL)
1021 return -1;
1022 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1024 if (PyNumber_Coerce == NULL) {
1025 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001026 }
1027 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001029 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001030 return -1;
1031 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1033 Py_DECREF(args);
1034 Py_DECREF(PyNumber_Coerce);
Guido van Rossum03093a21994-09-28 15:51:32 +00001035 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001036 return -1;
1037 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 if (coerced == Py_None) {
1039 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001040 return 1;
1041 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1043 Py_DECREF(coerced);
1044 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001045 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001046 return -1;
1047 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 v1 = PyTuple_GetItem(coerced, 0);
1049 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001050 if (v1 != v) {
1051 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001053 if (swapped)
1054 *r_result = (*thisfunc)(w, v);
1055 else
1056 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001058 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001059 }
1060 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001062 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001064 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 Py_XDECREF(coerced);
1066 if (PyErr_Occurred() != PyExc_AttributeError)
Guido van Rossume7d444f1995-01-07 12:35:18 +00001067 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001068 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001069 return 1;
1070 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001072 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 Py_DECREF(func);
1074 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001075 return -1;
1076 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 *r_result = PyEval_CallObject(func, args);
1078 Py_DECREF(args);
1079 Py_DECREF(func);
1080 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001081 return *r_result == NULL ? -1 : 0;
1082}
1083
Guido van Rossum879c5811995-01-10 15:24:06 +00001084static int
1085instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 PyObject **pv;
1087 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001088{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089 PyObject *v = *pv;
1090 PyObject *w = *pw;
1091 PyObject *PyNumber_Coerce;
1092 PyObject *args;
1093 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001094
Guido van Rossum2878a691996-08-09 20:53:24 +00001095 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001096 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001097 if (coerce_obj == NULL)
1098 return -1;
1099 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 PyNumber_Coerce = PyObject_GetAttr(v, coerce_obj);
1101 if (PyNumber_Coerce == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001102 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 PyErr_Clear();
1104 Py_INCREF(v);
1105 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001106 return 0;
1107 }
1108 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001110 if (args == NULL) {
1111 return -1;
1112 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113 coerced = PyEval_CallObject(PyNumber_Coerce, args);
1114 Py_DECREF(args);
1115 Py_DECREF(PyNumber_Coerce);
Guido van Rossum879c5811995-01-10 15:24:06 +00001116 if (coerced == NULL) {
1117 /* __coerce__ call raised an exception */
1118 return -1;
1119 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001121 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001123 return 1;
1124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001126 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001127 Py_DECREF(coerced);
1128 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001129 "coercion should return None or 2-tuple");
1130 return -1;
1131 }
1132 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 *pv = PyTuple_GetItem(coerced, 0);
1134 *pw = PyTuple_GetItem(coerced, 1);
1135 Py_INCREF(*pv);
1136 Py_INCREF(*pw);
1137 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001138 return 0;
1139}
1140
Guido van Rossum03093a21994-09-28 15:51:32 +00001141
Guido van Rossum04691fc1992-08-12 15:35:34 +00001142#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143static PyObject *funcname(self) PyInstanceObject *self; { \
1144 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001145 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001146 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001147}
1148
Guido van Rossum04691fc1992-08-12 15:35:34 +00001149UNARY(instance_neg, "__neg__")
1150UNARY(instance_pos, "__pos__")
1151UNARY(instance_abs, "__abs__")
1152
Guido van Rossum9bfef441993-03-29 10:43:31 +00001153static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001154instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001156{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001158 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001159 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001160
Guido van Rossum2878a691996-08-09 20:53:24 +00001161 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001162 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001163 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001164 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001165 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001166 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001167 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001169 /* Fall back to the default behavior:
1170 all instances are nonzero */
1171 return 1;
1172 }
1173 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 res = PyEval_CallObject(func, (PyObject *)NULL);
1175 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001176 if (res == NULL)
1177 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001178 if (!PyInt_Check(res)) {
1179 Py_DECREF(res);
1180 PyErr_SetString(PyExc_TypeError,
1181 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001182 return -1;
1183 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 outcome = PyInt_AsLong(res);
1185 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001186 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 PyErr_SetString(PyExc_ValueError,
1188 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001189 return -1;
1190 }
1191 return outcome > 0;
1192}
1193
1194UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001195UNARY(instance_int, "__int__")
1196UNARY(instance_long, "__long__")
1197UNARY(instance_float, "__float__")
1198UNARY(instance_oct, "__oct__")
1199UNARY(instance_hex, "__hex__")
1200
Guido van Rossum03093a21994-09-28 15:51:32 +00001201/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001203instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 PyObject *v;
1205 PyObject *w;
1206 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001207{
1208 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 PyObject *func;
1210 PyObject *args;
1211 PyObject *result;
1212 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001213
1214 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001215 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001217 if (func == NULL)
1218 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001220 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001222 return NULL;
1223 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 result = PyEval_CallObject(func, args);
1225 Py_DECREF(func);
1226 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001227 return result;
1228}
1229
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001231 0, /*nb_add*/
1232 0, /*nb_subtract*/
1233 0, /*nb_multiply*/
1234 0, /*nb_divide*/
1235 0, /*nb_remainder*/
1236 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001237 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001238 (unaryfunc)instance_neg, /*nb_negative*/
1239 (unaryfunc)instance_pos, /*nb_positive*/
1240 (unaryfunc)instance_abs, /*nb_absolute*/
1241 (inquiry)instance_nonzero, /*nb_nonzero*/
1242 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001243 0, /*nb_lshift*/
1244 0, /*nb_rshift*/
1245 0, /*nb_and*/
1246 0, /*nb_xor*/
1247 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001248 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001249 (unaryfunc)instance_int, /*nb_int*/
1250 (unaryfunc)instance_long, /*nb_long*/
1251 (unaryfunc)instance_float, /*nb_float*/
1252 (unaryfunc)instance_oct, /*nb_oct*/
1253 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001254};
1255
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256PyTypeObject PyInstance_Type = {
1257 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001258 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001259 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001261 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001262 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001263 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001264 0, /*tp_getattr*/
1265 0, /*tp_setattr*/
1266 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001267 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001268 &instance_as_number, /*tp_as_number*/
1269 &instance_as_sequence, /*tp_as_sequence*/
1270 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001271 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001272 0, /*tp_call*/
1273 0, /*tp_str*/
1274 (getattrofunc)instance_getattr, /*tp_getattro*/
1275 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001276};
1277
1278
Guido van Rossum81daa321993-05-20 14:24:46 +00001279/* Instance method objects are used for two purposes:
1280 (a) as bound instance methods (returned by instancename.methodname)
1281 (b) as unbound methods (returned by ClassName.methodname)
1282 In case (b), im_self is NULL
1283*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001284
1285typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 PyObject_HEAD
1287 PyObject *im_func; /* The function implementing the method */
1288 PyObject *im_self; /* The instance it is bound to, or NULL */
1289 PyObject *im_class; /* The class that defined the method */
1290} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001291
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292PyObject *
1293PyMethod_New(func, self, class)
1294 PyObject *func;
1295 PyObject *self;
1296 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001297{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 register PyMethodObject *im;
1299 if (!PyFunction_Check(func)) {
1300 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001301 return NULL;
1302 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +00001304 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001305 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001307 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001309 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001311 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001313}
1314
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315PyObject *
1316PyMethod_Function(im)
1317 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001318{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 if (!PyMethod_Check(im)) {
1320 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001321 return NULL;
1322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001324}
1325
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326PyObject *
1327PyMethod_Self(im)
1328 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001329{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 if (!PyMethod_Check(im)) {
1331 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001332 return NULL;
1333 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001335}
1336
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337PyObject *
1338PyMethod_Class(im)
1339 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001340{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 if (!PyMethod_Check(im)) {
1342 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001343 return NULL;
1344 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001346}
1347
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001348/* Class method methods */
1349
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001351
Guido van Rossume8122f11991-05-05 20:03:07 +00001352static struct memberlist instancemethod_memberlist[] = {
1353 {"im_func", T_OBJECT, OFF(im_func)},
1354 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001355 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001356 /* Dummies that are not handled by getattr() except for __members__ */
1357 {"__doc__", T_INT, 0},
1358 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001359 {NULL} /* Sentinel */
1360};
1361
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001363instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 register PyMethodObject *im;
1365 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001366{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001368 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001370 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001372 return func->func_name;
1373 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001374 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001376 return func->func_doc;
1377 }
1378 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 if (PyEval_GetRestricted()) {
1380 PyErr_SetString(PyExc_RuntimeError,
1381 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001382 return NULL;
1383 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001385}
1386
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001387static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001388instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001390{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391 Py_DECREF(im->im_func);
1392 Py_XDECREF(im->im_self);
1393 Py_DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001394 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001395}
1396
Guido van Rossumebc8c511992-09-03 20:39:51 +00001397static int
1398instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001400{
Guido van Rossume9df7271995-04-06 14:46:51 +00001401 if (a->im_self != b->im_self)
1402 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001404}
1405
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001407instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001409{
1410 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1412 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1413 PyClassObject *class = (PyClassObject *)(a->im_class);
1414 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001415 char *fcname, *icname, *fname;
1416 fclassname = class->cl_name;
1417 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 if (fclassname != NULL && PyString_Check(fclassname))
1419 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001420 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001421 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001422 if (funcname != NULL && PyString_Check(funcname))
1423 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001424 else
1425 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001426 if (self == NULL)
1427 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1428 else {
1429 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 if (iclassname != NULL && PyString_Check(iclassname))
1431 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001432 else
1433 icname = "?";
1434 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1435 fcname, fname, icname, (long)self);
1436 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001438}
1439
Guido van Rossum9bfef441993-03-29 10:43:31 +00001440static long
1441instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001443{
1444 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001445 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001447 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001449 if (x == -1)
1450 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001452 if (y == -1)
1453 return -1;
1454 return x ^ y;
1455}
1456
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457PyTypeObject PyMethod_Type = {
1458 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001459 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001460 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001462 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001463 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001464 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001465 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001466 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001467 (cmpfunc)instancemethod_compare, /*tp_compare*/
1468 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001469 0, /*tp_as_number*/
1470 0, /*tp_as_sequence*/
1471 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001472 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001473 0, /*tp_call*/
1474 0, /*tp_str*/
1475 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1476 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001477};