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