Coverage Report

Created: 2026-06-14 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
10.3k
{
256
10.3k
    if (op == NULL)
257
0
        return PyErr_NoMemory();
258
    /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
259
10.3k
    Py_TYPE(op) = tp;
260
10.3k
    if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) {
261
0
        Py_INCREF(tp);
262
0
    }
263
10.3k
    _Py_NewReference(op);
264
10.3k
    return op;
265
10.3k
}
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
134k
{
281
134k
    PyObject *op;
282
134k
    op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
283
134k
    if (op == NULL)
284
0
        return PyErr_NoMemory();
285
134k
    return PyObject_INIT(op, tp);
286
134k
}
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
661
{
302
661
    PyTypeObject *tp = Py_TYPE(self);
303
304
661
    if (tp->tp_finalize == NULL)
305
0
        return;
306
    /* tp_finalize should only be called once. */
307
661
    if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
308
0
        return;
309
310
661
    tp->tp_finalize(self);
311
661
    if (PyType_IS_GC(tp)) {
312
661
        _PyGC_SET_FINALIZED(self);
313
661
    }
314
661
}
315
316
int
317
PyObject_CallFinalizerFromDealloc(PyObject *self)
318
661
{
319
661
    Py_ssize_t refcnt;
320
321
    /* Temporarily resurrect the object. */
322
661
    if (self->ob_refcnt != 0) {
323
0
        Py_FatalError("PyObject_CallFinalizerFromDealloc called on "
324
0
                      "object with a non-zero refcount");
325
0
    }
326
661
    self->ob_refcnt = 1;
327
328
661
    PyObject_CallFinalizer(self);
329
330
    /* Undo the temporary resurrection; can't use DECREF here, it would
331
     * cause a recursive call.
332
     */
333
661
    _PyObject_ASSERT_WITH_MSG(self,
334
661
                              self->ob_refcnt > 0,
335
661
                              "refcount is too small");
336
661
    if (--self->ob_refcnt == 0)
337
661
        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
661
}
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
71
{
513
71
    PyObject *res;
514
71
    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
71
    if (v == NULL)
523
0
        return PyUnicode_FromString("<NULL>");
524
71
    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
71
    if (Py_EnterRecursiveCall(" while getting the repr of an object"))
538
0
        return NULL;
539
71
    res = (*v->ob_type->tp_repr)(v);
540
71
    Py_LeaveRecursiveCall();
541
71
    if (res == NULL)
542
0
        return NULL;
543
71
    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
71
#ifndef Py_DEBUG
551
71
    if (PyUnicode_READY(res) < 0)
552
0
        return NULL;
553
71
#endif
554
71
    return res;
555
71
}
556
557
PyObject *
558
PyObject_Str(PyObject *v)
559
875
{
560
875
    PyObject *res;
561
875
    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
875
    if (v == NULL)
570
0
        return PyUnicode_FromString("<NULL>");
571
875
    if (PyUnicode_CheckExact(v)) {
572
826
#ifndef Py_DEBUG
573
826
        if (PyUnicode_READY(v) < 0)
574
0
            return NULL;
575
826
#endif
576
826
        Py_INCREF(v);
577
826
        return v;
578
826
    }
579
49
    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
49
    if (Py_EnterRecursiveCall(" while getting the str of an object"))
592
0
        return NULL;
593
49
    res = (*Py_TYPE(v)->tp_str)(v);
594
49
    Py_LeaveRecursiveCall();
595
49
    if (res == NULL)
596
0
        return NULL;
597
49
    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
49
#ifndef Py_DEBUG
605
49
    if (PyUnicode_READY(res) < 0)
606
0
        return NULL;
607
49
#endif
608
49
    assert(_PyUnicode_CheckConsistency(res, 1));
609
49
    return res;
610
49
}
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
673
{
642
673
    PyObject *result, *func;
643
644
673
    if (v == NULL)
645
0
        return PyBytes_FromString("<NULL>");
646
647
673
    if (PyBytes_CheckExact(v)) {
648
673
        Py_INCREF(v);
649
673
        return v;
650
673
    }
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
106k
{
712
106k
    richcmpfunc f;
713
106k
    PyObject *res;
714
106k
    int checked_reverse_op = 0;
715
716
106k
    if (v->ob_type != w->ob_type &&
717
327
        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
106k
    if ((f = v->ob_type->tp_richcompare) != NULL) {
726
106k
        res = (*f)(v, w, op);
727
106k
        if (res != Py_NotImplemented)
728
106k
            return res;
729
214
        Py_DECREF(res);
730
214
    }
731
214
    if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) {
732
214
        res = (*f)(w, v, _Py_SwappedOp[op]);
733
214
        if (res != Py_NotImplemented)
734
0
            return res;
735
214
        Py_DECREF(res);
736
214
    }
737
    /* If neither object implements it, provide a sensible default
738
       for == and !=, but raise an exception for ordering. */
739
214
    switch (op) {
740
214
    case Py_EQ:
741
214
        res = (v == w) ? Py_True : Py_False;
742
214
        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
214
    }
754
214
    Py_INCREF(res);
755
214
    return res;
756
214
}
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
106k
{
764
106k
    PyObject *res;
765
766
106k
    assert(Py_LT <= op && op <= Py_GE);
767
106k
    if (v == NULL || w == NULL) {
768
0
        if (!PyErr_Occurred())
769
0
            PyErr_BadInternalCall();
770
0
        return NULL;
771
0
    }
772
106k
    if (Py_EnterRecursiveCall(" in comparison"))
773
0
        return NULL;
774
106k
    res = do_richcompare(v, w, op);
775
106k
    Py_LeaveRecursiveCall();
776
106k
    return res;
777
106k
}
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
91.2k
{
784
91.2k
    PyObject *res;
785
91.2k
    int ok;
786
787
    /* Quick result when objects are the same.
788
       Guarantees that identity implies equality. */
789
91.2k
    if (v == w) {
790
319
        if (op == Py_EQ)
791
294
            return 1;
792
25
        else if (op == Py_NE)
793
0
            return 0;
794
319
    }
795
796
90.9k
    res = PyObject_RichCompare(v, w, op);
797
90.9k
    if (res == NULL)
798
0
        return -1;
799
90.9k
    if (PyBool_Check(res))
800
90.9k
        ok = (res == Py_True);
801
0
    else
802
0
        ok = PyObject_IsTrue(res);
803
90.9k
    Py_DECREF(res);
804
90.9k
    return ok;
805
90.9k
}
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
329k
{
818
329k
    PyTypeObject *tp = Py_TYPE(v);
819
329k
    if (tp->tp_hash != NULL)
820
329k
        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
789
{
839
789
    PyObject *w, *res;
840
841
789
    if (Py_TYPE(v)->tp_getattr != NULL)
842
0
        return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
843
789
    w = PyUnicode_FromString(name);
844
789
    if (w == NULL)
845
0
        return NULL;
846
789
    res = PyObject_GetAttr(v, w);
847
789
    Py_DECREF(w);
848
789
    return res;
849
789
}
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.02k
{
866
5.02k
    PyObject *s;
867
5.02k
    int res;
868
869
5.02k
    if (Py_TYPE(v)->tp_setattr != NULL)
870
0
        return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
871
5.02k
    s = PyUnicode_InternFromString(name);
872
5.02k
    if (s == NULL)
873
0
        return -1;
874
5.02k
    res = PyObject_SetAttr(v, s, w);
875
5.02k
    Py_XDECREF(s);
876
5.02k
    return res;
877
5.02k
}
878
879
int
880
_PyObject_IsAbstract(PyObject *obj)
881
3.83k
{
882
3.83k
    int res;
883
3.83k
    PyObject* isabstract;
884
885
3.83k
    if (obj == NULL)
886
2
        return 0;
887
888
3.83k
    res = _PyObject_LookupAttrId(obj, &PyId___isabstractmethod__, &isabstract);
889
3.83k
    if (res > 0) {
890
848
        res = PyObject_IsTrue(isabstract);
891
848
        Py_DECREF(isabstract);
892
848
    }
893
3.83k
    return res;
894
3.83k
}
895
896
PyObject *
897
_PyObject_GetAttrId(PyObject *v, _Py_Identifier *name)
898
9.56k
{
899
9.56k
    PyObject *result;
900
9.56k
    PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
901
9.56k
    if (!oname)
902
0
        return NULL;
903
9.56k
    result = PyObject_GetAttr(v, oname);
904
9.56k
    return result;
905
9.56k
}
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.59k
{
921
1.59k
    int result;
922
1.59k
    PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
923
1.59k
    if (!oname)
924
0
        return -1;
925
1.59k
    result = PyObject_SetAttr(v, oname, w);
926
1.59k
    return result;
927
1.59k
}
928
929
PyObject *
930
PyObject_GetAttr(PyObject *v, PyObject *name)
931
83.0k
{
932
83.0k
    PyTypeObject *tp = Py_TYPE(v);
933
934
83.0k
    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
83.0k
    if (tp->tp_getattro != NULL)
941
83.0k
        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
14.9k
{
957
14.9k
    PyTypeObject *tp = Py_TYPE(v);
958
959
14.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
14.9k
    if (tp->tp_getattro == PyObject_GenericGetAttr) {
968
8.45k
        *result = _PyObject_GenericGetAttrWithDict(v, name, NULL, 1);
969
8.45k
        if (*result != NULL) {
970
4.74k
            return 1;
971
4.74k
        }
972
3.71k
        if (PyErr_Occurred()) {
973
0
            return -1;
974
0
        }
975
3.71k
        return 0;
976
3.71k
    }
977
6.52k
    if (tp->tp_getattro != NULL) {
978
6.52k
        *result = (*tp->tp_getattro)(v, name);
979
6.52k
    }
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.52k
    if (*result != NULL) {
994
4.93k
        return 1;
995
4.93k
    }
996
1.59k
    if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
997
0
        return -1;
998
0
    }
999
1.59k
    PyErr_Clear();
1000
1.59k
    return 0;
1001
1.59k
}
1002
1003
int
1004
_PyObject_LookupAttrId(PyObject *v, _Py_Identifier *name, PyObject **result)
1005
8.34k
{
1006
8.34k
    PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1007
8.34k
    if (!oname) {
1008
0
        *result = NULL;
1009
0
        return -1;
1010
0
    }
1011
8.34k
    return  _PyObject_LookupAttr(v, oname, result);
1012
8.34k
}
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
23.0k
{
1032
23.0k
    PyTypeObject *tp = Py_TYPE(v);
1033
23.0k
    int err;
1034
1035
23.0k
    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
23.0k
    Py_INCREF(name);
1042
1043
23.0k
    PyUnicode_InternInPlace(&name);
1044
23.0k
    if (tp->tp_setattro != NULL) {
1045
23.0k
        err = (*tp->tp_setattro)(v, name, value);
1046
23.0k
        Py_DECREF(name);
1047
23.0k
        return err;
1048
23.0k
    }
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
45.6k
{
1083
45.6k
    Py_ssize_t dictoffset;
1084
45.6k
    PyTypeObject *tp = Py_TYPE(obj);
1085
1086
45.6k
    dictoffset = tp->tp_dictoffset;
1087
45.6k
    if (dictoffset == 0)
1088
13.6k
        return NULL;
1089
31.9k
    if (dictoffset < 0) {
1090
552
        Py_ssize_t tsize;
1091
552
        size_t size;
1092
1093
552
        tsize = ((PyVarObject *)obj)->ob_size;
1094
552
        if (tsize < 0)
1095
0
            tsize = -tsize;
1096
552
        size = _PyObject_VAR_SIZE(tp, tsize);
1097
1098
552
        dictoffset += (long)size;
1099
552
        _PyObject_ASSERT(obj, dictoffset > 0);
1100
552
        _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
1101
552
    }
1102
31.9k
    return (PyObject **) ((char *)obj + dictoffset);
1103
45.6k
}
1104
1105
PyObject *
1106
PyObject_SelfIter(PyObject *obj)
1107
865
{
1108
865
    Py_INCREF(obj);
1109
865
    return obj;
1110
865
}
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
35.8k
{
1140
35.8k
    PyTypeObject *tp = Py_TYPE(obj);
1141
35.8k
    PyObject *descr;
1142
35.8k
    descrgetfunc f = NULL;
1143
35.8k
    PyObject **dictptr, *dict;
1144
35.8k
    PyObject *attr;
1145
35.8k
    int meth_found = 0;
1146
1147
35.8k
    assert(*method == NULL);
1148
1149
35.8k
    if (Py_TYPE(obj)->tp_getattro != PyObject_GenericGetAttr
1150
19.6k
            || !PyUnicode_Check(name)) {
1151
16.1k
        *method = PyObject_GetAttr(obj, name);
1152
16.1k
        return 0;
1153
16.1k
    }
1154
1155
19.6k
    if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1156
0
        return 0;
1157
1158
19.6k
    descr = _PyType_Lookup(tp, name);
1159
19.6k
    if (descr != NULL) {
1160
19.6k
        Py_INCREF(descr);
1161
19.6k
        if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
1162
19.5k
            meth_found = 1;
1163
19.5k
        } 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
19.6k
    }
1172
1173
19.6k
    dictptr = _PyObject_GetDictPtr(obj);
1174
19.6k
    if (dictptr != NULL && (dict = *dictptr) != NULL) {
1175
5.16k
        Py_INCREF(dict);
1176
5.16k
        attr = PyDict_GetItemWithError(dict, name);
1177
5.16k
        if (attr != NULL) {
1178
51
            Py_INCREF(attr);
1179
51
            *method = attr;
1180
51
            Py_DECREF(dict);
1181
51
            Py_XDECREF(descr);
1182
51
            return 0;
1183
51
        }
1184
5.11k
        else {
1185
5.11k
            Py_DECREF(dict);
1186
5.11k
            if (PyErr_Occurred()) {
1187
0
                Py_XDECREF(descr);
1188
0
                return 0;
1189
0
            }
1190
5.11k
        }
1191
5.16k
    }
1192
1193
19.5k
    if (meth_found) {
1194
19.5k
        *method = descr;
1195
19.5k
        return 1;
1196
19.5k
    }
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
84.3k
{
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
84.3k
    PyTypeObject *tp = Py_TYPE(obj);
1228
84.3k
    PyObject *descr = NULL;
1229
84.3k
    PyObject *res = NULL;
1230
84.3k
    descrgetfunc f;
1231
84.3k
    Py_ssize_t dictoffset;
1232
84.3k
    PyObject **dictptr;
1233
1234
84.3k
    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
84.3k
    Py_INCREF(name);
1241
1242
84.3k
    if (tp->tp_dict == NULL) {
1243
0
        if (PyType_Ready(tp) < 0)
1244
0
            goto done;
1245
0
    }
1246
1247
84.3k
    descr = _PyType_Lookup(tp, name);
1248
1249
84.3k
    f = NULL;
1250
84.3k
    if (descr != NULL) {
1251
14.0k
        Py_INCREF(descr);
1252
14.0k
        f = descr->ob_type->tp_descr_get;
1253
14.0k
        if (f != NULL && PyDescr_IsData(descr)) {
1254
10.9k
            res = f(descr, obj, (PyObject *)obj->ob_type);
1255
10.9k
            if (res == NULL && suppress &&
1256
0
                    PyErr_ExceptionMatches(PyExc_AttributeError)) {
1257
0
                PyErr_Clear();
1258
0
            }
1259
10.9k
            goto done;
1260
10.9k
        }
1261
14.0k
    }
1262
1263
73.3k
    if (dict == NULL) {
1264
        /* Inline _PyObject_GetDictPtr */
1265
73.3k
        dictoffset = tp->tp_dictoffset;
1266
73.3k
        if (dictoffset != 0) {
1267
70.6k
            if (dictoffset < 0) {
1268
569
                Py_ssize_t tsize;
1269
569
                size_t size;
1270
1271
569
                tsize = ((PyVarObject *)obj)->ob_size;
1272
569
                if (tsize < 0)
1273
0
                    tsize = -tsize;
1274
569
                size = _PyObject_VAR_SIZE(tp, tsize);
1275
569
                _PyObject_ASSERT(obj, size <= PY_SSIZE_T_MAX);
1276
1277
569
                dictoffset += (Py_ssize_t)size;
1278
569
                _PyObject_ASSERT(obj, dictoffset > 0);
1279
569
                _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
1280
569
            }
1281
70.6k
            dictptr = (PyObject **) ((char *)obj + dictoffset);
1282
70.6k
            dict = *dictptr;
1283
70.6k
        }
1284
73.3k
    }
1285
73.3k
    if (dict != NULL) {
1286
68.6k
        Py_INCREF(dict);
1287
68.6k
        res = PyDict_GetItemWithError(dict, name);
1288
68.6k
        if (res != NULL) {
1289
63.6k
            Py_INCREF(res);
1290
63.6k
            Py_DECREF(dict);
1291
63.6k
            goto done;
1292
63.6k
        }
1293
5.01k
        else {
1294
5.01k
            Py_DECREF(dict);
1295
5.01k
            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.01k
        }
1304
68.6k
    }
1305
1306
9.74k
    if (f != NULL) {
1307
2.92k
        res = f(descr, obj, (PyObject *)Py_TYPE(obj));
1308
2.92k
        if (res == NULL && suppress &&
1309
0
                PyErr_ExceptionMatches(PyExc_AttributeError)) {
1310
0
            PyErr_Clear();
1311
0
        }
1312
2.92k
        goto done;
1313
2.92k
    }
1314
1315
6.81k
    if (descr != NULL) {
1316
85
        res = descr;
1317
85
        descr = NULL;
1318
85
        goto done;
1319
85
    }
1320
1321
6.72k
    if (!suppress) {
1322
3.01k
        PyErr_Format(PyExc_AttributeError,
1323
3.01k
                     "'%.50s' object has no attribute '%U'",
1324
3.01k
                     tp->tp_name, name);
1325
3.01k
    }
1326
84.3k
  done:
1327
84.3k
    Py_XDECREF(descr);
1328
84.3k
    Py_DECREF(name);
1329
84.3k
    return res;
1330
6.72k
}
1331
1332
PyObject *
1333
PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
1334
75.9k
{
1335
75.9k
    return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 0);
1336
75.9k
}
1337
1338
int
1339
_PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
1340
                                 PyObject *value, PyObject *dict)
1341
23.0k
{
1342
23.0k
    PyTypeObject *tp = Py_TYPE(obj);
1343
23.0k
    PyObject *descr;
1344
23.0k
    descrsetfunc f;
1345
23.0k
    PyObject **dictptr;
1346
23.0k
    int res = -1;
1347
1348
23.0k
    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
23.0k
    if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1356
0
        return -1;
1357
1358
23.0k
    Py_INCREF(name);
1359
1360
23.0k
    descr = _PyType_Lookup(tp, name);
1361
1362
23.0k
    if (descr != NULL) {
1363
1.42k
        Py_INCREF(descr);
1364
1.42k
        f = descr->ob_type->tp_descr_set;
1365
1.42k
        if (f != NULL) {
1366
1.22k
            res = f(descr, obj, value);
1367
1.22k
            goto done;
1368
1.22k
        }
1369
1.42k
    }
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
21.8k
    if (dict == NULL) {
1380
21.8k
        dictptr = _PyObject_GetDictPtr(obj);
1381
21.8k
        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
21.8k
        res = _PyObjectDict_SetItem(tp, dictptr, name, value);
1395
21.8k
    }
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
21.8k
    if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
1405
0
        PyErr_SetObject(PyExc_AttributeError, name);
1406
1407
23.0k
  done:
1408
23.0k
    Py_XDECREF(descr);
1409
23.0k
    Py_DECREF(name);
1410
23.0k
    return res;
1411
21.8k
}
1412
1413
int
1414
PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
1415
22.1k
{
1416
22.1k
    return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
1417
22.1k
}
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.1k
{
1450
14.1k
    Py_ssize_t res;
1451
14.1k
    if (v == Py_True)
1452
1.48k
        return 1;
1453
12.6k
    if (v == Py_False)
1454
2.46k
        return 0;
1455
10.1k
    if (v == Py_None)
1456
567
        return 0;
1457
9.63k
    else if (v->ob_type->tp_as_number != NULL &&
1458
7.73k
             v->ob_type->tp_as_number->nb_bool != NULL)
1459
1.64k
        res = (*v->ob_type->tp_as_number->nb_bool)(v);
1460
7.98k
    else if (v->ob_type->tp_as_mapping != NULL &&
1461
7.32k
             v->ob_type->tp_as_mapping->mp_length != NULL)
1462
7.29k
        res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1463
690
    else if (v->ob_type->tp_as_sequence != NULL &&
1464
459
             v->ob_type->tp_as_sequence->sq_length != NULL)
1465
430
        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.37k
    return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
1470
10.1k
}
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.06k
{
1490
2.06k
    if (x == NULL)
1491
0
        return 0;
1492
2.06k
    return x->ob_type->tp_call != NULL;
1493
2.06k
}
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
13
{
1529
13
    PyObject *result, *sorted;
1530
13
    PyObject *dirfunc = _PyObject_LookupSpecial(obj, &PyId___dir__);
1531
1532
13
    assert(obj != NULL);
1533
13
    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
13
    result = _PyObject_CallNoArg(dirfunc);
1540
13
    Py_DECREF(dirfunc);
1541
13
    if (result == NULL)
1542
0
        return NULL;
1543
    /* return sorted(result) */
1544
13
    sorted = PySequence_List(result);
1545
13
    Py_DECREF(result);
1546
13
    if (sorted == NULL)
1547
0
        return NULL;
1548
13
    if (PyList_Sort(sorted)) {
1549
0
        Py_DECREF(sorted);
1550
0
        return NULL;
1551
0
    }
1552
13
    return sorted;
1553
13
}
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
13
{
1562
13
    return (obj == NULL) ? _dir_locals() : _dir_object(obj);
1563
13
}
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
13
{
1775
13
#define INIT_TYPE(TYPE, NAME) \
1776
858
    do { \
1777
858
        if (PyType_Ready(TYPE) < 0) { \
1778
0
            return _PyStatus_ERR("Can't initialize " NAME " type"); \
1779
0
        } \
1780
858
    } while (0)
1781
1782
13
    INIT_TYPE(&PyBaseObject_Type, "object");
1783
13
    INIT_TYPE(&PyType_Type, "type");
1784
13
    INIT_TYPE(&_PyWeakref_RefType, "weakref");
1785
13
    INIT_TYPE(&_PyWeakref_CallableProxyType, "callable weakref proxy");
1786
13
    INIT_TYPE(&_PyWeakref_ProxyType, "weakref proxy");
1787
13
    INIT_TYPE(&PyLong_Type, "int");
1788
13
    INIT_TYPE(&PyBool_Type, "bool");
1789
13
    INIT_TYPE(&PyByteArray_Type, "bytearray");
1790
13
    INIT_TYPE(&PyBytes_Type, "str");
1791
13
    INIT_TYPE(&PyList_Type, "list");
1792
13
    INIT_TYPE(&_PyNone_Type, "None");
1793
13
    INIT_TYPE(&_PyNotImplemented_Type, "NotImplemented");
1794
13
    INIT_TYPE(&PyTraceBack_Type, "traceback");
1795
13
    INIT_TYPE(&PySuper_Type, "super");
1796
13
    INIT_TYPE(&PyRange_Type, "range");
1797
13
    INIT_TYPE(&PyDict_Type, "dict");
1798
13
    INIT_TYPE(&PyDictKeys_Type, "dict keys");
1799
13
    INIT_TYPE(&PyDictValues_Type, "dict values");
1800
13
    INIT_TYPE(&PyDictItems_Type, "dict items");
1801
13
    INIT_TYPE(&PyDictRevIterKey_Type, "reversed dict keys");
1802
13
    INIT_TYPE(&PyDictRevIterValue_Type, "reversed dict values");
1803
13
    INIT_TYPE(&PyDictRevIterItem_Type, "reversed dict items");
1804
13
    INIT_TYPE(&PyODict_Type, "OrderedDict");
1805
13
    INIT_TYPE(&PyODictKeys_Type, "odict_keys");
1806
13
    INIT_TYPE(&PyODictItems_Type, "odict_items");
1807
13
    INIT_TYPE(&PyODictValues_Type, "odict_values");
1808
13
    INIT_TYPE(&PyODictIter_Type, "odict_keyiterator");
1809
13
    INIT_TYPE(&PySet_Type, "set");
1810
13
    INIT_TYPE(&PyUnicode_Type, "str");
1811
13
    INIT_TYPE(&PySlice_Type, "slice");
1812
13
    INIT_TYPE(&PyStaticMethod_Type, "static method");
1813
13
    INIT_TYPE(&PyComplex_Type, "complex");
1814
13
    INIT_TYPE(&PyFloat_Type, "float");
1815
13
    INIT_TYPE(&PyFrozenSet_Type, "frozenset");
1816
13
    INIT_TYPE(&PyProperty_Type, "property");
1817
13
    INIT_TYPE(&_PyManagedBuffer_Type, "managed buffer");
1818
13
    INIT_TYPE(&PyMemoryView_Type, "memoryview");
1819
13
    INIT_TYPE(&PyTuple_Type, "tuple");
1820
13
    INIT_TYPE(&PyEnum_Type, "enumerate");
1821
13
    INIT_TYPE(&PyReversed_Type, "reversed");
1822
13
    INIT_TYPE(&PyStdPrinter_Type, "StdPrinter");
1823
13
    INIT_TYPE(&PyCode_Type, "code");
1824
13
    INIT_TYPE(&PyFrame_Type, "frame");
1825
13
    INIT_TYPE(&PyCFunction_Type, "builtin function");
1826
13
    INIT_TYPE(&PyMethod_Type, "method");
1827
13
    INIT_TYPE(&PyFunction_Type, "function");
1828
13
    INIT_TYPE(&PyDictProxy_Type, "dict proxy");
1829
13
    INIT_TYPE(&PyGen_Type, "generator");
1830
13
    INIT_TYPE(&PyGetSetDescr_Type, "get-set descriptor");
1831
13
    INIT_TYPE(&PyWrapperDescr_Type, "wrapper");
1832
13
    INIT_TYPE(&_PyMethodWrapper_Type, "method wrapper");
1833
13
    INIT_TYPE(&PyEllipsis_Type, "ellipsis");
1834
13
    INIT_TYPE(&PyMemberDescr_Type, "member descriptor");
1835
13
    INIT_TYPE(&_PyNamespace_Type, "namespace");
1836
13
    INIT_TYPE(&PyCapsule_Type, "capsule");
1837
13
    INIT_TYPE(&PyLongRangeIter_Type, "long range iterator");
1838
13
    INIT_TYPE(&PyCell_Type, "cell");
1839
13
    INIT_TYPE(&PyInstanceMethod_Type, "instance method");
1840
13
    INIT_TYPE(&PyClassMethodDescr_Type, "class method descr");
1841
13
    INIT_TYPE(&PyMethodDescr_Type, "method descr");
1842
13
    INIT_TYPE(&PyCallIter_Type, "call iter");
1843
13
    INIT_TYPE(&PySeqIter_Type, "sequence iterator");
1844
13
    INIT_TYPE(&PyPickleBuffer_Type, "pickle.PickleBuffer");
1845
13
    INIT_TYPE(&PyCoro_Type, "coroutine");
1846
13
    INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper");
1847
13
    INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID");
1848
13
    return _PyStatus_OK();
1849
1850
13
#undef INIT_TYPE
1851
13
}
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
547k
{
2209
547k
    destructor dealloc = Py_TYPE(op)->tp_dealloc;
2210
#ifdef Py_TRACE_REFS
2211
    _Py_ForgetReference(op);
2212
#else
2213
547k
    _Py_INC_TPFREES(op);
2214
547k
#endif
2215
547k
    (*dealloc)(op);
2216
547k
}
2217
2218
#ifdef __cplusplus
2219
}
2220
#endif