blob: 20950c1e8d86bb5a1fc9a0657ead68ea2baaa2fb [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Jack Jansen28fc8802000-07-11 21:47:20 +00006#ifdef macintosh
7#include "macglue.h"
8#endif
9
Guido van Rossume92e6102000-04-24 15:40:53 +000010/* just for trashcan: */
11#include "compile.h"
12#include "frameobject.h"
13#include "traceback.h"
14
Guido van Rossum6f9e4331995-03-29 16:57:48 +000015#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000016DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000017#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
Guido van Rossum3f5da241990-12-20 15:06:42 +000019/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
20 These are used by the individual routines for object creation.
21 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000023#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000025extern int tuple_zero_allocs, fast_tuple_allocs;
26extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000027extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000028void
Fred Drake100814d2000-07-09 15:48:49 +000029dump_counts(void)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000030{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000032
33 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000034 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
35 tp->tp_name, tp->tp_alloc, tp->tp_free,
36 tp->tp_maxalloc);
37 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
38 fast_tuple_allocs, tuple_zero_allocs);
39 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
40 quick_int_allocs, quick_neg_int_allocs);
41 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
42 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000043}
44
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000045PyObject *
Fred Drake100814d2000-07-09 15:48:49 +000046get_counts(void)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000047{
48 PyTypeObject *tp;
49 PyObject *result;
50 PyObject *v;
51
52 result = PyList_New(0);
53 if (result == NULL)
54 return NULL;
55 for (tp = type_list; tp; tp = tp->tp_next) {
56 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
57 tp->tp_free, tp->tp_maxalloc);
58 if (v == NULL) {
59 Py_DECREF(result);
60 return NULL;
61 }
62 if (PyList_Append(result, v) < 0) {
63 Py_DECREF(v);
64 Py_DECREF(result);
65 return NULL;
66 }
67 Py_DECREF(v);
68 }
69 return result;
70}
71
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000072void
Fred Drake100814d2000-07-09 15:48:49 +000073inc_count(PyTypeObject *tp)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000074{
75 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000076 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000077 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000079 tp->tp_next = type_list;
80 type_list = tp;
81 }
82 tp->tp_alloc++;
83 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
84 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
85}
86#endif
87
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088PyObject *
Fred Drake100814d2000-07-09 15:48:49 +000089PyObject_Init(PyObject *op, PyTypeObject *tp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090{
Guido van Rossumb18618d2000-05-03 23:44:39 +000091 if (op == NULL) {
92 PyErr_SetString(PyExc_SystemError,
93 "NULL object passed to PyObject_Init");
94 return op;
95 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000096#ifdef WITH_CYCLE_GC
97 if (PyType_IS_GC(tp))
98 op = (PyObject *) PyObject_FROM_GC(op);
99#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000100 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 return op;
104}
105
Guido van Rossumb18618d2000-05-03 23:44:39 +0000106PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000107PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, int size)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000108{
109 if (op == NULL) {
110 PyErr_SetString(PyExc_SystemError,
111 "NULL object passed to PyObject_InitVar");
112 return op;
113 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000114#ifdef WITH_CYCLE_GC
115 if (PyType_IS_GC(tp))
116 op = (PyVarObject *) PyObject_FROM_GC(op);
117#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000118 /* Any changes should be reflected in PyObject_INIT_VAR */
119 op->ob_size = size;
120 op->ob_type = tp;
121 _Py_NewReference((PyObject *)op);
122 return op;
123}
124
125PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000126_PyObject_New(PyTypeObject *tp)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000127{
128 PyObject *op;
129 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
130 if (op == NULL)
131 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000132#ifdef WITH_CYCLE_GC
133 if (PyType_IS_GC(tp))
134 op = (PyObject *) PyObject_FROM_GC(op);
135#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000136 return PyObject_INIT(op, tp);
137}
138
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000139PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000140_PyObject_NewVar(PyTypeObject *tp, int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000142 PyVarObject *op;
143 op = (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE(tp, size));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000145 return (PyVarObject *)PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000146#ifdef WITH_CYCLE_GC
147 if (PyType_IS_GC(tp))
148 op = (PyVarObject *) PyObject_FROM_GC(op);
149#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000150 return PyObject_INIT_VAR(op, tp, size);
151}
152
153void
Fred Drake100814d2000-07-09 15:48:49 +0000154_PyObject_Del(PyObject *op)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000155{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000156#ifdef WITH_CYCLE_GC
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000157 if (op && PyType_IS_GC(op->ob_type)) {
158 op = (PyObject *) PyObject_AS_GC(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000159 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000160#endif
161 PyObject_FREE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162}
163
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000164#ifndef WITH_CYCLE_GC
165/* extension modules might need these */
166void _PyGC_Insert(PyObject *op) { }
167void _PyGC_Remove(PyObject *op) { }
168#endif
169
Guido van Rossum90933611991-06-07 16:10:43 +0000170int
Fred Drake100814d2000-07-09 15:48:49 +0000171PyObject_Print(PyObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172{
Guido van Rossum278ef591991-07-27 21:40:24 +0000173 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000175 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000176#ifdef USE_STACKCHECK
177 if (PyOS_CheckStack()) {
Fred Drake661ea262000-10-24 19:57:45 +0000178 PyErr_SetString(PyExc_MemoryError, "stack overflow");
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000179 return -1;
180 }
181#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000182 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000183 if (op == NULL) {
184 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185 }
Guido van Rossum90933611991-06-07 16:10:43 +0000186 else {
187 if (op->ob_refcnt <= 0)
Fred Drakea44d3532000-06-30 15:01:00 +0000188 fprintf(fp, "<refcnt %u at %p>",
189 op->ob_refcnt, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000190 else if (op->ob_type->tp_print == NULL) {
191 if (op->ob_type->tp_repr == NULL) {
Fred Drakea44d3532000-06-30 15:01:00 +0000192 fprintf(fp, "<%s object at %p>",
193 op->ob_type->tp_name, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000194 }
195 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 PyObject *s;
197 if (flags & Py_PRINT_RAW)
198 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000199 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000201 if (s == NULL)
202 ret = -1;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000203 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000204 ret = PyObject_Print(s, fp,
205 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000206 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000208 }
209 }
Guido van Rossum90933611991-06-07 16:10:43 +0000210 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000211 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000212 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000213 if (ret == 0) {
214 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000216 clearerr(fp);
217 ret = -1;
218 }
219 }
220 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221}
222
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000224PyObject_Repr(PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000227 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000228#ifdef USE_STACKCHECK
229 if (PyOS_CheckStack()) {
Fred Drake661ea262000-10-24 19:57:45 +0000230 PyErr_SetString(PyExc_MemoryError, "stack overflow");
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000231 return NULL;
232 }
233#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000234 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000236 else if (v->ob_type->tp_repr == NULL) {
237 char buf[120];
Fred Drakea44d3532000-06-30 15:01:00 +0000238 sprintf(buf, "<%.80s object at %p>",
239 v->ob_type->tp_name, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 else {
243 PyObject *res;
244 res = (*v->ob_type->tp_repr)(v);
245 if (res == NULL)
246 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000247 if (PyUnicode_Check(res)) {
248 PyObject* str;
Fredrik Lundh2a1e0602000-07-08 17:43:32 +0000249 str = PyUnicode_AsUnicodeEscapeString(res);
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000250 Py_DECREF(res);
251 if (str)
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000252 res = str;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000253 else
254 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000255 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000256 if (!PyString_Check(res)) {
257 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000258 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000259 res->ob_type->tp_name);
260 Py_DECREF(res);
261 return NULL;
262 }
263 return res;
264 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265}
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000268PyObject_Str(PyObject *v)
Guido van Rossumc6004111993-11-05 10:22:19 +0000269{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270 PyObject *res;
271
Guido van Rossumc6004111993-11-05 10:22:19 +0000272 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 return PyString_FromString("<NULL>");
274 else if (PyString_Check(v)) {
275 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000276 return v;
277 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000278 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000280 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 if (!PyInstance_Check(v) ||
283 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
284 PyErr_Clear();
285 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000286 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000287 res = PyEval_CallObject(func, (PyObject *)NULL);
288 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000289 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 if (res == NULL)
291 return NULL;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000292 if (PyUnicode_Check(res)) {
293 PyObject* str;
294 str = PyUnicode_AsEncodedString(res, NULL, NULL);
295 Py_DECREF(res);
296 if (str)
297 res = str;
298 else
299 return NULL;
300 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 if (!PyString_Check(res)) {
302 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000303 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 res->ob_type->tp_name);
305 Py_DECREF(res);
306 return NULL;
307 }
308 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000309}
310
Guido van Rossume797ec12001-01-17 15:24:28 +0000311/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
312static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000313
Guido van Rossume797ec12001-01-17 15:24:28 +0000314/* Try a genuine rich comparison, returning an object. Return:
315 NULL for exception;
316 NotImplemented if this particular rich comparison is not implemented or
317 undefined;
318 some object not equal to NotImplemented if it is implemented
319 (this latter object may not be a Boolean).
320*/
321static PyObject *
322try_rich_compare(PyObject *v, PyObject *w, int op)
323{
324 richcmpfunc f;
325 PyObject *res;
326
327 if ((f = v->ob_type->tp_richcompare) != NULL) {
328 res = (*f)(v, w, op);
329 if (res != Py_NotImplemented)
330 return res;
331 Py_DECREF(res);
332 }
333 if ((f = w->ob_type->tp_richcompare) != NULL) {
334 return (*f)(w, v, swapped_op[op]);
335 }
336 res = Py_NotImplemented;
337 Py_INCREF(res);
338 return res;
339}
340
341/* Try a genuine rich comparison, returning an int. Return:
342 -1 for exception (including the case where try_rich_compare() returns an
343 object that's not a Boolean);
344 0 if the outcome is false;
345 1 if the outcome is true;
346 2 if this particular rich comparison is not implemented or undefined.
347*/
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000348static int
Guido van Rossume797ec12001-01-17 15:24:28 +0000349try_rich_compare_bool(PyObject *v, PyObject *w, int op)
350{
351 PyObject *res;
352 int ok;
353
354 if (v->ob_type->tp_richcompare == NULL &&
355 w->ob_type->tp_richcompare == NULL)
356 return 2; /* Shortcut, avoid INCREF+DECREF */
357 res = try_rich_compare(v, w, op);
358 if (res == NULL)
359 return -1;
360 if (res == Py_NotImplemented) {
361 Py_DECREF(res);
362 return 2;
363 }
364 ok = PyObject_IsTrue(res);
365 Py_DECREF(res);
366 return ok;
367}
368
369/* Try rich comparisons to determine a 3-way comparison. Return:
370 -2 for an exception;
371 -1 if v < w;
372 0 if v == w;
373 1 if v > w;
374 2 if this particular rich comparison is not implemented or undefined.
375*/
376static int
377try_rich_to_3way_compare(PyObject *v, PyObject *w)
378{
379 if (v->ob_type->tp_richcompare == NULL &&
380 w->ob_type->tp_richcompare == NULL)
381 return 2; /* Shortcut */
382 switch (try_rich_compare_bool(v, w, Py_LT)) {
383 case -1: /* Error */
384 return -1;
385 case 0: /* False: not less */
386 break;
387 case 1: /* True: less */
388 return -1;
389 case 2: /* NotImplemented */
390 break;
391 }
392 switch (try_rich_compare_bool(v, w, Py_GT)) {
393 case -1: /* Error */
394 return -1;
395 case 0: /* False: not greater */
396 break;
397 case 1: /* True: greater */
398 return 1;
399 case 2: /* NotImplemented */
400 break;
401 }
402 switch (try_rich_compare_bool(v, w, Py_EQ)) {
403 case -1: /* Error */
404 return -1;
405 case 0: /* False: not equal */
406 break;
407 case 1: /* True: equal */
408 return 0;
409 case 2: /* NotImplemented */
410 break;
411 }
412 return 2; /* XXX Even if all three returned FALSE?! */
413}
414
415/* Try a 3-way comparison, returning an int. Return:
416 -2 for an exception;
417 -1 if v < w;
418 0 if v == w;
419 1 if v > w;
420 2 if this particular 3-way comparison is not implemented or undefined.
421*/
422static int
423try_3way_compare(PyObject *v, PyObject *w)
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000424{
425 int c;
Guido van Rossume797ec12001-01-17 15:24:28 +0000426 cmpfunc f;
427
428 /* Comparisons involving instances are given to instance_compare,
429 which has the same return conventions as this function. */
430
431 if (PyInstance_Check(v))
432 return (*v->ob_type->tp_compare)(v, w);
433 if (PyInstance_Check(w))
434 return (*w->ob_type->tp_compare)(v, w);
435
436 /* If the types are equal, don't bother with coercions etc. */
437 if (v->ob_type == w->ob_type) {
438 if ((f = v->ob_type->tp_compare) == NULL)
439 return 2;
440 c = (*f)(v, w);
441 if (PyErr_Occurred())
442 return -2;
443 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000444 }
Guido van Rossume797ec12001-01-17 15:24:28 +0000445
446 /* Try coercion; if it fails, give up */
447 c = PyNumber_CoerceEx(&v, &w);
448 if (c < 0)
449 return -2;
450 if (c > 0)
451 return 2;
452
453 /* Try v's comparison, if defined */
454 if ((f = v->ob_type->tp_compare) != NULL) {
455 c = (*f)(v, w);
456 Py_DECREF(v);
457 Py_DECREF(w);
458 if (PyErr_Occurred())
459 return -2;
460 return c < 0 ? -1 : c > 0 ? 1 : 0;
461 }
462
463 /* Try w's comparison, if defined */
464 if ((f = w->ob_type->tp_compare) != NULL) {
465 c = (*f)(w, v); /* swapped! */
466 Py_DECREF(v);
467 Py_DECREF(w);
468 if (PyErr_Occurred())
469 return -2;
470 return c < 0 ? 1 : c > 0 ? -1 : 0; /* negated! */
471 }
472
473 /* No comparison defined */
474 Py_DECREF(v);
475 Py_DECREF(w);
476 return 2;
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000477}
478
Guido van Rossume797ec12001-01-17 15:24:28 +0000479/* Final fallback 3-way comparison, returning an int. Return:
480 -2 if an error occurred;
481 -1 if v < w;
482 0 if v == w;
483 1 if v > w.
484*/
485static int
486default_3way_compare(PyObject *v, PyObject *w)
487{
488 int c;
489
490 if (v->ob_type == w->ob_type) {
491 /* same type: compare pointers */
492 void *vv = v;
493 void *ww = w;
494 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
495 }
496
497 /* Special case for Unicode */
498 if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
499 c = PyUnicode_Compare(v, w);
500 if (!PyErr_Occurred())
501 return c;
502 /* TypeErrors are ignored: if Unicode coercion fails due
503 to one of the arguments not having the right type, we
504 continue as defined by the coercion protocol (see
505 above). Luckily, decoding errors are reported as
506 ValueErrors and are not masked by this technique. */
507 if (!PyErr_ExceptionMatches(PyExc_TypeError))
508 return -2;
509 PyErr_Clear();
510 }
511
512 /* different type: compare type names */
513 c = strcmp(v->ob_type->tp_name, w->ob_type->tp_name);
514 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
515}
516
517#define CHECK_TYPES(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_CHECKTYPES)
518
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000519static int
Fred Drake100814d2000-07-09 15:48:49 +0000520do_cmp(PyObject *v, PyObject *w)
Guido van Rossum20566841995-01-12 11:26:10 +0000521{
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000522 int c;
523
Guido van Rossume797ec12001-01-17 15:24:28 +0000524 c = try_rich_to_3way_compare(v, w);
525 if (c < 2)
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000526 return c;
Guido van Rossume797ec12001-01-17 15:24:28 +0000527 c = try_3way_compare(v, w);
528 if (c < 2)
529 return c;
530 return default_3way_compare(v, w);
Guido van Rossum20566841995-01-12 11:26:10 +0000531}
532
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000533PyObject *_PyCompareState_Key;
534
Thomas Wouters7e474022000-07-16 12:04:32 +0000535/* _PyCompareState_nesting is incremented before calling compare (for
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000536 some types) and decremented on exit. If the count exceeds the
537 nesting limit, enable code to detect circular data structures.
538*/
Jack Jansend49cbe12000-08-22 21:52:51 +0000539#ifdef macintosh
540#define NESTING_LIMIT 60
541#else
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000542#define NESTING_LIMIT 500
Jack Jansend49cbe12000-08-22 21:52:51 +0000543#endif
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000544int _PyCompareState_nesting = 0;
545
546static PyObject*
Fred Drake100814d2000-07-09 15:48:49 +0000547get_inprogress_dict(void)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000548{
549 PyObject *tstate_dict, *inprogress;
550
551 tstate_dict = PyThreadState_GetDict();
552 if (tstate_dict == NULL) {
553 PyErr_BadInternalCall();
554 return NULL;
555 }
556 inprogress = PyDict_GetItem(tstate_dict, _PyCompareState_Key);
557 if (inprogress == NULL) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000558 inprogress = PyDict_New();
559 if (inprogress == NULL)
560 return NULL;
561 if (PyDict_SetItem(tstate_dict, _PyCompareState_Key,
562 inprogress) == -1) {
563 Py_DECREF(inprogress);
564 return NULL;
565 }
Jeremy Hyltona251ea02000-06-09 16:20:39 +0000566 Py_DECREF(inprogress);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000567 }
568 return inprogress;
569}
570
Marc-André Lemburgad7c98e2001-01-17 17:09:53 +0000571PyObject *
572PyObject_Unicode(PyObject *v)
573{
574 PyObject *res;
575
576 if (v == NULL)
577 res = PyString_FromString("<NULL>");
578 else if (PyUnicode_Check(v)) {
579 Py_INCREF(v);
580 return v;
581 }
582 else if (PyString_Check(v))
583 res = v;
584 else if (v->ob_type->tp_str != NULL)
585 res = (*v->ob_type->tp_str)(v);
586 else {
587 PyObject *func;
588 static PyObject *strstr;
589 if (strstr == NULL) {
590 strstr= PyString_InternFromString("__str__");
591 if (strstr == NULL)
592 return NULL;
593 }
594 if (!PyInstance_Check(v) ||
595 (func = PyObject_GetAttr(v, strstr)) == NULL) {
596 PyErr_Clear();
597 res = PyObject_Repr(v);
598 }
599 else {
600 res = PyEval_CallObject(func, (PyObject *)NULL);
601 Py_DECREF(func);
602 }
603 }
604 if (res == NULL)
605 return NULL;
606 if (!PyUnicode_Check(res)) {
607 PyObject* str;
608 str = PyUnicode_FromObject(res);
609 Py_DECREF(res);
610 if (str)
611 res = str;
612 else
613 return NULL;
614 }
615 return res;
616}
617
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000618static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000619make_pair(PyObject *v, PyObject *w)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000620{
621 PyObject *pair;
Barry Warsaw9d23a4e2000-08-18 05:01:19 +0000622 Py_uintptr_t iv = (Py_uintptr_t)v;
623 Py_uintptr_t iw = (Py_uintptr_t)w;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000624
625 pair = PyTuple_New(2);
626 if (pair == NULL) {
627 return NULL;
628 }
Barry Warsaw9d23a4e2000-08-18 05:01:19 +0000629 if (iv <= iw) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000630 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)v));
631 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)w));
632 } else {
633 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)w));
634 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)v));
635 }
636 return pair;
637}
638
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000639int
Fred Drake100814d2000-07-09 15:48:49 +0000640PyObject_Compare(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000641{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000642 PyTypeObject *vtp, *wtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000643 int result;
644
Jack Jansend49cbe12000-08-22 21:52:51 +0000645#if defined(USE_STACKCHECK)
Guido van Rossum9c0a99e2000-08-30 15:53:50 +0000646 if (PyOS_CheckStack()) {
Jack Jansend49cbe12000-08-22 21:52:51 +0000647 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
648 return -1;
649 }
650#endif
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000651 if (v == NULL || w == NULL) {
652 PyErr_BadInternalCall();
653 return -1;
654 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000655 if (v == w)
656 return 0;
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000657 vtp = v->ob_type;
658 wtp = w->ob_type;
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000659 _PyCompareState_nesting++;
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000660 if (_PyCompareState_nesting > NESTING_LIMIT &&
661 (vtp->tp_as_mapping
662 || PyInstance_Check(v)
663 || (vtp->tp_as_sequence && !PyString_Check(v)))) {
664 /* try to detect circular data structures */
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000665 PyObject *inprogress, *pair;
666
667 inprogress = get_inprogress_dict();
668 if (inprogress == NULL) {
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000669 result = -1;
670 goto exit_cmp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000671 }
672 pair = make_pair(v, w);
673 if (PyDict_GetItem(inprogress, pair)) {
674 /* already comparing these objects. assume
675 they're equal until shown otherwise */
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000676 Py_DECREF(pair);
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000677 result = 0;
678 goto exit_cmp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000679 }
680 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000681 result = -1;
682 goto exit_cmp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000683 }
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000684 result = do_cmp(v, w);
685 /* XXX DelItem shouldn't fail */
686 PyDict_DelItem(inprogress, pair);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000687 Py_DECREF(pair);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000688 }
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000689 else {
690 result = do_cmp(v, w);
691 }
692exit_cmp:
Vladimir Marangozov1d3e2392000-08-11 00:14:26 +0000693 _PyCompareState_nesting--;
Guido van Rossume797ec12001-01-17 15:24:28 +0000694 return result < 0 ? -1 : result;
695}
696
697static PyObject *
698try_3way_to_rich_compare(PyObject *v, PyObject *w, int op)
699{
700 int c;
701 PyObject *result;
702
703 c = try_3way_compare(v, w);
704 if (c <= -2)
705 return NULL;
706 if (c >= 2)
707 c = default_3way_compare(v, w);
708 switch (op) {
709 case Py_LT: c = c < 0; break;
710 case Py_LE: c = c <= 0; break;
711 case Py_EQ: c = c == 0; break;
712 case Py_NE: c = c != 0; break;
713 case Py_GT: c = c > 0; break;
714 case Py_GE: c = c >= 0; break;
715 }
716 result = c ? Py_True : Py_False;
717 Py_INCREF(result);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000718 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000719}
720
Guido van Rossume797ec12001-01-17 15:24:28 +0000721PyObject *
722do_richcmp(PyObject *v, PyObject *w, int op)
723{
724 PyObject *res;
725
726 res = try_rich_compare(v, w, op);
727 if (res != Py_NotImplemented)
728 return res;
729 Py_DECREF(res);
730
731 return try_3way_to_rich_compare(v, w, op);
732}
733
734PyObject *
735PyObject_RichCompare(PyObject *v, PyObject *w, int op)
736{
737 PyObject *res;
738
739 assert(Py_LT <= op && op <= Py_GE);
740
741 if (_PyCompareState_nesting > NESTING_LIMIT) {
742 /* Too deeply nested -- assume equal */
743 /* XXX This is an unfair shortcut!
744 Should use the same logic as PyObject_Compare. */
745 switch (op) {
746 case Py_LT:
747 case Py_NE:
748 case Py_GT:
749 res = Py_False;
750 break;
751 case Py_LE:
752 case Py_EQ:
753 case Py_GE:
754 res = Py_True;
755 break;
756 }
757 Py_INCREF(res);
758 return res;
759 }
760
761 _PyCompareState_nesting++;
762 res = do_richcmp(v, w, op);
763 _PyCompareState_nesting--;
764
765 return res;
766}
767
768int
769PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
770{
771 PyObject *res = PyObject_RichCompare(v, w, op);
772 int ok;
773
774 if (res == NULL)
775 return -1;
776 ok = PyObject_IsTrue(res);
777 Py_DECREF(res);
778 return ok;
779}
Fred Drake13634cf2000-06-29 19:17:04 +0000780
781/* Set of hash utility functions to help maintaining the invariant that
782 iff a==b then hash(a)==hash(b)
783
784 All the utility functions (_Py_Hash*()) return "-1" to signify an error.
785*/
786
787long
Fred Drake100814d2000-07-09 15:48:49 +0000788_Py_HashDouble(double v)
Fred Drake13634cf2000-06-29 19:17:04 +0000789{
Tim Peters39dce292000-08-15 03:34:48 +0000790 double intpart, fractpart;
791 int expo;
792 long hipart;
793 long x; /* the final hash value */
794 /* This is designed so that Python numbers of different types
795 * that compare equal hash to the same value; otherwise comparisons
796 * of mapping keys will turn out weird.
797 */
798
799#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
800{
801 extended e;
802 fractpart = modf(v, &e);
803 intpart = e;
804}
805#else
806 fractpart = modf(v, &intpart);
807#endif
808 if (fractpart == 0.0) {
809 /* This must return the same hash as an equal int or long. */
810 if (intpart > LONG_MAX || -intpart > LONG_MAX) {
811 /* Convert to long and use its hash. */
812 PyObject *plong; /* converted to Python long */
813 if (Py_IS_INFINITY(intpart))
814 /* can't convert to long int -- arbitrary */
815 v = v < 0 ? -271828.0 : 314159.0;
816 plong = PyLong_FromDouble(v);
817 if (plong == NULL)
818 return -1;
819 x = PyObject_Hash(plong);
820 Py_DECREF(plong);
821 return x;
822 }
823 /* Fits in a C long == a Python int, so is its own hash. */
824 x = (long)intpart;
825 if (x == -1)
826 x = -2;
827 return x;
828 }
829 /* The fractional part is non-zero, so we don't have to worry about
830 * making this match the hash of some other type.
831 * Use frexp to get at the bits in the double.
Fred Drake13634cf2000-06-29 19:17:04 +0000832 * Since the VAX D double format has 56 mantissa bits, which is the
833 * most of any double format in use, each of these parts may have as
834 * many as (but no more than) 56 significant bits.
Tim Peters39dce292000-08-15 03:34:48 +0000835 * So, assuming sizeof(long) >= 4, each part can be broken into two
836 * longs; frexp and multiplication are used to do that.
837 * Also, since the Cray double format has 15 exponent bits, which is
838 * the most of any double format in use, shifting the exponent field
839 * left by 15 won't overflow a long (again assuming sizeof(long) >= 4).
Fred Drake13634cf2000-06-29 19:17:04 +0000840 */
Tim Peters39dce292000-08-15 03:34:48 +0000841 v = frexp(v, &expo);
842 v *= 2147483648.0; /* 2**31 */
843 hipart = (long)v; /* take the top 32 bits */
844 v = (v - (double)hipart) * 2147483648.0; /* get the next 32 bits */
845 x = hipart + (long)v + (expo << 15);
846 if (x == -1)
847 x = -2;
848 return x;
Fred Drake13634cf2000-06-29 19:17:04 +0000849}
850
851long
Fred Drake100814d2000-07-09 15:48:49 +0000852_Py_HashPointer(void *p)
Fred Drake13634cf2000-06-29 19:17:04 +0000853{
854#if SIZEOF_LONG >= SIZEOF_VOID_P
855 return (long)p;
856#else
857 /* convert to a Python long and hash that */
858 PyObject* longobj;
859 long x;
860
861 if ((longobj = PyLong_FromVoidPtr(p)) == NULL) {
862 x = -1;
863 goto finally;
864 }
865 x = PyObject_Hash(longobj);
866
867finally:
868 Py_XDECREF(longobj);
869 return x;
870#endif
871}
872
873
Guido van Rossum9bfef441993-03-29 10:43:31 +0000874long
Fred Drake100814d2000-07-09 15:48:49 +0000875PyObject_Hash(PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000876{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000878 if (tp->tp_hash != NULL)
879 return (*tp->tp_hash)(v);
Fred Drake13634cf2000-06-29 19:17:04 +0000880 if (tp->tp_compare == NULL) {
881 return _Py_HashPointer(v); /* Use address as hash value */
882 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000883 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000885 return -1;
886}
887
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000889PyObject_GetAttrString(PyObject *v, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000890{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000891 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000892 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000893 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000894 if (w == NULL)
895 return NULL;
896 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000898 return res;
899 }
900
Guido van Rossum3f5da241990-12-20 15:06:42 +0000901 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000902 PyErr_Format(PyExc_AttributeError,
903 "'%.50s' object has no attribute '%.400s'",
904 v->ob_type->tp_name,
905 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000906 return NULL;
907 }
908 else {
909 return (*v->ob_type->tp_getattr)(v, name);
910 }
911}
912
913int
Fred Drake100814d2000-07-09 15:48:49 +0000914PyObject_HasAttrString(PyObject *v, char *name)
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000915{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000917 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000919 return 1;
920 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000922 return 0;
923}
924
925int
Fred Drake100814d2000-07-09 15:48:49 +0000926PyObject_SetAttrString(PyObject *v, char *name, PyObject *w)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000927{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000928 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000930 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000931 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000932 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000933 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000934 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000936 return res;
937 }
938
Guido van Rossum3f5da241990-12-20 15:06:42 +0000939 if (v->ob_type->tp_setattr == NULL) {
940 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000942 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000943 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000945 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000946 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000947 }
948 else {
949 return (*v->ob_type->tp_setattr)(v, name, w);
950 }
951}
952
Marc-André Lemburge44e5072000-09-18 16:20:57 +0000953/* Internal API needed by PyObject_GetAttr(): */
954extern
955PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
956 const char *errors);
957
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000958PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000959PyObject_GetAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000960{
Marc-André Lemburge44e5072000-09-18 16:20:57 +0000961 /* The Unicode to string conversion is done here because the
962 existing tp_getattro slots expect a string object as name
963 and we wouldn't want to break those. */
964 if (PyUnicode_Check(name)) {
965 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
966 if (name == NULL)
967 return NULL;
968 }
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000969
970 if (!PyString_Check(name)) {
971 PyErr_SetString(PyExc_TypeError,
972 "attribute name must be string");
973 return NULL;
974 }
Marc-André Lemburge44e5072000-09-18 16:20:57 +0000975 if (v->ob_type->tp_getattro != NULL)
976 return (*v->ob_type->tp_getattro)(v, name);
977 else
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000978 return PyObject_GetAttrString(v, PyString_AS_STRING(name));
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000979}
980
981int
Fred Drake100814d2000-07-09 15:48:49 +0000982PyObject_HasAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000983{
984 PyObject *res = PyObject_GetAttr(v, name);
985 if (res != NULL) {
986 Py_DECREF(res);
987 return 1;
988 }
989 PyErr_Clear();
990 return 0;
991}
992
993int
Fred Drake100814d2000-07-09 15:48:49 +0000994PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000995{
996 int err;
Marc-André Lemburge44e5072000-09-18 16:20:57 +0000997
998 /* The Unicode to string conversion is done here because the
999 existing tp_setattro slots expect a string object as name
1000 and we wouldn't want to break those. */
1001 if (PyUnicode_Check(name)) {
1002 name = PyUnicode_AsEncodedString(name, NULL, NULL);
1003 if (name == NULL)
1004 return -1;
Jeremy Hylton99a8f902000-06-23 14:36:32 +00001005 }
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001006 else
1007 Py_INCREF(name);
1008
1009 if (!PyString_Check(name)){
Jeremy Hylton99a8f902000-06-23 14:36:32 +00001010 PyErr_SetString(PyExc_TypeError,
1011 "attribute name must be string");
1012 err = -1;
1013 }
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001014 else {
1015 PyString_InternInPlace(&name);
1016 if (v->ob_type->tp_setattro != NULL)
1017 err = (*v->ob_type->tp_setattro)(v, name, value);
1018 else
1019 err = PyObject_SetAttrString(v,
1020 PyString_AS_STRING(name), value);
1021 }
1022
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001023 Py_DECREF(name);
1024 return err;
1025}
1026
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001027/* Test a value used as condition, e.g., in a for or if statement.
1028 Return -1 if an error occurred */
1029
1030int
Fred Drake100814d2000-07-09 15:48:49 +00001031PyObject_IsTrue(PyObject *v)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001032{
1033 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001035 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +00001036 else if (v->ob_type->tp_as_number != NULL &&
1037 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001038 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +00001039 else if (v->ob_type->tp_as_mapping != NULL &&
1040 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001041 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +00001042 else if (v->ob_type->tp_as_sequence != NULL &&
1043 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001044 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1045 else
1046 res = 1;
1047 if (res > 0)
1048 res = 1;
1049 return res;
1050}
1051
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001052/* equivalent of 'not v'
1053 Return -1 if an error occurred */
1054
1055int
Fred Drake100814d2000-07-09 15:48:49 +00001056PyObject_Not(PyObject *v)
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001057{
1058 int res;
1059 res = PyObject_IsTrue(v);
1060 if (res < 0)
1061 return res;
1062 return res == 0;
1063}
1064
Guido van Rossum5524a591995-01-10 15:26:20 +00001065/* Coerce two numeric types to the "larger" one.
1066 Increment the reference count on each argument.
Guido van Rossume797ec12001-01-17 15:24:28 +00001067 Return value:
1068 -1 if an error occurred;
1069 0 if the coercion succeeded (and then the reference counts are increased);
1070 1 if no coercion is possible (and no error is raised).
Guido van Rossum5524a591995-01-10 15:26:20 +00001071*/
Guido van Rossum5524a591995-01-10 15:26:20 +00001072int
Fred Drake100814d2000-07-09 15:48:49 +00001073PyNumber_CoerceEx(PyObject **pv, PyObject **pw)
Guido van Rossum5524a591995-01-10 15:26:20 +00001074{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 register PyObject *v = *pv;
1076 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +00001077 int res;
1078
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
1080 Py_INCREF(v);
1081 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +00001082 return 0;
1083 }
1084 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1085 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1086 if (res <= 0)
1087 return res;
1088 }
1089 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1090 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1091 if (res <= 0)
1092 return res;
1093 }
Guido van Rossum242c6421997-11-19 16:03:17 +00001094 return 1;
1095}
1096
Guido van Rossume797ec12001-01-17 15:24:28 +00001097/* Coerce two numeric types to the "larger" one.
1098 Increment the reference count on each argument.
1099 Return -1 and raise an exception if no coercion is possible
1100 (and then no reference count is incremented).
1101*/
Guido van Rossum242c6421997-11-19 16:03:17 +00001102int
Fred Drake100814d2000-07-09 15:48:49 +00001103PyNumber_Coerce(PyObject **pv, PyObject **pw)
Guido van Rossum242c6421997-11-19 16:03:17 +00001104{
1105 int err = PyNumber_CoerceEx(pv, pw);
1106 if (err <= 0)
1107 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +00001109 return -1;
1110}
1111
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001112
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001113/* Test whether an object can be called */
1114
1115int
Fred Drake100814d2000-07-09 15:48:49 +00001116PyCallable_Check(PyObject *x)
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001117{
1118 if (x == NULL)
1119 return 0;
1120 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 PyFunction_Check(x) ||
1122 PyMethod_Check(x) ||
1123 PyCFunction_Check(x) ||
1124 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001125 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126 if (PyInstance_Check(x)) {
1127 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001128 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001130 return 0;
1131 }
1132 /* Could test recursively but don't, for fear of endless
1133 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001135 return 1;
1136 }
1137 return 0;
1138}
1139
1140
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001141/*
1142NoObject is usable as a non-NULL undefined value, used by the macro None.
1143There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +00001144so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001145*/
1146
Guido van Rossum0c182a11992-03-27 17:26:13 +00001147/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001149none_repr(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001150{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001152}
1153
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001154static PyTypeObject PyNothing_Type = {
1155 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001156 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001158 0,
1159 0,
1160 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001161 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +00001162 0, /*tp_getattr*/
1163 0, /*tp_setattr*/
1164 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +00001165 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +00001166 0, /*tp_as_number*/
1167 0, /*tp_as_sequence*/
1168 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001169 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001170};
1171
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172PyObject _Py_NoneStruct = {
1173 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001174};
1175
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001176/* NotImplemented is an object that can be used to signal that an
1177 operation is not implemented for the given type combination. */
1178
1179static PyObject *
1180NotImplemented_repr(PyObject *op)
1181{
1182 return PyString_FromString("NotImplemented");
1183}
1184
1185static PyTypeObject PyNotImplemented_Type = {
1186 PyObject_HEAD_INIT(&PyType_Type)
1187 0,
1188 "NotImplemented",
1189 0,
1190 0,
1191 0, /*tp_dealloc*/ /*never called*/
1192 0, /*tp_print*/
1193 0, /*tp_getattr*/
1194 0, /*tp_setattr*/
1195 0, /*tp_compare*/
1196 (reprfunc)NotImplemented_repr, /*tp_repr*/
1197 0, /*tp_as_number*/
1198 0, /*tp_as_sequence*/
1199 0, /*tp_as_mapping*/
1200 0, /*tp_hash */
1201};
1202
1203PyObject _Py_NotImplementedStruct = {
1204 PyObject_HEAD_INIT(&PyNotImplemented_Type)
1205};
1206
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001207
Guido van Rossum84a90321996-05-22 16:34:47 +00001208#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001211
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001212void
Fred Drake100814d2000-07-09 15:48:49 +00001213_Py_ResetReferences(void)
Guido van Rossume09fb551997-08-05 02:04:34 +00001214{
1215 refchain._ob_prev = refchain._ob_next = &refchain;
1216 _Py_RefTotal = 0;
1217}
1218
1219void
Fred Drake100814d2000-07-09 15:48:49 +00001220_Py_NewReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001221{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001223 op->ob_refcnt = 1;
1224 op->_ob_next = refchain._ob_next;
1225 op->_ob_prev = &refchain;
1226 refchain._ob_next->_ob_prev = op;
1227 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001228#ifdef COUNT_ALLOCS
1229 inc_count(op->ob_type);
1230#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001231}
1232
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001233void
Fred Drake100814d2000-07-09 15:48:49 +00001234_Py_ForgetReference(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001235{
Guido van Rossumbffd6832000-01-20 22:32:56 +00001236#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +00001237 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +00001238#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +00001239 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001240 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001241 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +00001242 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001244#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +00001245 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
1246 if (p == op)
1247 break;
1248 }
Guido van Rossumd7047b31995-01-02 19:07:15 +00001249 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001251#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001252 op->_ob_next->_ob_prev = op->_ob_prev;
1253 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001254 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +00001255#ifdef COUNT_ALLOCS
1256 op->ob_type->tp_free++;
1257#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +00001258}
1259
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001260void
Fred Drake100814d2000-07-09 15:48:49 +00001261_Py_Dealloc(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001262{
Guido van Rossum9776adf1994-09-07 14:36:45 +00001263 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001264 _Py_ForgetReference(op);
Guido van Rossum9776adf1994-09-07 14:36:45 +00001265 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001266}
1267
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001268void
Fred Drake100814d2000-07-09 15:48:49 +00001269_Py_PrintReferences(FILE *fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001270{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +00001272 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001273 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
1274 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 if (PyObject_Print(op, fp, 0) != 0)
1276 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001277 putc('\n', fp);
1278 }
1279}
1280
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001281PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001282_Py_GetObjects(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001283{
1284 int i, n;
1285 PyObject *t = NULL;
1286 PyObject *res, *op;
1287
1288 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
1289 return NULL;
1290 op = refchain._ob_next;
1291 res = PyList_New(0);
1292 if (res == NULL)
1293 return NULL;
1294 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
1295 while (op == self || op == args || op == res || op == t ||
1296 t != NULL && op->ob_type != (PyTypeObject *) t) {
1297 op = op->_ob_next;
1298 if (op == &refchain)
1299 return res;
1300 }
1301 if (PyList_Append(res, op) < 0) {
1302 Py_DECREF(res);
1303 return NULL;
1304 }
1305 op = op->_ob_next;
1306 }
1307 return res;
1308}
1309
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001310#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +00001311
1312
1313/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +00001314PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +00001315
1316
1317/* Hack to force loading of abstract.o */
Jeremy Hylton6253f832000-07-12 12:56:19 +00001318int (*_Py_abstract_hack)(PyObject *) = &PyObject_Size;
Guido van Rossume09fb551997-08-05 02:04:34 +00001319
1320
Andrew M. Kuchling1582a3a2000-08-16 12:27:23 +00001321/* Python's malloc wrappers (see pymem.h) */
Guido van Rossume09fb551997-08-05 02:04:34 +00001322
Thomas Wouters334fb892000-07-25 12:56:38 +00001323void *
Fred Drake100814d2000-07-09 15:48:49 +00001324PyMem_Malloc(size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +00001325{
1326#if _PyMem_EXTRA > 0
1327 if (nbytes == 0)
1328 nbytes = _PyMem_EXTRA;
1329#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001330 return PyMem_MALLOC(nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001331}
1332
Thomas Wouters334fb892000-07-25 12:56:38 +00001333void *
1334PyMem_Realloc(void *p, size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +00001335{
1336#if _PyMem_EXTRA > 0
1337 if (nbytes == 0)
1338 nbytes = _PyMem_EXTRA;
1339#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001340 return PyMem_REALLOC(p, nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001341}
1342
1343void
Thomas Wouters334fb892000-07-25 12:56:38 +00001344PyMem_Free(void *p)
Guido van Rossume09fb551997-08-05 02:04:34 +00001345{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001346 PyMem_FREE(p);
1347}
1348
1349
1350/* Python's object malloc wrappers (see objimpl.h) */
1351
Thomas Wouters334fb892000-07-25 12:56:38 +00001352void *
Fred Drake100814d2000-07-09 15:48:49 +00001353PyObject_Malloc(size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001354{
1355 return PyObject_MALLOC(nbytes);
1356}
1357
Thomas Wouters334fb892000-07-25 12:56:38 +00001358void *
1359PyObject_Realloc(void *p, size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001360{
1361 return PyObject_REALLOC(p, nbytes);
1362}
1363
1364void
Thomas Wouters334fb892000-07-25 12:56:38 +00001365PyObject_Free(void *p)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001366{
1367 PyObject_FREE(p);
Guido van Rossume09fb551997-08-05 02:04:34 +00001368}
Guido van Rossum86610361998-04-10 22:32:46 +00001369
1370
1371/* These methods are used to control infinite recursion in repr, str, print,
1372 etc. Container objects that may recursively contain themselves,
1373 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
1374 Py_ReprLeave() to avoid infinite recursion.
1375
1376 Py_ReprEnter() returns 0 the first time it is called for a particular
1377 object and 1 every time thereafter. It returns -1 if an exception
1378 occurred. Py_ReprLeave() has no return value.
1379
1380 See dictobject.c and listobject.c for examples of use.
1381*/
1382
1383#define KEY "Py_Repr"
1384
1385int
Fred Drake100814d2000-07-09 15:48:49 +00001386Py_ReprEnter(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001387{
1388 PyObject *dict;
1389 PyObject *list;
1390 int i;
1391
1392 dict = PyThreadState_GetDict();
1393 if (dict == NULL)
1394 return -1;
1395 list = PyDict_GetItemString(dict, KEY);
1396 if (list == NULL) {
1397 list = PyList_New(0);
1398 if (list == NULL)
1399 return -1;
1400 if (PyDict_SetItemString(dict, KEY, list) < 0)
1401 return -1;
1402 Py_DECREF(list);
1403 }
1404 i = PyList_GET_SIZE(list);
1405 while (--i >= 0) {
1406 if (PyList_GET_ITEM(list, i) == obj)
1407 return 1;
1408 }
1409 PyList_Append(list, obj);
1410 return 0;
1411}
1412
1413void
Fred Drake100814d2000-07-09 15:48:49 +00001414Py_ReprLeave(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001415{
1416 PyObject *dict;
1417 PyObject *list;
1418 int i;
1419
1420 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001421 if (dict == NULL)
1422 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001423 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001424 if (list == NULL || !PyList_Check(list))
1425 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001426 i = PyList_GET_SIZE(list);
1427 /* Count backwards because we always expect obj to be list[-1] */
1428 while (--i >= 0) {
1429 if (PyList_GET_ITEM(list, i) == obj) {
1430 PyList_SetSlice(list, i, i + 1, NULL);
1431 break;
1432 }
1433 }
1434}
Guido van Rossumd724b232000-03-13 16:01:29 +00001435
1436/*
1437 trashcan
1438 CT 2k0130
1439 non-recursively destroy nested objects
1440
1441 CT 2k0223
1442 everything is now done in a macro.
1443
1444 CT 2k0305
1445 modified to use functions, after Tim Peter's suggestion.
1446
1447 CT 2k0309
1448 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001449
1450 CT 2k0325
1451 added better safe than sorry check for threadstate
Guido van Rossume92e6102000-04-24 15:40:53 +00001452
1453 CT 2k0422
1454 complete rewrite. We now build a chain via ob_type
1455 and save the limited number of types in ob_refcnt.
1456 This is perfect since we don't need any memory.
1457 A patch for free-threading would need just a lock.
Guido van Rossumd724b232000-03-13 16:01:29 +00001458*/
1459
Guido van Rossume92e6102000-04-24 15:40:53 +00001460#define Py_TRASHCAN_TUPLE 1
1461#define Py_TRASHCAN_LIST 2
1462#define Py_TRASHCAN_DICT 3
1463#define Py_TRASHCAN_FRAME 4
1464#define Py_TRASHCAN_TRACEBACK 5
1465/* extend here if other objects want protection */
1466
Guido van Rossumd724b232000-03-13 16:01:29 +00001467int _PyTrash_delete_nesting = 0;
Guido van Rossume92e6102000-04-24 15:40:53 +00001468
Guido van Rossumd724b232000-03-13 16:01:29 +00001469PyObject * _PyTrash_delete_later = NULL;
1470
1471void
Fred Drake100814d2000-07-09 15:48:49 +00001472_PyTrash_deposit_object(PyObject *op)
Guido van Rossumd724b232000-03-13 16:01:29 +00001473{
Guido van Rossume92e6102000-04-24 15:40:53 +00001474 int typecode;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001475
Guido van Rossume92e6102000-04-24 15:40:53 +00001476 if (PyTuple_Check(op))
1477 typecode = Py_TRASHCAN_TUPLE;
1478 else if (PyList_Check(op))
1479 typecode = Py_TRASHCAN_LIST;
1480 else if (PyDict_Check(op))
1481 typecode = Py_TRASHCAN_DICT;
1482 else if (PyFrame_Check(op))
1483 typecode = Py_TRASHCAN_FRAME;
1484 else if (PyTraceBack_Check(op))
1485 typecode = Py_TRASHCAN_TRACEBACK;
Moshe Zadkacf703f02000-08-04 15:36:13 +00001486 else /* We have a bug here -- those are the only types in GC */ {
1487 Py_FatalError("Type not supported in GC -- internal bug");
1488 return; /* pacify compiler -- execution never here */
1489 }
Guido van Rossume92e6102000-04-24 15:40:53 +00001490 op->ob_refcnt = typecode;
Guido van Rossumd724b232000-03-13 16:01:29 +00001491
Guido van Rossume92e6102000-04-24 15:40:53 +00001492 op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
1493 _PyTrash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00001494}
1495
1496void
Fred Drake100814d2000-07-09 15:48:49 +00001497_PyTrash_destroy_chain(void)
Guido van Rossumd724b232000-03-13 16:01:29 +00001498{
1499 while (_PyTrash_delete_later) {
1500 PyObject *shredder = _PyTrash_delete_later;
Guido van Rossume92e6102000-04-24 15:40:53 +00001501 _PyTrash_delete_later = (PyObject*) shredder->ob_type;
1502
1503 switch (shredder->ob_refcnt) {
1504 case Py_TRASHCAN_TUPLE:
1505 shredder->ob_type = &PyTuple_Type;
1506 break;
1507 case Py_TRASHCAN_LIST:
1508 shredder->ob_type = &PyList_Type;
1509 break;
1510 case Py_TRASHCAN_DICT:
1511 shredder->ob_type = &PyDict_Type;
1512 break;
1513 case Py_TRASHCAN_FRAME:
1514 shredder->ob_type = &PyFrame_Type;
1515 break;
1516 case Py_TRASHCAN_TRACEBACK:
1517 shredder->ob_type = &PyTraceBack_Type;
1518 break;
1519 }
1520 _Py_NewReference(shredder);
1521
Guido van Rossumd724b232000-03-13 16:01:29 +00001522 ++_PyTrash_delete_nesting;
1523 Py_DECREF(shredder);
1524 --_PyTrash_delete_nesting;
1525 }
1526}