blob: 9eaa163bdfd1f0c066f27127e8b7553d9db11be9 [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 Stinnerbe434dc2019-11-05 00:51:22 +01005#include "pycore_context.h"
Victor Stinner331a6a52019-05-27 16:39:22 +02006#include "pycore_initconfig.h"
Victor Stinner0fc91ee2019-04-12 21:51:34 +02007#include "pycore_object.h"
Victor Stinnerbe434dc2019-11-05 00:51:22 +01008#include "pycore_pyerrors.h"
Victor Stinner7a1f6c22020-01-30 09:02:14 +01009#include "pycore_pylifecycle.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010010#include "pycore_pystate.h"
Benjamin Petersonfd838e62009-04-20 02:09:13 +000011#include "frameobject.h"
Eric Snowc11183c2019-03-15 16:35:46 -060012#include "interpreteridobject.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000013
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000014#ifdef __cplusplus
15extern "C" {
16#endif
17
Victor Stinner626bff82018-10-25 17:31:10 +020018/* Defined in tracemalloc.c */
19extern void _PyMem_DumpTraceback(int fd, const void *ptr);
20
Victor Stinnerbd303c12013-11-07 23:07:29 +010021_Py_IDENTIFIER(Py_Repr);
22_Py_IDENTIFIER(__bytes__);
23_Py_IDENTIFIER(__dir__);
24_Py_IDENTIFIER(__isabstractmethod__);
Victor Stinnerbd303c12013-11-07 23:07:29 +010025
Victor Stinner0fc91ee2019-04-12 21:51:34 +020026
27int
28_PyObject_CheckConsistency(PyObject *op, int check_content)
29{
Victor Stinner68762572019-10-07 18:42:01 +020030#define CHECK(expr) \
31 do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0)
Victor Stinner0fc91ee2019-04-12 21:51:34 +020032
Victor Stinner68762572019-10-07 18:42:01 +020033 CHECK(!_PyObject_IsFreed(op));
34 CHECK(Py_REFCNT(op) >= 1);
35
36 CHECK(op->ob_type != NULL);
37 _PyType_CheckConsistency(op->ob_type);
Victor Stinner0fc91ee2019-04-12 21:51:34 +020038
39 if (PyUnicode_Check(op)) {
40 _PyUnicode_CheckConsistency(op, check_content);
41 }
42 else if (PyDict_Check(op)) {
43 _PyDict_CheckConsistency(op, check_content);
44 }
45 return 1;
Victor Stinner68762572019-10-07 18:42:01 +020046
47#undef CHECK
Victor Stinner0fc91ee2019-04-12 21:51:34 +020048}
49
50
Tim Peters34592512002-07-11 06:23:50 +000051#ifdef Py_REF_DEBUG
Neal Norwitz84632ee2006-03-04 20:00:59 +000052Py_ssize_t _Py_RefTotal;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000053
54Py_ssize_t
55_Py_GetRefTotal(void)
56{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 PyObject *o;
58 Py_ssize_t total = _Py_RefTotal;
Antoine Pitrou9d952542013-08-24 21:07:07 +020059 o = _PySet_Dummy;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 if (o != NULL)
61 total -= o->ob_refcnt;
62 return total;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000063}
Nick Coghland6009512014-11-20 21:39:37 +100064
65void
66_PyDebug_PrintTotalRefs(void) {
Eric Snowdae02762017-09-14 00:35:58 -070067 fprintf(stderr,
68 "[%" PY_FORMAT_SIZE_T "d refs, "
69 "%" PY_FORMAT_SIZE_T "d blocks]\n",
70 _Py_GetRefTotal(), _Py_GetAllocatedBlocks());
Nick Coghland6009512014-11-20 21:39:37 +100071}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000072#endif /* Py_REF_DEBUG */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073
Guido van Rossum3f5da241990-12-20 15:06:42 +000074/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
75 These are used by the individual routines for object creation.
76 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077
Tim Peters78be7992003-03-23 02:51:01 +000078#ifdef Py_TRACE_REFS
Tim Peters7571a0f2003-03-23 17:52:28 +000079/* Head of circular doubly-linked list of all objects. These are linked
80 * together via the _ob_prev and _ob_next members of a PyObject, which
81 * exist only in a Py_TRACE_REFS build.
82 */
Tim Peters78be7992003-03-23 02:51:01 +000083static PyObject refchain = {&refchain, &refchain};
Tim Peters36eb4df2003-03-23 03:33:13 +000084
Tim Peters7571a0f2003-03-23 17:52:28 +000085/* Insert op at the front of the list of all objects. If force is true,
86 * op is added even if _ob_prev and _ob_next are non-NULL already. If
87 * force is false amd _ob_prev or _ob_next are non-NULL, do nothing.
88 * force should be true if and only if op points to freshly allocated,
89 * uninitialized memory, or you've unlinked op from the list and are
Tim Peters51f8d382003-03-23 18:06:08 +000090 * relinking it into the front.
Tim Peters7571a0f2003-03-23 17:52:28 +000091 * Note that objects are normally added to the list via _Py_NewReference,
92 * which is called by PyObject_Init. Not all objects are initialized that
93 * way, though; exceptions include statically allocated type objects, and
94 * statically allocated singletons (like Py_True and Py_None).
95 */
Victor Stinner58f4e1a2020-02-05 18:24:33 +010096void
Tim Peters7571a0f2003-03-23 17:52:28 +000097_Py_AddToAllObjects(PyObject *op, int force)
Tim Peters36eb4df2003-03-23 03:33:13 +000098{
Tim Peters7571a0f2003-03-23 17:52:28 +000099#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 if (!force) {
101 /* If it's initialized memory, op must be in or out of
102 * the list unambiguously.
103 */
Victor Stinner24702042018-10-26 17:16:37 +0200104 _PyObject_ASSERT(op, (op->_ob_prev == NULL) == (op->_ob_next == NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 }
Tim Peters78be7992003-03-23 02:51:01 +0000106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 if (force || op->_ob_prev == NULL) {
108 op->_ob_next = refchain._ob_next;
109 op->_ob_prev = &refchain;
110 refchain._ob_next->_ob_prev = op;
111 refchain._ob_next = op;
112 }
Tim Peters7571a0f2003-03-23 17:52:28 +0000113}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114#endif /* Py_TRACE_REFS */
Tim Peters78be7992003-03-23 02:51:01 +0000115
Tim Peters7c321a82002-07-09 02:57:01 +0000116#ifdef Py_REF_DEBUG
117/* Log a fatal error; doesn't return. */
118void
Victor Stinner18618e652018-10-25 17:28:11 +0200119_Py_NegativeRefcount(const char *filename, int lineno, PyObject *op)
Tim Peters7c321a82002-07-09 02:57:01 +0000120{
Victor Stinnerf1d002c2018-11-21 23:53:44 +0100121 _PyObject_AssertFailed(op, NULL, "object has negative ref count",
Victor Stinner3ec9af72018-10-26 02:12:34 +0200122 filename, lineno, __func__);
Tim Peters7c321a82002-07-09 02:57:01 +0000123}
124
125#endif /* Py_REF_DEBUG */
126
Thomas Heller1328b522004-04-22 17:23:49 +0000127void
128Py_IncRef(PyObject *o)
129{
130 Py_XINCREF(o);
131}
132
133void
134Py_DecRef(PyObject *o)
135{
136 Py_XDECREF(o);
137}
138
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000140PyObject_Init(PyObject *op, PyTypeObject *tp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Victor Stinnerf58bd7c2020-02-05 13:12:19 +0100142 /* Any changes should be reflected in PyObject_INIT() macro */
143 if (op == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 return PyErr_NoMemory();
Victor Stinnerf58bd7c2020-02-05 13:12:19 +0100145 }
146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 Py_TYPE(op) = tp;
Eddie Elizondo364f0b02019-03-27 07:52:18 -0400148 if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) {
149 Py_INCREF(tp);
150 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 _Py_NewReference(op);
152 return op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153}
154
Guido van Rossumb18618d2000-05-03 23:44:39 +0000155PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000156PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000157{
Victor Stinnerf58bd7c2020-02-05 13:12:19 +0100158 /* Any changes should be reflected in PyObject_INIT_VAR() macro */
159 if (op == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 return (PyVarObject *) PyErr_NoMemory();
Victor Stinnerf58bd7c2020-02-05 13:12:19 +0100161 }
162
Eddie Elizondo364f0b02019-03-27 07:52:18 -0400163 Py_SIZE(op) = size;
164 PyObject_Init((PyObject *)op, tp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 return op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000166}
167
168PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000169_PyObject_New(PyTypeObject *tp)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 PyObject *op;
172 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
173 if (op == NULL)
174 return PyErr_NoMemory();
175 return PyObject_INIT(op, tp);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000176}
177
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000178PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000179_PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyVarObject *op;
182 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
183 op = (PyVarObject *) PyObject_MALLOC(size);
184 if (op == NULL)
185 return (PyVarObject *)PyErr_NoMemory();
186 return PyObject_INIT_VAR(op, tp, nitems);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000187}
188
Antoine Pitrou796564c2013-07-30 19:59:21 +0200189void
190PyObject_CallFinalizer(PyObject *self)
191{
192 PyTypeObject *tp = Py_TYPE(self);
193
Antoine Pitrouada319b2019-05-29 22:12:38 +0200194 if (tp->tp_finalize == NULL)
Antoine Pitrou796564c2013-07-30 19:59:21 +0200195 return;
196 /* tp_finalize should only be called once. */
197 if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
198 return;
199
200 tp->tp_finalize(self);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900201 if (PyType_IS_GC(tp)) {
202 _PyGC_SET_FINALIZED(self);
203 }
Antoine Pitrou796564c2013-07-30 19:59:21 +0200204}
205
206int
207PyObject_CallFinalizerFromDealloc(PyObject *self)
208{
Victor Stinner5eb8bff2020-01-30 09:01:07 +0100209 if (self->ob_refcnt != 0) {
210 _PyObject_ASSERT_FAILED_MSG(self,
211 "PyObject_CallFinalizerFromDealloc called "
212 "on object with a non-zero refcount");
213 }
Antoine Pitrou796564c2013-07-30 19:59:21 +0200214
215 /* Temporarily resurrect the object. */
Antoine Pitrou796564c2013-07-30 19:59:21 +0200216 self->ob_refcnt = 1;
217
218 PyObject_CallFinalizer(self);
219
Victor Stinner24702042018-10-26 17:16:37 +0200220 _PyObject_ASSERT_WITH_MSG(self,
221 self->ob_refcnt > 0,
222 "refcount is too small");
Victor Stinner5eb8bff2020-01-30 09:01:07 +0100223
224 /* Undo the temporary resurrection; can't use DECREF here, it would
225 * cause a recursive call. */
226 if (--self->ob_refcnt == 0) {
Antoine Pitrou796564c2013-07-30 19:59:21 +0200227 return 0; /* this is the normal path out */
Victor Stinner5eb8bff2020-01-30 09:01:07 +0100228 }
Antoine Pitrou796564c2013-07-30 19:59:21 +0200229
230 /* tp_finalize resurrected it! Make it look like the original Py_DECREF
Victor Stinner5eb8bff2020-01-30 09:01:07 +0100231 * never happened. */
232 Py_ssize_t refcnt = self->ob_refcnt;
Antoine Pitrou796564c2013-07-30 19:59:21 +0200233 _Py_NewReference(self);
234 self->ob_refcnt = refcnt;
235
Victor Stinner24702042018-10-26 17:16:37 +0200236 _PyObject_ASSERT(self,
237 (!PyType_IS_GC(Py_TYPE(self))
238 || _PyObject_GC_IS_TRACKED(self)));
Victor Stinner49932fe2020-02-03 17:55:05 +0100239 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
240 _Py_RefTotal, so we need to undo that. */
241#ifdef Py_REF_DEBUG
242 _Py_RefTotal--;
243#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +0200244 return -1;
245}
246
Antoine Pitrouc47bd4a2010-07-27 22:08:27 +0000247int
248PyObject_Print(PyObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 int ret = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 if (PyErr_CheckSignals())
252 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000253#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 if (PyOS_CheckStack()) {
255 PyErr_SetString(PyExc_MemoryError, "stack overflow");
256 return -1;
257 }
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 clearerr(fp); /* Clear any previous error condition */
260 if (op == NULL) {
261 Py_BEGIN_ALLOW_THREADS
262 fprintf(fp, "<nil>");
263 Py_END_ALLOW_THREADS
264 }
265 else {
Victor Stinner3ec9af72018-10-26 02:12:34 +0200266 if (op->ob_refcnt <= 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 /* XXX(twouters) cast refcount to long until %zd is
268 universally available */
269 Py_BEGIN_ALLOW_THREADS
270 fprintf(fp, "<refcnt %ld at %p>",
Zackery Spytz1a2252e2019-05-06 10:56:51 -0600271 (long)op->ob_refcnt, (void *)op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 Py_END_ALLOW_THREADS
Victor Stinner3ec9af72018-10-26 02:12:34 +0200273 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 else {
275 PyObject *s;
276 if (flags & Py_PRINT_RAW)
277 s = PyObject_Str(op);
278 else
279 s = PyObject_Repr(op);
280 if (s == NULL)
281 ret = -1;
282 else if (PyBytes_Check(s)) {
283 fwrite(PyBytes_AS_STRING(s), 1,
284 PyBytes_GET_SIZE(s), fp);
285 }
286 else if (PyUnicode_Check(s)) {
287 PyObject *t;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200288 t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace");
Zackery Spytzae62f012018-10-06 00:44:25 -0600289 if (t == NULL) {
290 ret = -1;
291 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 else {
293 fwrite(PyBytes_AS_STRING(t), 1,
294 PyBytes_GET_SIZE(t), fp);
Victor Stinnerba6b4302010-05-17 09:33:42 +0000295 Py_DECREF(t);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 }
297 }
298 else {
299 PyErr_Format(PyExc_TypeError,
300 "str() or repr() returned '%.100s'",
301 s->ob_type->tp_name);
302 ret = -1;
303 }
304 Py_XDECREF(s);
305 }
306 }
307 if (ret == 0) {
308 if (ferror(fp)) {
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300309 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 clearerr(fp);
311 ret = -1;
312 }
313 }
314 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}
316
Guido van Rossum38938152006-08-21 23:36:26 +0000317/* For debugging convenience. Set a breakpoint here and call it from your DLL */
318void
Thomas Woutersb2137042007-02-01 18:02:27 +0000319_Py_BreakPoint(void)
Guido van Rossum38938152006-08-21 23:36:26 +0000320{
321}
322
Neal Norwitz1a997502003-01-13 20:13:12 +0000323
Victor Stinner4c409be2019-04-11 13:01:15 +0200324/* Heuristic checking if the object memory is uninitialized or deallocated.
325 Rely on the debug hooks on Python memory allocators:
326 see _PyMem_IsPtrFreed().
Victor Stinner82af0b62018-10-23 17:39:40 +0200327
328 The function can be used to prevent segmentation fault on dereferencing
Victor Stinner4c409be2019-04-11 13:01:15 +0200329 pointers like 0xDDDDDDDDDDDDDDDD. */
Victor Stinner82af0b62018-10-23 17:39:40 +0200330int
331_PyObject_IsFreed(PyObject *op)
332{
Victor Stinner2b00db62019-04-11 11:33:27 +0200333 if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(op->ob_type)) {
Victor Stinner2cf5d322018-11-22 16:32:57 +0100334 return 1;
335 }
Victor Stinner2b00db62019-04-11 11:33:27 +0200336 /* ignore op->ob_ref: its value can have be modified
Victor Stinner82af0b62018-10-23 17:39:40 +0200337 by Py_INCREF() and Py_DECREF(). */
338#ifdef Py_TRACE_REFS
Pablo Galindo36e33c32019-10-08 00:43:14 +0100339 if (op->_ob_next != NULL && _PyMem_IsPtrFreed(op->_ob_next)) {
Victor Stinner2b00db62019-04-11 11:33:27 +0200340 return 1;
341 }
Pablo Galindo36e33c32019-10-08 00:43:14 +0100342 if (op->_ob_prev != NULL && _PyMem_IsPtrFreed(op->_ob_prev)) {
343 return 1;
344 }
Victor Stinner82af0b62018-10-23 17:39:40 +0200345#endif
Victor Stinner2b00db62019-04-11 11:33:27 +0200346 return 0;
Victor Stinner82af0b62018-10-23 17:39:40 +0200347}
348
349
Barry Warsaw9bf16442001-01-23 16:24:35 +0000350/* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */
Guido van Rossum38938152006-08-21 23:36:26 +0000351void
352_PyObject_Dump(PyObject* op)
Barry Warsaw9bf16442001-01-23 16:24:35 +0000353{
Victor Stinner82af0b62018-10-23 17:39:40 +0200354 if (_PyObject_IsFreed(op)) {
355 /* It seems like the object memory has been freed:
356 don't access it to prevent a segmentation fault. */
Victor Stinnerb39afb72019-09-17 23:36:28 +0200357 fprintf(stderr, "<object at %p is freed>\n", op);
Victor Stinner68762572019-10-07 18:42:01 +0200358 fflush(stderr);
Victor Stinner2cf5d322018-11-22 16:32:57 +0100359 return;
Victor Stinner82af0b62018-10-23 17:39:40 +0200360 }
361
Victor Stinner68762572019-10-07 18:42:01 +0200362 /* first, write fields which are the least likely to crash */
363 fprintf(stderr, "object address : %p\n", (void *)op);
Victor Stinner82af0b62018-10-23 17:39:40 +0200364 /* XXX(twouters) cast refcount to long until %zd is
365 universally available */
Victor Stinner68762572019-10-07 18:42:01 +0200366 fprintf(stderr, "object refcount : %ld\n", (long)op->ob_refcnt);
367 fflush(stderr);
368
369 PyTypeObject *type = Py_TYPE(op);
370 fprintf(stderr, "object type : %p\n", type);
371 fprintf(stderr, "object type name: %s\n",
372 type==NULL ? "NULL" : type->tp_name);
373
374 /* the most dangerous part */
375 fprintf(stderr, "object repr : ");
376 fflush(stderr);
377
378 PyGILState_STATE gil = PyGILState_Ensure();
379 PyObject *error_type, *error_value, *error_traceback;
380 PyErr_Fetch(&error_type, &error_value, &error_traceback);
381
382 (void)PyObject_Print(op, stderr, 0);
383 fflush(stderr);
384
385 PyErr_Restore(error_type, error_value, error_traceback);
386 PyGILState_Release(gil);
387
388 fprintf(stderr, "\n");
Victor Stinner82af0b62018-10-23 17:39:40 +0200389 fflush(stderr);
Barry Warsaw9bf16442001-01-23 16:24:35 +0000390}
Barry Warsaw903138f2001-01-23 16:33:18 +0000391
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000393PyObject_Repr(PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 PyObject *res;
396 if (PyErr_CheckSignals())
397 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000398#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 if (PyOS_CheckStack()) {
400 PyErr_SetString(PyExc_MemoryError, "stack overflow");
401 return NULL;
402 }
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 if (v == NULL)
405 return PyUnicode_FromString("<NULL>");
406 if (Py_TYPE(v)->tp_repr == NULL)
407 return PyUnicode_FromFormat("<%s object at %p>",
408 v->ob_type->tp_name, v);
Victor Stinner33824f62013-08-26 14:05:19 +0200409
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100410 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner33824f62013-08-26 14:05:19 +0200411#ifdef Py_DEBUG
412 /* PyObject_Repr() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +0100413 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +0000414 caller loses its exception */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100415 assert(!_PyErr_Occurred(tstate));
Victor Stinner33824f62013-08-26 14:05:19 +0200416#endif
417
Serhiy Storchaka1fb72d22017-12-03 22:12:11 +0200418 /* It is possible for a type to have a tp_repr representation that loops
419 infinitely. */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100420 if (_Py_EnterRecursiveCall(tstate,
421 " while getting the repr of an object")) {
Serhiy Storchaka1fb72d22017-12-03 22:12:11 +0200422 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100423 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 res = (*v->ob_type->tp_repr)(v);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100425 _Py_LeaveRecursiveCall(tstate);
426
427 if (res == NULL) {
Victor Stinner0a54cf12011-12-01 03:22:44 +0100428 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100429 }
Victor Stinner0a54cf12011-12-01 03:22:44 +0100430 if (!PyUnicode_Check(res)) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100431 _PyErr_Format(tstate, PyExc_TypeError,
432 "__repr__ returned non-string (type %.200s)",
433 res->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 Py_DECREF(res);
435 return NULL;
436 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100437#ifndef Py_DEBUG
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100438 if (PyUnicode_READY(res) < 0) {
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100439 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100440 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 return res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443}
444
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +0000446PyObject_Str(PyObject *v)
Guido van Rossumc6004111993-11-05 10:22:19 +0000447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 PyObject *res;
449 if (PyErr_CheckSignals())
450 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000451#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 if (PyOS_CheckStack()) {
453 PyErr_SetString(PyExc_MemoryError, "stack overflow");
454 return NULL;
455 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 if (v == NULL)
458 return PyUnicode_FromString("<NULL>");
459 if (PyUnicode_CheckExact(v)) {
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100460#ifndef Py_DEBUG
Victor Stinner4ead7c72011-11-20 19:48:36 +0100461 if (PyUnicode_READY(v) < 0)
462 return NULL;
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 Py_INCREF(v);
465 return v;
466 }
467 if (Py_TYPE(v)->tp_str == NULL)
468 return PyObject_Repr(v);
Guido van Rossum4f288ab2001-05-01 16:53:37 +0000469
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100470 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner33824f62013-08-26 14:05:19 +0200471#ifdef Py_DEBUG
472 /* PyObject_Str() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +0100473 because it can clear it (directly or indirectly) and so the
Nick Coghland979e432014-02-09 10:43:21 +1000474 caller loses its exception */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100475 assert(!_PyErr_Occurred(tstate));
Victor Stinner33824f62013-08-26 14:05:19 +0200476#endif
477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 /* It is possible for a type to have a tp_str representation that loops
479 infinitely. */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100480 if (_Py_EnterRecursiveCall(tstate, " while getting the str of an object")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100482 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 res = (*Py_TYPE(v)->tp_str)(v);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100484 _Py_LeaveRecursiveCall(tstate);
485
486 if (res == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100488 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 if (!PyUnicode_Check(res)) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100490 _PyErr_Format(tstate, PyExc_TypeError,
491 "__str__ returned non-string (type %.200s)",
492 Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 Py_DECREF(res);
494 return NULL;
495 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100496#ifndef Py_DEBUG
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100497 if (PyUnicode_READY(res) < 0) {
Victor Stinner4ead7c72011-11-20 19:48:36 +0100498 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100499 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100500#endif
Victor Stinner4ead7c72011-11-20 19:48:36 +0100501 assert(_PyUnicode_CheckConsistency(res, 1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 return res;
Neil Schemenauercf52c072005-08-12 17:34:58 +0000503}
504
Georg Brandl559e5d72008-06-11 18:37:52 +0000505PyObject *
506PyObject_ASCII(PyObject *v)
507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 PyObject *repr, *ascii, *res;
Georg Brandl559e5d72008-06-11 18:37:52 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 repr = PyObject_Repr(v);
511 if (repr == NULL)
512 return NULL;
Georg Brandl559e5d72008-06-11 18:37:52 +0000513
Victor Stinneraf037572013-04-14 18:44:10 +0200514 if (PyUnicode_IS_ASCII(repr))
515 return repr;
516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 /* repr is guaranteed to be a PyUnicode object by PyObject_Repr */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200518 ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 Py_DECREF(repr);
520 if (ascii == NULL)
521 return NULL;
Georg Brandl559e5d72008-06-11 18:37:52 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 res = PyUnicode_DecodeASCII(
524 PyBytes_AS_STRING(ascii),
525 PyBytes_GET_SIZE(ascii),
526 NULL);
527
528 Py_DECREF(ascii);
529 return res;
Georg Brandl559e5d72008-06-11 18:37:52 +0000530}
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000531
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000532PyObject *
533PyObject_Bytes(PyObject *v)
534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 PyObject *result, *func;
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 if (v == NULL)
538 return PyBytes_FromString("<NULL>");
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (PyBytes_CheckExact(v)) {
541 Py_INCREF(v);
542 return v;
543 }
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000544
Benjamin Petersonce798522012-01-22 11:24:29 -0500545 func = _PyObject_LookupSpecial(v, &PyId___bytes__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 if (func != NULL) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100547 result = _PyObject_CallNoArg(func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 Py_DECREF(func);
549 if (result == NULL)
Benjamin Peterson41ece392010-09-11 16:39:57 +0000550 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 if (!PyBytes_Check(result)) {
Benjamin Peterson41ece392010-09-11 16:39:57 +0000552 PyErr_Format(PyExc_TypeError,
553 "__bytes__ returned non-bytes (type %.200s)",
554 Py_TYPE(result)->tp_name);
555 Py_DECREF(result);
556 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 }
558 return result;
559 }
560 else if (PyErr_Occurred())
561 return NULL;
562 return PyBytes_FromObject(v);
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000563}
564
Jeroen Demeyerbf17d412019-11-05 16:48:04 +0100565
566/*
567def _PyObject_FunctionStr(x):
568 try:
569 qualname = x.__qualname__
570 except AttributeError:
571 return str(x)
572 try:
573 mod = x.__module__
574 if mod is not None and mod != 'builtins':
575 return f"{x.__module__}.{qualname}()"
576 except AttributeError:
577 pass
578 return qualname
579*/
580PyObject *
581_PyObject_FunctionStr(PyObject *x)
582{
583 _Py_IDENTIFIER(__module__);
584 _Py_IDENTIFIER(__qualname__);
585 _Py_IDENTIFIER(builtins);
586 assert(!PyErr_Occurred());
587 PyObject *qualname;
588 int ret = _PyObject_LookupAttrId(x, &PyId___qualname__, &qualname);
589 if (qualname == NULL) {
590 if (ret < 0) {
591 return NULL;
592 }
593 return PyObject_Str(x);
594 }
595 PyObject *module;
596 PyObject *result = NULL;
597 ret = _PyObject_LookupAttrId(x, &PyId___module__, &module);
598 if (module != NULL && module != Py_None) {
599 PyObject *builtinsname = _PyUnicode_FromId(&PyId_builtins);
600 if (builtinsname == NULL) {
601 goto done;
602 }
603 ret = PyObject_RichCompareBool(module, builtinsname, Py_NE);
604 if (ret < 0) {
605 // error
606 goto done;
607 }
608 if (ret > 0) {
609 result = PyUnicode_FromFormat("%S.%S()", module, qualname);
610 goto done;
611 }
612 }
613 else if (ret < 0) {
614 goto done;
615 }
616 result = PyUnicode_FromFormat("%S()", qualname);
617done:
618 Py_DECREF(qualname);
619 Py_XDECREF(module);
620 return result;
621}
622
Mark Dickinsonc008a172009-02-01 13:59:22 +0000623/* For Python 3.0.1 and later, the old three-way comparison has been
624 completely removed in favour of rich comparisons. PyObject_Compare() and
625 PyObject_Cmp() are gone, and the builtin cmp function no longer exists.
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200626 The old tp_compare slot has been renamed to tp_as_async, and should no
Mark Dickinsonc008a172009-02-01 13:59:22 +0000627 longer be used. Use tp_richcompare instead.
Guido van Rossum98297ee2007-11-06 21:34:58 +0000628
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000629 See (*) below for practical amendments.
630
Mark Dickinsonc008a172009-02-01 13:59:22 +0000631 tp_richcompare gets called with a first argument of the appropriate type
632 and a second object of an arbitrary type. We never do any kind of
633 coercion.
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000634
Mark Dickinsonc008a172009-02-01 13:59:22 +0000635 The tp_richcompare slot should return an object, as follows:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000636
637 NULL if an exception occurred
638 NotImplemented if the requested comparison is not implemented
639 any other false value if the requested comparison is false
640 any other true value if the requested comparison is true
641
642 The PyObject_RichCompare[Bool]() wrappers raise TypeError when they get
643 NotImplemented.
644
645 (*) Practical amendments:
646
647 - If rich comparison returns NotImplemented, == and != are decided by
648 comparing the object pointer (i.e. falling back to the base object
649 implementation).
650
Guido van Rossuma4073002002-05-31 20:03:54 +0000651*/
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000652
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000653/* Map rich comparison operators to their swapped version, e.g. LT <--> GT */
Brett Cannona5ca2e72004-09-25 01:37:24 +0000654int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000655
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200656static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="};
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000657
658/* Perform a rich comparison, raising TypeError when the requested comparison
659 operator is not supported. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000660static PyObject *
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100661do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op)
Guido van Rossume797ec12001-01-17 15:24:28 +0000662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 richcmpfunc f;
664 PyObject *res;
665 int checked_reverse_op = 0;
Guido van Rossume797ec12001-01-17 15:24:28 +0000666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 if (v->ob_type != w->ob_type &&
668 PyType_IsSubtype(w->ob_type, v->ob_type) &&
669 (f = w->ob_type->tp_richcompare) != NULL) {
670 checked_reverse_op = 1;
671 res = (*f)(w, v, _Py_SwappedOp[op]);
672 if (res != Py_NotImplemented)
673 return res;
674 Py_DECREF(res);
675 }
676 if ((f = v->ob_type->tp_richcompare) != NULL) {
677 res = (*f)(v, w, op);
678 if (res != Py_NotImplemented)
679 return res;
680 Py_DECREF(res);
681 }
682 if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) {
683 res = (*f)(w, v, _Py_SwappedOp[op]);
684 if (res != Py_NotImplemented)
685 return res;
686 Py_DECREF(res);
687 }
688 /* If neither object implements it, provide a sensible default
689 for == and !=, but raise an exception for ordering. */
690 switch (op) {
691 case Py_EQ:
692 res = (v == w) ? Py_True : Py_False;
693 break;
694 case Py_NE:
695 res = (v != w) ? Py_True : Py_False;
696 break;
697 default:
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100698 _PyErr_Format(tstate, PyExc_TypeError,
699 "'%s' not supported between instances of '%.100s' and '%.100s'",
700 opstrings[op],
701 v->ob_type->tp_name,
702 w->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 return NULL;
704 }
705 Py_INCREF(res);
706 return res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000707}
708
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000709/* Perform a rich comparison with object result. This wraps do_richcompare()
710 with a check for NULL arguments and a recursion check. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000711
Guido van Rossume797ec12001-01-17 15:24:28 +0000712PyObject *
713PyObject_RichCompare(PyObject *v, PyObject *w, int op)
714{
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100715 PyThreadState *tstate = _PyThreadState_GET();
Guido van Rossume797ec12001-01-17 15:24:28 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 assert(Py_LT <= op && op <= Py_GE);
718 if (v == NULL || w == NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100719 if (!_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 PyErr_BadInternalCall();
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100721 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 return NULL;
723 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100724 if (_Py_EnterRecursiveCall(tstate, " in comparison")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100726 }
727 PyObject *res = do_richcompare(tstate, v, w, op);
728 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 return res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000730}
731
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000732/* Perform a rich comparison with integer result. This wraps
733 PyObject_RichCompare(), returning -1 for error, 0 for false, 1 for true. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000734int
735PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 PyObject *res;
738 int ok;
Guido van Rossume797ec12001-01-17 15:24:28 +0000739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 /* Quick result when objects are the same.
741 Guarantees that identity implies equality. */
742 if (v == w) {
743 if (op == Py_EQ)
744 return 1;
745 else if (op == Py_NE)
746 return 0;
747 }
Mark Dickinson4a1f5932008-11-12 23:23:36 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 res = PyObject_RichCompare(v, w, op);
750 if (res == NULL)
751 return -1;
752 if (PyBool_Check(res))
753 ok = (res == Py_True);
754 else
755 ok = PyObject_IsTrue(res);
756 Py_DECREF(res);
757 return ok;
Guido van Rossume797ec12001-01-17 15:24:28 +0000758}
Fred Drake13634cf2000-06-29 19:17:04 +0000759
Antoine Pitrouce4a9da2011-11-21 20:46:33 +0100760Py_hash_t
Nick Coghland1abd252008-07-15 15:46:38 +0000761PyObject_HashNotImplemented(PyObject *v)
762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
764 Py_TYPE(v)->tp_name);
765 return -1;
Nick Coghland1abd252008-07-15 15:46:38 +0000766}
Fred Drake13634cf2000-06-29 19:17:04 +0000767
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000768Py_hash_t
Fred Drake100814d2000-07-09 15:48:49 +0000769PyObject_Hash(PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 PyTypeObject *tp = Py_TYPE(v);
772 if (tp->tp_hash != NULL)
773 return (*tp->tp_hash)(v);
774 /* To keep to the general practice that inheriting
775 * solely from object in C code should work without
776 * an explicit call to PyType_Ready, we implicitly call
777 * PyType_Ready here and then check the tp_hash slot again
778 */
779 if (tp->tp_dict == NULL) {
780 if (PyType_Ready(tp) < 0)
781 return -1;
782 if (tp->tp_hash != NULL)
783 return (*tp->tp_hash)(v);
784 }
785 /* Otherwise, the object can't be hashed */
786 return PyObject_HashNotImplemented(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000787}
788
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000790PyObject_GetAttrString(PyObject *v, const char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 PyObject *w, *res;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 if (Py_TYPE(v)->tp_getattr != NULL)
795 return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
INADA Naoki3e8d6cb2017-02-21 23:57:25 +0900796 w = PyUnicode_FromString(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 if (w == NULL)
798 return NULL;
799 res = PyObject_GetAttr(v, w);
Victor Stinner59af08f2012-03-22 02:09:08 +0100800 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000802}
803
804int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000805PyObject_HasAttrString(PyObject *v, const char *name)
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 PyObject *res = PyObject_GetAttrString(v, name);
808 if (res != NULL) {
809 Py_DECREF(res);
810 return 1;
811 }
812 PyErr_Clear();
813 return 0;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000814}
815
816int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000817PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 PyObject *s;
820 int res;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 if (Py_TYPE(v)->tp_setattr != NULL)
823 return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
824 s = PyUnicode_InternFromString(name);
825 if (s == NULL)
826 return -1;
827 res = PyObject_SetAttr(v, s, w);
828 Py_XDECREF(s);
829 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000830}
831
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500832int
833_PyObject_IsAbstract(PyObject *obj)
834{
835 int res;
836 PyObject* isabstract;
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500837
838 if (obj == NULL)
839 return 0;
840
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200841 res = _PyObject_LookupAttrId(obj, &PyId___isabstractmethod__, &isabstract);
842 if (res > 0) {
843 res = PyObject_IsTrue(isabstract);
844 Py_DECREF(isabstract);
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500845 }
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500846 return res;
847}
848
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000849PyObject *
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200850_PyObject_GetAttrId(PyObject *v, _Py_Identifier *name)
851{
852 PyObject *result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100853 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200854 if (!oname)
855 return NULL;
856 result = PyObject_GetAttr(v, oname);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200857 return result;
858}
859
860int
861_PyObject_HasAttrId(PyObject *v, _Py_Identifier *name)
862{
863 int result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100864 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200865 if (!oname)
866 return -1;
867 result = PyObject_HasAttr(v, oname);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200868 return result;
869}
870
871int
872_PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w)
873{
874 int result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100875 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200876 if (!oname)
877 return -1;
878 result = PyObject_SetAttr(v, oname, w);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200879 return result;
880}
881
882PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000883PyObject_GetAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 PyTypeObject *tp = Py_TYPE(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 if (!PyUnicode_Check(name)) {
888 PyErr_Format(PyExc_TypeError,
889 "attribute name must be string, not '%.200s'",
890 name->ob_type->tp_name);
891 return NULL;
892 }
893 if (tp->tp_getattro != NULL)
894 return (*tp->tp_getattro)(v, name);
895 if (tp->tp_getattr != NULL) {
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200896 const char *name_str = PyUnicode_AsUTF8(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 if (name_str == NULL)
898 return NULL;
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200899 return (*tp->tp_getattr)(v, (char *)name_str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 }
901 PyErr_Format(PyExc_AttributeError,
902 "'%.50s' object has no attribute '%U'",
903 tp->tp_name, name);
904 return NULL;
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000905}
906
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200907int
908_PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result)
INADA Naoki378edee2018-01-16 20:52:41 +0900909{
910 PyTypeObject *tp = Py_TYPE(v);
INADA Naoki378edee2018-01-16 20:52:41 +0900911
912 if (!PyUnicode_Check(name)) {
913 PyErr_Format(PyExc_TypeError,
914 "attribute name must be string, not '%.200s'",
915 name->ob_type->tp_name);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200916 *result = NULL;
917 return -1;
INADA Naoki378edee2018-01-16 20:52:41 +0900918 }
919
920 if (tp->tp_getattro == PyObject_GenericGetAttr) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200921 *result = _PyObject_GenericGetAttrWithDict(v, name, NULL, 1);
922 if (*result != NULL) {
923 return 1;
924 }
925 if (PyErr_Occurred()) {
926 return -1;
927 }
928 return 0;
INADA Naoki378edee2018-01-16 20:52:41 +0900929 }
930 if (tp->tp_getattro != NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200931 *result = (*tp->tp_getattro)(v, name);
INADA Naoki378edee2018-01-16 20:52:41 +0900932 }
933 else if (tp->tp_getattr != NULL) {
934 const char *name_str = PyUnicode_AsUTF8(name);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200935 if (name_str == NULL) {
936 *result = NULL;
937 return -1;
938 }
939 *result = (*tp->tp_getattr)(v, (char *)name_str);
INADA Naoki378edee2018-01-16 20:52:41 +0900940 }
INADA Naokie76daeb2018-01-26 16:22:51 +0900941 else {
942 *result = NULL;
943 return 0;
944 }
945
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200946 if (*result != NULL) {
947 return 1;
INADA Naoki378edee2018-01-16 20:52:41 +0900948 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200949 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
950 return -1;
951 }
952 PyErr_Clear();
953 return 0;
954}
955
956int
957_PyObject_LookupAttrId(PyObject *v, _Py_Identifier *name, PyObject **result)
958{
959 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
960 if (!oname) {
961 *result = NULL;
962 return -1;
963 }
964 return _PyObject_LookupAttr(v, oname, result);
INADA Naoki378edee2018-01-16 20:52:41 +0900965}
966
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000967int
Fred Drake100814d2000-07-09 15:48:49 +0000968PyObject_HasAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000969{
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200970 PyObject *res;
971 if (_PyObject_LookupAttr(v, name, &res) < 0) {
972 PyErr_Clear();
973 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200975 if (res == NULL) {
976 return 0;
977 }
978 Py_DECREF(res);
979 return 1;
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000980}
981
982int
Fred Drake100814d2000-07-09 15:48:49 +0000983PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 PyTypeObject *tp = Py_TYPE(v);
986 int err;
Marc-André Lemburge44e5072000-09-18 16:20:57 +0000987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 if (!PyUnicode_Check(name)) {
989 PyErr_Format(PyExc_TypeError,
990 "attribute name must be string, not '%.200s'",
991 name->ob_type->tp_name);
992 return -1;
993 }
994 Py_INCREF(name);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 PyUnicode_InternInPlace(&name);
997 if (tp->tp_setattro != NULL) {
998 err = (*tp->tp_setattro)(v, name, value);
999 Py_DECREF(name);
1000 return err;
1001 }
1002 if (tp->tp_setattr != NULL) {
Serhiy Storchaka2a404b62017-01-22 23:07:07 +02001003 const char *name_str = PyUnicode_AsUTF8(name);
Zackery Spytze0dcb852019-04-28 06:58:52 -06001004 if (name_str == NULL) {
1005 Py_DECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 return -1;
Zackery Spytze0dcb852019-04-28 06:58:52 -06001007 }
Serhiy Storchaka2a404b62017-01-22 23:07:07 +02001008 err = (*tp->tp_setattr)(v, (char *)name_str, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 Py_DECREF(name);
1010 return err;
1011 }
1012 Py_DECREF(name);
Victor Stinner24702042018-10-26 17:16:37 +02001013 _PyObject_ASSERT(name, name->ob_refcnt >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 if (tp->tp_getattr == NULL && tp->tp_getattro == NULL)
1015 PyErr_Format(PyExc_TypeError,
1016 "'%.100s' object has no attributes "
1017 "(%s .%U)",
1018 tp->tp_name,
1019 value==NULL ? "del" : "assign to",
1020 name);
1021 else
1022 PyErr_Format(PyExc_TypeError,
1023 "'%.100s' object has only read-only attributes "
1024 "(%s .%U)",
1025 tp->tp_name,
1026 value==NULL ? "del" : "assign to",
1027 name);
1028 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029}
1030
1031/* Helper to get a pointer to an object's __dict__ slot, if any */
1032
1033PyObject **
1034_PyObject_GetDictPtr(PyObject *obj)
1035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 Py_ssize_t dictoffset;
1037 PyTypeObject *tp = Py_TYPE(obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 dictoffset = tp->tp_dictoffset;
1040 if (dictoffset == 0)
1041 return NULL;
1042 if (dictoffset < 0) {
1043 Py_ssize_t tsize;
1044 size_t size;
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 tsize = ((PyVarObject *)obj)->ob_size;
1047 if (tsize < 0)
1048 tsize = -tsize;
1049 size = _PyObject_VAR_SIZE(tp, tsize);
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 dictoffset += (long)size;
Victor Stinner24702042018-10-26 17:16:37 +02001052 _PyObject_ASSERT(obj, dictoffset > 0);
1053 _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 }
1055 return (PyObject **) ((char *)obj + dictoffset);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056}
1057
Tim Peters6d6c1a32001-08-02 04:15:00 +00001058PyObject *
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00001059PyObject_SelfIter(PyObject *obj)
Raymond Hettinger01538262003-03-17 08:24:35 +00001060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 Py_INCREF(obj);
1062 return obj;
Raymond Hettinger01538262003-03-17 08:24:35 +00001063}
1064
Amaury Forgeot d'Arcf343e012009-01-12 23:58:21 +00001065/* Helper used when the __next__ method is removed from a type:
1066 tp_iternext is never NULL and can be safely called without checking
1067 on every iteration.
1068 */
1069
1070PyObject *
1071_PyObject_NextNotImplemented(PyObject *self)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 PyErr_Format(PyExc_TypeError,
1074 "'%.200s' object is not iterable",
1075 Py_TYPE(self)->tp_name);
1076 return NULL;
Amaury Forgeot d'Arcf343e012009-01-12 23:58:21 +00001077}
1078
Yury Selivanovf2392132016-12-13 19:03:51 -05001079
1080/* Specialized version of _PyObject_GenericGetAttrWithDict
1081 specifically for the LOAD_METHOD opcode.
1082
1083 Return 1 if a method is found, 0 if it's a regular attribute
1084 from __dict__ or something returned by using a descriptor
1085 protocol.
1086
1087 `method` will point to the resolved attribute or NULL. In the
1088 latter case, an error will be set.
1089*/
1090int
1091_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
1092{
1093 PyTypeObject *tp = Py_TYPE(obj);
1094 PyObject *descr;
1095 descrgetfunc f = NULL;
1096 PyObject **dictptr, *dict;
1097 PyObject *attr;
1098 int meth_found = 0;
1099
1100 assert(*method == NULL);
1101
1102 if (Py_TYPE(obj)->tp_getattro != PyObject_GenericGetAttr
1103 || !PyUnicode_Check(name)) {
1104 *method = PyObject_GetAttr(obj, name);
1105 return 0;
1106 }
1107
1108 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1109 return 0;
1110
1111 descr = _PyType_Lookup(tp, name);
1112 if (descr != NULL) {
1113 Py_INCREF(descr);
Jeroen Demeyereb65e242019-05-28 14:42:53 +02001114 if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
Yury Selivanovf2392132016-12-13 19:03:51 -05001115 meth_found = 1;
1116 } else {
1117 f = descr->ob_type->tp_descr_get;
1118 if (f != NULL && PyDescr_IsData(descr)) {
1119 *method = f(descr, obj, (PyObject *)obj->ob_type);
1120 Py_DECREF(descr);
1121 return 0;
1122 }
1123 }
1124 }
1125
1126 dictptr = _PyObject_GetDictPtr(obj);
1127 if (dictptr != NULL && (dict = *dictptr) != NULL) {
1128 Py_INCREF(dict);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001129 attr = PyDict_GetItemWithError(dict, name);
Yury Selivanovf2392132016-12-13 19:03:51 -05001130 if (attr != NULL) {
1131 Py_INCREF(attr);
1132 *method = attr;
1133 Py_DECREF(dict);
1134 Py_XDECREF(descr);
1135 return 0;
1136 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001137 else {
1138 Py_DECREF(dict);
1139 if (PyErr_Occurred()) {
1140 Py_XDECREF(descr);
1141 return 0;
1142 }
1143 }
Yury Selivanovf2392132016-12-13 19:03:51 -05001144 }
1145
1146 if (meth_found) {
1147 *method = descr;
1148 return 1;
1149 }
1150
1151 if (f != NULL) {
1152 *method = f(descr, obj, (PyObject *)Py_TYPE(obj));
1153 Py_DECREF(descr);
1154 return 0;
1155 }
1156
1157 if (descr != NULL) {
1158 *method = descr;
1159 return 0;
1160 }
1161
1162 PyErr_Format(PyExc_AttributeError,
1163 "'%.50s' object has no attribute '%U'",
1164 tp->tp_name, name);
1165 return 0;
1166}
1167
1168/* Generic GetAttr functions - put these in your tp_[gs]etattro slot. */
Michael W. Hudson1593f502004-09-14 17:09:47 +00001169
Raymond Hettinger01538262003-03-17 08:24:35 +00001170PyObject *
INADA Naoki378edee2018-01-16 20:52:41 +09001171_PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name,
1172 PyObject *dict, int suppress)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173{
Yury Selivanovf2392132016-12-13 19:03:51 -05001174 /* Make sure the logic of _PyObject_GetMethod is in sync with
1175 this method.
INADA Naoki378edee2018-01-16 20:52:41 +09001176
1177 When suppress=1, this function suppress AttributeError.
Yury Selivanovf2392132016-12-13 19:03:51 -05001178 */
1179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 PyTypeObject *tp = Py_TYPE(obj);
1181 PyObject *descr = NULL;
1182 PyObject *res = NULL;
1183 descrgetfunc f;
1184 Py_ssize_t dictoffset;
1185 PyObject **dictptr;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 if (!PyUnicode_Check(name)){
1188 PyErr_Format(PyExc_TypeError,
1189 "attribute name must be string, not '%.200s'",
1190 name->ob_type->tp_name);
1191 return NULL;
1192 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001193 Py_INCREF(name);
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 if (tp->tp_dict == NULL) {
1196 if (PyType_Ready(tp) < 0)
1197 goto done;
1198 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 descr = _PyType_Lookup(tp, name);
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00001201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 f = NULL;
1203 if (descr != NULL) {
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001204 Py_INCREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 f = descr->ob_type->tp_descr_get;
1206 if (f != NULL && PyDescr_IsData(descr)) {
1207 res = f(descr, obj, (PyObject *)obj->ob_type);
INADA Naoki378edee2018-01-16 20:52:41 +09001208 if (res == NULL && suppress &&
1209 PyErr_ExceptionMatches(PyExc_AttributeError)) {
1210 PyErr_Clear();
1211 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 goto done;
1213 }
1214 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001215
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001216 if (dict == NULL) {
1217 /* Inline _PyObject_GetDictPtr */
1218 dictoffset = tp->tp_dictoffset;
1219 if (dictoffset != 0) {
1220 if (dictoffset < 0) {
1221 Py_ssize_t tsize;
1222 size_t size;
Guido van Rossumc66ff442002-08-19 16:50:48 +00001223
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001224 tsize = ((PyVarObject *)obj)->ob_size;
1225 if (tsize < 0)
1226 tsize = -tsize;
1227 size = _PyObject_VAR_SIZE(tp, tsize);
Victor Stinner24702042018-10-26 17:16:37 +02001228 _PyObject_ASSERT(obj, size <= PY_SSIZE_T_MAX);
Guido van Rossumc66ff442002-08-19 16:50:48 +00001229
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001230 dictoffset += (Py_ssize_t)size;
Victor Stinner24702042018-10-26 17:16:37 +02001231 _PyObject_ASSERT(obj, dictoffset > 0);
1232 _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001234 dictptr = (PyObject **) ((char *)obj + dictoffset);
1235 dict = *dictptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 }
1237 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001238 if (dict != NULL) {
1239 Py_INCREF(dict);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001240 res = PyDict_GetItemWithError(dict, name);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001241 if (res != NULL) {
1242 Py_INCREF(res);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001243 Py_DECREF(dict);
1244 goto done;
1245 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001246 else {
1247 Py_DECREF(dict);
1248 if (PyErr_Occurred()) {
1249 if (suppress && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1250 PyErr_Clear();
1251 }
1252 else {
1253 goto done;
1254 }
1255 }
1256 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001257 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 if (f != NULL) {
1260 res = f(descr, obj, (PyObject *)Py_TYPE(obj));
INADA Naoki378edee2018-01-16 20:52:41 +09001261 if (res == NULL && suppress &&
1262 PyErr_ExceptionMatches(PyExc_AttributeError)) {
1263 PyErr_Clear();
1264 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 goto done;
1266 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 if (descr != NULL) {
1269 res = descr;
Victor Stinner2d01dc02012-03-09 00:44:13 +01001270 descr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 goto done;
1272 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001273
INADA Naoki378edee2018-01-16 20:52:41 +09001274 if (!suppress) {
1275 PyErr_Format(PyExc_AttributeError,
1276 "'%.50s' object has no attribute '%U'",
1277 tp->tp_name, name);
1278 }
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001279 done:
Victor Stinner2d01dc02012-03-09 00:44:13 +01001280 Py_XDECREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 Py_DECREF(name);
1282 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001283}
1284
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001285PyObject *
1286PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
1287{
INADA Naoki378edee2018-01-16 20:52:41 +09001288 return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 0);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001289}
1290
Tim Peters6d6c1a32001-08-02 04:15:00 +00001291int
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001292_PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
1293 PyObject *value, PyObject *dict)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 PyTypeObject *tp = Py_TYPE(obj);
1296 PyObject *descr;
1297 descrsetfunc f;
1298 PyObject **dictptr;
1299 int res = -1;
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 if (!PyUnicode_Check(name)){
1302 PyErr_Format(PyExc_TypeError,
1303 "attribute name must be string, not '%.200s'",
1304 name->ob_type->tp_name);
1305 return -1;
1306 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001307
Benjamin Peterson74529ad2012-03-09 07:25:32 -08001308 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1309 return -1;
1310
1311 Py_INCREF(name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 descr = _PyType_Lookup(tp, name);
Victor Stinner2d01dc02012-03-09 00:44:13 +01001314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 if (descr != NULL) {
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001316 Py_INCREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 f = descr->ob_type->tp_descr_set;
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001318 if (f != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 res = f(descr, obj, value);
1320 goto done;
1321 }
1322 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001323
Steve Dowerb82e17e2019-05-23 08:45:22 -07001324 /* XXX [Steve Dower] These are really noisy - worth it? */
1325 /*if (PyType_Check(obj) || PyModule_Check(obj)) {
1326 if (value && PySys_Audit("object.__setattr__", "OOO", obj, name, value) < 0)
1327 return -1;
1328 if (!value && PySys_Audit("object.__delattr__", "OO", obj, name) < 0)
1329 return -1;
1330 }*/
1331
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001332 if (dict == NULL) {
1333 dictptr = _PyObject_GetDictPtr(obj);
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001334 if (dictptr == NULL) {
1335 if (descr == NULL) {
1336 PyErr_Format(PyExc_AttributeError,
1337 "'%.100s' object has no attribute '%U'",
1338 tp->tp_name, name);
1339 }
1340 else {
1341 PyErr_Format(PyExc_AttributeError,
1342 "'%.50s' object attribute '%U' is read-only",
1343 tp->tp_name, name);
1344 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001345 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001347 res = _PyObjectDict_SetItem(tp, dictptr, name, value);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001348 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001349 else {
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001350 Py_INCREF(dict);
1351 if (value == NULL)
1352 res = PyDict_DelItem(dict, name);
1353 else
1354 res = PyDict_SetItem(dict, name, value);
Benjamin Peterson74529ad2012-03-09 07:25:32 -08001355 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001357 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
1358 PyErr_SetObject(PyExc_AttributeError, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001359
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001360 done:
Victor Stinner2d01dc02012-03-09 00:44:13 +01001361 Py_XDECREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 Py_DECREF(name);
1363 return res;
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001364}
1365
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001366int
1367PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
1368{
1369 return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
1370}
1371
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001372int
1373PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
1374{
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001375 PyObject **dictptr = _PyObject_GetDictPtr(obj);
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001376 if (dictptr == NULL) {
1377 PyErr_SetString(PyExc_AttributeError,
1378 "This object has no __dict__");
1379 return -1;
1380 }
1381 if (value == NULL) {
1382 PyErr_SetString(PyExc_TypeError, "cannot delete __dict__");
1383 return -1;
1384 }
1385 if (!PyDict_Check(value)) {
1386 PyErr_Format(PyExc_TypeError,
1387 "__dict__ must be set to a dictionary, "
1388 "not a '%.200s'", Py_TYPE(value)->tp_name);
1389 return -1;
1390 }
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001391 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001392 Py_XSETREF(*dictptr, value);
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001393 return 0;
1394}
1395
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001396
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001397/* Test a value used as condition, e.g., in a for or if statement.
1398 Return -1 if an error occurred */
1399
1400int
Fred Drake100814d2000-07-09 15:48:49 +00001401PyObject_IsTrue(PyObject *v)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 Py_ssize_t res;
1404 if (v == Py_True)
1405 return 1;
1406 if (v == Py_False)
1407 return 0;
1408 if (v == Py_None)
1409 return 0;
1410 else if (v->ob_type->tp_as_number != NULL &&
1411 v->ob_type->tp_as_number->nb_bool != NULL)
1412 res = (*v->ob_type->tp_as_number->nb_bool)(v);
1413 else if (v->ob_type->tp_as_mapping != NULL &&
1414 v->ob_type->tp_as_mapping->mp_length != NULL)
1415 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1416 else if (v->ob_type->tp_as_sequence != NULL &&
1417 v->ob_type->tp_as_sequence->sq_length != NULL)
1418 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1419 else
1420 return 1;
1421 /* if it is negative, it should be either -1 or -2 */
1422 return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001423}
1424
Tim Peters803526b2002-07-07 05:13:56 +00001425/* equivalent of 'not v'
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001426 Return -1 if an error occurred */
1427
1428int
Fred Drake100814d2000-07-09 15:48:49 +00001429PyObject_Not(PyObject *v)
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 int res;
1432 res = PyObject_IsTrue(v);
1433 if (res < 0)
1434 return res;
1435 return res == 0;
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001436}
1437
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001438/* Test whether an object can be called */
1439
1440int
Fred Drake100814d2000-07-09 15:48:49 +00001441PyCallable_Check(PyObject *x)
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 if (x == NULL)
1444 return 0;
1445 return x->ob_type->tp_call != NULL;
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001446}
1447
Tim Peters7eea37e2001-09-04 22:08:56 +00001448
Georg Brandle32b4222007-03-10 22:13:27 +00001449/* Helper for PyObject_Dir without arguments: returns the local scope. */
1450static PyObject *
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001451_dir_locals(void)
Tim Peters305b5852001-09-17 02:38:46 +00001452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 PyObject *names;
Victor Stinner41bb43a2013-10-29 01:19:37 +01001454 PyObject *locals;
Tim Peters305b5852001-09-17 02:38:46 +00001455
Victor Stinner41bb43a2013-10-29 01:19:37 +01001456 locals = PyEval_GetLocals();
1457 if (locals == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 return NULL;
Tim Peters305b5852001-09-17 02:38:46 +00001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 names = PyMapping_Keys(locals);
1461 if (!names)
1462 return NULL;
1463 if (!PyList_Check(names)) {
1464 PyErr_Format(PyExc_TypeError,
1465 "dir(): expected keys() of locals to be a list, "
1466 "not '%.200s'", Py_TYPE(names)->tp_name);
1467 Py_DECREF(names);
1468 return NULL;
1469 }
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001470 if (PyList_Sort(names)) {
1471 Py_DECREF(names);
1472 return NULL;
1473 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 /* the locals don't need to be DECREF'd */
1475 return names;
Georg Brandle32b4222007-03-10 22:13:27 +00001476}
1477
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001478/* Helper for PyObject_Dir: object introspection. */
Georg Brandle32b4222007-03-10 22:13:27 +00001479static PyObject *
1480_dir_object(PyObject *obj)
1481{
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001482 PyObject *result, *sorted;
Benjamin Petersonce798522012-01-22 11:24:29 -05001483 PyObject *dirfunc = _PyObject_LookupSpecial(obj, &PyId___dir__);
Georg Brandle32b4222007-03-10 22:13:27 +00001484
Victor Stinner24702042018-10-26 17:16:37 +02001485 assert(obj != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 if (dirfunc == NULL) {
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001487 if (!PyErr_Occurred())
1488 PyErr_SetString(PyExc_TypeError, "object does not provide __dir__");
1489 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 }
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001491 /* use __dir__ */
Victor Stinnerf17c3de2016-12-06 18:46:19 +01001492 result = _PyObject_CallNoArg(dirfunc);
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001493 Py_DECREF(dirfunc);
1494 if (result == NULL)
1495 return NULL;
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001496 /* return sorted(result) */
1497 sorted = PySequence_List(result);
1498 Py_DECREF(result);
1499 if (sorted == NULL)
1500 return NULL;
1501 if (PyList_Sort(sorted)) {
1502 Py_DECREF(sorted);
1503 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 }
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001505 return sorted;
Georg Brandle32b4222007-03-10 22:13:27 +00001506}
1507
1508/* Implementation of dir() -- if obj is NULL, returns the names in the current
1509 (local) scope. Otherwise, performs introspection of the object: returns a
1510 sorted list of attribute names (supposedly) accessible from the object
1511*/
1512PyObject *
1513PyObject_Dir(PyObject *obj)
1514{
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001515 return (obj == NULL) ? _dir_locals() : _dir_object(obj);
Tim Peters7eea37e2001-09-04 22:08:56 +00001516}
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001517
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001518/*
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001519None is a non-NULL undefined value.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001520There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +00001521so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001522*/
1523
Guido van Rossum0c182a11992-03-27 17:26:13 +00001524/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001526none_repr(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 return PyUnicode_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001529}
1530
Barry Warsaw9bf16442001-01-23 16:24:35 +00001531/* ARGUSED */
Victor Stinner2a4903f2020-01-30 13:09:11 +01001532static void _Py_NO_RETURN
Tim Peters803526b2002-07-07 05:13:56 +00001533none_dealloc(PyObject* ignore)
Barry Warsaw9bf16442001-01-23 16:24:35 +00001534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 /* This should never get called, but we also don't want to SEGV if
1536 * we accidentally decref None out of existence.
1537 */
1538 Py_FatalError("deallocating None");
Barry Warsaw9bf16442001-01-23 16:24:35 +00001539}
1540
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001541static PyObject *
1542none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1543{
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001544 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001545 PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments");
1546 return NULL;
1547 }
1548 Py_RETURN_NONE;
1549}
1550
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001551static int
1552none_bool(PyObject *v)
1553{
1554 return 0;
1555}
1556
1557static PyNumberMethods none_as_number = {
1558 0, /* nb_add */
1559 0, /* nb_subtract */
1560 0, /* nb_multiply */
1561 0, /* nb_remainder */
1562 0, /* nb_divmod */
1563 0, /* nb_power */
1564 0, /* nb_negative */
1565 0, /* nb_positive */
1566 0, /* nb_absolute */
1567 (inquiry)none_bool, /* nb_bool */
1568 0, /* nb_invert */
1569 0, /* nb_lshift */
1570 0, /* nb_rshift */
1571 0, /* nb_and */
1572 0, /* nb_xor */
1573 0, /* nb_or */
1574 0, /* nb_int */
1575 0, /* nb_reserved */
1576 0, /* nb_float */
1577 0, /* nb_inplace_add */
1578 0, /* nb_inplace_subtract */
1579 0, /* nb_inplace_multiply */
1580 0, /* nb_inplace_remainder */
1581 0, /* nb_inplace_power */
1582 0, /* nb_inplace_lshift */
1583 0, /* nb_inplace_rshift */
1584 0, /* nb_inplace_and */
1585 0, /* nb_inplace_xor */
1586 0, /* nb_inplace_or */
1587 0, /* nb_floor_divide */
1588 0, /* nb_true_divide */
1589 0, /* nb_inplace_floor_divide */
1590 0, /* nb_inplace_true_divide */
1591 0, /* nb_index */
1592};
Barry Warsaw9bf16442001-01-23 16:24:35 +00001593
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001594PyTypeObject _PyNone_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1596 "NoneType",
1597 0,
1598 0,
1599 none_dealloc, /*tp_dealloc*/ /*never called*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001600 0, /*tp_vectorcall_offset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 0, /*tp_getattr*/
1602 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001603 0, /*tp_as_async*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 none_repr, /*tp_repr*/
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001605 &none_as_number, /*tp_as_number*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 0, /*tp_as_sequence*/
1607 0, /*tp_as_mapping*/
1608 0, /*tp_hash */
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001609 0, /*tp_call */
1610 0, /*tp_str */
1611 0, /*tp_getattro */
1612 0, /*tp_setattro */
1613 0, /*tp_as_buffer */
1614 Py_TPFLAGS_DEFAULT, /*tp_flags */
1615 0, /*tp_doc */
1616 0, /*tp_traverse */
1617 0, /*tp_clear */
1618 0, /*tp_richcompare */
1619 0, /*tp_weaklistoffset */
1620 0, /*tp_iter */
1621 0, /*tp_iternext */
1622 0, /*tp_methods */
1623 0, /*tp_members */
1624 0, /*tp_getset */
1625 0, /*tp_base */
1626 0, /*tp_dict */
1627 0, /*tp_descr_get */
1628 0, /*tp_descr_set */
1629 0, /*tp_dictoffset */
1630 0, /*tp_init */
1631 0, /*tp_alloc */
1632 none_new, /*tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001633};
1634
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001635PyObject _Py_NoneStruct = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001636 _PyObject_EXTRA_INIT
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001637 1, &_PyNone_Type
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001638};
1639
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001640/* NotImplemented is an object that can be used to signal that an
1641 operation is not implemented for the given type combination. */
1642
1643static PyObject *
1644NotImplemented_repr(PyObject *op)
1645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 return PyUnicode_FromString("NotImplemented");
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001647}
1648
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001649static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301650NotImplemented_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001651{
1652 return PyUnicode_FromString("NotImplemented");
1653}
1654
1655static PyMethodDef notimplemented_methods[] = {
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301656 {"__reduce__", NotImplemented_reduce, METH_NOARGS, NULL},
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001657 {NULL, NULL}
1658};
1659
1660static PyObject *
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001661notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1662{
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001663 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001664 PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments");
1665 return NULL;
1666 }
Brian Curtindfc80e32011-08-10 20:28:54 -05001667 Py_RETURN_NOTIMPLEMENTED;
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001668}
1669
Victor Stinner2a4903f2020-01-30 13:09:11 +01001670static void _Py_NO_RETURN
Armin Ronacher226b1db2012-10-06 14:28:58 +02001671notimplemented_dealloc(PyObject* ignore)
1672{
1673 /* This should never get called, but we also don't want to SEGV if
1674 * we accidentally decref NotImplemented out of existence.
1675 */
1676 Py_FatalError("deallocating NotImplemented");
1677}
1678
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001679PyTypeObject _PyNotImplemented_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1681 "NotImplementedType",
1682 0,
1683 0,
Armin Ronacher226b1db2012-10-06 14:28:58 +02001684 notimplemented_dealloc, /*tp_dealloc*/ /*never called*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001685 0, /*tp_vectorcall_offset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 0, /*tp_getattr*/
1687 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001688 0, /*tp_as_async*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 NotImplemented_repr, /*tp_repr*/
1690 0, /*tp_as_number*/
1691 0, /*tp_as_sequence*/
1692 0, /*tp_as_mapping*/
1693 0, /*tp_hash */
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001694 0, /*tp_call */
1695 0, /*tp_str */
1696 0, /*tp_getattro */
1697 0, /*tp_setattro */
1698 0, /*tp_as_buffer */
1699 Py_TPFLAGS_DEFAULT, /*tp_flags */
1700 0, /*tp_doc */
1701 0, /*tp_traverse */
1702 0, /*tp_clear */
1703 0, /*tp_richcompare */
1704 0, /*tp_weaklistoffset */
1705 0, /*tp_iter */
1706 0, /*tp_iternext */
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001707 notimplemented_methods, /*tp_methods */
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001708 0, /*tp_members */
1709 0, /*tp_getset */
1710 0, /*tp_base */
1711 0, /*tp_dict */
1712 0, /*tp_descr_get */
1713 0, /*tp_descr_set */
1714 0, /*tp_dictoffset */
1715 0, /*tp_init */
1716 0, /*tp_alloc */
1717 notimplemented_new, /*tp_new */
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001718};
1719
1720PyObject _Py_NotImplementedStruct = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 _PyObject_EXTRA_INIT
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001722 1, &_PyNotImplemented_Type
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001723};
1724
Victor Stinner331a6a52019-05-27 16:39:22 +02001725PyStatus
Victor Stinnerab672812019-01-23 15:04:40 +01001726_PyTypes_Init(void)
Guido van Rossumba21a492001-08-16 08:17:26 +00001727{
Victor Stinner7a1f6c22020-01-30 09:02:14 +01001728 PyStatus status = _PyTypes_InitSlotDefs();
1729 if (_PyStatus_EXCEPTION(status)) {
1730 return status;
1731 }
1732
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001733#define INIT_TYPE(TYPE, NAME) \
1734 do { \
1735 if (PyType_Ready(TYPE) < 0) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02001736 return _PyStatus_ERR("Can't initialize " NAME " type"); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001737 } \
1738 } while (0)
Victor Stinner5a1bb4e2014-06-02 14:10:59 +02001739
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001740 INIT_TYPE(&PyBaseObject_Type, "object");
1741 INIT_TYPE(&PyType_Type, "type");
1742 INIT_TYPE(&_PyWeakref_RefType, "weakref");
1743 INIT_TYPE(&_PyWeakref_CallableProxyType, "callable weakref proxy");
1744 INIT_TYPE(&_PyWeakref_ProxyType, "weakref proxy");
1745 INIT_TYPE(&PyLong_Type, "int");
1746 INIT_TYPE(&PyBool_Type, "bool");
1747 INIT_TYPE(&PyByteArray_Type, "bytearray");
1748 INIT_TYPE(&PyBytes_Type, "str");
1749 INIT_TYPE(&PyList_Type, "list");
1750 INIT_TYPE(&_PyNone_Type, "None");
1751 INIT_TYPE(&_PyNotImplemented_Type, "NotImplemented");
1752 INIT_TYPE(&PyTraceBack_Type, "traceback");
1753 INIT_TYPE(&PySuper_Type, "super");
1754 INIT_TYPE(&PyRange_Type, "range");
1755 INIT_TYPE(&PyDict_Type, "dict");
1756 INIT_TYPE(&PyDictKeys_Type, "dict keys");
1757 INIT_TYPE(&PyDictValues_Type, "dict values");
1758 INIT_TYPE(&PyDictItems_Type, "dict items");
1759 INIT_TYPE(&PyDictRevIterKey_Type, "reversed dict keys");
1760 INIT_TYPE(&PyDictRevIterValue_Type, "reversed dict values");
1761 INIT_TYPE(&PyDictRevIterItem_Type, "reversed dict items");
1762 INIT_TYPE(&PyODict_Type, "OrderedDict");
1763 INIT_TYPE(&PyODictKeys_Type, "odict_keys");
1764 INIT_TYPE(&PyODictItems_Type, "odict_items");
1765 INIT_TYPE(&PyODictValues_Type, "odict_values");
1766 INIT_TYPE(&PyODictIter_Type, "odict_keyiterator");
1767 INIT_TYPE(&PySet_Type, "set");
1768 INIT_TYPE(&PyUnicode_Type, "str");
1769 INIT_TYPE(&PySlice_Type, "slice");
1770 INIT_TYPE(&PyStaticMethod_Type, "static method");
1771 INIT_TYPE(&PyComplex_Type, "complex");
1772 INIT_TYPE(&PyFloat_Type, "float");
1773 INIT_TYPE(&PyFrozenSet_Type, "frozenset");
1774 INIT_TYPE(&PyProperty_Type, "property");
1775 INIT_TYPE(&_PyManagedBuffer_Type, "managed buffer");
1776 INIT_TYPE(&PyMemoryView_Type, "memoryview");
1777 INIT_TYPE(&PyTuple_Type, "tuple");
1778 INIT_TYPE(&PyEnum_Type, "enumerate");
1779 INIT_TYPE(&PyReversed_Type, "reversed");
1780 INIT_TYPE(&PyStdPrinter_Type, "StdPrinter");
1781 INIT_TYPE(&PyCode_Type, "code");
1782 INIT_TYPE(&PyFrame_Type, "frame");
1783 INIT_TYPE(&PyCFunction_Type, "builtin function");
1784 INIT_TYPE(&PyMethod_Type, "method");
1785 INIT_TYPE(&PyFunction_Type, "function");
1786 INIT_TYPE(&PyDictProxy_Type, "dict proxy");
1787 INIT_TYPE(&PyGen_Type, "generator");
1788 INIT_TYPE(&PyGetSetDescr_Type, "get-set descriptor");
1789 INIT_TYPE(&PyWrapperDescr_Type, "wrapper");
1790 INIT_TYPE(&_PyMethodWrapper_Type, "method wrapper");
1791 INIT_TYPE(&PyEllipsis_Type, "ellipsis");
1792 INIT_TYPE(&PyMemberDescr_Type, "member descriptor");
1793 INIT_TYPE(&_PyNamespace_Type, "namespace");
1794 INIT_TYPE(&PyCapsule_Type, "capsule");
1795 INIT_TYPE(&PyLongRangeIter_Type, "long range iterator");
1796 INIT_TYPE(&PyCell_Type, "cell");
1797 INIT_TYPE(&PyInstanceMethod_Type, "instance method");
1798 INIT_TYPE(&PyClassMethodDescr_Type, "class method descr");
1799 INIT_TYPE(&PyMethodDescr_Type, "method descr");
1800 INIT_TYPE(&PyCallIter_Type, "call iter");
1801 INIT_TYPE(&PySeqIter_Type, "sequence iterator");
Antoine Pitrou91f43802019-05-26 17:10:09 +02001802 INIT_TYPE(&PyPickleBuffer_Type, "pickle.PickleBuffer");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001803 INIT_TYPE(&PyCoro_Type, "coroutine");
1804 INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper");
Eric Snowc11183c2019-03-15 16:35:46 -06001805 INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID");
Victor Stinner331a6a52019-05-27 16:39:22 +02001806 return _PyStatus_OK();
Guido van Rossumba21a492001-08-16 08:17:26 +00001807
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001808#undef INIT_TYPE
Guido van Rossumba21a492001-08-16 08:17:26 +00001809}
1810
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001811
Victor Stinner40e547d2020-02-05 01:11:10 +01001812void
1813_Py_NewReference(PyObject *op)
1814{
1815 if (_Py_tracemalloc_config.tracing) {
1816 _PyTraceMalloc_NewReference(op);
1817 }
1818#ifdef Py_REF_DEBUG
1819 _Py_RefTotal++;
1820#endif
1821 Py_REFCNT(op) = 1;
1822#ifdef Py_TRACE_REFS
1823 _Py_AddToAllObjects(op, 1);
1824#endif
1825}
1826
1827
Guido van Rossum84a90321996-05-22 16:34:47 +00001828#ifdef Py_TRACE_REFS
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001829void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001830_Py_ForgetReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001831{
Victor Stinner5eb8bff2020-01-30 09:01:07 +01001832 if (op->ob_refcnt < 0) {
1833 _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt");
1834 }
1835
1836 if (op == &refchain ||
1837 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
1838 {
1839 _PyObject_ASSERT_FAILED_MSG(op, "invalid object chain");
1840 }
1841
Guido van Rossumbffd6832000-01-20 22:32:56 +00001842#ifdef SLOW_UNREF_CHECK
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001843 PyObject *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
Victor Stinner5eb8bff2020-01-30 09:01:07 +01001845 if (p == op) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 break;
Victor Stinner5eb8bff2020-01-30 09:01:07 +01001847 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 }
Victor Stinner5eb8bff2020-01-30 09:01:07 +01001849 if (p == &refchain) {
1850 /* Not found */
1851 _PyObject_ASSERT_FAILED_MSG(op,
1852 "object not found in the objects list");
1853 }
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001854#endif
Victor Stinner5eb8bff2020-01-30 09:01:07 +01001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 op->_ob_next->_ob_prev = op->_ob_prev;
1857 op->_ob_prev->_ob_next = op->_ob_next;
1858 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001859}
1860
Tim Peters269b2a62003-04-17 19:52:29 +00001861/* Print all live objects. Because PyObject_Print is called, the
1862 * interpreter must be in a healthy state.
1863 */
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001864void
Fred Drake100814d2000-07-09 15:48:49 +00001865_Py_PrintReferences(FILE *fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 PyObject *op;
1868 fprintf(fp, "Remaining objects:\n");
1869 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
Zackery Spytz1a2252e2019-05-06 10:56:51 -06001870 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, op->ob_refcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 if (PyObject_Print(op, fp, 0) != 0)
1872 PyErr_Clear();
1873 putc('\n', fp);
1874 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001875}
1876
Tim Peters269b2a62003-04-17 19:52:29 +00001877/* Print the addresses of all live objects. Unlike _Py_PrintReferences, this
1878 * doesn't make any calls to the Python C API, so is always safe to call.
1879 */
1880void
1881_Py_PrintReferenceAddresses(FILE *fp)
1882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 PyObject *op;
1884 fprintf(fp, "Remaining object addresses:\n");
1885 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next)
Zackery Spytz1a2252e2019-05-06 10:56:51 -06001886 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", (void *)op,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 op->ob_refcnt, Py_TYPE(op)->tp_name);
Tim Peters269b2a62003-04-17 19:52:29 +00001888}
1889
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001890PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001891_Py_GetObjects(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 int i, n;
1894 PyObject *t = NULL;
1895 PyObject *res, *op;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
1898 return NULL;
1899 op = refchain._ob_next;
1900 res = PyList_New(0);
1901 if (res == NULL)
1902 return NULL;
1903 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
1904 while (op == self || op == args || op == res || op == t ||
1905 (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) {
1906 op = op->_ob_next;
1907 if (op == &refchain)
1908 return res;
1909 }
1910 if (PyList_Append(res, op) < 0) {
1911 Py_DECREF(res);
1912 return NULL;
1913 }
1914 op = op->_ob_next;
1915 }
1916 return res;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001917}
1918
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001919#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +00001920
Benjamin Petersonb173f782009-05-05 22:31:58 +00001921
Guido van Rossum84a90321996-05-22 16:34:47 +00001922/* Hack to force loading of abstract.o */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001923Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size;
Guido van Rossume09fb551997-08-05 02:04:34 +00001924
1925
David Malcolm49526f42012-06-22 14:55:41 -04001926void
1927_PyObject_DebugTypeStats(FILE *out)
1928{
David Malcolm49526f42012-06-22 14:55:41 -04001929 _PyDict_DebugMallocStats(out);
1930 _PyFloat_DebugMallocStats(out);
1931 _PyFrame_DebugMallocStats(out);
1932 _PyList_DebugMallocStats(out);
David Malcolm49526f42012-06-22 14:55:41 -04001933 _PyTuple_DebugMallocStats(out);
1934}
Guido van Rossumb18618d2000-05-03 23:44:39 +00001935
Guido van Rossum86610361998-04-10 22:32:46 +00001936/* These methods are used to control infinite recursion in repr, str, print,
1937 etc. Container objects that may recursively contain themselves,
Martin Panter8d56c022016-05-29 04:13:35 +00001938 e.g. builtin dictionaries and lists, should use Py_ReprEnter() and
Guido van Rossum86610361998-04-10 22:32:46 +00001939 Py_ReprLeave() to avoid infinite recursion.
1940
1941 Py_ReprEnter() returns 0 the first time it is called for a particular
1942 object and 1 every time thereafter. It returns -1 if an exception
1943 occurred. Py_ReprLeave() has no return value.
1944
1945 See dictobject.c and listobject.c for examples of use.
1946*/
1947
Guido van Rossum86610361998-04-10 22:32:46 +00001948int
Fred Drake100814d2000-07-09 15:48:49 +00001949Py_ReprEnter(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 PyObject *dict;
1952 PyObject *list;
1953 Py_ssize_t i;
Guido van Rossum86610361998-04-10 22:32:46 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 dict = PyThreadState_GetDict();
Antoine Pitrou04d17d32014-03-31 22:04:38 +02001956 /* Ignore a missing thread-state, so that this function can be called
1957 early on startup. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 if (dict == NULL)
1959 return 0;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001960 list = _PyDict_GetItemIdWithError(dict, &PyId_Py_Repr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 if (list == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001962 if (PyErr_Occurred()) {
1963 return -1;
1964 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 list = PyList_New(0);
1966 if (list == NULL)
1967 return -1;
Victor Stinner7a07e452013-11-06 18:57:29 +01001968 if (_PyDict_SetItemId(dict, &PyId_Py_Repr, list) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 return -1;
1970 Py_DECREF(list);
1971 }
1972 i = PyList_GET_SIZE(list);
1973 while (--i >= 0) {
1974 if (PyList_GET_ITEM(list, i) == obj)
1975 return 1;
1976 }
Victor Stinnere901d1f2013-07-17 21:58:41 +02001977 if (PyList_Append(list, obj) < 0)
1978 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 return 0;
Guido van Rossum86610361998-04-10 22:32:46 +00001980}
1981
1982void
Fred Drake100814d2000-07-09 15:48:49 +00001983Py_ReprLeave(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 PyObject *dict;
1986 PyObject *list;
1987 Py_ssize_t i;
Victor Stinner1b634932013-07-16 22:24:44 +02001988 PyObject *error_type, *error_value, *error_traceback;
1989
1990 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum86610361998-04-10 22:32:46 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 dict = PyThreadState_GetDict();
1993 if (dict == NULL)
Victor Stinner1b634932013-07-16 22:24:44 +02001994 goto finally;
1995
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001996 list = _PyDict_GetItemIdWithError(dict, &PyId_Py_Repr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 if (list == NULL || !PyList_Check(list))
Victor Stinner1b634932013-07-16 22:24:44 +02001998 goto finally;
1999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 i = PyList_GET_SIZE(list);
2001 /* Count backwards because we always expect obj to be list[-1] */
2002 while (--i >= 0) {
2003 if (PyList_GET_ITEM(list, i) == obj) {
2004 PyList_SetSlice(list, i, i + 1, NULL);
2005 break;
2006 }
2007 }
Victor Stinner1b634932013-07-16 22:24:44 +02002008
2009finally:
2010 /* ignore exceptions because there is no way to report them. */
2011 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum86610361998-04-10 22:32:46 +00002012}
Guido van Rossumd724b232000-03-13 16:01:29 +00002013
Tim Peters803526b2002-07-07 05:13:56 +00002014/* Trashcan support. */
Guido van Rossumd724b232000-03-13 16:01:29 +00002015
Tim Peters803526b2002-07-07 05:13:56 +00002016/* Add op to the _PyTrash_delete_later list. Called when the current
2017 * call-stack depth gets large. op must be a currently untracked gc'ed
2018 * object, with refcount 0. Py_DECREF must already have been called on it.
2019 */
Guido van Rossumd724b232000-03-13 16:01:29 +00002020void
Fred Drake100814d2000-07-09 15:48:49 +00002021_PyTrash_deposit_object(PyObject *op)
Guido van Rossumd724b232000-03-13 16:01:29 +00002022{
Victor Stinner72474072019-11-20 12:25:50 +01002023 PyThreadState *tstate = _PyThreadState_GET();
2024 struct _gc_runtime_state *gcstate = &tstate->interp->gc;
2025
Victor Stinner24702042018-10-26 17:16:37 +02002026 _PyObject_ASSERT(op, PyObject_IS_GC(op));
2027 _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op));
2028 _PyObject_ASSERT(op, op->ob_refcnt == 0);
Victor Stinner72474072019-11-20 12:25:50 +01002029 _PyGCHead_SET_PREV(_Py_AS_GC(op), gcstate->trash_delete_later);
2030 gcstate->trash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00002031}
2032
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002033/* The equivalent API, using per-thread state recursion info */
2034void
2035_PyTrash_thread_deposit_object(PyObject *op)
2036{
Victor Stinner50b48572018-11-01 01:51:40 +01002037 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner24702042018-10-26 17:16:37 +02002038 _PyObject_ASSERT(op, PyObject_IS_GC(op));
2039 _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op));
2040 _PyObject_ASSERT(op, op->ob_refcnt == 0);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002041 _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002042 tstate->trash_delete_later = op;
2043}
2044
Min ho Kimc4cacc82019-07-31 08:16:13 +10002045/* Deallocate all the objects in the _PyTrash_delete_later list. Called when
Tim Peters803526b2002-07-07 05:13:56 +00002046 * the call-stack unwinds again.
2047 */
Guido van Rossumd724b232000-03-13 16:01:29 +00002048void
Fred Drake100814d2000-07-09 15:48:49 +00002049_PyTrash_destroy_chain(void)
Guido van Rossumd724b232000-03-13 16:01:29 +00002050{
Victor Stinner72474072019-11-20 12:25:50 +01002051 PyThreadState *tstate = _PyThreadState_GET();
2052 struct _gc_runtime_state *gcstate = &tstate->interp->gc;
2053
2054 while (gcstate->trash_delete_later) {
2055 PyObject *op = gcstate->trash_delete_later;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 destructor dealloc = Py_TYPE(op)->tp_dealloc;
Neil Schemenauerf589c052002-03-29 03:05:54 +00002057
Victor Stinner72474072019-11-20 12:25:50 +01002058 gcstate->trash_delete_later =
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002059 (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
Neil Schemenauerf589c052002-03-29 03:05:54 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 /* Call the deallocator directly. This used to try to
2062 * fool Py_DECREF into calling it indirectly, but
2063 * Py_DECREF was already called on this object, and in
2064 * assorted non-release builds calling Py_DECREF again ends
2065 * up distorting allocation statistics.
2066 */
Victor Stinner24702042018-10-26 17:16:37 +02002067 _PyObject_ASSERT(op, op->ob_refcnt == 0);
Victor Stinner72474072019-11-20 12:25:50 +01002068 ++gcstate->trash_delete_nesting;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 (*dealloc)(op);
Victor Stinner72474072019-11-20 12:25:50 +01002070 --gcstate->trash_delete_nesting;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 }
Guido van Rossumd724b232000-03-13 16:01:29 +00002072}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002073
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002074/* The equivalent API, using per-thread state recursion info */
2075void
2076_PyTrash_thread_destroy_chain(void)
2077{
Victor Stinner50b48572018-11-01 01:51:40 +01002078 PyThreadState *tstate = _PyThreadState_GET();
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002079 /* We need to increase trash_delete_nesting here, otherwise,
2080 _PyTrash_thread_destroy_chain will be called recursively
2081 and then possibly crash. An example that may crash without
2082 increase:
2083 N = 500000 # need to be large enough
2084 ob = object()
2085 tups = [(ob,) for i in range(N)]
2086 for i in range(49):
2087 tups = [(tup,) for tup in tups]
2088 del tups
2089 */
2090 assert(tstate->trash_delete_nesting == 0);
2091 ++tstate->trash_delete_nesting;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002092 while (tstate->trash_delete_later) {
2093 PyObject *op = tstate->trash_delete_later;
2094 destructor dealloc = Py_TYPE(op)->tp_dealloc;
2095
2096 tstate->trash_delete_later =
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002097 (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002098
2099 /* Call the deallocator directly. This used to try to
2100 * fool Py_DECREF into calling it indirectly, but
2101 * Py_DECREF was already called on this object, and in
2102 * assorted non-release builds calling Py_DECREF again ends
2103 * up distorting allocation statistics.
2104 */
Victor Stinner24702042018-10-26 17:16:37 +02002105 _PyObject_ASSERT(op, op->ob_refcnt == 0);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002106 (*dealloc)(op);
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002107 assert(tstate->trash_delete_nesting == 1);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002108 }
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002109 --tstate->trash_delete_nesting;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002110}
2111
Victor Stinner626bff82018-10-25 17:31:10 +02002112
Victor Stinner2a4903f2020-01-30 13:09:11 +01002113void _Py_NO_RETURN
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002114_PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
Victor Stinner626bff82018-10-25 17:31:10 +02002115 const char *file, int line, const char *function)
2116{
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002117 fprintf(stderr, "%s:%d: ", file, line);
2118 if (function) {
2119 fprintf(stderr, "%s: ", function);
2120 }
Victor Stinner626bff82018-10-25 17:31:10 +02002121 fflush(stderr);
Victor Stinner68762572019-10-07 18:42:01 +02002122
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002123 if (expr) {
2124 fprintf(stderr, "Assertion \"%s\" failed", expr);
Victor Stinner626bff82018-10-25 17:31:10 +02002125 }
2126 else {
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002127 fprintf(stderr, "Assertion failed");
Victor Stinner626bff82018-10-25 17:31:10 +02002128 }
2129 fflush(stderr);
Victor Stinner68762572019-10-07 18:42:01 +02002130
Victor Stinnerf1d002c2018-11-21 23:53:44 +01002131 if (msg) {
2132 fprintf(stderr, ": %s", msg);
2133 }
2134 fprintf(stderr, "\n");
2135 fflush(stderr);
Victor Stinner626bff82018-10-25 17:31:10 +02002136
Victor Stinner68762572019-10-07 18:42:01 +02002137 if (_PyObject_IsFreed(obj)) {
Victor Stinner626bff82018-10-25 17:31:10 +02002138 /* It seems like the object memory has been freed:
2139 don't access it to prevent a segmentation fault. */
Victor Stinnerb39afb72019-09-17 23:36:28 +02002140 fprintf(stderr, "<object at %p is freed>\n", obj);
Victor Stinner68762572019-10-07 18:42:01 +02002141 fflush(stderr);
Victor Stinner626bff82018-10-25 17:31:10 +02002142 }
2143 else {
penguindustin96466302019-05-06 14:57:17 -04002144 /* Display the traceback where the object has been allocated.
Victor Stinner626bff82018-10-25 17:31:10 +02002145 Do it before dumping repr(obj), since repr() is more likely
2146 to crash than dumping the traceback. */
2147 void *ptr;
2148 PyTypeObject *type = Py_TYPE(obj);
2149 if (PyType_IS_GC(type)) {
2150 ptr = (void *)((char *)obj - sizeof(PyGC_Head));
2151 }
2152 else {
2153 ptr = (void *)obj;
2154 }
2155 _PyMem_DumpTraceback(fileno(stderr), ptr);
2156
2157 /* This might succeed or fail, but we're about to abort, so at least
2158 try to provide any extra info we can: */
2159 _PyObject_Dump(obj);
Victor Stinner77753492019-10-07 23:44:05 +02002160
2161 fprintf(stderr, "\n");
2162 fflush(stderr);
Victor Stinner626bff82018-10-25 17:31:10 +02002163 }
Victor Stinner626bff82018-10-25 17:31:10 +02002164
2165 Py_FatalError("_PyObject_AssertFailed");
2166}
2167
Victor Stinner3c09dca2018-10-30 14:48:26 +01002168
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002169void
2170_Py_Dealloc(PyObject *op)
2171{
Victor Stinner3c09dca2018-10-30 14:48:26 +01002172 destructor dealloc = Py_TYPE(op)->tp_dealloc;
2173#ifdef Py_TRACE_REFS
2174 _Py_ForgetReference(op);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002175#endif
Victor Stinner3c09dca2018-10-30 14:48:26 +01002176 (*dealloc)(op);
2177}
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002178
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002179#ifdef __cplusplus
2180}
2181#endif