blob: df2531371fa5b1f5db6388e6d8cc65a9ff300e1f [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Benjamin Peterson722954a2011-06-11 16:33:35 -05002/* Generic object operations; and implementation of None */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Victor Stinner331a6a52019-05-27 16:39:22 +02005#include "pycore_initconfig.h"
Victor Stinner0fc91ee2019-04-12 21:51:34 +02006#include "pycore_object.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01007#include "pycore_pystate.h"
Victor Stinner27e2d1f2018-11-01 00:52:28 +01008#include "pycore_context.h"
Benjamin Petersonfd838e62009-04-20 02:09:13 +00009#include "frameobject.h"
Eric Snowc11183c2019-03-15 16:35:46 -060010#include "interpreteridobject.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000012#ifdef __cplusplus
13extern "C" {
14#endif
15
Victor Stinner626bff82018-10-25 17:31:10 +020016/* Defined in tracemalloc.c */
17extern void _PyMem_DumpTraceback(int fd, const void *ptr);
18
Victor Stinnerbd303c12013-11-07 23:07:29 +010019_Py_IDENTIFIER(Py_Repr);
20_Py_IDENTIFIER(__bytes__);
21_Py_IDENTIFIER(__dir__);
22_Py_IDENTIFIER(__isabstractmethod__);
Victor Stinnerbd303c12013-11-07 23:07:29 +010023
Victor Stinner0fc91ee2019-04-12 21:51:34 +020024
25int
26_PyObject_CheckConsistency(PyObject *op, int check_content)
27{
28 _PyObject_ASSERT(op, op != NULL);
29 _PyObject_ASSERT(op, !_PyObject_IsFreed(op));
30 _PyObject_ASSERT(op, Py_REFCNT(op) >= 1);
31
32 PyTypeObject *type = op->ob_type;
33 _PyObject_ASSERT(op, type != NULL);
34 _PyType_CheckConsistency(type);
35
36 if (PyUnicode_Check(op)) {
37 _PyUnicode_CheckConsistency(op, check_content);
38 }
39 else if (PyDict_Check(op)) {
40 _PyDict_CheckConsistency(op, check_content);
41 }
42 return 1;
43}
44
45
Tim Peters34592512002-07-11 06:23:50 +000046#ifdef Py_REF_DEBUG
Neal Norwitz84632ee2006-03-04 20:00:59 +000047Py_ssize_t _Py_RefTotal;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000048
49Py_ssize_t
50_Py_GetRefTotal(void)
51{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 PyObject *o;
53 Py_ssize_t total = _Py_RefTotal;
Antoine Pitrou9d952542013-08-24 21:07:07 +020054 o = _PySet_Dummy;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 if (o != NULL)
56 total -= o->ob_refcnt;
57 return total;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000058}
Nick Coghland6009512014-11-20 21:39:37 +100059
60void
61_PyDebug_PrintTotalRefs(void) {
Eric Snowdae02762017-09-14 00:35:58 -070062 fprintf(stderr,
63 "[%" PY_FORMAT_SIZE_T "d refs, "
64 "%" PY_FORMAT_SIZE_T "d blocks]\n",
65 _Py_GetRefTotal(), _Py_GetAllocatedBlocks());
Nick Coghland6009512014-11-20 21:39:37 +100066}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000067#endif /* Py_REF_DEBUG */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068
Guido van Rossum3f5da241990-12-20 15:06:42 +000069/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
70 These are used by the individual routines for object creation.
71 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072
Tim Peters78be7992003-03-23 02:51:01 +000073#ifdef Py_TRACE_REFS
Tim Peters7571a0f2003-03-23 17:52:28 +000074/* Head of circular doubly-linked list of all objects. These are linked
75 * together via the _ob_prev and _ob_next members of a PyObject, which
76 * exist only in a Py_TRACE_REFS build.
77 */
Tim Peters78be7992003-03-23 02:51:01 +000078static PyObject refchain = {&refchain, &refchain};
Tim Peters36eb4df2003-03-23 03:33:13 +000079
Tim Peters7571a0f2003-03-23 17:52:28 +000080/* Insert op at the front of the list of all objects. If force is true,
81 * op is added even if _ob_prev and _ob_next are non-NULL already. If
82 * force is false amd _ob_prev or _ob_next are non-NULL, do nothing.
83 * force should be true if and only if op points to freshly allocated,
84 * uninitialized memory, or you've unlinked op from the list and are
Tim Peters51f8d382003-03-23 18:06:08 +000085 * relinking it into the front.
Tim Peters7571a0f2003-03-23 17:52:28 +000086 * Note that objects are normally added to the list via _Py_NewReference,
87 * which is called by PyObject_Init. Not all objects are initialized that
88 * way, though; exceptions include statically allocated type objects, and
89 * statically allocated singletons (like Py_True and Py_None).
90 */
Tim Peters36eb4df2003-03-23 03:33:13 +000091void
Tim Peters7571a0f2003-03-23 17:52:28 +000092_Py_AddToAllObjects(PyObject *op, int force)
Tim Peters36eb4df2003-03-23 03:33:13 +000093{
Tim Peters7571a0f2003-03-23 17:52:28 +000094#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 if (!force) {
96 /* If it's initialized memory, op must be in or out of
97 * the list unambiguously.
98 */
Victor Stinner24702042018-10-26 17:16:37 +020099 _PyObject_ASSERT(op, (op->_ob_prev == NULL) == (op->_ob_next == NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 }
Tim Peters78be7992003-03-23 02:51:01 +0000101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 if (force || op->_ob_prev == NULL) {
103 op->_ob_next = refchain._ob_next;
104 op->_ob_prev = &refchain;
105 refchain._ob_next->_ob_prev = op;
106 refchain._ob_next = op;
107 }
Tim Peters7571a0f2003-03-23 17:52:28 +0000108}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109#endif /* Py_TRACE_REFS */
Tim Peters78be7992003-03-23 02:51:01 +0000110
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000111#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112static PyTypeObject *type_list;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000113/* All types are added to type_list, at least when
114 they get one object created. That makes them
115 immortal, which unfortunately contributes to
116 garbage itself. If unlist_types_without_objects
117 is set, they will be removed from the type_list
118 once the last object is deallocated. */
Benjamin Petersona4a37fe2009-01-11 17:13:55 +0000119static int unlist_types_without_objects;
Pablo Galindo49c75a82018-10-28 15:02:17 +0000120extern Py_ssize_t _Py_tuple_zero_allocs, _Py_fast_tuple_allocs;
121extern Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs;
122extern Py_ssize_t _Py_null_strings, _Py_one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000123void
Pablo Galindo49c75a82018-10-28 15:02:17 +0000124_Py_dump_counts(FILE* f)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000125{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200126 PyInterpreterState *interp = _PyInterpreterState_Get();
Victor Stinner331a6a52019-05-27 16:39:22 +0200127 if (!interp->config.show_alloc_count) {
Serhiy Storchaka7e160ce2016-07-03 21:03:53 +0300128 return;
Victor Stinner25420fe2017-11-20 18:12:22 -0800129 }
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000130
Eddie Elizondo745dc652018-02-21 20:55:18 -0800131 PyTypeObject *tp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 for (tp = type_list; tp; tp = tp->tp_next)
133 fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, "
134 "freed: %" PY_FORMAT_SIZE_T "d, "
135 "max in use: %" PY_FORMAT_SIZE_T "d\n",
136 tp->tp_name, tp->tp_allocs, tp->tp_frees,
137 tp->tp_maxalloc);
138 fprintf(f, "fast tuple allocs: %" PY_FORMAT_SIZE_T "d, "
139 "empty: %" PY_FORMAT_SIZE_T "d\n",
Pablo Galindo49c75a82018-10-28 15:02:17 +0000140 _Py_fast_tuple_allocs, _Py_tuple_zero_allocs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 fprintf(f, "fast int allocs: pos: %" PY_FORMAT_SIZE_T "d, "
142 "neg: %" PY_FORMAT_SIZE_T "d\n",
Pablo Galindo49c75a82018-10-28 15:02:17 +0000143 _Py_quick_int_allocs, _Py_quick_neg_int_allocs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 fprintf(f, "null strings: %" PY_FORMAT_SIZE_T "d, "
145 "1-strings: %" PY_FORMAT_SIZE_T "d\n",
Pablo Galindo49c75a82018-10-28 15:02:17 +0000146 _Py_null_strings, _Py_one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000147}
148
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000149PyObject *
Pablo Galindo49c75a82018-10-28 15:02:17 +0000150_Py_get_counts(void)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyTypeObject *tp;
153 PyObject *result;
154 PyObject *v;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 result = PyList_New(0);
157 if (result == NULL)
158 return NULL;
159 for (tp = type_list; tp; tp = tp->tp_next) {
160 v = Py_BuildValue("(snnn)", tp->tp_name, tp->tp_allocs,
161 tp->tp_frees, tp->tp_maxalloc);
162 if (v == NULL) {
163 Py_DECREF(result);
164 return NULL;
165 }
166 if (PyList_Append(result, v) < 0) {
167 Py_DECREF(v);
168 Py_DECREF(result);
169 return NULL;
170 }
171 Py_DECREF(v);
172 }
173 return result;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000174}
175
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000176void
Pablo Galindo49c75a82018-10-28 15:02:17 +0000177_Py_inc_count(PyTypeObject *tp)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 if (tp->tp_next == NULL && tp->tp_prev == NULL) {
180 /* first time; insert in linked list */
181 if (tp->tp_next != NULL) /* sanity check */
Pablo Galindo49c75a82018-10-28 15:02:17 +0000182 Py_FatalError("XXX _Py_inc_count sanity check");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 if (type_list)
184 type_list->tp_prev = tp;
185 tp->tp_next = type_list;
186 /* Note that as of Python 2.2, heap-allocated type objects
187 * can go away, but this code requires that they stay alive
188 * until program exit. That's why we're careful with
189 * refcounts here. type_list gets a new reference to tp,
190 * while ownership of the reference type_list used to hold
191 * (if any) was transferred to tp->tp_next in the line above.
192 * tp is thus effectively immortal after this.
193 */
194 Py_INCREF(tp);
195 type_list = tp;
Tim Peters3e40c7f2003-03-23 03:04:32 +0000196#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 /* Also insert in the doubly-linked list of all objects,
198 * if not already there.
199 */
200 _Py_AddToAllObjects((PyObject *)tp, 0);
Tim Peters78be7992003-03-23 02:51:01 +0000201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 }
203 tp->tp_allocs++;
204 if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc)
205 tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000206}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000207
Pablo Galindo49c75a82018-10-28 15:02:17 +0000208void _Py_dec_count(PyTypeObject *tp)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 tp->tp_frees++;
211 if (unlist_types_without_objects &&
212 tp->tp_allocs == tp->tp_frees) {
213 /* unlink the type from type_list */
214 if (tp->tp_prev)
215 tp->tp_prev->tp_next = tp->tp_next;
216 else
217 type_list = tp->tp_next;
218 if (tp->tp_next)
219 tp->tp_next->tp_prev = tp->tp_prev;
220 tp->tp_next = tp->tp_prev = NULL;
221 Py_DECREF(tp);
222 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000223}
224
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000225#endif
226
Tim Peters7c321a82002-07-09 02:57:01 +0000227#ifdef Py_REF_DEBUG
228/* Log a fatal error; doesn't return. */
229void
Victor Stinner18618e652018-10-25 17:28:11 +0200230_Py_NegativeRefcount(const char *filename, int lineno, PyObject *op)
Tim Peters7c321a82002-07-09 02:57:01 +0000231{
Victor Stinnerf1d002c2018-11-21 23:53:44 +0100232 _PyObject_AssertFailed(op, NULL, "object has negative ref count",
Victor Stinner3ec9af72018-10-26 02:12:34 +0200233 filename, lineno, __func__);
Tim Peters7c321a82002-07-09 02:57:01 +0000234}
235
236#endif /* Py_REF_DEBUG */
237
Thomas Heller1328b522004-04-22 17:23:49 +0000238void
239Py_IncRef(PyObject *o)
240{
241 Py_XINCREF(o);
242}
243
244void
245Py_DecRef(PyObject *o)
246{
247 Py_XDECREF(o);
248}
249
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000251PyObject_Init(PyObject *op, PyTypeObject *tp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 if (op == NULL)
254 return PyErr_NoMemory();
255 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
256 Py_TYPE(op) = tp;
Eddie Elizondo364f0b02019-03-27 07:52:18 -0400257 if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) {
258 Py_INCREF(tp);
259 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 _Py_NewReference(op);
261 return op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262}
263
Guido van Rossumb18618d2000-05-03 23:44:39 +0000264PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000265PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 if (op == NULL)
268 return (PyVarObject *) PyErr_NoMemory();
269 /* Any changes should be reflected in PyObject_INIT_VAR */
Eddie Elizondo364f0b02019-03-27 07:52:18 -0400270 Py_SIZE(op) = size;
271 PyObject_Init((PyObject *)op, tp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 return op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000273}
274
275PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000276_PyObject_New(PyTypeObject *tp)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 PyObject *op;
279 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
280 if (op == NULL)
281 return PyErr_NoMemory();
282 return PyObject_INIT(op, tp);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000283}
284
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000285PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000286_PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 PyVarObject *op;
289 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
290 op = (PyVarObject *) PyObject_MALLOC(size);
291 if (op == NULL)
292 return (PyVarObject *)PyErr_NoMemory();
293 return PyObject_INIT_VAR(op, tp, nitems);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000294}
295
Antoine Pitrou796564c2013-07-30 19:59:21 +0200296void
297PyObject_CallFinalizer(PyObject *self)
298{
299 PyTypeObject *tp = Py_TYPE(self);
300
Antoine Pitrouada319b2019-05-29 22:12:38 +0200301 if (tp->tp_finalize == NULL)
Antoine Pitrou796564c2013-07-30 19:59:21 +0200302 return;
303 /* tp_finalize should only be called once. */
304 if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
305 return;
306
307 tp->tp_finalize(self);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900308 if (PyType_IS_GC(tp)) {
309 _PyGC_SET_FINALIZED(self);
310 }
Antoine Pitrou796564c2013-07-30 19:59:21 +0200311}
312
313int
314PyObject_CallFinalizerFromDealloc(PyObject *self)
315{
316 Py_ssize_t refcnt;
317
318 /* Temporarily resurrect the object. */
319 if (self->ob_refcnt != 0) {
320 Py_FatalError("PyObject_CallFinalizerFromDealloc called on "
321 "object with a non-zero refcount");
322 }
323 self->ob_refcnt = 1;
324
325 PyObject_CallFinalizer(self);
326
327 /* Undo the temporary resurrection; can't use DECREF here, it would
328 * cause a recursive call.
329 */
Victor Stinner24702042018-10-26 17:16:37 +0200330 _PyObject_ASSERT_WITH_MSG(self,
331 self->ob_refcnt > 0,
332 "refcount is too small");
Antoine Pitrou796564c2013-07-30 19:59:21 +0200333 if (--self->ob_refcnt == 0)
334 return 0; /* this is the normal path out */
335
336 /* tp_finalize resurrected it! Make it look like the original Py_DECREF
337 * never happened.
338 */
339 refcnt = self->ob_refcnt;
340 _Py_NewReference(self);
341 self->ob_refcnt = refcnt;
342
Victor Stinner24702042018-10-26 17:16:37 +0200343 _PyObject_ASSERT(self,
344 (!PyType_IS_GC(Py_TYPE(self))
345 || _PyObject_GC_IS_TRACKED(self)));
Antoine Pitrou796564c2013-07-30 19:59:21 +0200346 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
347 * we need to undo that. */
348 _Py_DEC_REFTOTAL;
349 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
350 * chain, so no more to do there.
351 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
352 * _Py_NewReference bumped tp_allocs: both of those need to be
353 * undone.
354 */
355#ifdef COUNT_ALLOCS
356 --Py_TYPE(self)->tp_frees;
357 --Py_TYPE(self)->tp_allocs;
358#endif
359 return -1;
360}
361
Antoine Pitrouc47bd4a2010-07-27 22:08:27 +0000362int
363PyObject_Print(PyObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 int ret = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 if (PyErr_CheckSignals())
367 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000368#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 if (PyOS_CheckStack()) {
370 PyErr_SetString(PyExc_MemoryError, "stack overflow");
371 return -1;
372 }
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 clearerr(fp); /* Clear any previous error condition */
375 if (op == NULL) {
376 Py_BEGIN_ALLOW_THREADS
377 fprintf(fp, "<nil>");
378 Py_END_ALLOW_THREADS
379 }
380 else {
Victor Stinner3ec9af72018-10-26 02:12:34 +0200381 if (op->ob_refcnt <= 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 /* XXX(twouters) cast refcount to long until %zd is
383 universally available */
384 Py_BEGIN_ALLOW_THREADS
385 fprintf(fp, "<refcnt %ld at %p>",
Zackery Spytz1a2252e2019-05-06 10:56:51 -0600386 (long)op->ob_refcnt, (void *)op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 Py_END_ALLOW_THREADS
Victor Stinner3ec9af72018-10-26 02:12:34 +0200388 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 else {
390 PyObject *s;
391 if (flags & Py_PRINT_RAW)
392 s = PyObject_Str(op);
393 else
394 s = PyObject_Repr(op);
395 if (s == NULL)
396 ret = -1;
397 else if (PyBytes_Check(s)) {
398 fwrite(PyBytes_AS_STRING(s), 1,
399 PyBytes_GET_SIZE(s), fp);
400 }
401 else if (PyUnicode_Check(s)) {
402 PyObject *t;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200403 t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace");
Zackery Spytzae62f012018-10-06 00:44:25 -0600404 if (t == NULL) {
405 ret = -1;
406 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 else {
408 fwrite(PyBytes_AS_STRING(t), 1,
409 PyBytes_GET_SIZE(t), fp);
Victor Stinnerba6b4302010-05-17 09:33:42 +0000410 Py_DECREF(t);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 }
412 }
413 else {
414 PyErr_Format(PyExc_TypeError,
415 "str() or repr() returned '%.100s'",
416 s->ob_type->tp_name);
417 ret = -1;
418 }
419 Py_XDECREF(s);
420 }
421 }
422 if (ret == 0) {
423 if (ferror(fp)) {
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300424 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 clearerr(fp);
426 ret = -1;
427 }
428 }
429 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430}
431
Guido van Rossum38938152006-08-21 23:36:26 +0000432/* For debugging convenience. Set a breakpoint here and call it from your DLL */
433void
Thomas Woutersb2137042007-02-01 18:02:27 +0000434_Py_BreakPoint(void)
Guido van Rossum38938152006-08-21 23:36:26 +0000435{
436}
437
Neal Norwitz1a997502003-01-13 20:13:12 +0000438
Victor Stinner4c409be2019-04-11 13:01:15 +0200439/* Heuristic checking if the object memory is uninitialized or deallocated.
440 Rely on the debug hooks on Python memory allocators:
441 see _PyMem_IsPtrFreed().
Victor Stinner82af0b62018-10-23 17:39:40 +0200442
443 The function can be used to prevent segmentation fault on dereferencing
Victor Stinner4c409be2019-04-11 13:01:15 +0200444 pointers like 0xDDDDDDDDDDDDDDDD. */
Victor Stinner82af0b62018-10-23 17:39:40 +0200445int
446_PyObject_IsFreed(PyObject *op)
447{
Victor Stinner2b00db62019-04-11 11:33:27 +0200448 if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(op->ob_type)) {
Victor Stinner2cf5d322018-11-22 16:32:57 +0100449 return 1;
450 }
Victor Stinner2b00db62019-04-11 11:33:27 +0200451 /* ignore op->ob_ref: its value can have be modified
Victor Stinner82af0b62018-10-23 17:39:40 +0200452 by Py_INCREF() and Py_DECREF(). */
453#ifdef Py_TRACE_REFS
Victor Stinner2b00db62019-04-11 11:33:27 +0200454 if (_PyMem_IsPtrFreed(op->_ob_next) || _PyMem_IsPtrFreed(op->_ob_prev)) {
455 return 1;
456 }
Victor Stinner82af0b62018-10-23 17:39:40 +0200457#endif
Victor Stinner2b00db62019-04-11 11:33:27 +0200458 return 0;
Victor Stinner82af0b62018-10-23 17:39:40 +0200459}
460
461
Barry Warsaw9bf16442001-01-23 16:24:35 +0000462/* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */
Guido van Rossum38938152006-08-21 23:36:26 +0000463void
464_PyObject_Dump(PyObject* op)
Barry Warsaw9bf16442001-01-23 16:24:35 +0000465{
Victor Stinner82af0b62018-10-23 17:39:40 +0200466 if (op == NULL) {
Victor Stinner47bbab92019-09-18 14:10:16 +0200467 fprintf(stderr, "<object at NULL>\n");
Victor Stinner82af0b62018-10-23 17:39:40 +0200468 fflush(stderr);
469 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 }
Victor Stinner82af0b62018-10-23 17:39:40 +0200471
472 if (_PyObject_IsFreed(op)) {
473 /* It seems like the object memory has been freed:
474 don't access it to prevent a segmentation fault. */
Victor Stinner47bbab92019-09-18 14:10:16 +0200475 fprintf(stderr, "<object at %p is freed>\n", op);
Victor Stinner2cf5d322018-11-22 16:32:57 +0100476 return;
Victor Stinner82af0b62018-10-23 17:39:40 +0200477 }
478
479 PyGILState_STATE gil;
480 PyObject *error_type, *error_value, *error_traceback;
481
482 fprintf(stderr, "object : ");
483 fflush(stderr);
484 gil = PyGILState_Ensure();
485
486 PyErr_Fetch(&error_type, &error_value, &error_traceback);
487 (void)PyObject_Print(op, stderr, 0);
488 fflush(stderr);
489 PyErr_Restore(error_type, error_value, error_traceback);
490
491 PyGILState_Release(gil);
492 /* XXX(twouters) cast refcount to long until %zd is
493 universally available */
494 fprintf(stderr, "\n"
495 "type : %s\n"
496 "refcount: %ld\n"
497 "address : %p\n",
498 Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name,
499 (long)op->ob_refcnt,
Zackery Spytz1a2252e2019-05-06 10:56:51 -0600500 (void *)op);
Victor Stinner82af0b62018-10-23 17:39:40 +0200501 fflush(stderr);
Barry Warsaw9bf16442001-01-23 16:24:35 +0000502}
Barry Warsaw903138f2001-01-23 16:33:18 +0000503
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000505PyObject_Repr(PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 PyObject *res;
508 if (PyErr_CheckSignals())
509 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000510#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 if (PyOS_CheckStack()) {
512 PyErr_SetString(PyExc_MemoryError, "stack overflow");
513 return NULL;
514 }
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 if (v == NULL)
517 return PyUnicode_FromString("<NULL>");
518 if (Py_TYPE(v)->tp_repr == NULL)
519 return PyUnicode_FromFormat("<%s object at %p>",
520 v->ob_type->tp_name, v);
Victor Stinner33824f62013-08-26 14:05:19 +0200521
522#ifdef Py_DEBUG
523 /* PyObject_Repr() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +0100524 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +0000525 caller loses its exception */
Victor Stinner33824f62013-08-26 14:05:19 +0200526 assert(!PyErr_Occurred());
527#endif
528
Serhiy Storchaka1fb72d22017-12-03 22:12:11 +0200529 /* It is possible for a type to have a tp_repr representation that loops
530 infinitely. */
531 if (Py_EnterRecursiveCall(" while getting the repr of an object"))
532 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 res = (*v->ob_type->tp_repr)(v);
Serhiy Storchaka1fb72d22017-12-03 22:12:11 +0200534 Py_LeaveRecursiveCall();
Victor Stinner0a54cf12011-12-01 03:22:44 +0100535 if (res == NULL)
536 return NULL;
537 if (!PyUnicode_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 PyErr_Format(PyExc_TypeError,
539 "__repr__ returned non-string (type %.200s)",
540 res->ob_type->tp_name);
541 Py_DECREF(res);
542 return NULL;
543 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100544#ifndef Py_DEBUG
545 if (PyUnicode_READY(res) < 0)
546 return NULL;
547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549}
550
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +0000552PyObject_Str(PyObject *v)
Guido van Rossumc6004111993-11-05 10:22:19 +0000553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 PyObject *res;
555 if (PyErr_CheckSignals())
556 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000557#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (PyOS_CheckStack()) {
559 PyErr_SetString(PyExc_MemoryError, "stack overflow");
560 return NULL;
561 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 if (v == NULL)
564 return PyUnicode_FromString("<NULL>");
565 if (PyUnicode_CheckExact(v)) {
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100566#ifndef Py_DEBUG
Victor Stinner4ead7c72011-11-20 19:48:36 +0100567 if (PyUnicode_READY(v) < 0)
568 return NULL;
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 Py_INCREF(v);
571 return v;
572 }
573 if (Py_TYPE(v)->tp_str == NULL)
574 return PyObject_Repr(v);
Guido van Rossum4f288ab2001-05-01 16:53:37 +0000575
Victor Stinner33824f62013-08-26 14:05:19 +0200576#ifdef Py_DEBUG
577 /* PyObject_Str() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +0100578 because it can clear it (directly or indirectly) and so the
Nick Coghland979e432014-02-09 10:43:21 +1000579 caller loses its exception */
Victor Stinner33824f62013-08-26 14:05:19 +0200580 assert(!PyErr_Occurred());
581#endif
582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 /* It is possible for a type to have a tp_str representation that loops
584 infinitely. */
585 if (Py_EnterRecursiveCall(" while getting the str of an object"))
586 return NULL;
587 res = (*Py_TYPE(v)->tp_str)(v);
588 Py_LeaveRecursiveCall();
589 if (res == NULL)
590 return NULL;
591 if (!PyUnicode_Check(res)) {
592 PyErr_Format(PyExc_TypeError,
593 "__str__ returned non-string (type %.200s)",
594 Py_TYPE(res)->tp_name);
595 Py_DECREF(res);
596 return NULL;
597 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100598#ifndef Py_DEBUG
Victor Stinner4ead7c72011-11-20 19:48:36 +0100599 if (PyUnicode_READY(res) < 0)
600 return NULL;
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100601#endif
Victor Stinner4ead7c72011-11-20 19:48:36 +0100602 assert(_PyUnicode_CheckConsistency(res, 1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 return res;
Neil Schemenauercf52c072005-08-12 17:34:58 +0000604}
605
Georg Brandl559e5d72008-06-11 18:37:52 +0000606PyObject *
607PyObject_ASCII(PyObject *v)
608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 PyObject *repr, *ascii, *res;
Georg Brandl559e5d72008-06-11 18:37:52 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 repr = PyObject_Repr(v);
612 if (repr == NULL)
613 return NULL;
Georg Brandl559e5d72008-06-11 18:37:52 +0000614
Victor Stinneraf037572013-04-14 18:44:10 +0200615 if (PyUnicode_IS_ASCII(repr))
616 return repr;
617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 /* repr is guaranteed to be a PyUnicode object by PyObject_Repr */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200619 ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 Py_DECREF(repr);
621 if (ascii == NULL)
622 return NULL;
Georg Brandl559e5d72008-06-11 18:37:52 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 res = PyUnicode_DecodeASCII(
625 PyBytes_AS_STRING(ascii),
626 PyBytes_GET_SIZE(ascii),
627 NULL);
628
629 Py_DECREF(ascii);
630 return res;
Georg Brandl559e5d72008-06-11 18:37:52 +0000631}
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000632
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000633PyObject *
634PyObject_Bytes(PyObject *v)
635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 PyObject *result, *func;
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 if (v == NULL)
639 return PyBytes_FromString("<NULL>");
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (PyBytes_CheckExact(v)) {
642 Py_INCREF(v);
643 return v;
644 }
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000645
Benjamin Petersonce798522012-01-22 11:24:29 -0500646 func = _PyObject_LookupSpecial(v, &PyId___bytes__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 if (func != NULL) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100648 result = _PyObject_CallNoArg(func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 Py_DECREF(func);
650 if (result == NULL)
Benjamin Peterson41ece392010-09-11 16:39:57 +0000651 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 if (!PyBytes_Check(result)) {
Benjamin Peterson41ece392010-09-11 16:39:57 +0000653 PyErr_Format(PyExc_TypeError,
654 "__bytes__ returned non-bytes (type %.200s)",
655 Py_TYPE(result)->tp_name);
656 Py_DECREF(result);
657 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 }
659 return result;
660 }
661 else if (PyErr_Occurred())
662 return NULL;
663 return PyBytes_FromObject(v);
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000664}
665
Mark Dickinsonc008a172009-02-01 13:59:22 +0000666/* For Python 3.0.1 and later, the old three-way comparison has been
667 completely removed in favour of rich comparisons. PyObject_Compare() and
668 PyObject_Cmp() are gone, and the builtin cmp function no longer exists.
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200669 The old tp_compare slot has been renamed to tp_as_async, and should no
Mark Dickinsonc008a172009-02-01 13:59:22 +0000670 longer be used. Use tp_richcompare instead.
Guido van Rossum98297ee2007-11-06 21:34:58 +0000671
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000672 See (*) below for practical amendments.
673
Mark Dickinsonc008a172009-02-01 13:59:22 +0000674 tp_richcompare gets called with a first argument of the appropriate type
675 and a second object of an arbitrary type. We never do any kind of
676 coercion.
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000677
Mark Dickinsonc008a172009-02-01 13:59:22 +0000678 The tp_richcompare slot should return an object, as follows:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000679
680 NULL if an exception occurred
681 NotImplemented if the requested comparison is not implemented
682 any other false value if the requested comparison is false
683 any other true value if the requested comparison is true
684
685 The PyObject_RichCompare[Bool]() wrappers raise TypeError when they get
686 NotImplemented.
687
688 (*) Practical amendments:
689
690 - If rich comparison returns NotImplemented, == and != are decided by
691 comparing the object pointer (i.e. falling back to the base object
692 implementation).
693
Guido van Rossuma4073002002-05-31 20:03:54 +0000694*/
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000695
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000696/* Map rich comparison operators to their swapped version, e.g. LT <--> GT */
Brett Cannona5ca2e72004-09-25 01:37:24 +0000697int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000698
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200699static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="};
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000700
701/* Perform a rich comparison, raising TypeError when the requested comparison
702 operator is not supported. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000703static PyObject *
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000704do_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossume797ec12001-01-17 15:24:28 +0000705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 richcmpfunc f;
707 PyObject *res;
708 int checked_reverse_op = 0;
Guido van Rossume797ec12001-01-17 15:24:28 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 if (v->ob_type != w->ob_type &&
711 PyType_IsSubtype(w->ob_type, v->ob_type) &&
712 (f = w->ob_type->tp_richcompare) != NULL) {
713 checked_reverse_op = 1;
714 res = (*f)(w, v, _Py_SwappedOp[op]);
715 if (res != Py_NotImplemented)
716 return res;
717 Py_DECREF(res);
718 }
719 if ((f = v->ob_type->tp_richcompare) != NULL) {
720 res = (*f)(v, w, op);
721 if (res != Py_NotImplemented)
722 return res;
723 Py_DECREF(res);
724 }
725 if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) {
726 res = (*f)(w, v, _Py_SwappedOp[op]);
727 if (res != Py_NotImplemented)
728 return res;
729 Py_DECREF(res);
730 }
731 /* If neither object implements it, provide a sensible default
732 for == and !=, but raise an exception for ordering. */
733 switch (op) {
734 case Py_EQ:
735 res = (v == w) ? Py_True : Py_False;
736 break;
737 case Py_NE:
738 res = (v != w) ? Py_True : Py_False;
739 break;
740 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 PyErr_Format(PyExc_TypeError,
Victor Stinner91108f02015-10-14 18:25:31 +0200742 "'%s' not supported between instances of '%.100s' and '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 opstrings[op],
Victor Stinner91108f02015-10-14 18:25:31 +0200744 v->ob_type->tp_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 w->ob_type->tp_name);
746 return NULL;
747 }
748 Py_INCREF(res);
749 return res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000750}
751
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000752/* Perform a rich comparison with object result. This wraps do_richcompare()
753 with a check for NULL arguments and a recursion check. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000754
Guido van Rossume797ec12001-01-17 15:24:28 +0000755PyObject *
756PyObject_RichCompare(PyObject *v, PyObject *w, int op)
757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 PyObject *res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 assert(Py_LT <= op && op <= Py_GE);
761 if (v == NULL || w == NULL) {
762 if (!PyErr_Occurred())
763 PyErr_BadInternalCall();
764 return NULL;
765 }
766 if (Py_EnterRecursiveCall(" in comparison"))
767 return NULL;
768 res = do_richcompare(v, w, op);
769 Py_LeaveRecursiveCall();
770 return res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000771}
772
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000773/* Perform a rich comparison with integer result. This wraps
774 PyObject_RichCompare(), returning -1 for error, 0 for false, 1 for true. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000775int
776PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 PyObject *res;
779 int ok;
Guido van Rossume797ec12001-01-17 15:24:28 +0000780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 /* Quick result when objects are the same.
782 Guarantees that identity implies equality. */
783 if (v == w) {
784 if (op == Py_EQ)
785 return 1;
786 else if (op == Py_NE)
787 return 0;
788 }
Mark Dickinson4a1f5932008-11-12 23:23:36 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 res = PyObject_RichCompare(v, w, op);
791 if (res == NULL)
792 return -1;
793 if (PyBool_Check(res))
794 ok = (res == Py_True);
795 else
796 ok = PyObject_IsTrue(res);
797 Py_DECREF(res);
798 return ok;
Guido van Rossume797ec12001-01-17 15:24:28 +0000799}
Fred Drake13634cf2000-06-29 19:17:04 +0000800
Antoine Pitrouce4a9da2011-11-21 20:46:33 +0100801Py_hash_t
Nick Coghland1abd252008-07-15 15:46:38 +0000802PyObject_HashNotImplemented(PyObject *v)
803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
805 Py_TYPE(v)->tp_name);
806 return -1;
Nick Coghland1abd252008-07-15 15:46:38 +0000807}
Fred Drake13634cf2000-06-29 19:17:04 +0000808
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000809Py_hash_t
Fred Drake100814d2000-07-09 15:48:49 +0000810PyObject_Hash(PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 PyTypeObject *tp = Py_TYPE(v);
813 if (tp->tp_hash != NULL)
814 return (*tp->tp_hash)(v);
815 /* To keep to the general practice that inheriting
816 * solely from object in C code should work without
817 * an explicit call to PyType_Ready, we implicitly call
818 * PyType_Ready here and then check the tp_hash slot again
819 */
820 if (tp->tp_dict == NULL) {
821 if (PyType_Ready(tp) < 0)
822 return -1;
823 if (tp->tp_hash != NULL)
824 return (*tp->tp_hash)(v);
825 }
826 /* Otherwise, the object can't be hashed */
827 return PyObject_HashNotImplemented(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828}
829
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000831PyObject_GetAttrString(PyObject *v, const char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 PyObject *w, *res;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 if (Py_TYPE(v)->tp_getattr != NULL)
836 return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
INADA Naoki3e8d6cb2017-02-21 23:57:25 +0900837 w = PyUnicode_FromString(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 if (w == NULL)
839 return NULL;
840 res = PyObject_GetAttr(v, w);
Victor Stinner59af08f2012-03-22 02:09:08 +0100841 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000843}
844
845int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000846PyObject_HasAttrString(PyObject *v, const char *name)
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 PyObject *res = PyObject_GetAttrString(v, name);
849 if (res != NULL) {
850 Py_DECREF(res);
851 return 1;
852 }
853 PyErr_Clear();
854 return 0;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000855}
856
857int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000858PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 PyObject *s;
861 int res;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 if (Py_TYPE(v)->tp_setattr != NULL)
864 return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
865 s = PyUnicode_InternFromString(name);
866 if (s == NULL)
867 return -1;
868 res = PyObject_SetAttr(v, s, w);
869 Py_XDECREF(s);
870 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871}
872
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500873int
874_PyObject_IsAbstract(PyObject *obj)
875{
876 int res;
877 PyObject* isabstract;
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500878
879 if (obj == NULL)
880 return 0;
881
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200882 res = _PyObject_LookupAttrId(obj, &PyId___isabstractmethod__, &isabstract);
883 if (res > 0) {
884 res = PyObject_IsTrue(isabstract);
885 Py_DECREF(isabstract);
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500886 }
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500887 return res;
888}
889
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000890PyObject *
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200891_PyObject_GetAttrId(PyObject *v, _Py_Identifier *name)
892{
893 PyObject *result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100894 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200895 if (!oname)
896 return NULL;
897 result = PyObject_GetAttr(v, oname);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200898 return result;
899}
900
901int
902_PyObject_HasAttrId(PyObject *v, _Py_Identifier *name)
903{
904 int result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100905 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200906 if (!oname)
907 return -1;
908 result = PyObject_HasAttr(v, oname);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200909 return result;
910}
911
912int
913_PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w)
914{
915 int result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100916 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200917 if (!oname)
918 return -1;
919 result = PyObject_SetAttr(v, oname, w);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200920 return result;
921}
922
923PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000924PyObject_GetAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 PyTypeObject *tp = Py_TYPE(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 if (!PyUnicode_Check(name)) {
929 PyErr_Format(PyExc_TypeError,
930 "attribute name must be string, not '%.200s'",
931 name->ob_type->tp_name);
932 return NULL;
933 }
934 if (tp->tp_getattro != NULL)
935 return (*tp->tp_getattro)(v, name);
936 if (tp->tp_getattr != NULL) {
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200937 const char *name_str = PyUnicode_AsUTF8(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (name_str == NULL)
939 return NULL;
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200940 return (*tp->tp_getattr)(v, (char *)name_str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 }
942 PyErr_Format(PyExc_AttributeError,
943 "'%.50s' object has no attribute '%U'",
944 tp->tp_name, name);
945 return NULL;
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000946}
947
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200948int
949_PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result)
INADA Naoki378edee2018-01-16 20:52:41 +0900950{
951 PyTypeObject *tp = Py_TYPE(v);
INADA Naoki378edee2018-01-16 20:52:41 +0900952
953 if (!PyUnicode_Check(name)) {
954 PyErr_Format(PyExc_TypeError,
955 "attribute name must be string, not '%.200s'",
956 name->ob_type->tp_name);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200957 *result = NULL;
958 return -1;
INADA Naoki378edee2018-01-16 20:52:41 +0900959 }
960
961 if (tp->tp_getattro == PyObject_GenericGetAttr) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200962 *result = _PyObject_GenericGetAttrWithDict(v, name, NULL, 1);
963 if (*result != NULL) {
964 return 1;
965 }
966 if (PyErr_Occurred()) {
967 return -1;
968 }
969 return 0;
INADA Naoki378edee2018-01-16 20:52:41 +0900970 }
971 if (tp->tp_getattro != NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200972 *result = (*tp->tp_getattro)(v, name);
INADA Naoki378edee2018-01-16 20:52:41 +0900973 }
974 else if (tp->tp_getattr != NULL) {
975 const char *name_str = PyUnicode_AsUTF8(name);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200976 if (name_str == NULL) {
977 *result = NULL;
978 return -1;
979 }
980 *result = (*tp->tp_getattr)(v, (char *)name_str);
INADA Naoki378edee2018-01-16 20:52:41 +0900981 }
INADA Naokie76daeb2018-01-26 16:22:51 +0900982 else {
983 *result = NULL;
984 return 0;
985 }
986
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200987 if (*result != NULL) {
988 return 1;
INADA Naoki378edee2018-01-16 20:52:41 +0900989 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200990 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
991 return -1;
992 }
993 PyErr_Clear();
994 return 0;
995}
996
997int
998_PyObject_LookupAttrId(PyObject *v, _Py_Identifier *name, PyObject **result)
999{
1000 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1001 if (!oname) {
1002 *result = NULL;
1003 return -1;
1004 }
1005 return _PyObject_LookupAttr(v, oname, result);
INADA Naoki378edee2018-01-16 20:52:41 +09001006}
1007
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001008int
Fred Drake100814d2000-07-09 15:48:49 +00001009PyObject_HasAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001010{
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001011 PyObject *res;
1012 if (_PyObject_LookupAttr(v, name, &res) < 0) {
1013 PyErr_Clear();
1014 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001016 if (res == NULL) {
1017 return 0;
1018 }
1019 Py_DECREF(res);
1020 return 1;
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001021}
1022
1023int
Fred Drake100814d2000-07-09 15:48:49 +00001024PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 PyTypeObject *tp = Py_TYPE(v);
1027 int err;
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 if (!PyUnicode_Check(name)) {
1030 PyErr_Format(PyExc_TypeError,
1031 "attribute name must be string, not '%.200s'",
1032 name->ob_type->tp_name);
1033 return -1;
1034 }
1035 Py_INCREF(name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 PyUnicode_InternInPlace(&name);
1038 if (tp->tp_setattro != NULL) {
1039 err = (*tp->tp_setattro)(v, name, value);
1040 Py_DECREF(name);
1041 return err;
1042 }
1043 if (tp->tp_setattr != NULL) {
Serhiy Storchaka2a404b62017-01-22 23:07:07 +02001044 const char *name_str = PyUnicode_AsUTF8(name);
Zackery Spytze0dcb852019-04-28 06:58:52 -06001045 if (name_str == NULL) {
1046 Py_DECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 return -1;
Zackery Spytze0dcb852019-04-28 06:58:52 -06001048 }
Serhiy Storchaka2a404b62017-01-22 23:07:07 +02001049 err = (*tp->tp_setattr)(v, (char *)name_str, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 Py_DECREF(name);
1051 return err;
1052 }
1053 Py_DECREF(name);
Victor Stinner24702042018-10-26 17:16:37 +02001054 _PyObject_ASSERT(name, name->ob_refcnt >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 if (tp->tp_getattr == NULL && tp->tp_getattro == NULL)
1056 PyErr_Format(PyExc_TypeError,
1057 "'%.100s' object has no attributes "
1058 "(%s .%U)",
1059 tp->tp_name,
1060 value==NULL ? "del" : "assign to",
1061 name);
1062 else
1063 PyErr_Format(PyExc_TypeError,
1064 "'%.100s' object has only read-only attributes "
1065 "(%s .%U)",
1066 tp->tp_name,
1067 value==NULL ? "del" : "assign to",
1068 name);
1069 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001070}
1071
1072/* Helper to get a pointer to an object's __dict__ slot, if any */
1073
1074PyObject **
1075_PyObject_GetDictPtr(PyObject *obj)
1076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 Py_ssize_t dictoffset;
1078 PyTypeObject *tp = Py_TYPE(obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 dictoffset = tp->tp_dictoffset;
1081 if (dictoffset == 0)
1082 return NULL;
1083 if (dictoffset < 0) {
1084 Py_ssize_t tsize;
1085 size_t size;
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 tsize = ((PyVarObject *)obj)->ob_size;
1088 if (tsize < 0)
1089 tsize = -tsize;
1090 size = _PyObject_VAR_SIZE(tp, tsize);
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 dictoffset += (long)size;
Victor Stinner24702042018-10-26 17:16:37 +02001093 _PyObject_ASSERT(obj, dictoffset > 0);
1094 _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 }
1096 return (PyObject **) ((char *)obj + dictoffset);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001097}
1098
Tim Peters6d6c1a32001-08-02 04:15:00 +00001099PyObject *
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00001100PyObject_SelfIter(PyObject *obj)
Raymond Hettinger01538262003-03-17 08:24:35 +00001101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 Py_INCREF(obj);
1103 return obj;
Raymond Hettinger01538262003-03-17 08:24:35 +00001104}
1105
Amaury Forgeot d'Arcf343e012009-01-12 23:58:21 +00001106/* Helper used when the __next__ method is removed from a type:
1107 tp_iternext is never NULL and can be safely called without checking
1108 on every iteration.
1109 */
1110
1111PyObject *
1112_PyObject_NextNotImplemented(PyObject *self)
1113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 PyErr_Format(PyExc_TypeError,
1115 "'%.200s' object is not iterable",
1116 Py_TYPE(self)->tp_name);
1117 return NULL;
Amaury Forgeot d'Arcf343e012009-01-12 23:58:21 +00001118}
1119
Yury Selivanovf2392132016-12-13 19:03:51 -05001120
1121/* Specialized version of _PyObject_GenericGetAttrWithDict
1122 specifically for the LOAD_METHOD opcode.
1123
1124 Return 1 if a method is found, 0 if it's a regular attribute
1125 from __dict__ or something returned by using a descriptor
1126 protocol.
1127
1128 `method` will point to the resolved attribute or NULL. In the
1129 latter case, an error will be set.
1130*/
1131int
1132_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
1133{
1134 PyTypeObject *tp = Py_TYPE(obj);
1135 PyObject *descr;
1136 descrgetfunc f = NULL;
1137 PyObject **dictptr, *dict;
1138 PyObject *attr;
1139 int meth_found = 0;
1140
1141 assert(*method == NULL);
1142
1143 if (Py_TYPE(obj)->tp_getattro != PyObject_GenericGetAttr
1144 || !PyUnicode_Check(name)) {
1145 *method = PyObject_GetAttr(obj, name);
1146 return 0;
1147 }
1148
1149 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1150 return 0;
1151
1152 descr = _PyType_Lookup(tp, name);
1153 if (descr != NULL) {
1154 Py_INCREF(descr);
Jeroen Demeyereb65e242019-05-28 14:42:53 +02001155 if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
Yury Selivanovf2392132016-12-13 19:03:51 -05001156 meth_found = 1;
1157 } else {
1158 f = descr->ob_type->tp_descr_get;
1159 if (f != NULL && PyDescr_IsData(descr)) {
1160 *method = f(descr, obj, (PyObject *)obj->ob_type);
1161 Py_DECREF(descr);
1162 return 0;
1163 }
1164 }
1165 }
1166
1167 dictptr = _PyObject_GetDictPtr(obj);
1168 if (dictptr != NULL && (dict = *dictptr) != NULL) {
1169 Py_INCREF(dict);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001170 attr = PyDict_GetItemWithError(dict, name);
Yury Selivanovf2392132016-12-13 19:03:51 -05001171 if (attr != NULL) {
1172 Py_INCREF(attr);
1173 *method = attr;
1174 Py_DECREF(dict);
1175 Py_XDECREF(descr);
1176 return 0;
1177 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001178 else {
1179 Py_DECREF(dict);
1180 if (PyErr_Occurred()) {
1181 Py_XDECREF(descr);
1182 return 0;
1183 }
1184 }
Yury Selivanovf2392132016-12-13 19:03:51 -05001185 }
1186
1187 if (meth_found) {
1188 *method = descr;
1189 return 1;
1190 }
1191
1192 if (f != NULL) {
1193 *method = f(descr, obj, (PyObject *)Py_TYPE(obj));
1194 Py_DECREF(descr);
1195 return 0;
1196 }
1197
1198 if (descr != NULL) {
1199 *method = descr;
1200 return 0;
1201 }
1202
1203 PyErr_Format(PyExc_AttributeError,
1204 "'%.50s' object has no attribute '%U'",
1205 tp->tp_name, name);
1206 return 0;
1207}
1208
1209/* Generic GetAttr functions - put these in your tp_[gs]etattro slot. */
Michael W. Hudson1593f502004-09-14 17:09:47 +00001210
Raymond Hettinger01538262003-03-17 08:24:35 +00001211PyObject *
INADA Naoki378edee2018-01-16 20:52:41 +09001212_PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name,
1213 PyObject *dict, int suppress)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001214{
Yury Selivanovf2392132016-12-13 19:03:51 -05001215 /* Make sure the logic of _PyObject_GetMethod is in sync with
1216 this method.
INADA Naoki378edee2018-01-16 20:52:41 +09001217
1218 When suppress=1, this function suppress AttributeError.
Yury Selivanovf2392132016-12-13 19:03:51 -05001219 */
1220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 PyTypeObject *tp = Py_TYPE(obj);
1222 PyObject *descr = NULL;
1223 PyObject *res = NULL;
1224 descrgetfunc f;
1225 Py_ssize_t dictoffset;
1226 PyObject **dictptr;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 if (!PyUnicode_Check(name)){
1229 PyErr_Format(PyExc_TypeError,
1230 "attribute name must be string, not '%.200s'",
1231 name->ob_type->tp_name);
1232 return NULL;
1233 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001234 Py_INCREF(name);
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 if (tp->tp_dict == NULL) {
1237 if (PyType_Ready(tp) < 0)
1238 goto done;
1239 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 descr = _PyType_Lookup(tp, name);
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 f = NULL;
1244 if (descr != NULL) {
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001245 Py_INCREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 f = descr->ob_type->tp_descr_get;
1247 if (f != NULL && PyDescr_IsData(descr)) {
1248 res = f(descr, obj, (PyObject *)obj->ob_type);
INADA Naoki378edee2018-01-16 20:52:41 +09001249 if (res == NULL && suppress &&
1250 PyErr_ExceptionMatches(PyExc_AttributeError)) {
1251 PyErr_Clear();
1252 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 goto done;
1254 }
1255 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001256
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001257 if (dict == NULL) {
1258 /* Inline _PyObject_GetDictPtr */
1259 dictoffset = tp->tp_dictoffset;
1260 if (dictoffset != 0) {
1261 if (dictoffset < 0) {
1262 Py_ssize_t tsize;
1263 size_t size;
Guido van Rossumc66ff442002-08-19 16:50:48 +00001264
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001265 tsize = ((PyVarObject *)obj)->ob_size;
1266 if (tsize < 0)
1267 tsize = -tsize;
1268 size = _PyObject_VAR_SIZE(tp, tsize);
Victor Stinner24702042018-10-26 17:16:37 +02001269 _PyObject_ASSERT(obj, size <= PY_SSIZE_T_MAX);
Guido van Rossumc66ff442002-08-19 16:50:48 +00001270
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001271 dictoffset += (Py_ssize_t)size;
Victor Stinner24702042018-10-26 17:16:37 +02001272 _PyObject_ASSERT(obj, dictoffset > 0);
1273 _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001275 dictptr = (PyObject **) ((char *)obj + dictoffset);
1276 dict = *dictptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 }
1278 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001279 if (dict != NULL) {
1280 Py_INCREF(dict);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001281 res = PyDict_GetItemWithError(dict, name);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001282 if (res != NULL) {
1283 Py_INCREF(res);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001284 Py_DECREF(dict);
1285 goto done;
1286 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001287 else {
1288 Py_DECREF(dict);
1289 if (PyErr_Occurred()) {
1290 if (suppress && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1291 PyErr_Clear();
1292 }
1293 else {
1294 goto done;
1295 }
1296 }
1297 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001298 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 if (f != NULL) {
1301 res = f(descr, obj, (PyObject *)Py_TYPE(obj));
INADA Naoki378edee2018-01-16 20:52:41 +09001302 if (res == NULL && suppress &&
1303 PyErr_ExceptionMatches(PyExc_AttributeError)) {
1304 PyErr_Clear();
1305 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 goto done;
1307 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 if (descr != NULL) {
1310 res = descr;
Victor Stinner2d01dc02012-03-09 00:44:13 +01001311 descr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 goto done;
1313 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001314
INADA Naoki378edee2018-01-16 20:52:41 +09001315 if (!suppress) {
1316 PyErr_Format(PyExc_AttributeError,
1317 "'%.50s' object has no attribute '%U'",
1318 tp->tp_name, name);
1319 }
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001320 done:
Victor Stinner2d01dc02012-03-09 00:44:13 +01001321 Py_XDECREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 Py_DECREF(name);
1323 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001324}
1325
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001326PyObject *
1327PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
1328{
INADA Naoki378edee2018-01-16 20:52:41 +09001329 return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 0);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001330}
1331
Tim Peters6d6c1a32001-08-02 04:15:00 +00001332int
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001333_PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
1334 PyObject *value, PyObject *dict)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 PyTypeObject *tp = Py_TYPE(obj);
1337 PyObject *descr;
1338 descrsetfunc f;
1339 PyObject **dictptr;
1340 int res = -1;
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 if (!PyUnicode_Check(name)){
1343 PyErr_Format(PyExc_TypeError,
1344 "attribute name must be string, not '%.200s'",
1345 name->ob_type->tp_name);
1346 return -1;
1347 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001348
Benjamin Peterson74529ad2012-03-09 07:25:32 -08001349 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1350 return -1;
1351
1352 Py_INCREF(name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 descr = _PyType_Lookup(tp, name);
Victor Stinner2d01dc02012-03-09 00:44:13 +01001355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 if (descr != NULL) {
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001357 Py_INCREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 f = descr->ob_type->tp_descr_set;
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001359 if (f != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 res = f(descr, obj, value);
1361 goto done;
1362 }
1363 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364
Steve Dowerb82e17e2019-05-23 08:45:22 -07001365 /* XXX [Steve Dower] These are really noisy - worth it? */
1366 /*if (PyType_Check(obj) || PyModule_Check(obj)) {
1367 if (value && PySys_Audit("object.__setattr__", "OOO", obj, name, value) < 0)
1368 return -1;
1369 if (!value && PySys_Audit("object.__delattr__", "OO", obj, name) < 0)
1370 return -1;
1371 }*/
1372
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001373 if (dict == NULL) {
1374 dictptr = _PyObject_GetDictPtr(obj);
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001375 if (dictptr == NULL) {
1376 if (descr == NULL) {
1377 PyErr_Format(PyExc_AttributeError,
1378 "'%.100s' object has no attribute '%U'",
1379 tp->tp_name, name);
1380 }
1381 else {
1382 PyErr_Format(PyExc_AttributeError,
1383 "'%.50s' object attribute '%U' is read-only",
1384 tp->tp_name, name);
1385 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001386 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001388 res = _PyObjectDict_SetItem(tp, dictptr, name, value);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001389 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001390 else {
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001391 Py_INCREF(dict);
1392 if (value == NULL)
1393 res = PyDict_DelItem(dict, name);
1394 else
1395 res = PyDict_SetItem(dict, name, value);
Benjamin Peterson74529ad2012-03-09 07:25:32 -08001396 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001398 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
1399 PyErr_SetObject(PyExc_AttributeError, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001401 done:
Victor Stinner2d01dc02012-03-09 00:44:13 +01001402 Py_XDECREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 Py_DECREF(name);
1404 return res;
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001405}
1406
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001407int
1408PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
1409{
1410 return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
1411}
1412
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001413int
1414PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
1415{
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001416 PyObject **dictptr = _PyObject_GetDictPtr(obj);
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001417 if (dictptr == NULL) {
1418 PyErr_SetString(PyExc_AttributeError,
1419 "This object has no __dict__");
1420 return -1;
1421 }
1422 if (value == NULL) {
1423 PyErr_SetString(PyExc_TypeError, "cannot delete __dict__");
1424 return -1;
1425 }
1426 if (!PyDict_Check(value)) {
1427 PyErr_Format(PyExc_TypeError,
1428 "__dict__ must be set to a dictionary, "
1429 "not a '%.200s'", Py_TYPE(value)->tp_name);
1430 return -1;
1431 }
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001432 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001433 Py_XSETREF(*dictptr, value);
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001434 return 0;
1435}
1436
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001437
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001438/* Test a value used as condition, e.g., in a for or if statement.
1439 Return -1 if an error occurred */
1440
1441int
Fred Drake100814d2000-07-09 15:48:49 +00001442PyObject_IsTrue(PyObject *v)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 Py_ssize_t res;
1445 if (v == Py_True)
1446 return 1;
1447 if (v == Py_False)
1448 return 0;
1449 if (v == Py_None)
1450 return 0;
1451 else if (v->ob_type->tp_as_number != NULL &&
1452 v->ob_type->tp_as_number->nb_bool != NULL)
1453 res = (*v->ob_type->tp_as_number->nb_bool)(v);
1454 else if (v->ob_type->tp_as_mapping != NULL &&
1455 v->ob_type->tp_as_mapping->mp_length != NULL)
1456 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1457 else if (v->ob_type->tp_as_sequence != NULL &&
1458 v->ob_type->tp_as_sequence->sq_length != NULL)
1459 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1460 else
1461 return 1;
1462 /* if it is negative, it should be either -1 or -2 */
1463 return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001464}
1465
Tim Peters803526b2002-07-07 05:13:56 +00001466/* equivalent of 'not v'
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001467 Return -1 if an error occurred */
1468
1469int
Fred Drake100814d2000-07-09 15:48:49 +00001470PyObject_Not(PyObject *v)
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 int res;
1473 res = PyObject_IsTrue(v);
1474 if (res < 0)
1475 return res;
1476 return res == 0;
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001477}
1478
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001479/* Test whether an object can be called */
1480
1481int
Fred Drake100814d2000-07-09 15:48:49 +00001482PyCallable_Check(PyObject *x)
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 if (x == NULL)
1485 return 0;
1486 return x->ob_type->tp_call != NULL;
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001487}
1488
Tim Peters7eea37e2001-09-04 22:08:56 +00001489
Georg Brandle32b4222007-03-10 22:13:27 +00001490/* Helper for PyObject_Dir without arguments: returns the local scope. */
1491static PyObject *
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001492_dir_locals(void)
Tim Peters305b5852001-09-17 02:38:46 +00001493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 PyObject *names;
Victor Stinner41bb43a2013-10-29 01:19:37 +01001495 PyObject *locals;
Tim Peters305b5852001-09-17 02:38:46 +00001496
Victor Stinner41bb43a2013-10-29 01:19:37 +01001497 locals = PyEval_GetLocals();
1498 if (locals == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 return NULL;
Tim Peters305b5852001-09-17 02:38:46 +00001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 names = PyMapping_Keys(locals);
1502 if (!names)
1503 return NULL;
1504 if (!PyList_Check(names)) {
1505 PyErr_Format(PyExc_TypeError,
1506 "dir(): expected keys() of locals to be a list, "
1507 "not '%.200s'", Py_TYPE(names)->tp_name);
1508 Py_DECREF(names);
1509 return NULL;
1510 }
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001511 if (PyList_Sort(names)) {
1512 Py_DECREF(names);
1513 return NULL;
1514 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 /* the locals don't need to be DECREF'd */
1516 return names;
Georg Brandle32b4222007-03-10 22:13:27 +00001517}
1518
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001519/* Helper for PyObject_Dir: object introspection. */
Georg Brandle32b4222007-03-10 22:13:27 +00001520static PyObject *
1521_dir_object(PyObject *obj)
1522{
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001523 PyObject *result, *sorted;
Benjamin Petersonce798522012-01-22 11:24:29 -05001524 PyObject *dirfunc = _PyObject_LookupSpecial(obj, &PyId___dir__);
Georg Brandle32b4222007-03-10 22:13:27 +00001525
Victor Stinner24702042018-10-26 17:16:37 +02001526 assert(obj != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 if (dirfunc == NULL) {
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001528 if (!PyErr_Occurred())
1529 PyErr_SetString(PyExc_TypeError, "object does not provide __dir__");
1530 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 }
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001532 /* use __dir__ */
Victor Stinnerf17c3de2016-12-06 18:46:19 +01001533 result = _PyObject_CallNoArg(dirfunc);
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001534 Py_DECREF(dirfunc);
1535 if (result == NULL)
1536 return NULL;
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001537 /* return sorted(result) */
1538 sorted = PySequence_List(result);
1539 Py_DECREF(result);
1540 if (sorted == NULL)
1541 return NULL;
1542 if (PyList_Sort(sorted)) {
1543 Py_DECREF(sorted);
1544 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 }
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001546 return sorted;
Georg Brandle32b4222007-03-10 22:13:27 +00001547}
1548
1549/* Implementation of dir() -- if obj is NULL, returns the names in the current
1550 (local) scope. Otherwise, performs introspection of the object: returns a
1551 sorted list of attribute names (supposedly) accessible from the object
1552*/
1553PyObject *
1554PyObject_Dir(PyObject *obj)
1555{
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001556 return (obj == NULL) ? _dir_locals() : _dir_object(obj);
Tim Peters7eea37e2001-09-04 22:08:56 +00001557}
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001558
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001559/*
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001560None is a non-NULL undefined value.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001561There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +00001562so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001563*/
1564
Guido van Rossum0c182a11992-03-27 17:26:13 +00001565/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001567none_repr(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 return PyUnicode_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001570}
1571
Barry Warsaw9bf16442001-01-23 16:24:35 +00001572/* ARGUSED */
1573static void
Tim Peters803526b2002-07-07 05:13:56 +00001574none_dealloc(PyObject* ignore)
Barry Warsaw9bf16442001-01-23 16:24:35 +00001575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 /* This should never get called, but we also don't want to SEGV if
1577 * we accidentally decref None out of existence.
1578 */
1579 Py_FatalError("deallocating None");
Barry Warsaw9bf16442001-01-23 16:24:35 +00001580}
1581
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001582static PyObject *
1583none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1584{
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001585 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001586 PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments");
1587 return NULL;
1588 }
1589 Py_RETURN_NONE;
1590}
1591
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001592static int
1593none_bool(PyObject *v)
1594{
1595 return 0;
1596}
1597
1598static PyNumberMethods none_as_number = {
1599 0, /* nb_add */
1600 0, /* nb_subtract */
1601 0, /* nb_multiply */
1602 0, /* nb_remainder */
1603 0, /* nb_divmod */
1604 0, /* nb_power */
1605 0, /* nb_negative */
1606 0, /* nb_positive */
1607 0, /* nb_absolute */
1608 (inquiry)none_bool, /* nb_bool */
1609 0, /* nb_invert */
1610 0, /* nb_lshift */
1611 0, /* nb_rshift */
1612 0, /* nb_and */
1613 0, /* nb_xor */
1614 0, /* nb_or */
1615 0, /* nb_int */
1616 0, /* nb_reserved */
1617 0, /* nb_float */
1618 0, /* nb_inplace_add */
1619 0, /* nb_inplace_subtract */
1620 0, /* nb_inplace_multiply */
1621 0, /* nb_inplace_remainder */
1622 0, /* nb_inplace_power */
1623 0, /* nb_inplace_lshift */
1624 0, /* nb_inplace_rshift */
1625 0, /* nb_inplace_and */
1626 0, /* nb_inplace_xor */
1627 0, /* nb_inplace_or */
1628 0, /* nb_floor_divide */
1629 0, /* nb_true_divide */
1630 0, /* nb_inplace_floor_divide */
1631 0, /* nb_inplace_true_divide */
1632 0, /* nb_index */
1633};
Barry Warsaw9bf16442001-01-23 16:24:35 +00001634
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001635PyTypeObject _PyNone_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1637 "NoneType",
1638 0,
1639 0,
1640 none_dealloc, /*tp_dealloc*/ /*never called*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001641 0, /*tp_vectorcall_offset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 0, /*tp_getattr*/
1643 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001644 0, /*tp_as_async*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 none_repr, /*tp_repr*/
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001646 &none_as_number, /*tp_as_number*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 0, /*tp_as_sequence*/
1648 0, /*tp_as_mapping*/
1649 0, /*tp_hash */
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001650 0, /*tp_call */
1651 0, /*tp_str */
1652 0, /*tp_getattro */
1653 0, /*tp_setattro */
1654 0, /*tp_as_buffer */
1655 Py_TPFLAGS_DEFAULT, /*tp_flags */
1656 0, /*tp_doc */
1657 0, /*tp_traverse */
1658 0, /*tp_clear */
1659 0, /*tp_richcompare */
1660 0, /*tp_weaklistoffset */
1661 0, /*tp_iter */
1662 0, /*tp_iternext */
1663 0, /*tp_methods */
1664 0, /*tp_members */
1665 0, /*tp_getset */
1666 0, /*tp_base */
1667 0, /*tp_dict */
1668 0, /*tp_descr_get */
1669 0, /*tp_descr_set */
1670 0, /*tp_dictoffset */
1671 0, /*tp_init */
1672 0, /*tp_alloc */
1673 none_new, /*tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001674};
1675
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001676PyObject _Py_NoneStruct = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001677 _PyObject_EXTRA_INIT
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001678 1, &_PyNone_Type
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001679};
1680
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001681/* NotImplemented is an object that can be used to signal that an
1682 operation is not implemented for the given type combination. */
1683
1684static PyObject *
1685NotImplemented_repr(PyObject *op)
1686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 return PyUnicode_FromString("NotImplemented");
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001688}
1689
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001690static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301691NotImplemented_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001692{
1693 return PyUnicode_FromString("NotImplemented");
1694}
1695
1696static PyMethodDef notimplemented_methods[] = {
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301697 {"__reduce__", NotImplemented_reduce, METH_NOARGS, NULL},
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001698 {NULL, NULL}
1699};
1700
1701static PyObject *
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001702notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1703{
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001704 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001705 PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments");
1706 return NULL;
1707 }
Brian Curtindfc80e32011-08-10 20:28:54 -05001708 Py_RETURN_NOTIMPLEMENTED;
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001709}
1710
Armin Ronacher226b1db2012-10-06 14:28:58 +02001711static void
1712notimplemented_dealloc(PyObject* ignore)
1713{
1714 /* This should never get called, but we also don't want to SEGV if
1715 * we accidentally decref NotImplemented out of existence.
1716 */
1717 Py_FatalError("deallocating NotImplemented");
1718}
1719
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001720PyTypeObject _PyNotImplemented_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1722 "NotImplementedType",
1723 0,
1724 0,
Armin Ronacher226b1db2012-10-06 14:28:58 +02001725 notimplemented_dealloc, /*tp_dealloc*/ /*never called*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001726 0, /*tp_vectorcall_offset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 0, /*tp_getattr*/
1728 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001729 0, /*tp_as_async*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 NotImplemented_repr, /*tp_repr*/
1731 0, /*tp_as_number*/
1732 0, /*tp_as_sequence*/
1733 0, /*tp_as_mapping*/
1734 0, /*tp_hash */
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001735 0, /*tp_call */
1736 0, /*tp_str */
1737 0, /*tp_getattro */
1738 0, /*tp_setattro */
1739 0, /*tp_as_buffer */
1740 Py_TPFLAGS_DEFAULT, /*tp_flags */
1741 0, /*tp_doc */
1742 0, /*tp_traverse */
1743 0, /*tp_clear */
1744 0, /*tp_richcompare */
1745 0, /*tp_weaklistoffset */
1746 0, /*tp_iter */
1747 0, /*tp_iternext */
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001748 notimplemented_methods, /*tp_methods */
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001749 0, /*tp_members */
1750 0, /*tp_getset */
1751 0, /*tp_base */
1752 0, /*tp_dict */
1753 0, /*tp_descr_get */
1754 0, /*tp_descr_set */
1755 0, /*tp_dictoffset */
1756 0, /*tp_init */
1757 0, /*tp_alloc */
1758 notimplemented_new, /*tp_new */
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001759};
1760
1761PyObject _Py_NotImplementedStruct = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 _PyObject_EXTRA_INIT
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001763 1, &_PyNotImplemented_Type
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001764};
1765
Victor Stinner331a6a52019-05-27 16:39:22 +02001766PyStatus
Victor Stinnerab672812019-01-23 15:04:40 +01001767_PyTypes_Init(void)
Guido van Rossumba21a492001-08-16 08:17:26 +00001768{
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001769#define INIT_TYPE(TYPE, NAME) \
1770 do { \
1771 if (PyType_Ready(TYPE) < 0) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02001772 return _PyStatus_ERR("Can't initialize " NAME " type"); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001773 } \
1774 } while (0)
Victor Stinner5a1bb4e2014-06-02 14:10:59 +02001775
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001776 INIT_TYPE(&PyBaseObject_Type, "object");
1777 INIT_TYPE(&PyType_Type, "type");
1778 INIT_TYPE(&_PyWeakref_RefType, "weakref");
1779 INIT_TYPE(&_PyWeakref_CallableProxyType, "callable weakref proxy");
1780 INIT_TYPE(&_PyWeakref_ProxyType, "weakref proxy");
1781 INIT_TYPE(&PyLong_Type, "int");
1782 INIT_TYPE(&PyBool_Type, "bool");
1783 INIT_TYPE(&PyByteArray_Type, "bytearray");
1784 INIT_TYPE(&PyBytes_Type, "str");
1785 INIT_TYPE(&PyList_Type, "list");
1786 INIT_TYPE(&_PyNone_Type, "None");
1787 INIT_TYPE(&_PyNotImplemented_Type, "NotImplemented");
1788 INIT_TYPE(&PyTraceBack_Type, "traceback");
1789 INIT_TYPE(&PySuper_Type, "super");
1790 INIT_TYPE(&PyRange_Type, "range");
1791 INIT_TYPE(&PyDict_Type, "dict");
1792 INIT_TYPE(&PyDictKeys_Type, "dict keys");
1793 INIT_TYPE(&PyDictValues_Type, "dict values");
1794 INIT_TYPE(&PyDictItems_Type, "dict items");
1795 INIT_TYPE(&PyDictRevIterKey_Type, "reversed dict keys");
1796 INIT_TYPE(&PyDictRevIterValue_Type, "reversed dict values");
1797 INIT_TYPE(&PyDictRevIterItem_Type, "reversed dict items");
1798 INIT_TYPE(&PyODict_Type, "OrderedDict");
1799 INIT_TYPE(&PyODictKeys_Type, "odict_keys");
1800 INIT_TYPE(&PyODictItems_Type, "odict_items");
1801 INIT_TYPE(&PyODictValues_Type, "odict_values");
1802 INIT_TYPE(&PyODictIter_Type, "odict_keyiterator");
1803 INIT_TYPE(&PySet_Type, "set");
1804 INIT_TYPE(&PyUnicode_Type, "str");
1805 INIT_TYPE(&PySlice_Type, "slice");
1806 INIT_TYPE(&PyStaticMethod_Type, "static method");
1807 INIT_TYPE(&PyComplex_Type, "complex");
1808 INIT_TYPE(&PyFloat_Type, "float");
1809 INIT_TYPE(&PyFrozenSet_Type, "frozenset");
1810 INIT_TYPE(&PyProperty_Type, "property");
1811 INIT_TYPE(&_PyManagedBuffer_Type, "managed buffer");
1812 INIT_TYPE(&PyMemoryView_Type, "memoryview");
1813 INIT_TYPE(&PyTuple_Type, "tuple");
1814 INIT_TYPE(&PyEnum_Type, "enumerate");
1815 INIT_TYPE(&PyReversed_Type, "reversed");
1816 INIT_TYPE(&PyStdPrinter_Type, "StdPrinter");
1817 INIT_TYPE(&PyCode_Type, "code");
1818 INIT_TYPE(&PyFrame_Type, "frame");
1819 INIT_TYPE(&PyCFunction_Type, "builtin function");
1820 INIT_TYPE(&PyMethod_Type, "method");
1821 INIT_TYPE(&PyFunction_Type, "function");
1822 INIT_TYPE(&PyDictProxy_Type, "dict proxy");
1823 INIT_TYPE(&PyGen_Type, "generator");
1824 INIT_TYPE(&PyGetSetDescr_Type, "get-set descriptor");
1825 INIT_TYPE(&PyWrapperDescr_Type, "wrapper");
1826 INIT_TYPE(&_PyMethodWrapper_Type, "method wrapper");
1827 INIT_TYPE(&PyEllipsis_Type, "ellipsis");
1828 INIT_TYPE(&PyMemberDescr_Type, "member descriptor");
1829 INIT_TYPE(&_PyNamespace_Type, "namespace");
1830 INIT_TYPE(&PyCapsule_Type, "capsule");
1831 INIT_TYPE(&PyLongRangeIter_Type, "long range iterator");
1832 INIT_TYPE(&PyCell_Type, "cell");
1833 INIT_TYPE(&PyInstanceMethod_Type, "instance method");
1834 INIT_TYPE(&PyClassMethodDescr_Type, "class method descr");
1835 INIT_TYPE(&PyMethodDescr_Type, "method descr");
1836 INIT_TYPE(&PyCallIter_Type, "call iter");
1837 INIT_TYPE(&PySeqIter_Type, "sequence iterator");
Antoine Pitrou91f43802019-05-26 17:10:09 +02001838 INIT_TYPE(&PyPickleBuffer_Type, "pickle.PickleBuffer");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001839 INIT_TYPE(&PyCoro_Type, "coroutine");
1840 INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper");
Eric Snowc11183c2019-03-15 16:35:46 -06001841 INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID");
Victor Stinner331a6a52019-05-27 16:39:22 +02001842 return _PyStatus_OK();
Guido van Rossumba21a492001-08-16 08:17:26 +00001843
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001844#undef INIT_TYPE
Guido van Rossumba21a492001-08-16 08:17:26 +00001845}
1846
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001847
Guido van Rossum84a90321996-05-22 16:34:47 +00001848#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001849
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001850void
Fred Drake100814d2000-07-09 15:48:49 +00001851_Py_NewReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001852{
Victor Stinner9e00e802018-10-25 13:31:16 +02001853 if (_Py_tracemalloc_config.tracing) {
1854 _PyTraceMalloc_NewReference(op);
1855 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 _Py_INC_REFTOTAL;
1857 op->ob_refcnt = 1;
1858 _Py_AddToAllObjects(op, 1);
1859 _Py_INC_TPALLOCS(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001860}
1861
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001862void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001863_Py_ForgetReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001864{
Guido van Rossumbffd6832000-01-20 22:32:56 +00001865#ifdef SLOW_UNREF_CHECK
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001866 PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +00001867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 if (op->ob_refcnt < 0)
1869 Py_FatalError("UNREF negative refcnt");
1870 if (op == &refchain ||
1871 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) {
1872 fprintf(stderr, "* ob\n");
1873 _PyObject_Dump(op);
1874 fprintf(stderr, "* op->_ob_prev->_ob_next\n");
1875 _PyObject_Dump(op->_ob_prev->_ob_next);
1876 fprintf(stderr, "* op->_ob_next->_ob_prev\n");
1877 _PyObject_Dump(op->_ob_next->_ob_prev);
1878 Py_FatalError("UNREF invalid object");
1879 }
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001880#ifdef SLOW_UNREF_CHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
1882 if (p == op)
1883 break;
1884 }
1885 if (p == &refchain) /* Not found */
1886 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 op->_ob_next->_ob_prev = op->_ob_prev;
1889 op->_ob_prev->_ob_next = op->_ob_next;
1890 op->_ob_next = op->_ob_prev = NULL;
1891 _Py_INC_TPFREES(op);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892}
1893
Tim Peters269b2a62003-04-17 19:52:29 +00001894/* Print all live objects. Because PyObject_Print is called, the
1895 * interpreter must be in a healthy state.
1896 */
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001897void
Fred Drake100814d2000-07-09 15:48:49 +00001898_Py_PrintReferences(FILE *fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 PyObject *op;
1901 fprintf(fp, "Remaining objects:\n");
1902 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
Zackery Spytz1a2252e2019-05-06 10:56:51 -06001903 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, op->ob_refcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 if (PyObject_Print(op, fp, 0) != 0)
1905 PyErr_Clear();
1906 putc('\n', fp);
1907 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001908}
1909
Tim Peters269b2a62003-04-17 19:52:29 +00001910/* Print the addresses of all live objects. Unlike _Py_PrintReferences, this
1911 * doesn't make any calls to the Python C API, so is always safe to call.
1912 */
1913void
1914_Py_PrintReferenceAddresses(FILE *fp)
1915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 PyObject *op;
1917 fprintf(fp, "Remaining object addresses:\n");
1918 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next)
Zackery Spytz1a2252e2019-05-06 10:56:51 -06001919 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", (void *)op,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 op->ob_refcnt, Py_TYPE(op)->tp_name);
Tim Peters269b2a62003-04-17 19:52:29 +00001921}
1922
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001923PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001924_Py_GetObjects(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 int i, n;
1927 PyObject *t = NULL;
1928 PyObject *res, *op;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
1931 return NULL;
1932 op = refchain._ob_next;
1933 res = PyList_New(0);
1934 if (res == NULL)
1935 return NULL;
1936 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
1937 while (op == self || op == args || op == res || op == t ||
1938 (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) {
1939 op = op->_ob_next;
1940 if (op == &refchain)
1941 return res;
1942 }
1943 if (PyList_Append(res, op) < 0) {
1944 Py_DECREF(res);
1945 return NULL;
1946 }
1947 op = op->_ob_next;
1948 }
1949 return res;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001950}
1951
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001952#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +00001953
Benjamin Petersonb173f782009-05-05 22:31:58 +00001954
Guido van Rossum84a90321996-05-22 16:34:47 +00001955/* Hack to force loading of abstract.o */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001956Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size;
Guido van Rossume09fb551997-08-05 02:04:34 +00001957
1958
David Malcolm49526f42012-06-22 14:55:41 -04001959void
1960_PyObject_DebugTypeStats(FILE *out)
1961{
1962 _PyCFunction_DebugMallocStats(out);
1963 _PyDict_DebugMallocStats(out);
1964 _PyFloat_DebugMallocStats(out);
1965 _PyFrame_DebugMallocStats(out);
1966 _PyList_DebugMallocStats(out);
1967 _PyMethod_DebugMallocStats(out);
David Malcolm49526f42012-06-22 14:55:41 -04001968 _PyTuple_DebugMallocStats(out);
1969}
Guido van Rossumb18618d2000-05-03 23:44:39 +00001970
Guido van Rossum86610361998-04-10 22:32:46 +00001971/* These methods are used to control infinite recursion in repr, str, print,
1972 etc. Container objects that may recursively contain themselves,
Martin Panter8d56c022016-05-29 04:13:35 +00001973 e.g. builtin dictionaries and lists, should use Py_ReprEnter() and
Guido van Rossum86610361998-04-10 22:32:46 +00001974 Py_ReprLeave() to avoid infinite recursion.
1975
1976 Py_ReprEnter() returns 0 the first time it is called for a particular
1977 object and 1 every time thereafter. It returns -1 if an exception
1978 occurred. Py_ReprLeave() has no return value.
1979
1980 See dictobject.c and listobject.c for examples of use.
1981*/
1982
Guido van Rossum86610361998-04-10 22:32:46 +00001983int
Fred Drake100814d2000-07-09 15:48:49 +00001984Py_ReprEnter(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001985{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 PyObject *dict;
1987 PyObject *list;
1988 Py_ssize_t i;
Guido van Rossum86610361998-04-10 22:32:46 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 dict = PyThreadState_GetDict();
Antoine Pitrou04d17d32014-03-31 22:04:38 +02001991 /* Ignore a missing thread-state, so that this function can be called
1992 early on startup. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 if (dict == NULL)
1994 return 0;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001995 list = _PyDict_GetItemIdWithError(dict, &PyId_Py_Repr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 if (list == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001997 if (PyErr_Occurred()) {
1998 return -1;
1999 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 list = PyList_New(0);
2001 if (list == NULL)
2002 return -1;
Victor Stinner7a07e452013-11-06 18:57:29 +01002003 if (_PyDict_SetItemId(dict, &PyId_Py_Repr, list) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 return -1;
2005 Py_DECREF(list);
2006 }
2007 i = PyList_GET_SIZE(list);
2008 while (--i >= 0) {
2009 if (PyList_GET_ITEM(list, i) == obj)
2010 return 1;
2011 }
Victor Stinnere901d1f2013-07-17 21:58:41 +02002012 if (PyList_Append(list, obj) < 0)
2013 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 return 0;
Guido van Rossum86610361998-04-10 22:32:46 +00002015}
2016
2017void
Fred Drake100814d2000-07-09 15:48:49 +00002018Py_ReprLeave(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00002019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 PyObject *dict;
2021 PyObject *list;
2022 Py_ssize_t i;
Victor Stinner1b634932013-07-16 22:24:44 +02002023 PyObject *error_type, *error_value, *error_traceback;
2024
2025 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum86610361998-04-10 22:32:46 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 dict = PyThreadState_GetDict();
2028 if (dict == NULL)
Victor Stinner1b634932013-07-16 22:24:44 +02002029 goto finally;
2030
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002031 list = _PyDict_GetItemIdWithError(dict, &PyId_Py_Repr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 if (list == NULL || !PyList_Check(list))
Victor Stinner1b634932013-07-16 22:24:44 +02002033 goto finally;
2034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 i = PyList_GET_SIZE(list);
2036 /* Count backwards because we always expect obj to be list[-1] */
2037 while (--i >= 0) {
2038 if (PyList_GET_ITEM(list, i) == obj) {
2039 PyList_SetSlice(list, i, i + 1, NULL);
2040 break;
2041 }
2042 }
Victor Stinner1b634932013-07-16 22:24:44 +02002043
2044finally:
2045 /* ignore exceptions because there is no way to report them. */
2046 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum86610361998-04-10 22:32:46 +00002047}
Guido van Rossumd724b232000-03-13 16:01:29 +00002048
Tim Peters803526b2002-07-07 05:13:56 +00002049/* Trashcan support. */
Guido van Rossumd724b232000-03-13 16:01:29 +00002050
Tim Peters803526b2002-07-07 05:13:56 +00002051/* Add op to the _PyTrash_delete_later list. Called when the current
2052 * call-stack depth gets large. op must be a currently untracked gc'ed
2053 * object, with refcount 0. Py_DECREF must already have been called on it.
2054 */
Guido van Rossumd724b232000-03-13 16:01:29 +00002055void
Fred Drake100814d2000-07-09 15:48:49 +00002056_PyTrash_deposit_object(PyObject *op)
Guido van Rossumd724b232000-03-13 16:01:29 +00002057{
Victor Stinner24702042018-10-26 17:16:37 +02002058 _PyObject_ASSERT(op, PyObject_IS_GC(op));
2059 _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op));
2060 _PyObject_ASSERT(op, op->ob_refcnt == 0);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002061 _PyGCHead_SET_PREV(_Py_AS_GC(op), _PyRuntime.gc.trash_delete_later);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002062 _PyRuntime.gc.trash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00002063}
2064
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002065/* The equivalent API, using per-thread state recursion info */
2066void
2067_PyTrash_thread_deposit_object(PyObject *op)
2068{
Victor Stinner50b48572018-11-01 01:51:40 +01002069 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner24702042018-10-26 17:16:37 +02002070 _PyObject_ASSERT(op, PyObject_IS_GC(op));
2071 _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op));
2072 _PyObject_ASSERT(op, op->ob_refcnt == 0);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002073 _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002074 tstate->trash_delete_later = op;
2075}
2076
Tim Peters803526b2002-07-07 05:13:56 +00002077/* Dealloccate all the objects in the _PyTrash_delete_later list. Called when
2078 * the call-stack unwinds again.
2079 */
Guido van Rossumd724b232000-03-13 16:01:29 +00002080void
Fred Drake100814d2000-07-09 15:48:49 +00002081_PyTrash_destroy_chain(void)
Guido van Rossumd724b232000-03-13 16:01:29 +00002082{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002083 while (_PyRuntime.gc.trash_delete_later) {
2084 PyObject *op = _PyRuntime.gc.trash_delete_later;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 destructor dealloc = Py_TYPE(op)->tp_dealloc;
Neil Schemenauerf589c052002-03-29 03:05:54 +00002086
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002087 _PyRuntime.gc.trash_delete_later =
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002088 (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
Neil Schemenauerf589c052002-03-29 03:05:54 +00002089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 /* Call the deallocator directly. This used to try to
2091 * fool Py_DECREF into calling it indirectly, but
2092 * Py_DECREF was already called on this object, and in
2093 * assorted non-release builds calling Py_DECREF again ends
2094 * up distorting allocation statistics.
2095 */
Victor Stinner24702042018-10-26 17:16:37 +02002096 _PyObject_ASSERT(op, op->ob_refcnt == 0);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002097 ++_PyRuntime.gc.trash_delete_nesting;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 (*dealloc)(op);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002099 --_PyRuntime.gc.trash_delete_nesting;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 }
Guido van Rossumd724b232000-03-13 16:01:29 +00002101}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002102
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002103/* The equivalent API, using per-thread state recursion info */
2104void
2105_PyTrash_thread_destroy_chain(void)
2106{
Victor Stinner50b48572018-11-01 01:51:40 +01002107 PyThreadState *tstate = _PyThreadState_GET();
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002108 /* We need to increase trash_delete_nesting here, otherwise,
2109 _PyTrash_thread_destroy_chain will be called recursively
2110 and then possibly crash. An example that may crash without
2111 increase:
2112 N = 500000 # need to be large enough
2113 ob = object()
2114 tups = [(ob,) for i in range(N)]
2115 for i in range(49):
2116 tups = [(tup,) for tup in tups]
2117 del tups
2118 */
2119 assert(tstate->trash_delete_nesting == 0);
2120 ++tstate->trash_delete_nesting;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002121 while (tstate->trash_delete_later) {
2122 PyObject *op = tstate->trash_delete_later;
2123 destructor dealloc = Py_TYPE(op)->tp_dealloc;
2124
2125 tstate->trash_delete_later =
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002126 (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002127
2128 /* Call the deallocator directly. This used to try to
2129 * fool Py_DECREF into calling it indirectly, but
2130 * Py_DECREF was already called on this object, and in
2131 * assorted non-release builds calling Py_DECREF again ends
2132 * up distorting allocation statistics.
2133 */
Victor Stinner24702042018-10-26 17:16:37 +02002134 _PyObject_ASSERT(op, op->ob_refcnt == 0);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002135 (*dealloc)(op);
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002136 assert(tstate->trash_delete_nesting == 1);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002137 }
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002138 --tstate->trash_delete_nesting;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002139}
2140
Victor Stinner626bff82018-10-25 17:31:10 +02002141
2142void
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002143_PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
Victor Stinner626bff82018-10-25 17:31:10 +02002144 const char *file, int line, const char *function)
2145{
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002146 fprintf(stderr, "%s:%d: ", file, line);
2147 if (function) {
2148 fprintf(stderr, "%s: ", function);
2149 }
Victor Stinner626bff82018-10-25 17:31:10 +02002150 fflush(stderr);
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002151 if (expr) {
2152 fprintf(stderr, "Assertion \"%s\" failed", expr);
Victor Stinner626bff82018-10-25 17:31:10 +02002153 }
2154 else {
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002155 fprintf(stderr, "Assertion failed");
Victor Stinner626bff82018-10-25 17:31:10 +02002156 }
2157 fflush(stderr);
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002158 if (msg) {
2159 fprintf(stderr, ": %s", msg);
2160 }
2161 fprintf(stderr, "\n");
2162 fflush(stderr);
Victor Stinner626bff82018-10-25 17:31:10 +02002163
2164 if (obj == NULL) {
Victor Stinner47bbab92019-09-18 14:10:16 +02002165 fprintf(stderr, "<object at NULL>\n");
Victor Stinner626bff82018-10-25 17:31:10 +02002166 }
2167 else if (_PyObject_IsFreed(obj)) {
2168 /* It seems like the object memory has been freed:
2169 don't access it to prevent a segmentation fault. */
Victor Stinner47bbab92019-09-18 14:10:16 +02002170 fprintf(stderr, "<object at %p is freed>\n", obj);
Victor Stinner0fc91ee2019-04-12 21:51:34 +02002171 }
2172 else if (Py_TYPE(obj) == NULL) {
Victor Stinner47bbab92019-09-18 14:10:16 +02002173 fprintf(stderr, "<object at %p: ob_type=NULL>\n", obj);
Victor Stinner0fc91ee2019-04-12 21:51:34 +02002174 }
2175 else if (_PyObject_IsFreed((PyObject *)Py_TYPE(obj))) {
Victor Stinner47bbab92019-09-18 14:10:16 +02002176 fprintf(stderr, "<object at %p: type at %p is freed>\n",
2177 obj, (void *)Py_TYPE(obj));
Victor Stinner626bff82018-10-25 17:31:10 +02002178 }
2179 else {
penguindustin96466302019-05-06 14:57:17 -04002180 /* Display the traceback where the object has been allocated.
Victor Stinner626bff82018-10-25 17:31:10 +02002181 Do it before dumping repr(obj), since repr() is more likely
2182 to crash than dumping the traceback. */
2183 void *ptr;
2184 PyTypeObject *type = Py_TYPE(obj);
2185 if (PyType_IS_GC(type)) {
2186 ptr = (void *)((char *)obj - sizeof(PyGC_Head));
2187 }
2188 else {
2189 ptr = (void *)obj;
2190 }
2191 _PyMem_DumpTraceback(fileno(stderr), ptr);
2192
2193 /* This might succeed or fail, but we're about to abort, so at least
2194 try to provide any extra info we can: */
2195 _PyObject_Dump(obj);
2196 }
2197 fflush(stderr);
2198
2199 Py_FatalError("_PyObject_AssertFailed");
2200}
2201
Victor Stinner3c09dca2018-10-30 14:48:26 +01002202
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002203#undef _Py_Dealloc
Victor Stinner3c09dca2018-10-30 14:48:26 +01002204
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002205void
2206_Py_Dealloc(PyObject *op)
2207{
Victor Stinner3c09dca2018-10-30 14:48:26 +01002208 destructor dealloc = Py_TYPE(op)->tp_dealloc;
2209#ifdef Py_TRACE_REFS
2210 _Py_ForgetReference(op);
2211#else
2212 _Py_INC_TPFREES(op);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002213#endif
Victor Stinner3c09dca2018-10-30 14:48:26 +01002214 (*dealloc)(op);
2215}
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002216
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002217#ifdef __cplusplus
2218}
2219#endif