blob: d6b7607dd8812a852bd5b03313d09abf1264b240 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000012
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
Jack Jansen28fc8802000-07-11 21:47:20 +000015#ifdef macintosh
16#include "macglue.h"
17#endif
18
Guido van Rossume92e6102000-04-24 15:40:53 +000019/* just for trashcan: */
20#include "compile.h"
21#include "frameobject.h"
22#include "traceback.h"
23
Guido van Rossum6f9e4331995-03-29 16:57:48 +000024#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000025DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000026#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027
Guido van Rossum3f5da241990-12-20 15:06:42 +000028/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
29 These are used by the individual routines for object creation.
30 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000032#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000034extern int tuple_zero_allocs, fast_tuple_allocs;
35extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000036extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000037void
Fred Drake100814d2000-07-09 15:48:49 +000038dump_counts(void)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000039{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000041
42 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000043 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
44 tp->tp_name, tp->tp_alloc, tp->tp_free,
45 tp->tp_maxalloc);
46 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
47 fast_tuple_allocs, tuple_zero_allocs);
48 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
49 quick_int_allocs, quick_neg_int_allocs);
50 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
51 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000052}
53
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000054PyObject *
Fred Drake100814d2000-07-09 15:48:49 +000055get_counts(void)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000056{
57 PyTypeObject *tp;
58 PyObject *result;
59 PyObject *v;
60
61 result = PyList_New(0);
62 if (result == NULL)
63 return NULL;
64 for (tp = type_list; tp; tp = tp->tp_next) {
65 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
66 tp->tp_free, tp->tp_maxalloc);
67 if (v == NULL) {
68 Py_DECREF(result);
69 return NULL;
70 }
71 if (PyList_Append(result, v) < 0) {
72 Py_DECREF(v);
73 Py_DECREF(result);
74 return NULL;
75 }
76 Py_DECREF(v);
77 }
78 return result;
79}
80
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000081void
Fred Drake100814d2000-07-09 15:48:49 +000082inc_count(PyTypeObject *tp)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000083{
84 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000085 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000086 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000088 tp->tp_next = type_list;
89 type_list = tp;
90 }
91 tp->tp_alloc++;
92 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
93 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
94}
95#endif
96
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097PyObject *
Fred Drake100814d2000-07-09 15:48:49 +000098PyObject_Init(PyObject *op, PyTypeObject *tp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000100 if (op == NULL) {
101 PyErr_SetString(PyExc_SystemError,
102 "NULL object passed to PyObject_Init");
103 return op;
104 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000105#ifdef WITH_CYCLE_GC
106 if (PyType_IS_GC(tp))
107 op = (PyObject *) PyObject_FROM_GC(op);
108#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000109 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112 return op;
113}
114
Guido van Rossumb18618d2000-05-03 23:44:39 +0000115PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000116PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, int size)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000117{
118 if (op == NULL) {
119 PyErr_SetString(PyExc_SystemError,
120 "NULL object passed to PyObject_InitVar");
121 return op;
122 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000123#ifdef WITH_CYCLE_GC
124 if (PyType_IS_GC(tp))
125 op = (PyVarObject *) PyObject_FROM_GC(op);
126#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000127 /* Any changes should be reflected in PyObject_INIT_VAR */
128 op->ob_size = size;
129 op->ob_type = tp;
130 _Py_NewReference((PyObject *)op);
131 return op;
132}
133
134PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000135_PyObject_New(PyTypeObject *tp)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000136{
137 PyObject *op;
138 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
139 if (op == NULL)
140 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000141#ifdef WITH_CYCLE_GC
142 if (PyType_IS_GC(tp))
143 op = (PyObject *) PyObject_FROM_GC(op);
144#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000145 return PyObject_INIT(op, tp);
146}
147
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000148PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000149_PyObject_NewVar(PyTypeObject *tp, int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000151 PyVarObject *op;
152 op = (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE(tp, size));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000154 return (PyVarObject *)PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000155#ifdef WITH_CYCLE_GC
156 if (PyType_IS_GC(tp))
157 op = (PyVarObject *) PyObject_FROM_GC(op);
158#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000159 return PyObject_INIT_VAR(op, tp, size);
160}
161
162void
Fred Drake100814d2000-07-09 15:48:49 +0000163_PyObject_Del(PyObject *op)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000164{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000165#ifdef WITH_CYCLE_GC
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000166 if (op && PyType_IS_GC(op->ob_type)) {
167 op = (PyObject *) PyObject_AS_GC(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000168 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000169#endif
170 PyObject_FREE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171}
172
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000173#ifndef WITH_CYCLE_GC
174/* extension modules might need these */
175void _PyGC_Insert(PyObject *op) { }
176void _PyGC_Remove(PyObject *op) { }
177#endif
178
Guido van Rossum90933611991-06-07 16:10:43 +0000179int
Fred Drake100814d2000-07-09 15:48:49 +0000180PyObject_Print(PyObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
Guido van Rossum278ef591991-07-27 21:40:24 +0000182 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000184 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000185#ifdef USE_STACKCHECK
186 if (PyOS_CheckStack()) {
187 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
188 return -1;
189 }
190#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000191 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000192 if (op == NULL) {
193 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 }
Guido van Rossum90933611991-06-07 16:10:43 +0000195 else {
196 if (op->ob_refcnt <= 0)
Fred Drakea44d3532000-06-30 15:01:00 +0000197 fprintf(fp, "<refcnt %u at %p>",
198 op->ob_refcnt, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000199 else if (op->ob_type->tp_print == NULL) {
200 if (op->ob_type->tp_repr == NULL) {
Fred Drakea44d3532000-06-30 15:01:00 +0000201 fprintf(fp, "<%s object at %p>",
202 op->ob_type->tp_name, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000203 }
204 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 PyObject *s;
206 if (flags & Py_PRINT_RAW)
207 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000208 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000210 if (s == NULL)
211 ret = -1;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000212 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000213 ret = PyObject_Print(s, fp,
214 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000215 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000217 }
218 }
Guido van Rossum90933611991-06-07 16:10:43 +0000219 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000220 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000221 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000222 if (ret == 0) {
223 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000225 clearerr(fp);
226 ret = -1;
227 }
228 }
229 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230}
231
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000233PyObject_Repr(PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000236 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000237#ifdef USE_STACKCHECK
238 if (PyOS_CheckStack()) {
239 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
240 return NULL;
241 }
242#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000243 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000245 else if (v->ob_type->tp_repr == NULL) {
246 char buf[120];
Fred Drakea44d3532000-06-30 15:01:00 +0000247 sprintf(buf, "<%.80s object at %p>",
248 v->ob_type->tp_name, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000251 else {
252 PyObject *res;
253 res = (*v->ob_type->tp_repr)(v);
254 if (res == NULL)
255 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000256 if (PyUnicode_Check(res)) {
257 PyObject* str;
Fredrik Lundh2a1e0602000-07-08 17:43:32 +0000258 str = PyUnicode_AsUnicodeEscapeString(res);
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000259 Py_DECREF(res);
260 if (str)
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000261 res = str;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000262 else
263 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000264 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 if (!PyString_Check(res)) {
266 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000267 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000268 res->ob_type->tp_name);
269 Py_DECREF(res);
270 return NULL;
271 }
272 return res;
273 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274}
275
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000277PyObject_Str(PyObject *v)
Guido van Rossumc6004111993-11-05 10:22:19 +0000278{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279 PyObject *res;
280
Guido van Rossumc6004111993-11-05 10:22:19 +0000281 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 return PyString_FromString("<NULL>");
283 else if (PyString_Check(v)) {
284 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000285 return v;
286 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000287 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000289 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 if (!PyInstance_Check(v) ||
292 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
293 PyErr_Clear();
294 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000295 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296 res = PyEval_CallObject(func, (PyObject *)NULL);
297 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000298 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000299 if (res == NULL)
300 return NULL;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000301 if (PyUnicode_Check(res)) {
302 PyObject* str;
303 str = PyUnicode_AsEncodedString(res, NULL, NULL);
304 Py_DECREF(res);
305 if (str)
306 res = str;
307 else
308 return NULL;
309 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000310 if (!PyString_Check(res)) {
311 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000312 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 res->ob_type->tp_name);
314 Py_DECREF(res);
315 return NULL;
316 }
317 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000318}
319
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000321do_cmp(PyObject *v, PyObject *w)
Guido van Rossum20566841995-01-12 11:26:10 +0000322{
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000323 long c;
Guido van Rossum20566841995-01-12 11:26:10 +0000324 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
325 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 This is intentional -- it makes no sense to define cmp(x,y)
327 different than -cmp(y,x). */
328 if (PyInstance_Check(v) || PyInstance_Check(w))
329 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000330 c = PyObject_Compare(v, w);
331 if (c && PyErr_Occurred())
332 return NULL;
333 return PyInt_FromLong(c);
Guido van Rossum20566841995-01-12 11:26:10 +0000334}
335
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000336PyObject *_PyCompareState_Key;
337
Thomas Wouters7e474022000-07-16 12:04:32 +0000338/* _PyCompareState_nesting is incremented before calling compare (for
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000339 some types) and decremented on exit. If the count exceeds the
340 nesting limit, enable code to detect circular data structures.
341*/
342#define NESTING_LIMIT 500
343int _PyCompareState_nesting = 0;
344
345static PyObject*
Fred Drake100814d2000-07-09 15:48:49 +0000346get_inprogress_dict(void)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000347{
348 PyObject *tstate_dict, *inprogress;
349
350 tstate_dict = PyThreadState_GetDict();
351 if (tstate_dict == NULL) {
352 PyErr_BadInternalCall();
353 return NULL;
354 }
355 inprogress = PyDict_GetItem(tstate_dict, _PyCompareState_Key);
356 if (inprogress == NULL) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000357 inprogress = PyDict_New();
358 if (inprogress == NULL)
359 return NULL;
360 if (PyDict_SetItem(tstate_dict, _PyCompareState_Key,
361 inprogress) == -1) {
362 Py_DECREF(inprogress);
363 return NULL;
364 }
Jeremy Hyltona251ea02000-06-09 16:20:39 +0000365 Py_DECREF(inprogress);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000366 }
367 return inprogress;
368}
369
370static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000371make_pair(PyObject *v, PyObject *w)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000372{
373 PyObject *pair;
374
375 pair = PyTuple_New(2);
376 if (pair == NULL) {
377 return NULL;
378 }
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000379 if (v <= w) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000380 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)v));
381 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)w));
382 } else {
383 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)w));
384 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)v));
385 }
386 return pair;
387}
388
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389int
Fred Drake100814d2000-07-09 15:48:49 +0000390PyObject_Compare(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000392 PyTypeObject *vtp, *wtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000393 int result;
394
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000395 if (v == NULL || w == NULL) {
396 PyErr_BadInternalCall();
397 return -1;
398 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399 if (v == w)
400 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 if (PyInstance_Check(v) || PyInstance_Check(w)) {
402 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000403 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 if (!PyInstance_Check(v))
405 return -PyObject_Compare(w, v);
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000406 _PyCompareState_nesting++;
407 if (_PyCompareState_nesting > NESTING_LIMIT) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000408 PyObject *inprogress, *pair;
409
410 inprogress = get_inprogress_dict();
411 if (inprogress == NULL) {
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000412 _PyCompareState_nesting--;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000413 return -1;
414 }
415 pair = make_pair(v, w);
416 if (PyDict_GetItem(inprogress, pair)) {
417 /* already comparing these objects. assume
418 they're equal until shown otherwise */
419 Py_DECREF(pair);
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000420 _PyCompareState_nesting--;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000421 return 0;
422 }
423 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000424 _PyCompareState_nesting--;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000425 return -1;
426 }
427 res = do_cmp(v, w);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000428 /* XXX DelItem shouldn't fail */
429 PyDict_DelItem(inprogress, pair);
430 Py_DECREF(pair);
431 } else {
432 res = do_cmp(v, w);
433 }
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000434 _PyCompareState_nesting--;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000435 if (res == NULL)
436 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 if (!PyInt_Check(res)) {
438 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000439 PyErr_SetString(PyExc_TypeError,
440 "comparison did not return an int");
441 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000442 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 c = PyInt_AsLong(res);
444 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000445 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
446 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000447 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
448 char *vname = vtp->tp_name;
449 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000450 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000451 int err;
452 err = PyNumber_CoerceEx(&v, &w);
453 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000454 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000455 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000456 int cmp;
457 vtp = v->ob_type;
458 if (vtp->tp_compare == NULL)
459 cmp = (v < w) ? -1 : 1;
460 else
461 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 Py_DECREF(v);
463 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000464 return cmp;
465 }
466 }
Guido van Rossumb244f692000-04-10 13:42:33 +0000467 else if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
468 int result = PyUnicode_Compare(v, w);
469 if (result == -1 && PyErr_Occurred() &&
470 PyErr_ExceptionMatches(PyExc_TypeError))
471 /* TypeErrors are ignored: if Unicode coercion
472 fails due to one of the arguments not
473 having the right type, we continue as
474 defined by the coercion protocol (see
475 above). Luckily, decoding errors are
476 reported as ValueErrors and are not masked
477 by this technique. */
478 PyErr_Clear();
479 else
480 return result;
481 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000482 else if (vtp->tp_as_number != NULL)
483 vname = "";
484 else if (wtp->tp_as_number != NULL)
485 wname = "";
486 /* Numerical types compare smaller than all other types */
487 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000488 }
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000489 if (vtp->tp_compare == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 return (v < w) ? -1 : 1;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000491 }
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000492 _PyCompareState_nesting++;
493 if (_PyCompareState_nesting > NESTING_LIMIT
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000494 && (vtp->tp_as_mapping
495 || (vtp->tp_as_sequence && !PyString_Check(v)))) {
496 PyObject *inprogress, *pair;
497
498 inprogress = get_inprogress_dict();
499 if (inprogress == NULL) {
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000500 _PyCompareState_nesting--;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000501 return -1;
502 }
503 pair = make_pair(v, w);
504 if (PyDict_GetItem(inprogress, pair)) {
505 /* already comparing these objects. assume
506 they're equal until shown otherwise */
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000507 Py_DECREF(pair);
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000508 _PyCompareState_nesting--;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000509 return 0;
510 }
511 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000512 _PyCompareState_nesting--;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000513 return -1;
514 }
515 result = (*vtp->tp_compare)(v, w);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000516 PyDict_DelItem(inprogress, pair); /* XXX shouldn't fail */
517 Py_DECREF(pair);
518 } else {
519 result = (*vtp->tp_compare)(v, w);
520 }
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000521 _PyCompareState_nesting--;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000522 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000523}
524
Fred Drake13634cf2000-06-29 19:17:04 +0000525
526/* Set of hash utility functions to help maintaining the invariant that
527 iff a==b then hash(a)==hash(b)
528
529 All the utility functions (_Py_Hash*()) return "-1" to signify an error.
530*/
531
532long
Fred Drake100814d2000-07-09 15:48:49 +0000533_Py_HashDouble(double v)
Fred Drake13634cf2000-06-29 19:17:04 +0000534{
Tim Peters39dce292000-08-15 03:34:48 +0000535 double intpart, fractpart;
536 int expo;
537 long hipart;
538 long x; /* the final hash value */
539 /* This is designed so that Python numbers of different types
540 * that compare equal hash to the same value; otherwise comparisons
541 * of mapping keys will turn out weird.
542 */
543
544#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
545{
546 extended e;
547 fractpart = modf(v, &e);
548 intpart = e;
549}
550#else
551 fractpart = modf(v, &intpart);
552#endif
553 if (fractpart == 0.0) {
554 /* This must return the same hash as an equal int or long. */
555 if (intpart > LONG_MAX || -intpart > LONG_MAX) {
556 /* Convert to long and use its hash. */
557 PyObject *plong; /* converted to Python long */
558 if (Py_IS_INFINITY(intpart))
559 /* can't convert to long int -- arbitrary */
560 v = v < 0 ? -271828.0 : 314159.0;
561 plong = PyLong_FromDouble(v);
562 if (plong == NULL)
563 return -1;
564 x = PyObject_Hash(plong);
565 Py_DECREF(plong);
566 return x;
567 }
568 /* Fits in a C long == a Python int, so is its own hash. */
569 x = (long)intpart;
570 if (x == -1)
571 x = -2;
572 return x;
573 }
574 /* The fractional part is non-zero, so we don't have to worry about
575 * making this match the hash of some other type.
576 * Use frexp to get at the bits in the double.
Fred Drake13634cf2000-06-29 19:17:04 +0000577 * Since the VAX D double format has 56 mantissa bits, which is the
578 * most of any double format in use, each of these parts may have as
579 * many as (but no more than) 56 significant bits.
Tim Peters39dce292000-08-15 03:34:48 +0000580 * So, assuming sizeof(long) >= 4, each part can be broken into two
581 * longs; frexp and multiplication are used to do that.
582 * Also, since the Cray double format has 15 exponent bits, which is
583 * the most of any double format in use, shifting the exponent field
584 * left by 15 won't overflow a long (again assuming sizeof(long) >= 4).
Fred Drake13634cf2000-06-29 19:17:04 +0000585 */
Tim Peters39dce292000-08-15 03:34:48 +0000586 v = frexp(v, &expo);
587 v *= 2147483648.0; /* 2**31 */
588 hipart = (long)v; /* take the top 32 bits */
589 v = (v - (double)hipart) * 2147483648.0; /* get the next 32 bits */
590 x = hipart + (long)v + (expo << 15);
591 if (x == -1)
592 x = -2;
593 return x;
Fred Drake13634cf2000-06-29 19:17:04 +0000594}
595
596long
Fred Drake100814d2000-07-09 15:48:49 +0000597_Py_HashPointer(void *p)
Fred Drake13634cf2000-06-29 19:17:04 +0000598{
599#if SIZEOF_LONG >= SIZEOF_VOID_P
600 return (long)p;
601#else
602 /* convert to a Python long and hash that */
603 PyObject* longobj;
604 long x;
605
606 if ((longobj = PyLong_FromVoidPtr(p)) == NULL) {
607 x = -1;
608 goto finally;
609 }
610 x = PyObject_Hash(longobj);
611
612finally:
613 Py_XDECREF(longobj);
614 return x;
615#endif
616}
617
618
Guido van Rossum9bfef441993-03-29 10:43:31 +0000619long
Fred Drake100814d2000-07-09 15:48:49 +0000620PyObject_Hash(PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000621{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000623 if (tp->tp_hash != NULL)
624 return (*tp->tp_hash)(v);
Fred Drake13634cf2000-06-29 19:17:04 +0000625 if (tp->tp_compare == NULL) {
626 return _Py_HashPointer(v); /* Use address as hash value */
627 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000628 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630 return -1;
631}
632
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000634PyObject_GetAttrString(PyObject *v, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000635{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000636 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000638 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000639 if (w == NULL)
640 return NULL;
641 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000643 return res;
644 }
645
Guido van Rossum3f5da241990-12-20 15:06:42 +0000646 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000647 PyErr_Format(PyExc_AttributeError,
648 "'%.50s' object has no attribute '%.400s'",
649 v->ob_type->tp_name,
650 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000651 return NULL;
652 }
653 else {
654 return (*v->ob_type->tp_getattr)(v, name);
655 }
656}
657
658int
Fred Drake100814d2000-07-09 15:48:49 +0000659PyObject_HasAttrString(PyObject *v, char *name)
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000660{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000662 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000664 return 1;
665 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000667 return 0;
668}
669
670int
Fred Drake100814d2000-07-09 15:48:49 +0000671PyObject_SetAttrString(PyObject *v, char *name, PyObject *w)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000672{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000673 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000675 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000676 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000677 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000678 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000679 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000681 return res;
682 }
683
Guido van Rossum3f5da241990-12-20 15:06:42 +0000684 if (v->ob_type->tp_setattr == NULL) {
685 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000687 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000690 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000691 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000692 }
693 else {
694 return (*v->ob_type->tp_setattr)(v, name, w);
695 }
696}
697
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000698PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000699PyObject_GetAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000700{
701 if (v->ob_type->tp_getattro != NULL)
702 return (*v->ob_type->tp_getattro)(v, name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000703
704 if (!PyString_Check(name)) {
705 PyErr_SetString(PyExc_TypeError,
706 "attribute name must be string");
707 return NULL;
708 }
709 return PyObject_GetAttrString(v, PyString_AS_STRING(name));
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000710}
711
712int
Fred Drake100814d2000-07-09 15:48:49 +0000713PyObject_HasAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000714{
715 PyObject *res = PyObject_GetAttr(v, name);
716 if (res != NULL) {
717 Py_DECREF(res);
718 return 1;
719 }
720 PyErr_Clear();
721 return 0;
722}
723
724int
Fred Drake100814d2000-07-09 15:48:49 +0000725PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000726{
727 int err;
728 Py_INCREF(name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000729 if (PyString_Check(name))
730 PyString_InternInPlace(&name);
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000731 if (v->ob_type->tp_setattro != NULL)
732 err = (*v->ob_type->tp_setattro)(v, name, value);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000733 else if (PyString_Check(name)) {
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000734 err = PyObject_SetAttrString(
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000735 v, PyString_AS_STRING(name), value);
736 }
737 else {
738 PyErr_SetString(PyExc_TypeError,
739 "attribute name must be string");
740 err = -1;
741 }
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000742 Py_DECREF(name);
743 return err;
744}
745
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000746/* Test a value used as condition, e.g., in a for or if statement.
747 Return -1 if an error occurred */
748
749int
Fred Drake100814d2000-07-09 15:48:49 +0000750PyObject_IsTrue(PyObject *v)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000751{
752 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000754 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000755 else if (v->ob_type->tp_as_number != NULL &&
756 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000757 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000758 else if (v->ob_type->tp_as_mapping != NULL &&
759 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000760 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000761 else if (v->ob_type->tp_as_sequence != NULL &&
762 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000763 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
764 else
765 res = 1;
766 if (res > 0)
767 res = 1;
768 return res;
769}
770
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000771/* equivalent of 'not v'
772 Return -1 if an error occurred */
773
774int
Fred Drake100814d2000-07-09 15:48:49 +0000775PyObject_Not(PyObject *v)
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000776{
777 int res;
778 res = PyObject_IsTrue(v);
779 if (res < 0)
780 return res;
781 return res == 0;
782}
783
Guido van Rossum5524a591995-01-10 15:26:20 +0000784/* Coerce two numeric types to the "larger" one.
785 Increment the reference count on each argument.
786 Return -1 and raise an exception if no coercion is possible
787 (and then no reference count is incremented).
788*/
789
790int
Fred Drake100814d2000-07-09 15:48:49 +0000791PyNumber_CoerceEx(PyObject **pv, PyObject **pw)
Guido van Rossum5524a591995-01-10 15:26:20 +0000792{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000793 register PyObject *v = *pv;
794 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000795 int res;
796
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
798 Py_INCREF(v);
799 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000800 return 0;
801 }
802 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
803 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
804 if (res <= 0)
805 return res;
806 }
807 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
808 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
809 if (res <= 0)
810 return res;
811 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000812 return 1;
813}
814
815int
Fred Drake100814d2000-07-09 15:48:49 +0000816PyNumber_Coerce(PyObject **pv, PyObject **pw)
Guido van Rossum242c6421997-11-19 16:03:17 +0000817{
818 int err = PyNumber_CoerceEx(pv, pw);
819 if (err <= 0)
820 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000822 return -1;
823}
824
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000825
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000826/* Test whether an object can be called */
827
828int
Fred Drake100814d2000-07-09 15:48:49 +0000829PyCallable_Check(PyObject *x)
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000830{
831 if (x == NULL)
832 return 0;
833 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 PyFunction_Check(x) ||
835 PyMethod_Check(x) ||
836 PyCFunction_Check(x) ||
837 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000838 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 if (PyInstance_Check(x)) {
840 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000841 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000843 return 0;
844 }
845 /* Could test recursively but don't, for fear of endless
846 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000848 return 1;
849 }
850 return 0;
851}
852
853
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000854/*
855NoObject is usable as a non-NULL undefined value, used by the macro None.
856There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000857so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000858*/
859
Guido van Rossum0c182a11992-03-27 17:26:13 +0000860/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000862none_repr(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000863{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000865}
866
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867static PyTypeObject PyNothing_Type = {
868 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000869 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000870 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000871 0,
872 0,
873 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000874 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000875 0, /*tp_getattr*/
876 0, /*tp_setattr*/
877 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000878 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000879 0, /*tp_as_number*/
880 0, /*tp_as_sequence*/
881 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000882 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000883};
884
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885PyObject _Py_NoneStruct = {
886 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000887};
888
889
Guido van Rossum84a90321996-05-22 16:34:47 +0000890#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000891
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000892static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000893
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000894void
Fred Drake100814d2000-07-09 15:48:49 +0000895_Py_ResetReferences(void)
Guido van Rossume09fb551997-08-05 02:04:34 +0000896{
897 refchain._ob_prev = refchain._ob_next = &refchain;
898 _Py_RefTotal = 0;
899}
900
901void
Fred Drake100814d2000-07-09 15:48:49 +0000902_Py_NewReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000903{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000905 op->ob_refcnt = 1;
906 op->_ob_next = refchain._ob_next;
907 op->_ob_prev = &refchain;
908 refchain._ob_next->_ob_prev = op;
909 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000910#ifdef COUNT_ALLOCS
911 inc_count(op->ob_type);
912#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000913}
914
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000915void
Fred Drake100814d2000-07-09 15:48:49 +0000916_Py_ForgetReference(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000917{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000918#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +0000919 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000920#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000921 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000923 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000924 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000926#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000927 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
928 if (p == op)
929 break;
930 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000931 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000933#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000934 op->_ob_next->_ob_prev = op->_ob_prev;
935 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000936 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000937#ifdef COUNT_ALLOCS
938 op->ob_type->tp_free++;
939#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000940}
941
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000942void
Fred Drake100814d2000-07-09 15:48:49 +0000943_Py_Dealloc(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000944{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000945 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 _Py_ForgetReference(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000947#ifndef WITH_CYCLE_GC
Guido van Rossume92e6102000-04-24 15:40:53 +0000948 if (_PyTrash_delete_nesting < PyTrash_UNWIND_LEVEL-1)
949 op->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000950#endif
Guido van Rossum9776adf1994-09-07 14:36:45 +0000951 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000952}
953
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000954void
Fred Drake100814d2000-07-09 15:48:49 +0000955_Py_PrintReferences(FILE *fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000956{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000958 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000959 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
960 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 if (PyObject_Print(op, fp, 0) != 0)
962 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000963 putc('\n', fp);
964 }
965}
966
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000967PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000968_Py_GetObjects(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000969{
970 int i, n;
971 PyObject *t = NULL;
972 PyObject *res, *op;
973
974 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
975 return NULL;
976 op = refchain._ob_next;
977 res = PyList_New(0);
978 if (res == NULL)
979 return NULL;
980 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
981 while (op == self || op == args || op == res || op == t ||
982 t != NULL && op->ob_type != (PyTypeObject *) t) {
983 op = op->_ob_next;
984 if (op == &refchain)
985 return res;
986 }
987 if (PyList_Append(res, op) < 0) {
988 Py_DECREF(res);
989 return NULL;
990 }
991 op = op->_ob_next;
992 }
993 return res;
994}
995
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000996#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000997
998
999/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +00001000PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +00001001
1002
1003/* Hack to force loading of abstract.o */
Jeremy Hylton6253f832000-07-12 12:56:19 +00001004int (*_Py_abstract_hack)(PyObject *) = &PyObject_Size;
Guido van Rossume09fb551997-08-05 02:04:34 +00001005
1006
Guido van Rossumb18618d2000-05-03 23:44:39 +00001007/* Python's malloc wrappers (see mymalloc.h) */
Guido van Rossume09fb551997-08-05 02:04:34 +00001008
Thomas Wouters334fb892000-07-25 12:56:38 +00001009void *
Fred Drake100814d2000-07-09 15:48:49 +00001010PyMem_Malloc(size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +00001011{
1012#if _PyMem_EXTRA > 0
1013 if (nbytes == 0)
1014 nbytes = _PyMem_EXTRA;
1015#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001016 return PyMem_MALLOC(nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001017}
1018
Thomas Wouters334fb892000-07-25 12:56:38 +00001019void *
1020PyMem_Realloc(void *p, size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +00001021{
1022#if _PyMem_EXTRA > 0
1023 if (nbytes == 0)
1024 nbytes = _PyMem_EXTRA;
1025#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001026 return PyMem_REALLOC(p, nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001027}
1028
1029void
Thomas Wouters334fb892000-07-25 12:56:38 +00001030PyMem_Free(void *p)
Guido van Rossume09fb551997-08-05 02:04:34 +00001031{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001032 PyMem_FREE(p);
1033}
1034
1035
1036/* Python's object malloc wrappers (see objimpl.h) */
1037
Thomas Wouters334fb892000-07-25 12:56:38 +00001038void *
Fred Drake100814d2000-07-09 15:48:49 +00001039PyObject_Malloc(size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001040{
1041 return PyObject_MALLOC(nbytes);
1042}
1043
Thomas Wouters334fb892000-07-25 12:56:38 +00001044void *
1045PyObject_Realloc(void *p, size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001046{
1047 return PyObject_REALLOC(p, nbytes);
1048}
1049
1050void
Thomas Wouters334fb892000-07-25 12:56:38 +00001051PyObject_Free(void *p)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001052{
1053 PyObject_FREE(p);
Guido van Rossume09fb551997-08-05 02:04:34 +00001054}
Guido van Rossum86610361998-04-10 22:32:46 +00001055
1056
1057/* These methods are used to control infinite recursion in repr, str, print,
1058 etc. Container objects that may recursively contain themselves,
1059 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
1060 Py_ReprLeave() to avoid infinite recursion.
1061
1062 Py_ReprEnter() returns 0 the first time it is called for a particular
1063 object and 1 every time thereafter. It returns -1 if an exception
1064 occurred. Py_ReprLeave() has no return value.
1065
1066 See dictobject.c and listobject.c for examples of use.
1067*/
1068
1069#define KEY "Py_Repr"
1070
1071int
Fred Drake100814d2000-07-09 15:48:49 +00001072Py_ReprEnter(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001073{
1074 PyObject *dict;
1075 PyObject *list;
1076 int i;
1077
1078 dict = PyThreadState_GetDict();
1079 if (dict == NULL)
1080 return -1;
1081 list = PyDict_GetItemString(dict, KEY);
1082 if (list == NULL) {
1083 list = PyList_New(0);
1084 if (list == NULL)
1085 return -1;
1086 if (PyDict_SetItemString(dict, KEY, list) < 0)
1087 return -1;
1088 Py_DECREF(list);
1089 }
1090 i = PyList_GET_SIZE(list);
1091 while (--i >= 0) {
1092 if (PyList_GET_ITEM(list, i) == obj)
1093 return 1;
1094 }
1095 PyList_Append(list, obj);
1096 return 0;
1097}
1098
1099void
Fred Drake100814d2000-07-09 15:48:49 +00001100Py_ReprLeave(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001101{
1102 PyObject *dict;
1103 PyObject *list;
1104 int i;
1105
1106 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001107 if (dict == NULL)
1108 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001109 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001110 if (list == NULL || !PyList_Check(list))
1111 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001112 i = PyList_GET_SIZE(list);
1113 /* Count backwards because we always expect obj to be list[-1] */
1114 while (--i >= 0) {
1115 if (PyList_GET_ITEM(list, i) == obj) {
1116 PyList_SetSlice(list, i, i + 1, NULL);
1117 break;
1118 }
1119 }
1120}
Guido van Rossumd724b232000-03-13 16:01:29 +00001121
1122/*
1123 trashcan
1124 CT 2k0130
1125 non-recursively destroy nested objects
1126
1127 CT 2k0223
1128 everything is now done in a macro.
1129
1130 CT 2k0305
1131 modified to use functions, after Tim Peter's suggestion.
1132
1133 CT 2k0309
1134 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001135
1136 CT 2k0325
1137 added better safe than sorry check for threadstate
Guido van Rossume92e6102000-04-24 15:40:53 +00001138
1139 CT 2k0422
1140 complete rewrite. We now build a chain via ob_type
1141 and save the limited number of types in ob_refcnt.
1142 This is perfect since we don't need any memory.
1143 A patch for free-threading would need just a lock.
Guido van Rossumd724b232000-03-13 16:01:29 +00001144*/
1145
Guido van Rossume92e6102000-04-24 15:40:53 +00001146#define Py_TRASHCAN_TUPLE 1
1147#define Py_TRASHCAN_LIST 2
1148#define Py_TRASHCAN_DICT 3
1149#define Py_TRASHCAN_FRAME 4
1150#define Py_TRASHCAN_TRACEBACK 5
1151/* extend here if other objects want protection */
1152
Guido van Rossumd724b232000-03-13 16:01:29 +00001153int _PyTrash_delete_nesting = 0;
Guido van Rossume92e6102000-04-24 15:40:53 +00001154
Guido van Rossumd724b232000-03-13 16:01:29 +00001155PyObject * _PyTrash_delete_later = NULL;
1156
1157void
Fred Drake100814d2000-07-09 15:48:49 +00001158_PyTrash_deposit_object(PyObject *op)
Guido van Rossumd724b232000-03-13 16:01:29 +00001159{
Guido van Rossume92e6102000-04-24 15:40:53 +00001160 int typecode;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001161
Guido van Rossume92e6102000-04-24 15:40:53 +00001162 if (PyTuple_Check(op))
1163 typecode = Py_TRASHCAN_TUPLE;
1164 else if (PyList_Check(op))
1165 typecode = Py_TRASHCAN_LIST;
1166 else if (PyDict_Check(op))
1167 typecode = Py_TRASHCAN_DICT;
1168 else if (PyFrame_Check(op))
1169 typecode = Py_TRASHCAN_FRAME;
1170 else if (PyTraceBack_Check(op))
1171 typecode = Py_TRASHCAN_TRACEBACK;
Moshe Zadkacf703f02000-08-04 15:36:13 +00001172 else /* We have a bug here -- those are the only types in GC */ {
1173 Py_FatalError("Type not supported in GC -- internal bug");
1174 return; /* pacify compiler -- execution never here */
1175 }
Guido van Rossume92e6102000-04-24 15:40:53 +00001176 op->ob_refcnt = typecode;
Guido van Rossumd724b232000-03-13 16:01:29 +00001177
Guido van Rossume92e6102000-04-24 15:40:53 +00001178 op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
1179 _PyTrash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00001180}
1181
1182void
Fred Drake100814d2000-07-09 15:48:49 +00001183_PyTrash_destroy_chain(void)
Guido van Rossumd724b232000-03-13 16:01:29 +00001184{
1185 while (_PyTrash_delete_later) {
1186 PyObject *shredder = _PyTrash_delete_later;
Guido van Rossume92e6102000-04-24 15:40:53 +00001187 _PyTrash_delete_later = (PyObject*) shredder->ob_type;
1188
1189 switch (shredder->ob_refcnt) {
1190 case Py_TRASHCAN_TUPLE:
1191 shredder->ob_type = &PyTuple_Type;
1192 break;
1193 case Py_TRASHCAN_LIST:
1194 shredder->ob_type = &PyList_Type;
1195 break;
1196 case Py_TRASHCAN_DICT:
1197 shredder->ob_type = &PyDict_Type;
1198 break;
1199 case Py_TRASHCAN_FRAME:
1200 shredder->ob_type = &PyFrame_Type;
1201 break;
1202 case Py_TRASHCAN_TRACEBACK:
1203 shredder->ob_type = &PyTraceBack_Type;
1204 break;
1205 }
1206 _Py_NewReference(shredder);
1207
Guido van Rossumd724b232000-03-13 16:01:29 +00001208 ++_PyTrash_delete_nesting;
1209 Py_DECREF(shredder);
1210 --_PyTrash_delete_nesting;
1211 }
1212}