• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  
2  /* Generic object operations; and implementation of None */
3  
4  #include "Python.h"
5  #include "pycore_ceval.h"         // _Py_EnterRecursiveCall()
6  #include "pycore_context.h"
7  #include "pycore_initconfig.h"
8  #include "pycore_object.h"
9  #include "pycore_pyerrors.h"
10  #include "pycore_pylifecycle.h"
11  #include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
12  #include "pycore_pystate.h"       // _PyThreadState_GET()
13  #include "pycore_symtable.h"      // PySTEntry_Type
14  #include "pycore_unionobject.h"   // _PyUnion_Type
15  #include "frameobject.h"
16  #include "interpreteridobject.h"
17  
18  #ifdef Py_LIMITED_API
19     // Prevent recursive call _Py_IncRef() <=> Py_INCREF()
20  #  error "Py_LIMITED_API macro must not be defined"
21  #endif
22  
23  #ifdef __cplusplus
24  extern "C" {
25  #endif
26  
27  /* Defined in tracemalloc.c */
28  extern void _PyMem_DumpTraceback(int fd, const void *ptr);
29  
30  _Py_IDENTIFIER(Py_Repr);
31  _Py_IDENTIFIER(__bytes__);
32  _Py_IDENTIFIER(__dir__);
33  _Py_IDENTIFIER(__isabstractmethod__);
34  
35  
36  int
_PyObject_CheckConsistency(PyObject * op,int check_content)37  _PyObject_CheckConsistency(PyObject *op, int check_content)
38  {
39  #define CHECK(expr) \
40      do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0)
41  
42      CHECK(!_PyObject_IsFreed(op));
43      CHECK(Py_REFCNT(op) >= 1);
44  
45      _PyType_CheckConsistency(Py_TYPE(op));
46  
47      if (PyUnicode_Check(op)) {
48          _PyUnicode_CheckConsistency(op, check_content);
49      }
50      else if (PyDict_Check(op)) {
51          _PyDict_CheckConsistency(op, check_content);
52      }
53      return 1;
54  
55  #undef CHECK
56  }
57  
58  
59  #ifdef Py_REF_DEBUG
60  Py_ssize_t _Py_RefTotal;
61  
62  Py_ssize_t
_Py_GetRefTotal(void)63  _Py_GetRefTotal(void)
64  {
65      PyObject *o;
66      Py_ssize_t total = _Py_RefTotal;
67      o = _PySet_Dummy;
68      if (o != NULL)
69          total -= Py_REFCNT(o);
70      return total;
71  }
72  
73  void
_PyDebug_PrintTotalRefs(void)74  _PyDebug_PrintTotalRefs(void) {
75      fprintf(stderr,
76              "[%zd refs, %zd blocks]\n",
77              _Py_GetRefTotal(), _Py_GetAllocatedBlocks());
78  }
79  #endif /* Py_REF_DEBUG */
80  
81  /* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
82     These are used by the individual routines for object creation.
83     Do not call them otherwise, they do not initialize the object! */
84  
85  #ifdef Py_TRACE_REFS
86  /* Head of circular doubly-linked list of all objects.  These are linked
87   * together via the _ob_prev and _ob_next members of a PyObject, which
88   * exist only in a Py_TRACE_REFS build.
89   */
90  static PyObject refchain = {&refchain, &refchain};
91  
92  /* Insert op at the front of the list of all objects.  If force is true,
93   * op is added even if _ob_prev and _ob_next are non-NULL already.  If
94   * force is false amd _ob_prev or _ob_next are non-NULL, do nothing.
95   * force should be true if and only if op points to freshly allocated,
96   * uninitialized memory, or you've unlinked op from the list and are
97   * relinking it into the front.
98   * Note that objects are normally added to the list via _Py_NewReference,
99   * which is called by PyObject_Init.  Not all objects are initialized that
100   * way, though; exceptions include statically allocated type objects, and
101   * statically allocated singletons (like Py_True and Py_None).
102   */
103  void
_Py_AddToAllObjects(PyObject * op,int force)104  _Py_AddToAllObjects(PyObject *op, int force)
105  {
106  #ifdef  Py_DEBUG
107      if (!force) {
108          /* If it's initialized memory, op must be in or out of
109           * the list unambiguously.
110           */
111          _PyObject_ASSERT(op, (op->_ob_prev == NULL) == (op->_ob_next == NULL));
112      }
113  #endif
114      if (force || op->_ob_prev == NULL) {
115          op->_ob_next = refchain._ob_next;
116          op->_ob_prev = &refchain;
117          refchain._ob_next->_ob_prev = op;
118          refchain._ob_next = op;
119      }
120  }
121  #endif  /* Py_TRACE_REFS */
122  
123  #ifdef Py_REF_DEBUG
124  /* Log a fatal error; doesn't return. */
125  void
_Py_NegativeRefcount(const char * filename,int lineno,PyObject * op)126  _Py_NegativeRefcount(const char *filename, int lineno, PyObject *op)
127  {
128      _PyObject_AssertFailed(op, NULL, "object has negative ref count",
129                             filename, lineno, __func__);
130  }
131  
132  #endif /* Py_REF_DEBUG */
133  
134  void
Py_IncRef(PyObject * o)135  Py_IncRef(PyObject *o)
136  {
137      Py_XINCREF(o);
138  }
139  
140  void
Py_DecRef(PyObject * o)141  Py_DecRef(PyObject *o)
142  {
143      Py_XDECREF(o);
144  }
145  
146  void
_Py_IncRef(PyObject * o)147  _Py_IncRef(PyObject *o)
148  {
149      Py_INCREF(o);
150  }
151  
152  void
_Py_DecRef(PyObject * o)153  _Py_DecRef(PyObject *o)
154  {
155      Py_DECREF(o);
156  }
157  
158  PyObject *
PyObject_Init(PyObject * op,PyTypeObject * tp)159  PyObject_Init(PyObject *op, PyTypeObject *tp)
160  {
161      if (op == NULL) {
162          return PyErr_NoMemory();
163      }
164  
165      _PyObject_Init(op, tp);
166      return op;
167  }
168  
169  PyVarObject *
PyObject_InitVar(PyVarObject * op,PyTypeObject * tp,Py_ssize_t size)170  PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size)
171  {
172      if (op == NULL) {
173          return (PyVarObject *) PyErr_NoMemory();
174      }
175  
176      _PyObject_InitVar(op, tp, size);
177      return op;
178  }
179  
180  PyObject *
_PyObject_New(PyTypeObject * tp)181  _PyObject_New(PyTypeObject *tp)
182  {
183      PyObject *op = (PyObject *) PyObject_Malloc(_PyObject_SIZE(tp));
184      if (op == NULL) {
185          return PyErr_NoMemory();
186      }
187      _PyObject_Init(op, tp);
188      return op;
189  }
190  
191  PyVarObject *
_PyObject_NewVar(PyTypeObject * tp,Py_ssize_t nitems)192  _PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
193  {
194      PyVarObject *op;
195      const size_t size = _PyObject_VAR_SIZE(tp, nitems);
196      op = (PyVarObject *) PyObject_Malloc(size);
197      if (op == NULL) {
198          return (PyVarObject *)PyErr_NoMemory();
199      }
200      _PyObject_InitVar(op, tp, nitems);
201      return op;
202  }
203  
204  void
PyObject_CallFinalizer(PyObject * self)205  PyObject_CallFinalizer(PyObject *self)
206  {
207      PyTypeObject *tp = Py_TYPE(self);
208  
209      if (tp->tp_finalize == NULL)
210          return;
211      /* tp_finalize should only be called once. */
212      if (_PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
213          return;
214  
215      tp->tp_finalize(self);
216      if (_PyType_IS_GC(tp)) {
217          _PyGC_SET_FINALIZED(self);
218      }
219  }
220  
221  int
PyObject_CallFinalizerFromDealloc(PyObject * self)222  PyObject_CallFinalizerFromDealloc(PyObject *self)
223  {
224      if (Py_REFCNT(self) != 0) {
225          _PyObject_ASSERT_FAILED_MSG(self,
226                                      "PyObject_CallFinalizerFromDealloc called "
227                                      "on object with a non-zero refcount");
228      }
229  
230      /* Temporarily resurrect the object. */
231      Py_SET_REFCNT(self, 1);
232  
233      PyObject_CallFinalizer(self);
234  
235      _PyObject_ASSERT_WITH_MSG(self,
236                                Py_REFCNT(self) > 0,
237                                "refcount is too small");
238  
239      /* Undo the temporary resurrection; can't use DECREF here, it would
240       * cause a recursive call. */
241      Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
242      if (Py_REFCNT(self) == 0) {
243          return 0;         /* this is the normal path out */
244      }
245  
246      /* tp_finalize resurrected it!  Make it look like the original Py_DECREF
247       * never happened. */
248      Py_ssize_t refcnt = Py_REFCNT(self);
249      _Py_NewReference(self);
250      Py_SET_REFCNT(self, refcnt);
251  
252      _PyObject_ASSERT(self,
253                       (!_PyType_IS_GC(Py_TYPE(self))
254                        || _PyObject_GC_IS_TRACKED(self)));
255      /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
256         _Py_RefTotal, so we need to undo that. */
257  #ifdef Py_REF_DEBUG
258      _Py_RefTotal--;
259  #endif
260      return -1;
261  }
262  
263  int
PyObject_Print(PyObject * op,FILE * fp,int flags)264  PyObject_Print(PyObject *op, FILE *fp, int flags)
265  {
266      int ret = 0;
267      if (PyErr_CheckSignals())
268          return -1;
269  #ifdef USE_STACKCHECK
270      if (PyOS_CheckStack()) {
271          PyErr_SetString(PyExc_MemoryError, "stack overflow");
272          return -1;
273      }
274  #endif
275      clearerr(fp); /* Clear any previous error condition */
276      if (op == NULL) {
277          Py_BEGIN_ALLOW_THREADS
278          fprintf(fp, "<nil>");
279          Py_END_ALLOW_THREADS
280      }
281      else {
282          if (Py_REFCNT(op) <= 0) {
283              /* XXX(twouters) cast refcount to long until %zd is
284                 universally available */
285              Py_BEGIN_ALLOW_THREADS
286              fprintf(fp, "<refcnt %ld at %p>",
287                  (long)Py_REFCNT(op), (void *)op);
288              Py_END_ALLOW_THREADS
289          }
290          else {
291              PyObject *s;
292              if (flags & Py_PRINT_RAW)
293                  s = PyObject_Str(op);
294              else
295                  s = PyObject_Repr(op);
296              if (s == NULL)
297                  ret = -1;
298              else if (PyBytes_Check(s)) {
299                  fwrite(PyBytes_AS_STRING(s), 1,
300                         PyBytes_GET_SIZE(s), fp);
301              }
302              else if (PyUnicode_Check(s)) {
303                  PyObject *t;
304                  t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace");
305                  if (t == NULL) {
306                      ret = -1;
307                  }
308                  else {
309                      fwrite(PyBytes_AS_STRING(t), 1,
310                             PyBytes_GET_SIZE(t), fp);
311                      Py_DECREF(t);
312                  }
313              }
314              else {
315                  PyErr_Format(PyExc_TypeError,
316                               "str() or repr() returned '%.100s'",
317                               Py_TYPE(s)->tp_name);
318                  ret = -1;
319              }
320              Py_XDECREF(s);
321          }
322      }
323      if (ret == 0) {
324          if (ferror(fp)) {
325              PyErr_SetFromErrno(PyExc_OSError);
326              clearerr(fp);
327              ret = -1;
328          }
329      }
330      return ret;
331  }
332  
333  /* For debugging convenience.  Set a breakpoint here and call it from your DLL */
334  void
_Py_BreakPoint(void)335  _Py_BreakPoint(void)
336  {
337  }
338  
339  
340  /* Heuristic checking if the object memory is uninitialized or deallocated.
341     Rely on the debug hooks on Python memory allocators:
342     see _PyMem_IsPtrFreed().
343  
344     The function can be used to prevent segmentation fault on dereferencing
345     pointers like 0xDDDDDDDDDDDDDDDD. */
346  int
_PyObject_IsFreed(PyObject * op)347  _PyObject_IsFreed(PyObject *op)
348  {
349      if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(Py_TYPE(op))) {
350          return 1;
351      }
352      /* ignore op->ob_ref: its value can have be modified
353         by Py_INCREF() and Py_DECREF(). */
354  #ifdef Py_TRACE_REFS
355      if (op->_ob_next != NULL && _PyMem_IsPtrFreed(op->_ob_next)) {
356          return 1;
357      }
358      if (op->_ob_prev != NULL && _PyMem_IsPtrFreed(op->_ob_prev)) {
359           return 1;
360       }
361  #endif
362      return 0;
363  }
364  
365  
366  /* For debugging convenience.  See Misc/gdbinit for some useful gdb hooks */
367  void
_PyObject_Dump(PyObject * op)368  _PyObject_Dump(PyObject* op)
369  {
370      if (_PyObject_IsFreed(op)) {
371          /* It seems like the object memory has been freed:
372             don't access it to prevent a segmentation fault. */
373          fprintf(stderr, "<object at %p is freed>\n", op);
374          fflush(stderr);
375          return;
376      }
377  
378      /* first, write fields which are the least likely to crash */
379      fprintf(stderr, "object address  : %p\n", (void *)op);
380      /* XXX(twouters) cast refcount to long until %zd is
381         universally available */
382      fprintf(stderr, "object refcount : %ld\n", (long)Py_REFCNT(op));
383      fflush(stderr);
384  
385      PyTypeObject *type = Py_TYPE(op);
386      fprintf(stderr, "object type     : %p\n", type);
387      fprintf(stderr, "object type name: %s\n",
388              type==NULL ? "NULL" : type->tp_name);
389  
390      /* the most dangerous part */
391      fprintf(stderr, "object repr     : ");
392      fflush(stderr);
393  
394      PyGILState_STATE gil = PyGILState_Ensure();
395      PyObject *error_type, *error_value, *error_traceback;
396      PyErr_Fetch(&error_type, &error_value, &error_traceback);
397  
398      (void)PyObject_Print(op, stderr, 0);
399      fflush(stderr);
400  
401      PyErr_Restore(error_type, error_value, error_traceback);
402      PyGILState_Release(gil);
403  
404      fprintf(stderr, "\n");
405      fflush(stderr);
406  }
407  
408  PyObject *
PyObject_Repr(PyObject * v)409  PyObject_Repr(PyObject *v)
410  {
411      PyObject *res;
412      if (PyErr_CheckSignals())
413          return NULL;
414  #ifdef USE_STACKCHECK
415      if (PyOS_CheckStack()) {
416          PyErr_SetString(PyExc_MemoryError, "stack overflow");
417          return NULL;
418      }
419  #endif
420      if (v == NULL)
421          return PyUnicode_FromString("<NULL>");
422      if (Py_TYPE(v)->tp_repr == NULL)
423          return PyUnicode_FromFormat("<%s object at %p>",
424                                      Py_TYPE(v)->tp_name, v);
425  
426      PyThreadState *tstate = _PyThreadState_GET();
427  #ifdef Py_DEBUG
428      /* PyObject_Repr() must not be called with an exception set,
429         because it can clear it (directly or indirectly) and so the
430         caller loses its exception */
431      assert(!_PyErr_Occurred(tstate));
432  #endif
433  
434      /* It is possible for a type to have a tp_repr representation that loops
435         infinitely. */
436      if (_Py_EnterRecursiveCall(tstate,
437                                 " while getting the repr of an object")) {
438          return NULL;
439      }
440      res = (*Py_TYPE(v)->tp_repr)(v);
441      _Py_LeaveRecursiveCall(tstate);
442  
443      if (res == NULL) {
444          return NULL;
445      }
446      if (!PyUnicode_Check(res)) {
447          _PyErr_Format(tstate, PyExc_TypeError,
448                        "__repr__ returned non-string (type %.200s)",
449                        Py_TYPE(res)->tp_name);
450          Py_DECREF(res);
451          return NULL;
452      }
453  #ifndef Py_DEBUG
454      if (PyUnicode_READY(res) < 0) {
455          return NULL;
456      }
457  #endif
458      return res;
459  }
460  
461  PyObject *
PyObject_Str(PyObject * v)462  PyObject_Str(PyObject *v)
463  {
464      PyObject *res;
465      if (PyErr_CheckSignals())
466          return NULL;
467  #ifdef USE_STACKCHECK
468      if (PyOS_CheckStack()) {
469          PyErr_SetString(PyExc_MemoryError, "stack overflow");
470          return NULL;
471      }
472  #endif
473      if (v == NULL)
474          return PyUnicode_FromString("<NULL>");
475      if (PyUnicode_CheckExact(v)) {
476  #ifndef Py_DEBUG
477          if (PyUnicode_READY(v) < 0)
478              return NULL;
479  #endif
480          Py_INCREF(v);
481          return v;
482      }
483      if (Py_TYPE(v)->tp_str == NULL)
484          return PyObject_Repr(v);
485  
486      PyThreadState *tstate = _PyThreadState_GET();
487  #ifdef Py_DEBUG
488      /* PyObject_Str() must not be called with an exception set,
489         because it can clear it (directly or indirectly) and so the
490         caller loses its exception */
491      assert(!_PyErr_Occurred(tstate));
492  #endif
493  
494      /* It is possible for a type to have a tp_str representation that loops
495         infinitely. */
496      if (_Py_EnterRecursiveCall(tstate, " while getting the str of an object")) {
497          return NULL;
498      }
499      res = (*Py_TYPE(v)->tp_str)(v);
500      _Py_LeaveRecursiveCall(tstate);
501  
502      if (res == NULL) {
503          return NULL;
504      }
505      if (!PyUnicode_Check(res)) {
506          _PyErr_Format(tstate, PyExc_TypeError,
507                        "__str__ returned non-string (type %.200s)",
508                        Py_TYPE(res)->tp_name);
509          Py_DECREF(res);
510          return NULL;
511      }
512  #ifndef Py_DEBUG
513      if (PyUnicode_READY(res) < 0) {
514          return NULL;
515      }
516  #endif
517      assert(_PyUnicode_CheckConsistency(res, 1));
518      return res;
519  }
520  
521  PyObject *
PyObject_ASCII(PyObject * v)522  PyObject_ASCII(PyObject *v)
523  {
524      PyObject *repr, *ascii, *res;
525  
526      repr = PyObject_Repr(v);
527      if (repr == NULL)
528          return NULL;
529  
530      if (PyUnicode_IS_ASCII(repr))
531          return repr;
532  
533      /* repr is guaranteed to be a PyUnicode object by PyObject_Repr */
534      ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
535      Py_DECREF(repr);
536      if (ascii == NULL)
537          return NULL;
538  
539      res = PyUnicode_DecodeASCII(
540          PyBytes_AS_STRING(ascii),
541          PyBytes_GET_SIZE(ascii),
542          NULL);
543  
544      Py_DECREF(ascii);
545      return res;
546  }
547  
548  PyObject *
PyObject_Bytes(PyObject * v)549  PyObject_Bytes(PyObject *v)
550  {
551      PyObject *result, *func;
552  
553      if (v == NULL)
554          return PyBytes_FromString("<NULL>");
555  
556      if (PyBytes_CheckExact(v)) {
557          Py_INCREF(v);
558          return v;
559      }
560  
561      func = _PyObject_LookupSpecial(v, &PyId___bytes__);
562      if (func != NULL) {
563          result = _PyObject_CallNoArg(func);
564          Py_DECREF(func);
565          if (result == NULL)
566              return NULL;
567          if (!PyBytes_Check(result)) {
568              PyErr_Format(PyExc_TypeError,
569                           "__bytes__ returned non-bytes (type %.200s)",
570                           Py_TYPE(result)->tp_name);
571              Py_DECREF(result);
572              return NULL;
573          }
574          return result;
575      }
576      else if (PyErr_Occurred())
577          return NULL;
578      return PyBytes_FromObject(v);
579  }
580  
581  
582  /*
583  def _PyObject_FunctionStr(x):
584      try:
585          qualname = x.__qualname__
586      except AttributeError:
587          return str(x)
588      try:
589          mod = x.__module__
590          if mod is not None and mod != 'builtins':
591              return f"{x.__module__}.{qualname}()"
592      except AttributeError:
593          pass
594      return qualname
595  */
596  PyObject *
_PyObject_FunctionStr(PyObject * x)597  _PyObject_FunctionStr(PyObject *x)
598  {
599      _Py_IDENTIFIER(__module__);
600      _Py_IDENTIFIER(__qualname__);
601      _Py_IDENTIFIER(builtins);
602      assert(!PyErr_Occurred());
603      PyObject *qualname;
604      int ret = _PyObject_LookupAttrId(x, &PyId___qualname__, &qualname);
605      if (qualname == NULL) {
606          if (ret < 0) {
607              return NULL;
608          }
609          return PyObject_Str(x);
610      }
611      PyObject *module;
612      PyObject *result = NULL;
613      ret = _PyObject_LookupAttrId(x, &PyId___module__, &module);
614      if (module != NULL && module != Py_None) {
615          PyObject *builtinsname = _PyUnicode_FromId(&PyId_builtins);
616          if (builtinsname == NULL) {
617              goto done;
618          }
619          ret = PyObject_RichCompareBool(module, builtinsname, Py_NE);
620          if (ret < 0) {
621              // error
622              goto done;
623          }
624          if (ret > 0) {
625              result = PyUnicode_FromFormat("%S.%S()", module, qualname);
626              goto done;
627          }
628      }
629      else if (ret < 0) {
630          goto done;
631      }
632      result = PyUnicode_FromFormat("%S()", qualname);
633  done:
634      Py_DECREF(qualname);
635      Py_XDECREF(module);
636      return result;
637  }
638  
639  /* For Python 3.0.1 and later, the old three-way comparison has been
640     completely removed in favour of rich comparisons.  PyObject_Compare() and
641     PyObject_Cmp() are gone, and the builtin cmp function no longer exists.
642     The old tp_compare slot has been renamed to tp_as_async, and should no
643     longer be used.  Use tp_richcompare instead.
644  
645     See (*) below for practical amendments.
646  
647     tp_richcompare gets called with a first argument of the appropriate type
648     and a second object of an arbitrary type.  We never do any kind of
649     coercion.
650  
651     The tp_richcompare slot should return an object, as follows:
652  
653      NULL if an exception occurred
654      NotImplemented if the requested comparison is not implemented
655      any other false value if the requested comparison is false
656      any other true value if the requested comparison is true
657  
658    The PyObject_RichCompare[Bool]() wrappers raise TypeError when they get
659    NotImplemented.
660  
661    (*) Practical amendments:
662  
663    - If rich comparison returns NotImplemented, == and != are decided by
664      comparing the object pointer (i.e. falling back to the base object
665      implementation).
666  
667  */
668  
669  /* Map rich comparison operators to their swapped version, e.g. LT <--> GT */
670  int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
671  
672  static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="};
673  
674  /* Perform a rich comparison, raising TypeError when the requested comparison
675     operator is not supported. */
676  static PyObject *
do_richcompare(PyThreadState * tstate,PyObject * v,PyObject * w,int op)677  do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op)
678  {
679      richcmpfunc f;
680      PyObject *res;
681      int checked_reverse_op = 0;
682  
683      if (!Py_IS_TYPE(v, Py_TYPE(w)) &&
684          PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v)) &&
685          (f = Py_TYPE(w)->tp_richcompare) != NULL) {
686          checked_reverse_op = 1;
687          res = (*f)(w, v, _Py_SwappedOp[op]);
688          if (res != Py_NotImplemented)
689              return res;
690          Py_DECREF(res);
691      }
692      if ((f = Py_TYPE(v)->tp_richcompare) != NULL) {
693          res = (*f)(v, w, op);
694          if (res != Py_NotImplemented)
695              return res;
696          Py_DECREF(res);
697      }
698      if (!checked_reverse_op && (f = Py_TYPE(w)->tp_richcompare) != NULL) {
699          res = (*f)(w, v, _Py_SwappedOp[op]);
700          if (res != Py_NotImplemented)
701              return res;
702          Py_DECREF(res);
703      }
704      /* If neither object implements it, provide a sensible default
705         for == and !=, but raise an exception for ordering. */
706      switch (op) {
707      case Py_EQ:
708          res = (v == w) ? Py_True : Py_False;
709          break;
710      case Py_NE:
711          res = (v != w) ? Py_True : Py_False;
712          break;
713      default:
714          _PyErr_Format(tstate, PyExc_TypeError,
715                        "'%s' not supported between instances of '%.100s' and '%.100s'",
716                        opstrings[op],
717                        Py_TYPE(v)->tp_name,
718                        Py_TYPE(w)->tp_name);
719          return NULL;
720      }
721      Py_INCREF(res);
722      return res;
723  }
724  
725  /* Perform a rich comparison with object result.  This wraps do_richcompare()
726     with a check for NULL arguments and a recursion check. */
727  
728  PyObject *
PyObject_RichCompare(PyObject * v,PyObject * w,int op)729  PyObject_RichCompare(PyObject *v, PyObject *w, int op)
730  {
731      PyThreadState *tstate = _PyThreadState_GET();
732  
733      assert(Py_LT <= op && op <= Py_GE);
734      if (v == NULL || w == NULL) {
735          if (!_PyErr_Occurred(tstate)) {
736              PyErr_BadInternalCall();
737          }
738          return NULL;
739      }
740      if (_Py_EnterRecursiveCall(tstate, " in comparison")) {
741          return NULL;
742      }
743      PyObject *res = do_richcompare(tstate, v, w, op);
744      _Py_LeaveRecursiveCall(tstate);
745      return res;
746  }
747  
748  /* Perform a rich comparison with integer result.  This wraps
749     PyObject_RichCompare(), returning -1 for error, 0 for false, 1 for true. */
750  int
PyObject_RichCompareBool(PyObject * v,PyObject * w,int op)751  PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
752  {
753      PyObject *res;
754      int ok;
755  
756      /* Quick result when objects are the same.
757         Guarantees that identity implies equality. */
758      if (v == w) {
759          if (op == Py_EQ)
760              return 1;
761          else if (op == Py_NE)
762              return 0;
763      }
764  
765      res = PyObject_RichCompare(v, w, op);
766      if (res == NULL)
767          return -1;
768      if (PyBool_Check(res))
769          ok = (res == Py_True);
770      else
771          ok = PyObject_IsTrue(res);
772      Py_DECREF(res);
773      return ok;
774  }
775  
776  Py_hash_t
PyObject_HashNotImplemented(PyObject * v)777  PyObject_HashNotImplemented(PyObject *v)
778  {
779      PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
780                   Py_TYPE(v)->tp_name);
781      return -1;
782  }
783  
784  Py_hash_t
PyObject_Hash(PyObject * v)785  PyObject_Hash(PyObject *v)
786  {
787      PyTypeObject *tp = Py_TYPE(v);
788      if (tp->tp_hash != NULL)
789          return (*tp->tp_hash)(v);
790      /* To keep to the general practice that inheriting
791       * solely from object in C code should work without
792       * an explicit call to PyType_Ready, we implicitly call
793       * PyType_Ready here and then check the tp_hash slot again
794       */
795      if (tp->tp_dict == NULL) {
796          if (PyType_Ready(tp) < 0)
797              return -1;
798          if (tp->tp_hash != NULL)
799              return (*tp->tp_hash)(v);
800      }
801      /* Otherwise, the object can't be hashed */
802      return PyObject_HashNotImplemented(v);
803  }
804  
805  PyObject *
PyObject_GetAttrString(PyObject * v,const char * name)806  PyObject_GetAttrString(PyObject *v, const char *name)
807  {
808      PyObject *w, *res;
809  
810      if (Py_TYPE(v)->tp_getattr != NULL)
811          return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
812      w = PyUnicode_FromString(name);
813      if (w == NULL)
814          return NULL;
815      res = PyObject_GetAttr(v, w);
816      Py_DECREF(w);
817      return res;
818  }
819  
820  int
PyObject_HasAttrString(PyObject * v,const char * name)821  PyObject_HasAttrString(PyObject *v, const char *name)
822  {
823      PyObject *res = PyObject_GetAttrString(v, name);
824      if (res != NULL) {
825          Py_DECREF(res);
826          return 1;
827      }
828      PyErr_Clear();
829      return 0;
830  }
831  
832  int
PyObject_SetAttrString(PyObject * v,const char * name,PyObject * w)833  PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
834  {
835      PyObject *s;
836      int res;
837  
838      if (Py_TYPE(v)->tp_setattr != NULL)
839          return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
840      s = PyUnicode_InternFromString(name);
841      if (s == NULL)
842          return -1;
843      res = PyObject_SetAttr(v, s, w);
844      Py_XDECREF(s);
845      return res;
846  }
847  
848  int
_PyObject_IsAbstract(PyObject * obj)849  _PyObject_IsAbstract(PyObject *obj)
850  {
851      int res;
852      PyObject* isabstract;
853  
854      if (obj == NULL)
855          return 0;
856  
857      res = _PyObject_LookupAttrId(obj, &PyId___isabstractmethod__, &isabstract);
858      if (res > 0) {
859          res = PyObject_IsTrue(isabstract);
860          Py_DECREF(isabstract);
861      }
862      return res;
863  }
864  
865  PyObject *
_PyObject_GetAttrId(PyObject * v,_Py_Identifier * name)866  _PyObject_GetAttrId(PyObject *v, _Py_Identifier *name)
867  {
868      PyObject *result;
869      PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
870      if (!oname)
871          return NULL;
872      result = PyObject_GetAttr(v, oname);
873      return result;
874  }
875  
876  int
_PyObject_SetAttrId(PyObject * v,_Py_Identifier * name,PyObject * w)877  _PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w)
878  {
879      int result;
880      PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
881      if (!oname)
882          return -1;
883      result = PyObject_SetAttr(v, oname, w);
884      return result;
885  }
886  
887  static inline int
set_attribute_error_context(PyObject * v,PyObject * name)888  set_attribute_error_context(PyObject* v, PyObject* name)
889  {
890      assert(PyErr_Occurred());
891      _Py_IDENTIFIER(name);
892      _Py_IDENTIFIER(obj);
893      // Intercept AttributeError exceptions and augment them to offer
894      // suggestions later.
895      if (PyErr_ExceptionMatches(PyExc_AttributeError)){
896          PyObject *type, *value, *traceback;
897          PyErr_Fetch(&type, &value, &traceback);
898          PyErr_NormalizeException(&type, &value, &traceback);
899          if (PyErr_GivenExceptionMatches(value, PyExc_AttributeError) &&
900              (_PyObject_SetAttrId(value, &PyId_name, name) ||
901               _PyObject_SetAttrId(value, &PyId_obj, v))) {
902              return 1;
903          }
904          PyErr_Restore(type, value, traceback);
905      }
906      return 0;
907  }
908  
909  PyObject *
PyObject_GetAttr(PyObject * v,PyObject * name)910  PyObject_GetAttr(PyObject *v, PyObject *name)
911  {
912      PyTypeObject *tp = Py_TYPE(v);
913      if (!PyUnicode_Check(name)) {
914          PyErr_Format(PyExc_TypeError,
915                       "attribute name must be string, not '%.200s'",
916                       Py_TYPE(name)->tp_name);
917          return NULL;
918      }
919  
920      PyObject* result = NULL;
921      if (tp->tp_getattro != NULL) {
922          result = (*tp->tp_getattro)(v, name);
923      }
924      else if (tp->tp_getattr != NULL) {
925          const char *name_str = PyUnicode_AsUTF8(name);
926          if (name_str == NULL) {
927              return NULL;
928          }
929          result = (*tp->tp_getattr)(v, (char *)name_str);
930      }
931      else {
932          PyErr_Format(PyExc_AttributeError,
933                      "'%.50s' object has no attribute '%U'",
934                      tp->tp_name, name);
935      }
936  
937      if (result == NULL) {
938          set_attribute_error_context(v, name);
939      }
940      return result;
941  }
942  
943  int
_PyObject_LookupAttr(PyObject * v,PyObject * name,PyObject ** result)944  _PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result)
945  {
946      PyTypeObject *tp = Py_TYPE(v);
947  
948      if (!PyUnicode_Check(name)) {
949          PyErr_Format(PyExc_TypeError,
950                       "attribute name must be string, not '%.200s'",
951                       Py_TYPE(name)->tp_name);
952          *result = NULL;
953          return -1;
954      }
955  
956      if (tp->tp_getattro == PyObject_GenericGetAttr) {
957          *result = _PyObject_GenericGetAttrWithDict(v, name, NULL, 1);
958          if (*result != NULL) {
959              return 1;
960          }
961          if (PyErr_Occurred()) {
962              return -1;
963          }
964          return 0;
965      }
966      if (tp->tp_getattro != NULL) {
967          *result = (*tp->tp_getattro)(v, name);
968      }
969      else if (tp->tp_getattr != NULL) {
970          const char *name_str = PyUnicode_AsUTF8(name);
971          if (name_str == NULL) {
972              *result = NULL;
973              return -1;
974          }
975          *result = (*tp->tp_getattr)(v, (char *)name_str);
976      }
977      else {
978          *result = NULL;
979          return 0;
980      }
981  
982      if (*result != NULL) {
983          return 1;
984      }
985      if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
986          return -1;
987      }
988      PyErr_Clear();
989      return 0;
990  }
991  
992  int
_PyObject_LookupAttrId(PyObject * v,_Py_Identifier * name,PyObject ** result)993  _PyObject_LookupAttrId(PyObject *v, _Py_Identifier *name, PyObject **result)
994  {
995      PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
996      if (!oname) {
997          *result = NULL;
998          return -1;
999      }
1000      return  _PyObject_LookupAttr(v, oname, result);
1001  }
1002  
1003  int
PyObject_HasAttr(PyObject * v,PyObject * name)1004  PyObject_HasAttr(PyObject *v, PyObject *name)
1005  {
1006      PyObject *res;
1007      if (_PyObject_LookupAttr(v, name, &res) < 0) {
1008          PyErr_Clear();
1009          return 0;
1010      }
1011      if (res == NULL) {
1012          return 0;
1013      }
1014      Py_DECREF(res);
1015      return 1;
1016  }
1017  
1018  int
PyObject_SetAttr(PyObject * v,PyObject * name,PyObject * value)1019  PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
1020  {
1021      PyTypeObject *tp = Py_TYPE(v);
1022      int err;
1023  
1024      if (!PyUnicode_Check(name)) {
1025          PyErr_Format(PyExc_TypeError,
1026                       "attribute name must be string, not '%.200s'",
1027                       Py_TYPE(name)->tp_name);
1028          return -1;
1029      }
1030      Py_INCREF(name);
1031  
1032      PyUnicode_InternInPlace(&name);
1033      if (tp->tp_setattro != NULL) {
1034          err = (*tp->tp_setattro)(v, name, value);
1035          Py_DECREF(name);
1036          return err;
1037      }
1038      if (tp->tp_setattr != NULL) {
1039          const char *name_str = PyUnicode_AsUTF8(name);
1040          if (name_str == NULL) {
1041              Py_DECREF(name);
1042              return -1;
1043          }
1044          err = (*tp->tp_setattr)(v, (char *)name_str, value);
1045          Py_DECREF(name);
1046          return err;
1047      }
1048      Py_DECREF(name);
1049      _PyObject_ASSERT(name, Py_REFCNT(name) >= 1);
1050      if (tp->tp_getattr == NULL && tp->tp_getattro == NULL)
1051          PyErr_Format(PyExc_TypeError,
1052                       "'%.100s' object has no attributes "
1053                       "(%s .%U)",
1054                       tp->tp_name,
1055                       value==NULL ? "del" : "assign to",
1056                       name);
1057      else
1058          PyErr_Format(PyExc_TypeError,
1059                       "'%.100s' object has only read-only attributes "
1060                       "(%s .%U)",
1061                       tp->tp_name,
1062                       value==NULL ? "del" : "assign to",
1063                       name);
1064      return -1;
1065  }
1066  
1067  /* Helper to get a pointer to an object's __dict__ slot, if any */
1068  
1069  PyObject **
_PyObject_GetDictPtr(PyObject * obj)1070  _PyObject_GetDictPtr(PyObject *obj)
1071  {
1072      Py_ssize_t dictoffset;
1073      PyTypeObject *tp = Py_TYPE(obj);
1074  
1075      dictoffset = tp->tp_dictoffset;
1076      if (dictoffset == 0)
1077          return NULL;
1078      if (dictoffset < 0) {
1079          Py_ssize_t tsize = Py_SIZE(obj);
1080          if (tsize < 0) {
1081              tsize = -tsize;
1082          }
1083          size_t size = _PyObject_VAR_SIZE(tp, tsize);
1084  
1085          dictoffset += (long)size;
1086          _PyObject_ASSERT(obj, dictoffset > 0);
1087          _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
1088      }
1089      return (PyObject **) ((char *)obj + dictoffset);
1090  }
1091  
1092  PyObject *
PyObject_SelfIter(PyObject * obj)1093  PyObject_SelfIter(PyObject *obj)
1094  {
1095      Py_INCREF(obj);
1096      return obj;
1097  }
1098  
1099  /* Helper used when the __next__ method is removed from a type:
1100     tp_iternext is never NULL and can be safely called without checking
1101     on every iteration.
1102   */
1103  
1104  PyObject *
_PyObject_NextNotImplemented(PyObject * self)1105  _PyObject_NextNotImplemented(PyObject *self)
1106  {
1107      PyErr_Format(PyExc_TypeError,
1108                   "'%.200s' object is not iterable",
1109                   Py_TYPE(self)->tp_name);
1110      return NULL;
1111  }
1112  
1113  
1114  /* Specialized version of _PyObject_GenericGetAttrWithDict
1115     specifically for the LOAD_METHOD opcode.
1116  
1117     Return 1 if a method is found, 0 if it's a regular attribute
1118     from __dict__ or something returned by using a descriptor
1119     protocol.
1120  
1121     `method` will point to the resolved attribute or NULL.  In the
1122     latter case, an error will be set.
1123  */
1124  int
_PyObject_GetMethod(PyObject * obj,PyObject * name,PyObject ** method)1125  _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
1126  {
1127      PyTypeObject *tp = Py_TYPE(obj);
1128      PyObject *descr;
1129      descrgetfunc f = NULL;
1130      PyObject **dictptr, *dict;
1131      PyObject *attr;
1132      int meth_found = 0;
1133  
1134      assert(*method == NULL);
1135  
1136      if (Py_TYPE(obj)->tp_getattro != PyObject_GenericGetAttr
1137              || !PyUnicode_Check(name)) {
1138          *method = PyObject_GetAttr(obj, name);
1139          return 0;
1140      }
1141  
1142      if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1143          return 0;
1144  
1145      descr = _PyType_Lookup(tp, name);
1146      if (descr != NULL) {
1147          Py_INCREF(descr);
1148          if (_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
1149              meth_found = 1;
1150          } else {
1151              f = Py_TYPE(descr)->tp_descr_get;
1152              if (f != NULL && PyDescr_IsData(descr)) {
1153                  *method = f(descr, obj, (PyObject *)Py_TYPE(obj));
1154                  Py_DECREF(descr);
1155                  return 0;
1156              }
1157          }
1158      }
1159  
1160      dictptr = _PyObject_GetDictPtr(obj);
1161      if (dictptr != NULL && (dict = *dictptr) != NULL) {
1162          Py_INCREF(dict);
1163          attr = PyDict_GetItemWithError(dict, name);
1164          if (attr != NULL) {
1165              Py_INCREF(attr);
1166              *method = attr;
1167              Py_DECREF(dict);
1168              Py_XDECREF(descr);
1169              return 0;
1170          }
1171          else {
1172              Py_DECREF(dict);
1173              if (PyErr_Occurred()) {
1174                  Py_XDECREF(descr);
1175                  return 0;
1176              }
1177          }
1178      }
1179  
1180      if (meth_found) {
1181          *method = descr;
1182          return 1;
1183      }
1184  
1185      if (f != NULL) {
1186          *method = f(descr, obj, (PyObject *)Py_TYPE(obj));
1187          Py_DECREF(descr);
1188          return 0;
1189      }
1190  
1191      if (descr != NULL) {
1192          *method = descr;
1193          return 0;
1194      }
1195  
1196      PyErr_Format(PyExc_AttributeError,
1197                   "'%.50s' object has no attribute '%U'",
1198                   tp->tp_name, name);
1199  
1200      set_attribute_error_context(obj, name);
1201      return 0;
1202  }
1203  
1204  /* Generic GetAttr functions - put these in your tp_[gs]etattro slot. */
1205  
1206  PyObject *
_PyObject_GenericGetAttrWithDict(PyObject * obj,PyObject * name,PyObject * dict,int suppress)1207  _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name,
1208                                   PyObject *dict, int suppress)
1209  {
1210      /* Make sure the logic of _PyObject_GetMethod is in sync with
1211         this method.
1212  
1213         When suppress=1, this function suppresses AttributeError.
1214      */
1215  
1216      PyTypeObject *tp = Py_TYPE(obj);
1217      PyObject *descr = NULL;
1218      PyObject *res = NULL;
1219      descrgetfunc f;
1220      Py_ssize_t dictoffset;
1221      PyObject **dictptr;
1222  
1223      if (!PyUnicode_Check(name)){
1224          PyErr_Format(PyExc_TypeError,
1225                       "attribute name must be string, not '%.200s'",
1226                       Py_TYPE(name)->tp_name);
1227          return NULL;
1228      }
1229      Py_INCREF(name);
1230  
1231      if (tp->tp_dict == NULL) {
1232          if (PyType_Ready(tp) < 0)
1233              goto done;
1234      }
1235  
1236      descr = _PyType_Lookup(tp, name);
1237  
1238      f = NULL;
1239      if (descr != NULL) {
1240          Py_INCREF(descr);
1241          f = Py_TYPE(descr)->tp_descr_get;
1242          if (f != NULL && PyDescr_IsData(descr)) {
1243              res = f(descr, obj, (PyObject *)Py_TYPE(obj));
1244              if (res == NULL && suppress &&
1245                      PyErr_ExceptionMatches(PyExc_AttributeError)) {
1246                  PyErr_Clear();
1247              }
1248              goto done;
1249          }
1250      }
1251  
1252      if (dict == NULL) {
1253          /* Inline _PyObject_GetDictPtr */
1254          dictoffset = tp->tp_dictoffset;
1255          if (dictoffset != 0) {
1256              if (dictoffset < 0) {
1257                  Py_ssize_t tsize = Py_SIZE(obj);
1258                  if (tsize < 0) {
1259                      tsize = -tsize;
1260                  }
1261                  size_t size = _PyObject_VAR_SIZE(tp, tsize);
1262                  _PyObject_ASSERT(obj, size <= PY_SSIZE_T_MAX);
1263  
1264                  dictoffset += (Py_ssize_t)size;
1265                  _PyObject_ASSERT(obj, dictoffset > 0);
1266                  _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
1267              }
1268              dictptr = (PyObject **) ((char *)obj + dictoffset);
1269              dict = *dictptr;
1270          }
1271      }
1272      if (dict != NULL) {
1273          Py_INCREF(dict);
1274          res = PyDict_GetItemWithError(dict, name);
1275          if (res != NULL) {
1276              Py_INCREF(res);
1277              Py_DECREF(dict);
1278              goto done;
1279          }
1280          else {
1281              Py_DECREF(dict);
1282              if (PyErr_Occurred()) {
1283                  if (suppress && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1284                      PyErr_Clear();
1285                  }
1286                  else {
1287                      goto done;
1288                  }
1289              }
1290          }
1291      }
1292  
1293      if (f != NULL) {
1294          res = f(descr, obj, (PyObject *)Py_TYPE(obj));
1295          if (res == NULL && suppress &&
1296                  PyErr_ExceptionMatches(PyExc_AttributeError)) {
1297              PyErr_Clear();
1298          }
1299          goto done;
1300      }
1301  
1302      if (descr != NULL) {
1303          res = descr;
1304          descr = NULL;
1305          goto done;
1306      }
1307  
1308      if (!suppress) {
1309          PyErr_Format(PyExc_AttributeError,
1310                       "'%.50s' object has no attribute '%U'",
1311                       tp->tp_name, name);
1312      }
1313    done:
1314      Py_XDECREF(descr);
1315      Py_DECREF(name);
1316      return res;
1317  }
1318  
1319  PyObject *
PyObject_GenericGetAttr(PyObject * obj,PyObject * name)1320  PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
1321  {
1322      return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 0);
1323  }
1324  
1325  int
_PyObject_GenericSetAttrWithDict(PyObject * obj,PyObject * name,PyObject * value,PyObject * dict)1326  _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
1327                                   PyObject *value, PyObject *dict)
1328  {
1329      PyTypeObject *tp = Py_TYPE(obj);
1330      PyObject *descr;
1331      descrsetfunc f;
1332      PyObject **dictptr;
1333      int res = -1;
1334  
1335      if (!PyUnicode_Check(name)){
1336          PyErr_Format(PyExc_TypeError,
1337                       "attribute name must be string, not '%.200s'",
1338                       Py_TYPE(name)->tp_name);
1339          return -1;
1340      }
1341  
1342      if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1343          return -1;
1344  
1345      Py_INCREF(name);
1346  
1347      descr = _PyType_Lookup(tp, name);
1348  
1349      if (descr != NULL) {
1350          Py_INCREF(descr);
1351          f = Py_TYPE(descr)->tp_descr_set;
1352          if (f != NULL) {
1353              res = f(descr, obj, value);
1354              goto done;
1355          }
1356      }
1357  
1358      /* XXX [Steve Dower] These are really noisy - worth it? */
1359      /*if (PyType_Check(obj) || PyModule_Check(obj)) {
1360          if (value && PySys_Audit("object.__setattr__", "OOO", obj, name, value) < 0)
1361              return -1;
1362          if (!value && PySys_Audit("object.__delattr__", "OO", obj, name) < 0)
1363              return -1;
1364      }*/
1365  
1366      if (dict == NULL) {
1367          dictptr = _PyObject_GetDictPtr(obj);
1368          if (dictptr == NULL) {
1369              if (descr == NULL) {
1370                  PyErr_Format(PyExc_AttributeError,
1371                               "'%.100s' object has no attribute '%U'",
1372                               tp->tp_name, name);
1373              }
1374              else {
1375                  PyErr_Format(PyExc_AttributeError,
1376                               "'%.50s' object attribute '%U' is read-only",
1377                               tp->tp_name, name);
1378              }
1379              goto done;
1380          }
1381          res = _PyObjectDict_SetItem(tp, dictptr, name, value);
1382      }
1383      else {
1384          Py_INCREF(dict);
1385          if (value == NULL)
1386              res = PyDict_DelItem(dict, name);
1387          else
1388              res = PyDict_SetItem(dict, name, value);
1389          Py_DECREF(dict);
1390      }
1391      if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
1392          PyErr_SetObject(PyExc_AttributeError, name);
1393  
1394    done:
1395      Py_XDECREF(descr);
1396      Py_DECREF(name);
1397      return res;
1398  }
1399  
1400  int
PyObject_GenericSetAttr(PyObject * obj,PyObject * name,PyObject * value)1401  PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
1402  {
1403      return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
1404  }
1405  
1406  int
PyObject_GenericSetDict(PyObject * obj,PyObject * value,void * context)1407  PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
1408  {
1409      PyObject **dictptr = _PyObject_GetDictPtr(obj);
1410      if (dictptr == NULL) {
1411          PyErr_SetString(PyExc_AttributeError,
1412                          "This object has no __dict__");
1413          return -1;
1414      }
1415      if (value == NULL) {
1416          PyErr_SetString(PyExc_TypeError, "cannot delete __dict__");
1417          return -1;
1418      }
1419      if (!PyDict_Check(value)) {
1420          PyErr_Format(PyExc_TypeError,
1421                       "__dict__ must be set to a dictionary, "
1422                       "not a '%.200s'", Py_TYPE(value)->tp_name);
1423          return -1;
1424      }
1425      Py_INCREF(value);
1426      Py_XSETREF(*dictptr, value);
1427      return 0;
1428  }
1429  
1430  
1431  /* Test a value used as condition, e.g., in a while or if statement.
1432     Return -1 if an error occurred */
1433  
1434  int
PyObject_IsTrue(PyObject * v)1435  PyObject_IsTrue(PyObject *v)
1436  {
1437      Py_ssize_t res;
1438      if (v == Py_True)
1439          return 1;
1440      if (v == Py_False)
1441          return 0;
1442      if (v == Py_None)
1443          return 0;
1444      else if (Py_TYPE(v)->tp_as_number != NULL &&
1445               Py_TYPE(v)->tp_as_number->nb_bool != NULL)
1446          res = (*Py_TYPE(v)->tp_as_number->nb_bool)(v);
1447      else if (Py_TYPE(v)->tp_as_mapping != NULL &&
1448               Py_TYPE(v)->tp_as_mapping->mp_length != NULL)
1449          res = (*Py_TYPE(v)->tp_as_mapping->mp_length)(v);
1450      else if (Py_TYPE(v)->tp_as_sequence != NULL &&
1451               Py_TYPE(v)->tp_as_sequence->sq_length != NULL)
1452          res = (*Py_TYPE(v)->tp_as_sequence->sq_length)(v);
1453      else
1454          return 1;
1455      /* if it is negative, it should be either -1 or -2 */
1456      return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
1457  }
1458  
1459  /* equivalent of 'not v'
1460     Return -1 if an error occurred */
1461  
1462  int
PyObject_Not(PyObject * v)1463  PyObject_Not(PyObject *v)
1464  {
1465      int res;
1466      res = PyObject_IsTrue(v);
1467      if (res < 0)
1468          return res;
1469      return res == 0;
1470  }
1471  
1472  /* Test whether an object can be called */
1473  
1474  int
PyCallable_Check(PyObject * x)1475  PyCallable_Check(PyObject *x)
1476  {
1477      if (x == NULL)
1478          return 0;
1479      return Py_TYPE(x)->tp_call != NULL;
1480  }
1481  
1482  
1483  /* Helper for PyObject_Dir without arguments: returns the local scope. */
1484  static PyObject *
_dir_locals(void)1485  _dir_locals(void)
1486  {
1487      PyObject *names;
1488      PyObject *locals;
1489  
1490      locals = PyEval_GetLocals();
1491      if (locals == NULL)
1492          return NULL;
1493  
1494      names = PyMapping_Keys(locals);
1495      if (!names)
1496          return NULL;
1497      if (!PyList_Check(names)) {
1498          PyErr_Format(PyExc_TypeError,
1499              "dir(): expected keys() of locals to be a list, "
1500              "not '%.200s'", Py_TYPE(names)->tp_name);
1501          Py_DECREF(names);
1502          return NULL;
1503      }
1504      if (PyList_Sort(names)) {
1505          Py_DECREF(names);
1506          return NULL;
1507      }
1508      /* the locals don't need to be DECREF'd */
1509      return names;
1510  }
1511  
1512  /* Helper for PyObject_Dir: object introspection. */
1513  static PyObject *
_dir_object(PyObject * obj)1514  _dir_object(PyObject *obj)
1515  {
1516      PyObject *result, *sorted;
1517      PyObject *dirfunc = _PyObject_LookupSpecial(obj, &PyId___dir__);
1518  
1519      assert(obj != NULL);
1520      if (dirfunc == NULL) {
1521          if (!PyErr_Occurred())
1522              PyErr_SetString(PyExc_TypeError, "object does not provide __dir__");
1523          return NULL;
1524      }
1525      /* use __dir__ */
1526      result = _PyObject_CallNoArg(dirfunc);
1527      Py_DECREF(dirfunc);
1528      if (result == NULL)
1529          return NULL;
1530      /* return sorted(result) */
1531      sorted = PySequence_List(result);
1532      Py_DECREF(result);
1533      if (sorted == NULL)
1534          return NULL;
1535      if (PyList_Sort(sorted)) {
1536          Py_DECREF(sorted);
1537          return NULL;
1538      }
1539      return sorted;
1540  }
1541  
1542  /* Implementation of dir() -- if obj is NULL, returns the names in the current
1543     (local) scope.  Otherwise, performs introspection of the object: returns a
1544     sorted list of attribute names (supposedly) accessible from the object
1545  */
1546  PyObject *
PyObject_Dir(PyObject * obj)1547  PyObject_Dir(PyObject *obj)
1548  {
1549      return (obj == NULL) ? _dir_locals() : _dir_object(obj);
1550  }
1551  
1552  /*
1553  None is a non-NULL undefined value.
1554  There is (and should be!) no way to create other objects of this type,
1555  so there is exactly one (which is indestructible, by the way).
1556  */
1557  
1558  /* ARGSUSED */
1559  static PyObject *
none_repr(PyObject * op)1560  none_repr(PyObject *op)
1561  {
1562      return PyUnicode_FromString("None");
1563  }
1564  
1565  /* ARGUSED */
1566  static void _Py_NO_RETURN
none_dealloc(PyObject * ignore)1567  none_dealloc(PyObject* ignore)
1568  {
1569      /* This should never get called, but we also don't want to SEGV if
1570       * we accidentally decref None out of existence.
1571       */
1572      Py_FatalError("deallocating None");
1573  }
1574  
1575  static PyObject *
none_new(PyTypeObject * type,PyObject * args,PyObject * kwargs)1576  none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1577  {
1578      if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
1579          PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments");
1580          return NULL;
1581      }
1582      Py_RETURN_NONE;
1583  }
1584  
1585  static int
none_bool(PyObject * v)1586  none_bool(PyObject *v)
1587  {
1588      return 0;
1589  }
1590  
1591  static PyNumberMethods none_as_number = {
1592      0,                          /* nb_add */
1593      0,                          /* nb_subtract */
1594      0,                          /* nb_multiply */
1595      0,                          /* nb_remainder */
1596      0,                          /* nb_divmod */
1597      0,                          /* nb_power */
1598      0,                          /* nb_negative */
1599      0,                          /* nb_positive */
1600      0,                          /* nb_absolute */
1601      (inquiry)none_bool,         /* nb_bool */
1602      0,                          /* nb_invert */
1603      0,                          /* nb_lshift */
1604      0,                          /* nb_rshift */
1605      0,                          /* nb_and */
1606      0,                          /* nb_xor */
1607      0,                          /* nb_or */
1608      0,                          /* nb_int */
1609      0,                          /* nb_reserved */
1610      0,                          /* nb_float */
1611      0,                          /* nb_inplace_add */
1612      0,                          /* nb_inplace_subtract */
1613      0,                          /* nb_inplace_multiply */
1614      0,                          /* nb_inplace_remainder */
1615      0,                          /* nb_inplace_power */
1616      0,                          /* nb_inplace_lshift */
1617      0,                          /* nb_inplace_rshift */
1618      0,                          /* nb_inplace_and */
1619      0,                          /* nb_inplace_xor */
1620      0,                          /* nb_inplace_or */
1621      0,                          /* nb_floor_divide */
1622      0,                          /* nb_true_divide */
1623      0,                          /* nb_inplace_floor_divide */
1624      0,                          /* nb_inplace_true_divide */
1625      0,                          /* nb_index */
1626  };
1627  
1628  PyTypeObject _PyNone_Type = {
1629      PyVarObject_HEAD_INIT(&PyType_Type, 0)
1630      "NoneType",
1631      0,
1632      0,
1633      none_dealloc,       /*tp_dealloc*/ /*never called*/
1634      0,                  /*tp_vectorcall_offset*/
1635      0,                  /*tp_getattr*/
1636      0,                  /*tp_setattr*/
1637      0,                  /*tp_as_async*/
1638      none_repr,          /*tp_repr*/
1639      &none_as_number,    /*tp_as_number*/
1640      0,                  /*tp_as_sequence*/
1641      0,                  /*tp_as_mapping*/
1642      0,                  /*tp_hash */
1643      0,                  /*tp_call */
1644      0,                  /*tp_str */
1645      0,                  /*tp_getattro */
1646      0,                  /*tp_setattro */
1647      0,                  /*tp_as_buffer */
1648      Py_TPFLAGS_DEFAULT, /*tp_flags */
1649      0,                  /*tp_doc */
1650      0,                  /*tp_traverse */
1651      0,                  /*tp_clear */
1652      0,                  /*tp_richcompare */
1653      0,                  /*tp_weaklistoffset */
1654      0,                  /*tp_iter */
1655      0,                  /*tp_iternext */
1656      0,                  /*tp_methods */
1657      0,                  /*tp_members */
1658      0,                  /*tp_getset */
1659      0,                  /*tp_base */
1660      0,                  /*tp_dict */
1661      0,                  /*tp_descr_get */
1662      0,                  /*tp_descr_set */
1663      0,                  /*tp_dictoffset */
1664      0,                  /*tp_init */
1665      0,                  /*tp_alloc */
1666      none_new,           /*tp_new */
1667  };
1668  
1669  PyObject _Py_NoneStruct = {
1670    _PyObject_EXTRA_INIT
1671    1, &_PyNone_Type
1672  };
1673  
1674  /* NotImplemented is an object that can be used to signal that an
1675     operation is not implemented for the given type combination. */
1676  
1677  static PyObject *
NotImplemented_repr(PyObject * op)1678  NotImplemented_repr(PyObject *op)
1679  {
1680      return PyUnicode_FromString("NotImplemented");
1681  }
1682  
1683  static PyObject *
NotImplemented_reduce(PyObject * op,PyObject * Py_UNUSED (ignored))1684  NotImplemented_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
1685  {
1686      return PyUnicode_FromString("NotImplemented");
1687  }
1688  
1689  static PyMethodDef notimplemented_methods[] = {
1690      {"__reduce__", NotImplemented_reduce, METH_NOARGS, NULL},
1691      {NULL, NULL}
1692  };
1693  
1694  static PyObject *
notimplemented_new(PyTypeObject * type,PyObject * args,PyObject * kwargs)1695  notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1696  {
1697      if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
1698          PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments");
1699          return NULL;
1700      }
1701      Py_RETURN_NOTIMPLEMENTED;
1702  }
1703  
1704  static void _Py_NO_RETURN
notimplemented_dealloc(PyObject * ignore)1705  notimplemented_dealloc(PyObject* ignore)
1706  {
1707      /* This should never get called, but we also don't want to SEGV if
1708       * we accidentally decref NotImplemented out of existence.
1709       */
1710      Py_FatalError("deallocating NotImplemented");
1711  }
1712  
1713  static int
notimplemented_bool(PyObject * v)1714  notimplemented_bool(PyObject *v)
1715  {
1716      if (PyErr_WarnEx(PyExc_DeprecationWarning,
1717                       "NotImplemented should not be used in a boolean context",
1718                       1) < 0)
1719      {
1720          return -1;
1721      }
1722      return 1;
1723  }
1724  
1725  static PyNumberMethods notimplemented_as_number = {
1726      .nb_bool = notimplemented_bool,
1727  };
1728  
1729  PyTypeObject _PyNotImplemented_Type = {
1730      PyVarObject_HEAD_INIT(&PyType_Type, 0)
1731      "NotImplementedType",
1732      0,
1733      0,
1734      notimplemented_dealloc,       /*tp_dealloc*/ /*never called*/
1735      0,                  /*tp_vectorcall_offset*/
1736      0,                  /*tp_getattr*/
1737      0,                  /*tp_setattr*/
1738      0,                  /*tp_as_async*/
1739      NotImplemented_repr,        /*tp_repr*/
1740      &notimplemented_as_number,  /*tp_as_number*/
1741      0,                  /*tp_as_sequence*/
1742      0,                  /*tp_as_mapping*/
1743      0,                  /*tp_hash */
1744      0,                  /*tp_call */
1745      0,                  /*tp_str */
1746      0,                  /*tp_getattro */
1747      0,                  /*tp_setattro */
1748      0,                  /*tp_as_buffer */
1749      Py_TPFLAGS_DEFAULT, /*tp_flags */
1750      0,                  /*tp_doc */
1751      0,                  /*tp_traverse */
1752      0,                  /*tp_clear */
1753      0,                  /*tp_richcompare */
1754      0,                  /*tp_weaklistoffset */
1755      0,                  /*tp_iter */
1756      0,                  /*tp_iternext */
1757      notimplemented_methods, /*tp_methods */
1758      0,                  /*tp_members */
1759      0,                  /*tp_getset */
1760      0,                  /*tp_base */
1761      0,                  /*tp_dict */
1762      0,                  /*tp_descr_get */
1763      0,                  /*tp_descr_set */
1764      0,                  /*tp_dictoffset */
1765      0,                  /*tp_init */
1766      0,                  /*tp_alloc */
1767      notimplemented_new, /*tp_new */
1768  };
1769  
1770  PyObject _Py_NotImplementedStruct = {
1771      _PyObject_EXTRA_INIT
1772      1, &_PyNotImplemented_Type
1773  };
1774  
1775  PyStatus
_PyTypes_Init(void)1776  _PyTypes_Init(void)
1777  {
1778      PyStatus status = _PyTypes_InitSlotDefs();
1779      if (_PyStatus_EXCEPTION(status)) {
1780          return status;
1781      }
1782  
1783  #define INIT_TYPE(TYPE) \
1784      do { \
1785          if (PyType_Ready(&(TYPE)) < 0) { \
1786              return _PyStatus_ERR("Can't initialize " #TYPE " type"); \
1787          } \
1788      } while (0)
1789  
1790      // Base types
1791      INIT_TYPE(PyBaseObject_Type);
1792      INIT_TYPE(PyType_Type);
1793      assert(PyBaseObject_Type.tp_base == NULL);
1794      assert(PyType_Type.tp_base == &PyBaseObject_Type);
1795  
1796      // All other static types
1797      INIT_TYPE(PyAsyncGen_Type);
1798      INIT_TYPE(PyBool_Type);
1799      INIT_TYPE(PyByteArrayIter_Type);
1800      INIT_TYPE(PyByteArray_Type);
1801      INIT_TYPE(PyBytesIter_Type);
1802      INIT_TYPE(PyBytes_Type);
1803      INIT_TYPE(PyCFunction_Type);
1804      INIT_TYPE(PyCMethod_Type);
1805      INIT_TYPE(PyCallIter_Type);
1806      INIT_TYPE(PyCapsule_Type);
1807      INIT_TYPE(PyCell_Type);
1808      INIT_TYPE(PyClassMethodDescr_Type);
1809      INIT_TYPE(PyClassMethod_Type);
1810      INIT_TYPE(PyCode_Type);
1811      INIT_TYPE(PyComplex_Type);
1812      INIT_TYPE(PyCoro_Type);
1813      INIT_TYPE(PyDictItems_Type);
1814      INIT_TYPE(PyDictIterItem_Type);
1815      INIT_TYPE(PyDictIterKey_Type);
1816      INIT_TYPE(PyDictIterValue_Type);
1817      INIT_TYPE(PyDictKeys_Type);
1818      INIT_TYPE(PyDictProxy_Type);
1819      INIT_TYPE(PyDictRevIterItem_Type);
1820      INIT_TYPE(PyDictRevIterKey_Type);
1821      INIT_TYPE(PyDictRevIterValue_Type);
1822      INIT_TYPE(PyDictValues_Type);
1823      INIT_TYPE(PyDict_Type);
1824      INIT_TYPE(PyEllipsis_Type);
1825      INIT_TYPE(PyEnum_Type);
1826      INIT_TYPE(PyFloat_Type);
1827      INIT_TYPE(PyFrame_Type);
1828      INIT_TYPE(PyFrozenSet_Type);
1829      INIT_TYPE(PyFunction_Type);
1830      INIT_TYPE(PyGen_Type);
1831      INIT_TYPE(PyGetSetDescr_Type);
1832      INIT_TYPE(PyInstanceMethod_Type);
1833      INIT_TYPE(PyListIter_Type);
1834      INIT_TYPE(PyListRevIter_Type);
1835      INIT_TYPE(PyList_Type);
1836      INIT_TYPE(PyLongRangeIter_Type);
1837      INIT_TYPE(PyLong_Type);
1838      INIT_TYPE(PyMemberDescr_Type);
1839      INIT_TYPE(PyMemoryView_Type);
1840      INIT_TYPE(PyMethodDescr_Type);
1841      INIT_TYPE(PyMethod_Type);
1842      INIT_TYPE(PyModuleDef_Type);
1843      INIT_TYPE(PyModule_Type);
1844      INIT_TYPE(PyODictItems_Type);
1845      INIT_TYPE(PyODictIter_Type);
1846      INIT_TYPE(PyODictKeys_Type);
1847      INIT_TYPE(PyODictValues_Type);
1848      INIT_TYPE(PyODict_Type);
1849      INIT_TYPE(PyPickleBuffer_Type);
1850      INIT_TYPE(PyProperty_Type);
1851      INIT_TYPE(PyRangeIter_Type);
1852      INIT_TYPE(PyRange_Type);
1853      INIT_TYPE(PyReversed_Type);
1854      INIT_TYPE(PySTEntry_Type);
1855      INIT_TYPE(PySeqIter_Type);
1856      INIT_TYPE(PySetIter_Type);
1857      INIT_TYPE(PySet_Type);
1858      INIT_TYPE(PySlice_Type);
1859      INIT_TYPE(PyStaticMethod_Type);
1860      INIT_TYPE(PyStdPrinter_Type);
1861      INIT_TYPE(PySuper_Type);
1862      INIT_TYPE(PyTraceBack_Type);
1863      INIT_TYPE(PyTupleIter_Type);
1864      INIT_TYPE(PyTuple_Type);
1865      INIT_TYPE(PyUnicodeIter_Type);
1866      INIT_TYPE(PyUnicode_Type);
1867      INIT_TYPE(PyWrapperDescr_Type);
1868      INIT_TYPE(Py_GenericAliasType);
1869      INIT_TYPE(_PyAnextAwaitable_Type);
1870      INIT_TYPE(_PyAsyncGenASend_Type);
1871      INIT_TYPE(_PyAsyncGenAThrow_Type);
1872      INIT_TYPE(_PyAsyncGenWrappedValue_Type);
1873      INIT_TYPE(_PyCoroWrapper_Type);
1874      INIT_TYPE(_PyInterpreterID_Type);
1875      INIT_TYPE(_PyManagedBuffer_Type);
1876      INIT_TYPE(_PyMethodWrapper_Type);
1877      INIT_TYPE(_PyNamespace_Type);
1878      INIT_TYPE(_PyNone_Type);
1879      INIT_TYPE(_PyNotImplemented_Type);
1880      INIT_TYPE(_PyWeakref_CallableProxyType);
1881      INIT_TYPE(_PyWeakref_ProxyType);
1882      INIT_TYPE(_PyWeakref_RefType);
1883      INIT_TYPE(_PyUnion_Type);
1884  
1885      return _PyStatus_OK();
1886  #undef INIT_TYPE
1887  }
1888  
1889  
1890  void
_Py_NewReference(PyObject * op)1891  _Py_NewReference(PyObject *op)
1892  {
1893      if (_Py_tracemalloc_config.tracing) {
1894          _PyTraceMalloc_NewReference(op);
1895      }
1896  #ifdef Py_REF_DEBUG
1897      _Py_RefTotal++;
1898  #endif
1899      Py_SET_REFCNT(op, 1);
1900  #ifdef Py_TRACE_REFS
1901      _Py_AddToAllObjects(op, 1);
1902  #endif
1903  }
1904  
1905  
1906  #ifdef Py_TRACE_REFS
1907  void
_Py_ForgetReference(PyObject * op)1908  _Py_ForgetReference(PyObject *op)
1909  {
1910      if (Py_REFCNT(op) < 0) {
1911          _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt");
1912      }
1913  
1914      if (op == &refchain ||
1915          op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
1916      {
1917          _PyObject_ASSERT_FAILED_MSG(op, "invalid object chain");
1918      }
1919  
1920  #ifdef SLOW_UNREF_CHECK
1921      PyObject *p;
1922      for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
1923          if (p == op) {
1924              break;
1925          }
1926      }
1927      if (p == &refchain) {
1928          /* Not found */
1929          _PyObject_ASSERT_FAILED_MSG(op,
1930                                      "object not found in the objects list");
1931      }
1932  #endif
1933  
1934      op->_ob_next->_ob_prev = op->_ob_prev;
1935      op->_ob_prev->_ob_next = op->_ob_next;
1936      op->_ob_next = op->_ob_prev = NULL;
1937  }
1938  
1939  /* Print all live objects.  Because PyObject_Print is called, the
1940   * interpreter must be in a healthy state.
1941   */
1942  void
_Py_PrintReferences(FILE * fp)1943  _Py_PrintReferences(FILE *fp)
1944  {
1945      PyObject *op;
1946      fprintf(fp, "Remaining objects:\n");
1947      for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
1948          fprintf(fp, "%p [%zd] ", (void *)op, Py_REFCNT(op));
1949          if (PyObject_Print(op, fp, 0) != 0) {
1950              PyErr_Clear();
1951          }
1952          putc('\n', fp);
1953      }
1954  }
1955  
1956  /* Print the addresses of all live objects.  Unlike _Py_PrintReferences, this
1957   * doesn't make any calls to the Python C API, so is always safe to call.
1958   */
1959  void
_Py_PrintReferenceAddresses(FILE * fp)1960  _Py_PrintReferenceAddresses(FILE *fp)
1961  {
1962      PyObject *op;
1963      fprintf(fp, "Remaining object addresses:\n");
1964      for (op = refchain._ob_next; op != &refchain; op = op->_ob_next)
1965          fprintf(fp, "%p [%zd] %s\n", (void *)op,
1966              Py_REFCNT(op), Py_TYPE(op)->tp_name);
1967  }
1968  
1969  PyObject *
_Py_GetObjects(PyObject * self,PyObject * args)1970  _Py_GetObjects(PyObject *self, PyObject *args)
1971  {
1972      int i, n;
1973      PyObject *t = NULL;
1974      PyObject *res, *op;
1975  
1976      if (!PyArg_ParseTuple(args, "i|O", &n, &t))
1977          return NULL;
1978      op = refchain._ob_next;
1979      res = PyList_New(0);
1980      if (res == NULL)
1981          return NULL;
1982      for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
1983          while (op == self || op == args || op == res || op == t ||
1984                 (t != NULL && !Py_IS_TYPE(op, (PyTypeObject *) t))) {
1985              op = op->_ob_next;
1986              if (op == &refchain)
1987                  return res;
1988          }
1989          if (PyList_Append(res, op) < 0) {
1990              Py_DECREF(res);
1991              return NULL;
1992          }
1993          op = op->_ob_next;
1994      }
1995      return res;
1996  }
1997  
1998  #endif
1999  
2000  
2001  /* Hack to force loading of abstract.o */
2002  Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size;
2003  
2004  
2005  void
_PyObject_DebugTypeStats(FILE * out)2006  _PyObject_DebugTypeStats(FILE *out)
2007  {
2008      _PyDict_DebugMallocStats(out);
2009      _PyFloat_DebugMallocStats(out);
2010      _PyFrame_DebugMallocStats(out);
2011      _PyList_DebugMallocStats(out);
2012      _PyTuple_DebugMallocStats(out);
2013  }
2014  
2015  /* These methods are used to control infinite recursion in repr, str, print,
2016     etc.  Container objects that may recursively contain themselves,
2017     e.g. builtin dictionaries and lists, should use Py_ReprEnter() and
2018     Py_ReprLeave() to avoid infinite recursion.
2019  
2020     Py_ReprEnter() returns 0 the first time it is called for a particular
2021     object and 1 every time thereafter.  It returns -1 if an exception
2022     occurred.  Py_ReprLeave() has no return value.
2023  
2024     See dictobject.c and listobject.c for examples of use.
2025  */
2026  
2027  int
Py_ReprEnter(PyObject * obj)2028  Py_ReprEnter(PyObject *obj)
2029  {
2030      PyObject *dict;
2031      PyObject *list;
2032      Py_ssize_t i;
2033  
2034      dict = PyThreadState_GetDict();
2035      /* Ignore a missing thread-state, so that this function can be called
2036         early on startup. */
2037      if (dict == NULL)
2038          return 0;
2039      list = _PyDict_GetItemIdWithError(dict, &PyId_Py_Repr);
2040      if (list == NULL) {
2041          if (PyErr_Occurred()) {
2042              return -1;
2043          }
2044          list = PyList_New(0);
2045          if (list == NULL)
2046              return -1;
2047          if (_PyDict_SetItemId(dict, &PyId_Py_Repr, list) < 0)
2048              return -1;
2049          Py_DECREF(list);
2050      }
2051      i = PyList_GET_SIZE(list);
2052      while (--i >= 0) {
2053          if (PyList_GET_ITEM(list, i) == obj)
2054              return 1;
2055      }
2056      if (PyList_Append(list, obj) < 0)
2057          return -1;
2058      return 0;
2059  }
2060  
2061  void
Py_ReprLeave(PyObject * obj)2062  Py_ReprLeave(PyObject *obj)
2063  {
2064      PyObject *dict;
2065      PyObject *list;
2066      Py_ssize_t i;
2067      PyObject *error_type, *error_value, *error_traceback;
2068  
2069      PyErr_Fetch(&error_type, &error_value, &error_traceback);
2070  
2071      dict = PyThreadState_GetDict();
2072      if (dict == NULL)
2073          goto finally;
2074  
2075      list = _PyDict_GetItemIdWithError(dict, &PyId_Py_Repr);
2076      if (list == NULL || !PyList_Check(list))
2077          goto finally;
2078  
2079      i = PyList_GET_SIZE(list);
2080      /* Count backwards because we always expect obj to be list[-1] */
2081      while (--i >= 0) {
2082          if (PyList_GET_ITEM(list, i) == obj) {
2083              PyList_SetSlice(list, i, i + 1, NULL);
2084              break;
2085          }
2086      }
2087  
2088  finally:
2089      /* ignore exceptions because there is no way to report them. */
2090      PyErr_Restore(error_type, error_value, error_traceback);
2091  }
2092  
2093  /* Trashcan support. */
2094  
2095  /* Add op to the _PyTrash_delete_later list.  Called when the current
2096   * call-stack depth gets large.  op must be a currently untracked gc'ed
2097   * object, with refcount 0.  Py_DECREF must already have been called on it.
2098   */
2099  void
_PyTrash_deposit_object(PyObject * op)2100  _PyTrash_deposit_object(PyObject *op)
2101  {
2102      PyInterpreterState *interp = _PyInterpreterState_GET();
2103      struct _gc_runtime_state *gcstate = &interp->gc;
2104  
2105      _PyObject_ASSERT(op, _PyObject_IS_GC(op));
2106      _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op));
2107      _PyObject_ASSERT(op, Py_REFCNT(op) == 0);
2108      _PyGCHead_SET_PREV(_Py_AS_GC(op), gcstate->trash_delete_later);
2109      gcstate->trash_delete_later = op;
2110  }
2111  
2112  /* The equivalent API, using per-thread state recursion info */
2113  void
_PyTrash_thread_deposit_object(PyObject * op)2114  _PyTrash_thread_deposit_object(PyObject *op)
2115  {
2116      PyThreadState *tstate = _PyThreadState_GET();
2117      _PyObject_ASSERT(op, _PyObject_IS_GC(op));
2118      _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op));
2119      _PyObject_ASSERT(op, Py_REFCNT(op) == 0);
2120      _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later);
2121      tstate->trash_delete_later = op;
2122  }
2123  
2124  /* Deallocate all the objects in the _PyTrash_delete_later list.  Called when
2125   * the call-stack unwinds again.
2126   */
2127  void
_PyTrash_destroy_chain(void)2128  _PyTrash_destroy_chain(void)
2129  {
2130      PyInterpreterState *interp = _PyInterpreterState_GET();
2131      struct _gc_runtime_state *gcstate = &interp->gc;
2132  
2133      while (gcstate->trash_delete_later) {
2134          PyObject *op = gcstate->trash_delete_later;
2135          destructor dealloc = Py_TYPE(op)->tp_dealloc;
2136  
2137          gcstate->trash_delete_later =
2138              (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
2139  
2140          /* Call the deallocator directly.  This used to try to
2141           * fool Py_DECREF into calling it indirectly, but
2142           * Py_DECREF was already called on this object, and in
2143           * assorted non-release builds calling Py_DECREF again ends
2144           * up distorting allocation statistics.
2145           */
2146          _PyObject_ASSERT(op, Py_REFCNT(op) == 0);
2147          ++gcstate->trash_delete_nesting;
2148          (*dealloc)(op);
2149          --gcstate->trash_delete_nesting;
2150      }
2151  }
2152  
2153  /* The equivalent API, using per-thread state recursion info */
2154  void
_PyTrash_thread_destroy_chain(void)2155  _PyTrash_thread_destroy_chain(void)
2156  {
2157      PyThreadState *tstate = _PyThreadState_GET();
2158      /* We need to increase trash_delete_nesting here, otherwise,
2159         _PyTrash_thread_destroy_chain will be called recursively
2160         and then possibly crash.  An example that may crash without
2161         increase:
2162             N = 500000  # need to be large enough
2163             ob = object()
2164             tups = [(ob,) for i in range(N)]
2165             for i in range(49):
2166                 tups = [(tup,) for tup in tups]
2167             del tups
2168      */
2169      assert(tstate->trash_delete_nesting == 0);
2170      ++tstate->trash_delete_nesting;
2171      while (tstate->trash_delete_later) {
2172          PyObject *op = tstate->trash_delete_later;
2173          destructor dealloc = Py_TYPE(op)->tp_dealloc;
2174  
2175          tstate->trash_delete_later =
2176              (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
2177  
2178          /* Call the deallocator directly.  This used to try to
2179           * fool Py_DECREF into calling it indirectly, but
2180           * Py_DECREF was already called on this object, and in
2181           * assorted non-release builds calling Py_DECREF again ends
2182           * up distorting allocation statistics.
2183           */
2184          _PyObject_ASSERT(op, Py_REFCNT(op) == 0);
2185          (*dealloc)(op);
2186          assert(tstate->trash_delete_nesting == 1);
2187      }
2188      --tstate->trash_delete_nesting;
2189  }
2190  
2191  
2192  int
_PyTrash_begin(PyThreadState * tstate,PyObject * op)2193  _PyTrash_begin(PyThreadState *tstate, PyObject *op)
2194  {
2195      if (tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) {
2196          /* Store the object (to be deallocated later) and jump past
2197           * Py_TRASHCAN_END, skipping the body of the deallocator */
2198          _PyTrash_thread_deposit_object(op);
2199          return 1;
2200      }
2201      ++tstate->trash_delete_nesting;
2202      return 0;
2203  }
2204  
2205  
2206  void
_PyTrash_end(PyThreadState * tstate)2207  _PyTrash_end(PyThreadState *tstate)
2208  {
2209      --tstate->trash_delete_nesting;
2210      if (tstate->trash_delete_later && tstate->trash_delete_nesting <= 0) {
2211          _PyTrash_thread_destroy_chain();
2212      }
2213  }
2214  
2215  
2216  /* bpo-40170: It's only be used in Py_TRASHCAN_BEGIN macro to hide
2217     implementation details. */
2218  int
_PyTrash_cond(PyObject * op,destructor dealloc)2219  _PyTrash_cond(PyObject *op, destructor dealloc)
2220  {
2221      return Py_TYPE(op)->tp_dealloc == dealloc;
2222  }
2223  
2224  
2225  void _Py_NO_RETURN
_PyObject_AssertFailed(PyObject * obj,const char * expr,const char * msg,const char * file,int line,const char * function)2226  _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
2227                         const char *file, int line, const char *function)
2228  {
2229      fprintf(stderr, "%s:%d: ", file, line);
2230      if (function) {
2231          fprintf(stderr, "%s: ", function);
2232      }
2233      fflush(stderr);
2234  
2235      if (expr) {
2236          fprintf(stderr, "Assertion \"%s\" failed", expr);
2237      }
2238      else {
2239          fprintf(stderr, "Assertion failed");
2240      }
2241      fflush(stderr);
2242  
2243      if (msg) {
2244          fprintf(stderr, ": %s", msg);
2245      }
2246      fprintf(stderr, "\n");
2247      fflush(stderr);
2248  
2249      if (_PyObject_IsFreed(obj)) {
2250          /* It seems like the object memory has been freed:
2251             don't access it to prevent a segmentation fault. */
2252          fprintf(stderr, "<object at %p is freed>\n", obj);
2253          fflush(stderr);
2254      }
2255      else {
2256          /* Display the traceback where the object has been allocated.
2257             Do it before dumping repr(obj), since repr() is more likely
2258             to crash than dumping the traceback. */
2259          void *ptr;
2260          PyTypeObject *type = Py_TYPE(obj);
2261          if (_PyType_IS_GC(type)) {
2262              ptr = (void *)((char *)obj - sizeof(PyGC_Head));
2263          }
2264          else {
2265              ptr = (void *)obj;
2266          }
2267          _PyMem_DumpTraceback(fileno(stderr), ptr);
2268  
2269          /* This might succeed or fail, but we're about to abort, so at least
2270             try to provide any extra info we can: */
2271          _PyObject_Dump(obj);
2272  
2273          fprintf(stderr, "\n");
2274          fflush(stderr);
2275      }
2276  
2277      Py_FatalError("_PyObject_AssertFailed");
2278  }
2279  
2280  
2281  void
_Py_Dealloc(PyObject * op)2282  _Py_Dealloc(PyObject *op)
2283  {
2284      destructor dealloc = Py_TYPE(op)->tp_dealloc;
2285  #ifdef Py_TRACE_REFS
2286      _Py_ForgetReference(op);
2287  #endif
2288      (*dealloc)(op);
2289  }
2290  
2291  
2292  PyObject **
PyObject_GET_WEAKREFS_LISTPTR(PyObject * op)2293  PyObject_GET_WEAKREFS_LISTPTR(PyObject *op)
2294  {
2295      return _PyObject_GET_WEAKREFS_LISTPTR(op);
2296  }
2297  
2298  
2299  #undef Py_NewRef
2300  #undef Py_XNewRef
2301  
2302  // Export Py_NewRef() and Py_XNewRef() as regular functions for the stable ABI.
2303  PyObject*
Py_NewRef(PyObject * obj)2304  Py_NewRef(PyObject *obj)
2305  {
2306      return _Py_NewRef(obj);
2307  }
2308  
2309  PyObject*
Py_XNewRef(PyObject * obj)2310  Py_XNewRef(PyObject *obj)
2311  {
2312      return _Py_XNewRef(obj);
2313  }
2314  
2315  #undef Py_Is
2316  #undef Py_IsNone
2317  #undef Py_IsTrue
2318  #undef Py_IsFalse
2319  
2320  // Export Py_Is(), Py_IsNone(), Py_IsTrue(), Py_IsFalse() as regular functions
2321  // for the stable ABI.
Py_Is(PyObject * x,PyObject * y)2322  int Py_Is(PyObject *x, PyObject *y)
2323  {
2324      return (x == y);
2325  }
2326  
Py_IsNone(PyObject * x)2327  int Py_IsNone(PyObject *x)
2328  {
2329      return Py_Is(x, Py_None);
2330  }
2331  
Py_IsTrue(PyObject * x)2332  int Py_IsTrue(PyObject *x)
2333  {
2334      return Py_Is(x, Py_True);
2335  }
2336  
Py_IsFalse(PyObject * x)2337  int Py_IsFalse(PyObject *x)
2338  {
2339      return Py_Is(x, Py_False);
2340  }
2341  
2342  #ifdef __cplusplus
2343  }
2344  #endif
2345