blob: 69ad23d2f94573e204c8f66d3651cdb00d66d237 [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 Rossum3f5da241990-12-20 15:06:42 +000032/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum6f9e4331995-03-29 16:57:48 +000036#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000037DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039
Guido van Rossum3f5da241990-12-20 15:06:42 +000040/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
41 These are used by the individual routines for object creation.
42 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000044#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000046extern int tuple_zero_allocs, fast_tuple_allocs;
47extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000048extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000049void
50dump_counts()
51{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000053
54 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000055 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
56 tp->tp_name, tp->tp_alloc, tp->tp_free,
57 tp->tp_maxalloc);
58 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
59 fast_tuple_allocs, tuple_zero_allocs);
60 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
61 quick_int_allocs, quick_neg_int_allocs);
62 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
63 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000064}
65
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000066PyObject *
67get_counts()
68{
69 PyTypeObject *tp;
70 PyObject *result;
71 PyObject *v;
72
73 result = PyList_New(0);
74 if (result == NULL)
75 return NULL;
76 for (tp = type_list; tp; tp = tp->tp_next) {
77 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
78 tp->tp_free, tp->tp_maxalloc);
79 if (v == NULL) {
80 Py_DECREF(result);
81 return NULL;
82 }
83 if (PyList_Append(result, v) < 0) {
84 Py_DECREF(v);
85 Py_DECREF(result);
86 return NULL;
87 }
88 Py_DECREF(v);
89 }
90 return result;
91}
92
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000093void
94inc_count(tp)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000096{
97 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000098 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000099 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000101 tp->tp_next = type_list;
102 type_list = tp;
103 }
104 tp->tp_alloc++;
105 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
106 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
107}
108#endif
109
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000110#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111PyObject *
112_PyObject_New(tp)
113 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000114#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
116_PyObject_New(tp,op)
117 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000118 PyObject *op;
119#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000121#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 PyObject *op = (PyObject *) malloc(tp->tp_basicsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000123#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return op;
129}
130
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000131#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000132PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133_PyObject_NewVar(tp, size)
134 PyTypeObject *tp;
Guido van Rossum2497ead1995-02-10 17:00:27 +0000135 int size;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000136#else
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000137PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138_PyObject_NewVar(tp, size, op)
139 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000140 int size;
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000141 PyVarObject *op;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000142#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000144#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000145 PyVarObject *op = (PyVarObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 malloc(tp->tp_basicsize + size * tp->tp_itemsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000147#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000149 return (PyVarObject *)PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 op->ob_type = tp;
151 op->ob_size = size;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000152 _Py_NewReference((PyObject *)op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 return op;
154}
155
Guido van Rossum90933611991-06-07 16:10:43 +0000156int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157PyObject_Print(op, fp, flags)
158 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 FILE *fp;
160 int flags;
161{
Guido van Rossum278ef591991-07-27 21:40:24 +0000162 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000164 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000165#ifdef USE_STACKCHECK
166 if (PyOS_CheckStack()) {
167 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
168 return -1;
169 }
170#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000171 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000172 if (op == NULL) {
173 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 }
Guido van Rossum90933611991-06-07 16:10:43 +0000175 else {
176 if (op->ob_refcnt <= 0)
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000177 fprintf(fp, "<refcnt %u at %lx>",
178 op->ob_refcnt, (long)op);
179 else if (op->ob_type->tp_print == NULL) {
180 if (op->ob_type->tp_repr == NULL) {
181 fprintf(fp, "<%s object at %lx>",
182 op->ob_type->tp_name, (long)op);
183 }
184 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 PyObject *s;
186 if (flags & Py_PRINT_RAW)
187 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000188 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000190 if (s == NULL)
191 ret = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 else if (!PyString_Check(s)) {
193 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000194 "repr not string");
195 ret = -1;
196 }
197 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000198 ret = PyObject_Print(s, fp,
199 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000200 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000202 }
203 }
Guido van Rossum90933611991-06-07 16:10:43 +0000204 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000205 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000206 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000207 if (ret == 0) {
208 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000210 clearerr(fp);
211 ret = -1;
212 }
213 }
214 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215}
216
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217PyObject *
218PyObject_Repr(v)
219 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000222 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000223#ifdef USE_STACKCHECK
224 if (PyOS_CheckStack()) {
225 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
226 return NULL;
227 }
228#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000229 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000231 else if (v->ob_type->tp_repr == NULL) {
232 char buf[120];
233 sprintf(buf, "<%.80s object at %lx>",
234 v->ob_type->tp_name, (long)v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236 }
Guido van Rossum90933611991-06-07 16:10:43 +0000237 else
238 return (*v->ob_type->tp_repr)(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239}
240
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241PyObject *
242PyObject_Str(v)
243 PyObject *v;
Guido van Rossumc6004111993-11-05 10:22:19 +0000244{
245 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 return PyString_FromString("<NULL>");
247 else if (PyString_Check(v)) {
248 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000249 return v;
250 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000251 else if (v->ob_type->tp_str != NULL)
252 return (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000253 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254 PyObject *func;
255 PyObject *res;
256 if (!PyInstance_Check(v) ||
257 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
258 PyErr_Clear();
259 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000260 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 res = PyEval_CallObject(func, (PyObject *)NULL);
262 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000263 return res;
264 }
265}
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267static PyObject *
Guido van Rossum20566841995-01-12 11:26:10 +0000268do_cmp(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 PyObject *v, *w;
Guido van Rossum20566841995-01-12 11:26:10 +0000270{
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000271 long c;
Guido van Rossum20566841995-01-12 11:26:10 +0000272 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
273 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274 This is intentional -- it makes no sense to define cmp(x,y)
275 different than -cmp(y,x). */
276 if (PyInstance_Check(v) || PyInstance_Check(w))
277 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000278 c = PyObject_Compare(v, w);
279 if (c && PyErr_Occurred())
280 return NULL;
281 return PyInt_FromLong(c);
Guido van Rossum20566841995-01-12 11:26:10 +0000282}
283
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285PyObject_Compare(v, w)
286 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000288 PyTypeObject *vtp, *wtp;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000289 if (v == NULL || w == NULL) {
290 PyErr_BadInternalCall();
291 return -1;
292 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 if (v == w)
294 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 if (PyInstance_Check(v) || PyInstance_Check(w)) {
296 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000297 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 if (!PyInstance_Check(v))
299 return -PyObject_Compare(w, v);
Guido van Rossum20566841995-01-12 11:26:10 +0000300 res = do_cmp(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000301 if (res == NULL)
302 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303 if (!PyInt_Check(res)) {
304 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000305 PyErr_SetString(PyExc_TypeError,
306 "comparison did not return an int");
307 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000308 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 c = PyInt_AsLong(res);
310 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000311 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
312 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000313 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
314 char *vname = vtp->tp_name;
315 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000316 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000317 int err;
318 err = PyNumber_CoerceEx(&v, &w);
319 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000320 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000321 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000322 int cmp;
323 vtp = v->ob_type;
324 if (vtp->tp_compare == NULL)
325 cmp = (v < w) ? -1 : 1;
326 else
327 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 Py_DECREF(v);
329 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000330 return cmp;
331 }
332 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000333 else if (vtp->tp_as_number != NULL)
334 vname = "";
335 else if (wtp->tp_as_number != NULL)
336 wname = "";
337 /* Numerical types compare smaller than all other types */
338 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000339 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000340 if (vtp->tp_compare == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 return (v < w) ? -1 : 1;
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000342 return (*vtp->tp_compare)(v, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
Guido van Rossum9bfef441993-03-29 10:43:31 +0000345long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346PyObject_Hash(v)
347 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000348{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000350 if (tp->tp_hash != NULL)
351 return (*tp->tp_hash)(v);
352 if (tp->tp_compare == NULL)
353 return (long) v; /* Use address as hash value */
354 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000356 return -1;
357}
358
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359PyObject *
360PyObject_GetAttrString(v, name)
361 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000362 char *name;
363{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000364 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000366 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000367 if (w == NULL)
368 return NULL;
369 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000371 return res;
372 }
373
Guido van Rossum3f5da241990-12-20 15:06:42 +0000374 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000375 PyErr_Format(PyExc_AttributeError,
376 "'%.50s' object has no attribute '%.400s'",
377 v->ob_type->tp_name,
378 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379 return NULL;
380 }
381 else {
382 return (*v->ob_type->tp_getattr)(v, name);
383 }
384}
385
386int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387PyObject_HasAttrString(v, name)
388 PyObject *v;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000389 char *name;
390{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000392 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000394 return 1;
395 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000397 return 0;
398}
399
400int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401PyObject_SetAttrString(v, name, w)
402 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000403 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 PyObject *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000406 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000408 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000409 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000410 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000411 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000412 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000414 return res;
415 }
416
Guido van Rossum3f5da241990-12-20 15:06:42 +0000417 if (v->ob_type->tp_setattr == NULL) {
418 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000420 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000421 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000423 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000424 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000425 }
426 else {
427 return (*v->ob_type->tp_setattr)(v, name, w);
428 }
429}
430
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000431PyObject *
432PyObject_GetAttr(v, name)
433 PyObject *v;
434 PyObject *name;
435{
436 if (v->ob_type->tp_getattro != NULL)
437 return (*v->ob_type->tp_getattro)(v, name);
438 else
439 return PyObject_GetAttrString(v, PyString_AsString(name));
440}
441
442int
443PyObject_HasAttr(v, name)
444 PyObject *v;
445 PyObject *name;
446{
447 PyObject *res = PyObject_GetAttr(v, name);
448 if (res != NULL) {
449 Py_DECREF(res);
450 return 1;
451 }
452 PyErr_Clear();
453 return 0;
454}
455
456int
457PyObject_SetAttr(v, name, value)
458 PyObject *v;
459 PyObject *name;
460 PyObject *value;
461{
462 int err;
463 Py_INCREF(name);
464 PyString_InternInPlace(&name);
465 if (v->ob_type->tp_setattro != NULL)
466 err = (*v->ob_type->tp_setattro)(v, name, value);
467 else
468 err = PyObject_SetAttrString(
469 v, PyString_AsString(name), value);
470 Py_DECREF(name);
471 return err;
472}
473
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000474/* Test a value used as condition, e.g., in a for or if statement.
475 Return -1 if an error occurred */
476
477int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478PyObject_IsTrue(v)
479 PyObject *v;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000480{
481 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000483 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000484 else if (v->ob_type->tp_as_number != NULL &&
485 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000486 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000487 else if (v->ob_type->tp_as_mapping != NULL &&
488 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000489 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000490 else if (v->ob_type->tp_as_sequence != NULL &&
491 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000492 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
493 else
494 res = 1;
495 if (res > 0)
496 res = 1;
497 return res;
498}
499
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000500/* equivalent of 'not v'
501 Return -1 if an error occurred */
502
503int
504PyObject_Not(v)
505 PyObject *v;
506{
507 int res;
508 res = PyObject_IsTrue(v);
509 if (res < 0)
510 return res;
511 return res == 0;
512}
513
Guido van Rossum5524a591995-01-10 15:26:20 +0000514/* Coerce two numeric types to the "larger" one.
515 Increment the reference count on each argument.
516 Return -1 and raise an exception if no coercion is possible
517 (and then no reference count is incremented).
518*/
519
520int
Guido van Rossum242c6421997-11-19 16:03:17 +0000521PyNumber_CoerceEx(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyObject **pv, **pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000523{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 register PyObject *v = *pv;
525 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000526 int res;
527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
529 Py_INCREF(v);
530 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000531 return 0;
532 }
533 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
534 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
535 if (res <= 0)
536 return res;
537 }
538 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
539 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
540 if (res <= 0)
541 return res;
542 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000543 return 1;
544}
545
546int
547PyNumber_Coerce(pv, pw)
548 PyObject **pv, **pw;
549{
550 int err = PyNumber_CoerceEx(pv, pw);
551 if (err <= 0)
552 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000554 return -1;
555}
556
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000558/* Test whether an object can be called */
559
560int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561PyCallable_Check(x)
562 PyObject *x;
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000563{
564 if (x == NULL)
565 return 0;
566 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 PyFunction_Check(x) ||
568 PyMethod_Check(x) ||
569 PyCFunction_Check(x) ||
570 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000571 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 if (PyInstance_Check(x)) {
573 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000574 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000576 return 0;
577 }
578 /* Could test recursively but don't, for fear of endless
579 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000581 return 1;
582 }
583 return 0;
584}
585
586
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000587/*
588NoObject is usable as a non-NULL undefined value, used by the macro None.
589There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000590so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000591*/
592
Guido van Rossum0c182a11992-03-27 17:26:13 +0000593/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000595none_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000597{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000599}
600
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601static PyTypeObject PyNothing_Type = {
602 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000603 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000604 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605 0,
606 0,
607 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000608 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000609 0, /*tp_getattr*/
610 0, /*tp_setattr*/
611 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000612 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000613 0, /*tp_as_number*/
614 0, /*tp_as_sequence*/
615 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000616 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000617};
618
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619PyObject _Py_NoneStruct = {
620 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000621};
622
623
Guido van Rossum84a90321996-05-22 16:34:47 +0000624#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000628void
Guido van Rossume09fb551997-08-05 02:04:34 +0000629_Py_ResetReferences()
630{
631 refchain._ob_prev = refchain._ob_next = &refchain;
632 _Py_RefTotal = 0;
633}
634
635void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636_Py_NewReference(op)
637 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000638{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640 op->ob_refcnt = 1;
641 op->_ob_next = refchain._ob_next;
642 op->_ob_prev = &refchain;
643 refchain._ob_next->_ob_prev = op;
644 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000645#ifdef COUNT_ALLOCS
646 inc_count(op->ob_type);
647#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648}
649
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000650void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651_Py_ForgetReference(op)
652 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000654#ifdef SLOW_UNREF_CHECK
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000656#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000657 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000659 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000660 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000662#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000663 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
664 if (p == op)
665 break;
666 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000667 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000669#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000670 op->_ob_next->_ob_prev = op->_ob_prev;
671 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000672 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000673#ifdef COUNT_ALLOCS
674 op->ob_type->tp_free++;
675#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000676}
677
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000678void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679_Py_Dealloc(op)
680 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000681{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000682 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 _Py_ForgetReference(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000684 op->ob_type = NULL;
Guido van Rossum9776adf1994-09-07 14:36:45 +0000685 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686}
687
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000688void
Guido van Rossumded690f1996-05-24 20:48:31 +0000689_Py_PrintReferences(fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690 FILE *fp;
691{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000693 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
695 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 if (PyObject_Print(op, fp, 0) != 0)
697 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698 putc('\n', fp);
699 }
700}
701
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000702PyObject *
Guido van Rossumded690f1996-05-24 20:48:31 +0000703_Py_GetObjects(self, args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000704 PyObject *self;
705 PyObject *args;
706{
707 int i, n;
708 PyObject *t = NULL;
709 PyObject *res, *op;
710
711 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
712 return NULL;
713 op = refchain._ob_next;
714 res = PyList_New(0);
715 if (res == NULL)
716 return NULL;
717 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
718 while (op == self || op == args || op == res || op == t ||
719 t != NULL && op->ob_type != (PyTypeObject *) t) {
720 op = op->_ob_next;
721 if (op == &refchain)
722 return res;
723 }
724 if (PyList_Append(res, op) < 0) {
725 Py_DECREF(res);
726 return NULL;
727 }
728 op = op->_ob_next;
729 }
730 return res;
731}
732
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000734
735
736/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000737PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000738
739
740/* Hack to force loading of abstract.o */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;
Guido van Rossume09fb551997-08-05 02:04:34 +0000742
743
744/* Malloc wrappers (see mymalloc.h) */
745
746/* The Py_{Malloc,Realloc} wrappers call PyErr_NoMemory() on failure */
747
748ANY *
749Py_Malloc(nbytes)
750 size_t nbytes;
751{
752 ANY *p;
753#if _PyMem_EXTRA > 0
754 if (nbytes == 0)
755 nbytes = _PyMem_EXTRA;
756#endif
757 p = malloc(nbytes);
758 if (p != NULL)
759 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000760 else {
761 PyErr_NoMemory();
762 return NULL;
763 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000764}
765
766ANY *
767Py_Realloc(p, nbytes)
768 ANY *p;
769 size_t nbytes;
770{
771#if _PyMem_EXTRA > 0
772 if (nbytes == 0)
773 nbytes = _PyMem_EXTRA;
774#endif
775 p = realloc(p, nbytes);
776 if (p != NULL)
777 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000778 else {
779 PyErr_NoMemory();
780 return NULL;
781 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000782}
783
784void
785Py_Free(p)
786 ANY *p;
787{
788 free(p);
789}
790
791/* The PyMem_{Malloc,Realloc} wrappers don't call anything on failure */
792
793ANY *
794PyMem_Malloc(nbytes)
795 size_t nbytes;
796{
797#if _PyMem_EXTRA > 0
798 if (nbytes == 0)
799 nbytes = _PyMem_EXTRA;
800#endif
801 return malloc(nbytes);
802}
803
804ANY *
805PyMem_Realloc(p, nbytes)
806 ANY *p;
807 size_t nbytes;
808{
809#if _PyMem_EXTRA > 0
810 if (nbytes == 0)
811 nbytes = _PyMem_EXTRA;
812#endif
813 return realloc(p, nbytes);
814}
815
816void
817PyMem_Free(p)
818 ANY *p;
819{
820 free(p);
821}
Guido van Rossum86610361998-04-10 22:32:46 +0000822
823
824/* These methods are used to control infinite recursion in repr, str, print,
825 etc. Container objects that may recursively contain themselves,
826 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
827 Py_ReprLeave() to avoid infinite recursion.
828
829 Py_ReprEnter() returns 0 the first time it is called for a particular
830 object and 1 every time thereafter. It returns -1 if an exception
831 occurred. Py_ReprLeave() has no return value.
832
833 See dictobject.c and listobject.c for examples of use.
834*/
835
836#define KEY "Py_Repr"
837
838int
839Py_ReprEnter(obj)
840 PyObject *obj;
841{
842 PyObject *dict;
843 PyObject *list;
844 int i;
845
846 dict = PyThreadState_GetDict();
847 if (dict == NULL)
848 return -1;
849 list = PyDict_GetItemString(dict, KEY);
850 if (list == NULL) {
851 list = PyList_New(0);
852 if (list == NULL)
853 return -1;
854 if (PyDict_SetItemString(dict, KEY, list) < 0)
855 return -1;
856 Py_DECREF(list);
857 }
858 i = PyList_GET_SIZE(list);
859 while (--i >= 0) {
860 if (PyList_GET_ITEM(list, i) == obj)
861 return 1;
862 }
863 PyList_Append(list, obj);
864 return 0;
865}
866
867void
868Py_ReprLeave(obj)
869 PyObject *obj;
870{
871 PyObject *dict;
872 PyObject *list;
873 int i;
874
875 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +0000876 if (dict == NULL)
877 return;
Guido van Rossum86610361998-04-10 22:32:46 +0000878 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +0000879 if (list == NULL || !PyList_Check(list))
880 return;
Guido van Rossum86610361998-04-10 22:32:46 +0000881 i = PyList_GET_SIZE(list);
882 /* Count backwards because we always expect obj to be list[-1] */
883 while (--i >= 0) {
884 if (PyList_GET_ITEM(list, i) == obj) {
885 PyList_SetSlice(list, i, i + 1, NULL);
886 break;
887 }
888 }
889}