Coverage Report

Created: 2025-07-18 06:09

/src/cpython/Objects/abstract.c
Line
Count
Source (jump to first uncovered line)
1
/* Abstract Object Interface (many thanks to Jim Fulton) */
2
3
#include "Python.h"
4
#include "pycore_abstract.h"      // _PyIndex_Check()
5
#include "pycore_call.h"          // _PyObject_CallNoArgs()
6
#include "pycore_ceval.h"         // _Py_EnterRecursiveCallTstate()
7
#include "pycore_crossinterp.h"   // _Py_CallInInterpreter()
8
#include "pycore_genobject.h"     // _PyGen_FetchStopIterationValue()
9
#include "pycore_list.h"          // _PyList_AppendTakeRef()
10
#include "pycore_long.h"          // _PyLong_IsNegative()
11
#include "pycore_object.h"        // _Py_CheckSlotResult()
12
#include "pycore_pybuffer.h"      // _PyBuffer_ReleaseInInterpreterAndRawFree()
13
#include "pycore_pyerrors.h"      // _PyErr_Occurred()
14
#include "pycore_pystate.h"       // _PyThreadState_GET()
15
#include "pycore_tuple.h"         // _PyTuple_FromArraySteal()
16
#include "pycore_unionobject.h"   // _PyUnion_Check()
17
18
#include <stddef.h>               // offsetof()
19
20
21
/* Shorthands to return certain errors */
22
23
static PyObject *
24
type_error(const char *msg, PyObject *obj)
25
0
{
26
0
    PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name);
27
0
    return NULL;
28
0
}
29
30
static PyObject *
31
null_error(void)
32
0
{
33
0
    PyThreadState *tstate = _PyThreadState_GET();
34
0
    if (!_PyErr_Occurred(tstate)) {
35
0
        _PyErr_SetString(tstate, PyExc_SystemError,
36
0
                         "null argument to internal routine");
37
0
    }
38
0
    return NULL;
39
0
}
40
41
/* Operations on any object */
42
43
PyObject *
44
PyObject_Type(PyObject *o)
45
92
{
46
92
    PyObject *v;
47
48
92
    if (o == NULL) {
49
0
        return null_error();
50
0
    }
51
52
92
    v = (PyObject *)Py_TYPE(o);
53
92
    return Py_NewRef(v);
54
92
}
55
56
Py_ssize_t
57
PyObject_Size(PyObject *o)
58
93.4M
{
59
93.4M
    if (o == NULL) {
60
0
        null_error();
61
0
        return -1;
62
0
    }
63
64
93.4M
    PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
65
93.4M
    if (m && m->sq_length) {
66
93.4M
        Py_ssize_t len = m->sq_length(o);
67
93.4M
        assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
68
93.4M
        return len;
69
93.4M
    }
70
71
424
    return PyMapping_Size(o);
72
93.4M
}
73
74
#undef PyObject_Length
75
Py_ssize_t
76
PyObject_Length(PyObject *o)
77
0
{
78
0
    return PyObject_Size(o);
79
0
}
80
329k
#define PyObject_Length PyObject_Size
81
82
int
83
5.73M
_PyObject_HasLen(PyObject *o) {
84
5.73M
    return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
85
5.73M
        (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
86
5.73M
}
87
88
/* The length hint function returns a non-negative value from o.__len__()
89
   or o.__length_hint__(). If those methods aren't found the defaultvalue is
90
   returned.  If one of the calls fails with an exception other than TypeError
91
   this function returns -1.
92
*/
93
94
Py_ssize_t
95
PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
96
5.73M
{
97
5.73M
    PyObject *hint, *result;
98
5.73M
    Py_ssize_t res;
99
5.73M
    if (_PyObject_HasLen(o)) {
100
329k
        res = PyObject_Length(o);
101
329k
        if (res < 0) {
102
0
            PyThreadState *tstate = _PyThreadState_GET();
103
0
            assert(_PyErr_Occurred(tstate));
104
0
            if (!_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
105
0
                return -1;
106
0
            }
107
0
            _PyErr_Clear(tstate);
108
0
        }
109
329k
        else {
110
329k
            return res;
111
329k
        }
112
329k
    }
113
5.40M
    hint = _PyObject_LookupSpecial(o, &_Py_ID(__length_hint__));
114
5.40M
    if (hint == NULL) {
115
3.88M
        if (PyErr_Occurred()) {
116
0
            return -1;
117
0
        }
118
3.88M
        return defaultvalue;
119
3.88M
    }
120
1.51M
    result = _PyObject_CallNoArgs(hint);
121
1.51M
    Py_DECREF(hint);
122
1.51M
    if (result == NULL) {
123
0
        PyThreadState *tstate = _PyThreadState_GET();
124
0
        if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
125
0
            _PyErr_Clear(tstate);
126
0
            return defaultvalue;
127
0
        }
128
0
        return -1;
129
0
    }
130
1.51M
    else if (result == Py_NotImplemented) {
131
0
        Py_DECREF(result);
132
0
        return defaultvalue;
133
0
    }
134
1.51M
    if (!PyLong_Check(result)) {
135
0
        PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
136
0
            Py_TYPE(result)->tp_name);
137
0
        Py_DECREF(result);
138
0
        return -1;
139
0
    }
140
1.51M
    res = PyLong_AsSsize_t(result);
141
1.51M
    Py_DECREF(result);
142
1.51M
    if (res < 0 && PyErr_Occurred()) {
143
0
        return -1;
144
0
    }
145
1.51M
    if (res < 0) {
146
0
        PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
147
0
        return -1;
148
0
    }
149
1.51M
    return res;
150
1.51M
}
151
152
PyObject *
153
PyObject_GetItem(PyObject *o, PyObject *key)
154
179M
{
155
179M
    if (o == NULL || key == NULL) {
156
0
        return null_error();
157
0
    }
158
159
179M
    PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
160
179M
    if (m && m->mp_subscript) {
161
179M
        PyObject *item = m->mp_subscript(o, key);
162
179M
        assert(_Py_CheckSlotResult(o, "__getitem__", item != NULL));
163
179M
        return item;
164
179M
    }
165
166
42
    PySequenceMethods *ms = Py_TYPE(o)->tp_as_sequence;
167
42
    if (ms && ms->sq_item) {
168
0
        if (_PyIndex_Check(key)) {
169
0
            Py_ssize_t key_value;
170
0
            key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
171
0
            if (key_value == -1 && PyErr_Occurred())
172
0
                return NULL;
173
0
            return PySequence_GetItem(o, key_value);
174
0
        }
175
0
        else {
176
0
            return type_error("sequence index must "
177
0
                              "be integer, not '%.200s'", key);
178
0
        }
179
0
    }
180
181
42
    if (PyType_Check(o)) {
182
42
        PyObject *meth, *result;
183
184
        // Special case type[int], but disallow other types so str[int] fails
185
42
        if ((PyTypeObject*)o == &PyType_Type) {
186
0
            return Py_GenericAlias(o, key);
187
0
        }
188
189
42
        if (PyObject_GetOptionalAttr(o, &_Py_ID(__class_getitem__), &meth) < 0) {
190
0
            return NULL;
191
0
        }
192
42
        if (meth && meth != Py_None) {
193
42
            result = PyObject_CallOneArg(meth, key);
194
42
            Py_DECREF(meth);
195
42
            return result;
196
42
        }
197
0
        Py_XDECREF(meth);
198
0
        PyErr_Format(PyExc_TypeError, "type '%.200s' is not subscriptable",
199
0
                     ((PyTypeObject *)o)->tp_name);
200
0
        return NULL;
201
42
    }
202
203
0
    return type_error("'%.200s' object is not subscriptable", o);
204
42
}
205
206
int
207
PyMapping_GetOptionalItem(PyObject *obj, PyObject *key, PyObject **result)
208
96.6k
{
209
96.6k
    if (PyDict_CheckExact(obj)) {
210
96.3k
        return PyDict_GetItemRef(obj, key, result);
211
96.3k
    }
212
213
279
    *result = PyObject_GetItem(obj, key);
214
279
    if (*result) {
215
44
        return 1;
216
44
    }
217
235
    assert(PyErr_Occurred());
218
235
    if (!PyErr_ExceptionMatches(PyExc_KeyError)) {
219
0
        return -1;
220
0
    }
221
235
    PyErr_Clear();
222
235
    return 0;
223
235
}
224
225
int
226
PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
227
215k
{
228
215k
    if (o == NULL || key == NULL || value == NULL) {
229
0
        null_error();
230
0
        return -1;
231
0
    }
232
233
215k
    PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
234
215k
    if (m && m->mp_ass_subscript) {
235
215k
        int res = m->mp_ass_subscript(o, key, value);
236
215k
        assert(_Py_CheckSlotResult(o, "__setitem__", res >= 0));
237
215k
        return res;
238
215k
    }
239
240
0
    if (Py_TYPE(o)->tp_as_sequence) {
241
0
        if (_PyIndex_Check(key)) {
242
0
            Py_ssize_t key_value;
243
0
            key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
244
0
            if (key_value == -1 && PyErr_Occurred())
245
0
                return -1;
246
0
            return PySequence_SetItem(o, key_value, value);
247
0
        }
248
0
        else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
249
0
            type_error("sequence index must be "
250
0
                       "integer, not '%.200s'", key);
251
0
            return -1;
252
0
        }
253
0
    }
254
255
0
    type_error("'%.200s' object does not support item assignment", o);
256
0
    return -1;
257
0
}
258
259
int
260
PyObject_DelItem(PyObject *o, PyObject *key)
261
391k
{
262
391k
    if (o == NULL || key == NULL) {
263
0
        null_error();
264
0
        return -1;
265
0
    }
266
267
391k
    PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
268
391k
    if (m && m->mp_ass_subscript) {
269
391k
        int res = m->mp_ass_subscript(o, key, (PyObject*)NULL);
270
391k
        assert(_Py_CheckSlotResult(o, "__delitem__", res >= 0));
271
391k
        return res;
272
391k
    }
273
274
0
    if (Py_TYPE(o)->tp_as_sequence) {
275
0
        if (_PyIndex_Check(key)) {
276
0
            Py_ssize_t key_value;
277
0
            key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
278
0
            if (key_value == -1 && PyErr_Occurred())
279
0
                return -1;
280
0
            return PySequence_DelItem(o, key_value);
281
0
        }
282
0
        else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
283
0
            type_error("sequence index must be "
284
0
                       "integer, not '%.200s'", key);
285
0
            return -1;
286
0
        }
287
0
    }
288
289
0
    type_error("'%.200s' object does not support item deletion", o);
290
0
    return -1;
291
0
}
292
293
int
294
PyObject_DelItemString(PyObject *o, const char *key)
295
0
{
296
0
    PyObject *okey;
297
0
    int ret;
298
299
0
    if (o == NULL || key == NULL) {
300
0
        null_error();
301
0
        return -1;
302
0
    }
303
0
    okey = PyUnicode_FromString(key);
304
0
    if (okey == NULL)
305
0
        return -1;
306
0
    ret = PyObject_DelItem(o, okey);
307
0
    Py_DECREF(okey);
308
0
    return ret;
309
0
}
310
311
312
/* Return 1 if the getbuffer function is available, otherwise return 0. */
313
int
314
PyObject_CheckBuffer(PyObject *obj)
315
10.4M
{
316
10.4M
    PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer;
317
10.4M
    return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL);
318
10.4M
}
319
320
// Old buffer protocols (deprecated, abi only)
321
322
/* Checks whether an arbitrary object supports the (character, single segment)
323
   buffer interface.
324
325
   Returns 1 on success, 0 on failure.
326
327
   We release the buffer right after use of this function which could
328
   cause issues later on.  Don't use these functions in new code.
329
 */
330
PyAPI_FUNC(int) /* abi_only */
331
PyObject_CheckReadBuffer(PyObject *obj)
332
0
{
333
0
    PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
334
0
    Py_buffer view;
335
336
0
    if (pb == NULL ||
337
0
        pb->bf_getbuffer == NULL)
338
0
        return 0;
339
0
    if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
340
0
        PyErr_Clear();
341
0
        return 0;
342
0
    }
343
0
    PyBuffer_Release(&view);
344
0
    return 1;
345
0
}
346
347
static int
348
as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len)
349
0
{
350
0
    Py_buffer view;
351
352
0
    if (obj == NULL || buffer == NULL || buffer_len == NULL) {
353
0
        null_error();
354
0
        return -1;
355
0
    }
356
0
    if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
357
0
        return -1;
358
359
0
    *buffer = view.buf;
360
0
    *buffer_len = view.len;
361
0
    PyBuffer_Release(&view);
362
0
    return 0;
363
0
}
364
365
/* Takes an arbitrary object which must support the (character, single segment)
366
   buffer interface and returns a pointer to a read-only memory location
367
   usable as character based input for subsequent processing.
368
369
   Return 0 on success.  buffer and buffer_len are only set in case no error
370
   occurs. Otherwise, -1 is returned and an exception set. */
371
PyAPI_FUNC(int) /* abi_only */
372
PyObject_AsCharBuffer(PyObject *obj,
373
                      const char **buffer,
374
                      Py_ssize_t *buffer_len)
375
0
{
376
0
    return as_read_buffer(obj, (const void **)buffer, buffer_len);
377
0
}
378
379
/* Same as PyObject_AsCharBuffer() except that this API expects (readable,
380
   single segment) buffer interface and returns a pointer to a read-only memory
381
   location which can contain arbitrary data.
382
383
   0 is returned on success.  buffer and buffer_len are only set in case no
384
   error occurs.  Otherwise, -1 is returned and an exception set. */
385
PyAPI_FUNC(int) /* abi_only */
386
PyObject_AsReadBuffer(PyObject *obj,
387
                      const void **buffer,
388
                      Py_ssize_t *buffer_len)
389
0
{
390
0
    return as_read_buffer(obj, buffer, buffer_len);
391
0
}
392
393
/* Takes an arbitrary object which must support the (writable, single segment)
394
   buffer interface and returns a pointer to a writable memory location in
395
   buffer of size 'buffer_len'.
396
397
   Return 0 on success.  buffer and buffer_len are only set in case no error
398
   occurs. Otherwise, -1 is returned and an exception set. */
399
PyAPI_FUNC(int) /* abi_only */
400
PyObject_AsWriteBuffer(PyObject *obj,
401
                       void **buffer,
402
                       Py_ssize_t *buffer_len)
403
0
{
404
0
    PyBufferProcs *pb;
405
0
    Py_buffer view;
406
407
0
    if (obj == NULL || buffer == NULL || buffer_len == NULL) {
408
0
        null_error();
409
0
        return -1;
410
0
    }
411
0
    pb = Py_TYPE(obj)->tp_as_buffer;
412
0
    if (pb == NULL ||
413
0
        pb->bf_getbuffer == NULL ||
414
0
        ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
415
0
        PyErr_SetString(PyExc_TypeError,
416
0
                        "expected a writable bytes-like object");
417
0
        return -1;
418
0
    }
419
420
0
    *buffer = view.buf;
421
0
    *buffer_len = view.len;
422
0
    PyBuffer_Release(&view);
423
0
    return 0;
424
0
}
425
426
/* Buffer C-API for Python 3.0 */
427
428
int
429
PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
430
14.0M
{
431
14.0M
    if (flags != PyBUF_SIMPLE) {  /* fast path */
432
1.07M
        if (flags == PyBUF_READ || flags == PyBUF_WRITE) {
433
0
            PyErr_BadInternalCall();
434
0
            return -1;
435
0
        }
436
1.07M
    }
437
14.0M
    PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
438
439
14.0M
    if (pb == NULL || pb->bf_getbuffer == NULL) {
440
0
        PyErr_Format(PyExc_TypeError,
441
0
                     "a bytes-like object is required, not '%.100s'",
442
0
                     Py_TYPE(obj)->tp_name);
443
0
        return -1;
444
0
    }
445
14.0M
    int res = (*pb->bf_getbuffer)(obj, view, flags);
446
14.0M
    assert(_Py_CheckSlotResult(obj, "getbuffer", res >= 0));
447
14.0M
    return res;
448
14.0M
}
449
450
static int
451
_IsFortranContiguous(const Py_buffer *view)
452
0
{
453
0
    Py_ssize_t sd, dim;
454
0
    int i;
455
456
    /* 1) len = product(shape) * itemsize
457
       2) itemsize > 0
458
       3) len = 0 <==> exists i: shape[i] = 0 */
459
0
    if (view->len == 0) return 1;
460
0
    if (view->strides == NULL) {  /* C-contiguous by definition */
461
        /* Trivially F-contiguous */
462
0
        if (view->ndim <= 1) return 1;
463
464
        /* ndim > 1 implies shape != NULL */
465
0
        assert(view->shape != NULL);
466
467
        /* Effectively 1-d */
468
0
        sd = 0;
469
0
        for (i=0; i<view->ndim; i++) {
470
0
            if (view->shape[i] > 1) sd += 1;
471
0
        }
472
0
        return sd <= 1;
473
0
    }
474
475
    /* strides != NULL implies both of these */
476
0
    assert(view->ndim > 0);
477
0
    assert(view->shape != NULL);
478
479
0
    sd = view->itemsize;
480
0
    for (i=0; i<view->ndim; i++) {
481
0
        dim = view->shape[i];
482
0
        if (dim > 1 && view->strides[i] != sd) {
483
0
            return 0;
484
0
        }
485
0
        sd *= dim;
486
0
    }
487
0
    return 1;
488
0
}
489
490
static int
491
_IsCContiguous(const Py_buffer *view)
492
1.07M
{
493
1.07M
    Py_ssize_t sd, dim;
494
1.07M
    int i;
495
496
    /* 1) len = product(shape) * itemsize
497
       2) itemsize > 0
498
       3) len = 0 <==> exists i: shape[i] = 0 */
499
1.07M
    if (view->len == 0) return 1;
500
939k
    if (view->strides == NULL) return 1; /* C-contiguous by definition */
501
502
    /* strides != NULL implies both of these */
503
939k
    assert(view->ndim > 0);
504
939k
    assert(view->shape != NULL);
505
506
939k
    sd = view->itemsize;
507
1.87M
    for (i=view->ndim-1; i>=0; i--) {
508
939k
        dim = view->shape[i];
509
939k
        if (dim > 1 && view->strides[i] != sd) {
510
0
            return 0;
511
0
        }
512
939k
        sd *= dim;
513
939k
    }
514
939k
    return 1;
515
939k
}
516
517
int
518
PyBuffer_IsContiguous(const Py_buffer *view, char order)
519
1.07M
{
520
521
1.07M
    if (view->suboffsets != NULL) return 0;
522
523
1.07M
    if (order == 'C')
524
1.07M
        return _IsCContiguous(view);
525
0
    else if (order == 'F')
526
0
        return _IsFortranContiguous(view);
527
0
    else if (order == 'A')
528
0
        return (_IsCContiguous(view) || _IsFortranContiguous(view));
529
0
    return 0;
530
1.07M
}
531
532
533
void*
534
PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices)
535
0
{
536
0
    char* pointer;
537
0
    int i;
538
0
    pointer = (char *)view->buf;
539
0
    for (i = 0; i < view->ndim; i++) {
540
0
        pointer += view->strides[i]*indices[i];
541
0
        if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
542
0
            pointer = *((char**)pointer) + view->suboffsets[i];
543
0
        }
544
0
    }
545
0
    return (void*)pointer;
546
0
}
547
548
549
static void
550
_Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
551
0
{
552
0
    int k;
553
554
0
    for (k=0; k<nd; k++) {
555
0
        if (index[k] < shape[k]-1) {
556
0
            index[k]++;
557
0
            break;
558
0
        }
559
0
        else {
560
0
            index[k] = 0;
561
0
        }
562
0
    }
563
0
}
564
565
static void
566
_Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
567
0
{
568
0
    int k;
569
570
0
    for (k=nd-1; k>=0; k--) {
571
0
        if (index[k] < shape[k]-1) {
572
0
            index[k]++;
573
0
            break;
574
0
        }
575
0
        else {
576
0
            index[k] = 0;
577
0
        }
578
0
    }
579
0
}
580
581
Py_ssize_t
582
PyBuffer_SizeFromFormat(const char *format)
583
0
{
584
0
    PyObject *calcsize = NULL;
585
0
    PyObject *res = NULL;
586
0
    PyObject *fmt = NULL;
587
0
    Py_ssize_t itemsize = -1;
588
589
0
    calcsize = PyImport_ImportModuleAttrString("struct", "calcsize");
590
0
    if (calcsize == NULL) {
591
0
        goto done;
592
0
    }
593
594
0
    fmt = PyUnicode_FromString(format);
595
0
    if (fmt == NULL) {
596
0
        goto done;
597
0
    }
598
599
0
    res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL);
600
0
    if (res == NULL) {
601
0
        goto done;
602
0
    }
603
604
0
    itemsize = PyLong_AsSsize_t(res);
605
0
    if (itemsize < 0) {
606
0
        goto done;
607
0
    }
608
609
0
done:
610
0
    Py_XDECREF(calcsize);
611
0
    Py_XDECREF(fmt);
612
0
    Py_XDECREF(res);
613
0
    return itemsize;
614
0
}
615
616
int
617
PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, Py_ssize_t len, char fort)
618
0
{
619
0
    int k;
620
0
    void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
621
0
    Py_ssize_t *indices, elements;
622
0
    char *ptr;
623
0
    const char *src;
624
625
0
    if (len > view->len) {
626
0
        len = view->len;
627
0
    }
628
629
0
    if (PyBuffer_IsContiguous(view, fort)) {
630
        /* simplest copy is all that is needed */
631
0
        memcpy(view->buf, buf, len);
632
0
        return 0;
633
0
    }
634
635
    /* Otherwise a more elaborate scheme is needed */
636
637
    /* view->ndim <= 64 */
638
0
    indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
639
0
    if (indices == NULL) {
640
0
        PyErr_NoMemory();
641
0
        return -1;
642
0
    }
643
0
    for (k=0; k<view->ndim;k++) {
644
0
        indices[k] = 0;
645
0
    }
646
647
0
    if (fort == 'F') {
648
0
        addone = _Py_add_one_to_index_F;
649
0
    }
650
0
    else {
651
0
        addone = _Py_add_one_to_index_C;
652
0
    }
653
0
    src = buf;
654
    /* XXX : This is not going to be the fastest code in the world
655
             several optimizations are possible.
656
     */
657
0
    elements = len / view->itemsize;
658
0
    while (elements--) {
659
0
        ptr = PyBuffer_GetPointer(view, indices);
660
0
        memcpy(ptr, src, view->itemsize);
661
0
        src += view->itemsize;
662
0
        addone(view->ndim, indices, view->shape);
663
0
    }
664
665
0
    PyMem_Free(indices);
666
0
    return 0;
667
0
}
668
669
int PyObject_CopyData(PyObject *dest, PyObject *src)
670
0
{
671
0
    Py_buffer view_dest, view_src;
672
0
    int k;
673
0
    Py_ssize_t *indices, elements;
674
0
    char *dptr, *sptr;
675
676
0
    if (!PyObject_CheckBuffer(dest) ||
677
0
        !PyObject_CheckBuffer(src)) {
678
0
        PyErr_SetString(PyExc_TypeError,
679
0
                        "both destination and source must be "\
680
0
                        "bytes-like objects");
681
0
        return -1;
682
0
    }
683
684
0
    if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
685
0
    if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
686
0
        PyBuffer_Release(&view_dest);
687
0
        return -1;
688
0
    }
689
690
0
    if (view_dest.len < view_src.len) {
691
0
        PyErr_SetString(PyExc_BufferError,
692
0
                        "destination is too small to receive data from source");
693
0
        PyBuffer_Release(&view_dest);
694
0
        PyBuffer_Release(&view_src);
695
0
        return -1;
696
0
    }
697
698
0
    if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
699
0
         PyBuffer_IsContiguous(&view_src, 'C')) ||
700
0
        (PyBuffer_IsContiguous(&view_dest, 'F') &&
701
0
         PyBuffer_IsContiguous(&view_src, 'F'))) {
702
        /* simplest copy is all that is needed */
703
0
        memcpy(view_dest.buf, view_src.buf, view_src.len);
704
0
        PyBuffer_Release(&view_dest);
705
0
        PyBuffer_Release(&view_src);
706
0
        return 0;
707
0
    }
708
709
    /* Otherwise a more elaborate copy scheme is needed */
710
711
    /* XXX(nnorwitz): need to check for overflow! */
712
0
    indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
713
0
    if (indices == NULL) {
714
0
        PyErr_NoMemory();
715
0
        PyBuffer_Release(&view_dest);
716
0
        PyBuffer_Release(&view_src);
717
0
        return -1;
718
0
    }
719
0
    for (k=0; k<view_src.ndim;k++) {
720
0
        indices[k] = 0;
721
0
    }
722
0
    elements = 1;
723
0
    for (k=0; k<view_src.ndim; k++) {
724
        /* XXX(nnorwitz): can this overflow? */
725
0
        elements *= view_src.shape[k];
726
0
    }
727
0
    while (elements--) {
728
0
        _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
729
0
        dptr = PyBuffer_GetPointer(&view_dest, indices);
730
0
        sptr = PyBuffer_GetPointer(&view_src, indices);
731
0
        memcpy(dptr, sptr, view_src.itemsize);
732
0
    }
733
0
    PyMem_Free(indices);
734
0
    PyBuffer_Release(&view_dest);
735
0
    PyBuffer_Release(&view_src);
736
0
    return 0;
737
0
}
738
739
void
740
PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
741
                               Py_ssize_t *strides, int itemsize,
742
                               char fort)
743
0
{
744
0
    int k;
745
0
    Py_ssize_t sd;
746
747
0
    sd = itemsize;
748
0
    if (fort == 'F') {
749
0
        for (k=0; k<nd; k++) {
750
0
            strides[k] = sd;
751
0
            sd *= shape[k];
752
0
        }
753
0
    }
754
0
    else {
755
0
        for (k=nd-1; k>=0; k--) {
756
0
            strides[k] = sd;
757
0
            sd *= shape[k];
758
0
        }
759
0
    }
760
0
    return;
761
0
}
762
763
int
764
PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
765
                  int readonly, int flags)
766
14.1M
{
767
14.1M
    if (view == NULL) {
768
0
        PyErr_SetString(PyExc_BufferError,
769
0
                        "PyBuffer_FillInfo: view==NULL argument is obsolete");
770
0
        return -1;
771
0
    }
772
773
14.1M
    if (flags != PyBUF_SIMPLE) {  /* fast path */
774
1.39M
        if (flags == PyBUF_READ || flags == PyBUF_WRITE) {
775
0
            PyErr_BadInternalCall();
776
0
            return -1;
777
0
        }
778
1.39M
        if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
779
1.39M
            (readonly == 1)) {
780
0
            PyErr_SetString(PyExc_BufferError,
781
0
                            "Object is not writable.");
782
0
            return -1;
783
0
        }
784
1.39M
    }
785
786
14.1M
    view->obj = Py_XNewRef(obj);
787
14.1M
    view->buf = buf;
788
14.1M
    view->len = len;
789
14.1M
    view->readonly = readonly;
790
14.1M
    view->itemsize = 1;
791
14.1M
    view->format = NULL;
792
14.1M
    if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
793
1.39M
        view->format = "B";
794
14.1M
    view->ndim = 1;
795
14.1M
    view->shape = NULL;
796
14.1M
    if ((flags & PyBUF_ND) == PyBUF_ND)
797
1.39M
        view->shape = &(view->len);
798
14.1M
    view->strides = NULL;
799
14.1M
    if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
800
1.39M
        view->strides = &(view->itemsize);
801
14.1M
    view->suboffsets = NULL;
802
14.1M
    view->internal = NULL;
803
14.1M
    return 0;
804
14.1M
}
805
806
void
807
PyBuffer_Release(Py_buffer *view)
808
15.9M
{
809
15.9M
    PyObject *obj = view->obj;
810
15.9M
    PyBufferProcs *pb;
811
15.9M
    if (obj == NULL)
812
1.71M
        return;
813
14.2M
    pb = Py_TYPE(obj)->tp_as_buffer;
814
14.2M
    if (pb && pb->bf_releasebuffer) {
815
1.26M
        pb->bf_releasebuffer(obj, view);
816
1.26M
    }
817
14.2M
    view->obj = NULL;
818
14.2M
    Py_DECREF(obj);
819
14.2M
}
820
821
static int
822
_buffer_release_call(void *arg)
823
0
{
824
0
    PyBuffer_Release((Py_buffer *)arg);
825
0
    return 0;
826
0
}
827
828
int
829
_PyBuffer_ReleaseInInterpreter(PyInterpreterState *interp,
830
                               Py_buffer *view)
831
0
{
832
0
    return _Py_CallInInterpreter(interp, _buffer_release_call, view);
833
0
}
834
835
int
836
_PyBuffer_ReleaseInInterpreterAndRawFree(PyInterpreterState *interp,
837
                                         Py_buffer *view)
838
0
{
839
0
    return _Py_CallInInterpreterAndRawFree(interp, _buffer_release_call, view);
840
0
}
841
842
PyObject *
843
PyObject_Format(PyObject *obj, PyObject *format_spec)
844
242k
{
845
242k
    PyObject *meth;
846
242k
    PyObject *empty = NULL;
847
242k
    PyObject *result = NULL;
848
849
242k
    if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
850
0
        PyErr_Format(PyExc_SystemError,
851
0
                     "Format specifier must be a string, not %.200s",
852
0
                     Py_TYPE(format_spec)->tp_name);
853
0
        return NULL;
854
0
    }
855
856
    /* Fast path for common types. */
857
242k
    if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
858
241k
        if (PyUnicode_CheckExact(obj)) {
859
0
            return Py_NewRef(obj);
860
0
        }
861
241k
        if (PyLong_CheckExact(obj)) {
862
807
            return PyObject_Str(obj);
863
807
        }
864
241k
    }
865
866
    /* If no format_spec is provided, use an empty string */
867
241k
    if (format_spec == NULL) {
868
0
        empty = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
869
0
        format_spec = empty;
870
0
    }
871
872
    /* Find the (unbound!) __format__ method */
873
241k
    meth = _PyObject_LookupSpecial(obj, &_Py_ID(__format__));
874
241k
    if (meth == NULL) {
875
0
        PyThreadState *tstate = _PyThreadState_GET();
876
0
        if (!_PyErr_Occurred(tstate)) {
877
0
            _PyErr_Format(tstate, PyExc_TypeError,
878
0
                          "Type %.100s doesn't define __format__",
879
0
                          Py_TYPE(obj)->tp_name);
880
0
        }
881
0
        goto done;
882
0
    }
883
884
    /* And call it. */
885
241k
    result = PyObject_CallOneArg(meth, format_spec);
886
241k
    Py_DECREF(meth);
887
888
241k
    if (result && !PyUnicode_Check(result)) {
889
0
        PyErr_Format(PyExc_TypeError,
890
0
                     "__format__ must return a str, not %.200s",
891
0
                     Py_TYPE(result)->tp_name);
892
0
        Py_SETREF(result, NULL);
893
0
        goto done;
894
0
    }
895
896
241k
done:
897
241k
    Py_XDECREF(empty);
898
241k
    return result;
899
241k
}
900
/* Operations on numbers */
901
902
int
903
PyNumber_Check(PyObject *o)
904
12.6M
{
905
12.6M
    if (o == NULL)
906
0
        return 0;
907
12.6M
    PyNumberMethods *nb = Py_TYPE(o)->tp_as_number;
908
12.6M
    return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o));
909
12.6M
}
910
911
/* Binary operators */
912
913
34.8M
#define NB_SLOT(x) offsetof(PyNumberMethods, x)
914
#define NB_BINOP(nb_methods, slot) \
915
43.2M
        (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
916
#define NB_TERNOP(nb_methods, slot) \
917
49
        (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
918
919
/*
920
  Calling scheme used for binary operations:
921
922
  Order operations are tried until either a valid result or error:
923
    w.op(v,w)[*], v.op(v,w), w.op(v,w)
924
925
  [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of
926
      Py_TYPE(v)
927
 */
928
929
static PyObject *
930
binary_op1(PyObject *v, PyObject *w, const int op_slot
931
#ifndef NDEBUG
932
           , const char *op_name
933
#endif
934
           )
935
55.7M
{
936
55.7M
    binaryfunc slotv;
937
55.7M
    if (Py_TYPE(v)->tp_as_number != NULL) {
938
34.6M
        slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot);
939
34.6M
    }
940
21.0M
    else {
941
21.0M
        slotv = NULL;
942
21.0M
    }
943
944
55.7M
    binaryfunc slotw;
945
55.7M
    if (!Py_IS_TYPE(w, Py_TYPE(v)) && Py_TYPE(w)->tp_as_number != NULL) {
946
7.73M
        slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot);
947
7.73M
        if (slotw == slotv) {
948
43.6k
            slotw = NULL;
949
43.6k
        }
950
7.73M
    }
951
47.9M
    else {
952
47.9M
        slotw = NULL;
953
47.9M
    }
954
955
55.7M
    if (slotv) {
956
34.3M
        PyObject *x;
957
34.3M
        if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
958
190
            x = slotw(v, w);
959
190
            if (x != Py_NotImplemented)
960
190
                return x;
961
0
            Py_DECREF(x); /* can't do it */
962
0
            slotw = NULL;
963
0
        }
964
34.3M
        x = slotv(v, w);
965
34.3M
        assert(_Py_CheckSlotResult(v, op_name, x != NULL));
966
34.3M
        if (x != Py_NotImplemented) {
967
34.3M
            return x;
968
34.3M
        }
969
9
        Py_DECREF(x); /* can't do it */
970
9
    }
971
21.3M
    if (slotw) {
972
310k
        PyObject *x = slotw(v, w);
973
310k
        assert(_Py_CheckSlotResult(w, op_name, x != NULL));
974
310k
        if (x != Py_NotImplemented) {
975
2
            return x;
976
2
        }
977
310k
        Py_DECREF(x); /* can't do it */
978
310k
    }
979
21.3M
    Py_RETURN_NOTIMPLEMENTED;
980
21.3M
}
981
982
#ifdef NDEBUG
983
54.9M
#  define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot)
984
#else
985
#  define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot, op_name)
986
#endif
987
988
static PyObject *
989
binop_type_error(PyObject *v, PyObject *w, const char *op_name)
990
0
{
991
0
    PyErr_Format(PyExc_TypeError,
992
0
                 "unsupported operand type(s) for %.100s: "
993
0
                 "'%.100s' and '%.100s'",
994
0
                 op_name,
995
0
                 Py_TYPE(v)->tp_name,
996
0
                 Py_TYPE(w)->tp_name);
997
0
    return NULL;
998
0
}
999
1000
static PyObject *
1001
binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
1002
33.3M
{
1003
33.3M
    PyObject *result = BINARY_OP1(v, w, op_slot, op_name);
1004
33.3M
    if (result == Py_NotImplemented) {
1005
0
        Py_DECREF(result);
1006
0
        return binop_type_error(v, w, op_name);
1007
0
    }
1008
33.3M
    return result;
1009
33.3M
}
1010
1011
1012
/*
1013
  Calling scheme used for ternary operations:
1014
1015
  Order operations are tried until either a valid result or error:
1016
    v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
1017
 */
1018
1019
static PyObject *
1020
ternary_op(PyObject *v,
1021
           PyObject *w,
1022
           PyObject *z,
1023
           const int op_slot,
1024
           const char *op_name
1025
           )
1026
49
{
1027
49
    PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
1028
49
    PyNumberMethods *mw = Py_TYPE(w)->tp_as_number;
1029
1030
49
    ternaryfunc slotv;
1031
49
    if (mv != NULL) {
1032
49
        slotv = NB_TERNOP(mv, op_slot);
1033
49
    }
1034
0
    else {
1035
0
        slotv = NULL;
1036
0
    }
1037
1038
49
    ternaryfunc slotw;
1039
49
    if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) {
1040
0
        slotw = NB_TERNOP(mw, op_slot);
1041
0
        if (slotw == slotv) {
1042
0
            slotw = NULL;
1043
0
        }
1044
0
    }
1045
49
    else {
1046
49
        slotw = NULL;
1047
49
    }
1048
1049
49
    if (slotv) {
1050
49
        PyObject *x;
1051
49
        if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
1052
0
            x = slotw(v, w, z);
1053
0
            if (x != Py_NotImplemented) {
1054
0
                return x;
1055
0
            }
1056
0
            Py_DECREF(x); /* can't do it */
1057
0
            slotw = NULL;
1058
0
        }
1059
49
        x = slotv(v, w, z);
1060
49
        assert(_Py_CheckSlotResult(v, op_name, x != NULL));
1061
49
        if (x != Py_NotImplemented) {
1062
49
            return x;
1063
49
        }
1064
0
        Py_DECREF(x); /* can't do it */
1065
0
    }
1066
0
    if (slotw) {
1067
0
        PyObject *x = slotw(v, w, z);
1068
0
        assert(_Py_CheckSlotResult(w, op_name, x != NULL));
1069
0
        if (x != Py_NotImplemented) {
1070
0
            return x;
1071
0
        }
1072
0
        Py_DECREF(x); /* can't do it */
1073
0
    }
1074
1075
0
    PyNumberMethods *mz = Py_TYPE(z)->tp_as_number;
1076
0
    if (mz != NULL) {
1077
0
        ternaryfunc slotz = NB_TERNOP(mz, op_slot);
1078
0
        if (slotz == slotv || slotz == slotw) {
1079
0
            slotz = NULL;
1080
0
        }
1081
0
        if (slotz) {
1082
0
            PyObject *x = slotz(v, w, z);
1083
0
            assert(_Py_CheckSlotResult(z, op_name, x != NULL));
1084
0
            if (x != Py_NotImplemented) {
1085
0
                return x;
1086
0
            }
1087
0
            Py_DECREF(x); /* can't do it */
1088
0
        }
1089
0
    }
1090
1091
0
    if (z == Py_None) {
1092
0
        PyErr_Format(
1093
0
            PyExc_TypeError,
1094
0
            "unsupported operand type(s) for %.100s: "
1095
0
            "'%.100s' and '%.100s'",
1096
0
            op_name,
1097
0
            Py_TYPE(v)->tp_name,
1098
0
            Py_TYPE(w)->tp_name);
1099
0
    }
1100
0
    else {
1101
0
        PyErr_Format(
1102
0
            PyExc_TypeError,
1103
0
            "unsupported operand type(s) for %.100s: "
1104
0
            "'%.100s', '%.100s', '%.100s'",
1105
0
            op_name,
1106
0
            Py_TYPE(v)->tp_name,
1107
0
            Py_TYPE(w)->tp_name,
1108
0
            Py_TYPE(z)->tp_name);
1109
0
    }
1110
0
    return NULL;
1111
0
}
1112
1113
#define BINARY_FUNC(func, op, op_name) \
1114
    PyObject * \
1115
33.3M
    func(PyObject *v, PyObject *w) { \
1116
33.3M
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
33.3M
    }
PyNumber_Or
Line
Count
Source
1115
457k
    func(PyObject *v, PyObject *w) { \
1116
457k
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
457k
    }
PyNumber_Xor
Line
Count
Source
1115
172
    func(PyObject *v, PyObject *w) { \
1116
172
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
172
    }
PyNumber_And
Line
Count
Source
1115
2.86k
    func(PyObject *v, PyObject *w) { \
1116
2.86k
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
2.86k
    }
PyNumber_Lshift
Line
Count
Source
1115
33
    func(PyObject *v, PyObject *w) { \
1116
33
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
33
    }
PyNumber_Rshift
Line
Count
Source
1115
156
    func(PyObject *v, PyObject *w) { \
1116
156
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
156
    }
PyNumber_Subtract
Line
Count
Source
1115
778
    func(PyObject *v, PyObject *w) { \
1116
778
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
778
    }
Unexecuted instantiation: PyNumber_Divmod
Unexecuted instantiation: PyNumber_MatrixMultiply
PyNumber_FloorDivide
Line
Count
Source
1115
1.75M
    func(PyObject *v, PyObject *w) { \
1116
1.75M
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
1.75M
    }
PyNumber_TrueDivide
Line
Count
Source
1115
12.9k
    func(PyObject *v, PyObject *w) { \
1116
12.9k
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
12.9k
    }
PyNumber_Remainder
Line
Count
Source
1115
31.1M
    func(PyObject *v, PyObject *w) { \
1116
31.1M
        return binary_op(v, w, NB_SLOT(op), op_name); \
1117
31.1M
    }
1118
1119
BINARY_FUNC(PyNumber_Or, nb_or, "|")
1120
BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1121
BINARY_FUNC(PyNumber_And, nb_and, "&")
1122
BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1123
BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1124
BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
1125
BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
1126
1127
PyObject *
1128
PyNumber_Add(PyObject *v, PyObject *w)
1129
21.1M
{
1130
21.1M
    PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_add), "+");
1131
21.1M
    if (result != Py_NotImplemented) {
1132
60.4k
        return result;
1133
60.4k
    }
1134
21.0M
    Py_DECREF(result);
1135
1136
21.0M
    PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
1137
21.0M
    if (m && m->sq_concat) {
1138
21.0M
        result = (*m->sq_concat)(v, w);
1139
21.0M
        assert(_Py_CheckSlotResult(v, "+", result != NULL));
1140
21.0M
        return result;
1141
21.0M
    }
1142
1143
0
    return binop_type_error(v, w, "+");
1144
21.0M
}
1145
1146
static PyObject *
1147
sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
1148
310k
{
1149
310k
    Py_ssize_t count;
1150
310k
    if (_PyIndex_Check(n)) {
1151
310k
        count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
1152
310k
        if (count == -1 && PyErr_Occurred()) {
1153
0
            return NULL;
1154
0
        }
1155
310k
    }
1156
0
    else {
1157
0
        return type_error("can't multiply sequence by "
1158
0
                          "non-int of type '%.200s'", n);
1159
0
    }
1160
310k
    PyObject *res = (*repeatfunc)(seq, count);
1161
310k
    assert(_Py_CheckSlotResult(seq, "*", res != NULL));
1162
310k
    return res;
1163
310k
}
1164
1165
PyObject *
1166
PyNumber_Multiply(PyObject *v, PyObject *w)
1167
447k
{
1168
447k
    PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_multiply), "*");
1169
447k
    if (result == Py_NotImplemented) {
1170
310k
        PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1171
310k
        PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
1172
310k
        Py_DECREF(result);
1173
310k
        if  (mv && mv->sq_repeat) {
1174
310k
            return sequence_repeat(mv->sq_repeat, v, w);
1175
310k
        }
1176
7
        else if (mw && mw->sq_repeat) {
1177
7
            return sequence_repeat(mw->sq_repeat, w, v);
1178
7
        }
1179
0
        result = binop_type_error(v, w, "*");
1180
0
    }
1181
136k
    return result;
1182
447k
}
1183
1184
BINARY_FUNC(PyNumber_MatrixMultiply, nb_matrix_multiply, "@")
1185
BINARY_FUNC(PyNumber_FloorDivide, nb_floor_divide, "//")
1186
BINARY_FUNC(PyNumber_TrueDivide, nb_true_divide, "/")
1187
BINARY_FUNC(PyNumber_Remainder, nb_remainder, "%")
1188
1189
PyObject *
1190
PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
1191
49
{
1192
49
    return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
1193
49
}
1194
1195
PyObject *
1196
_PyNumber_PowerNoMod(PyObject *lhs, PyObject *rhs)
1197
41
{
1198
41
    return PyNumber_Power(lhs, rhs, Py_None);
1199
41
}
1200
1201
/* Binary in-place operators */
1202
1203
/* The in-place operators are defined to fall back to the 'normal',
1204
   non in-place operations, if the in-place methods are not in place.
1205
1206
   - If the left hand object has the appropriate struct members, and
1207
     they are filled, call the appropriate function and return the
1208
     result.  No coercion is done on the arguments; the left-hand object
1209
     is the one the operation is performed on, and it's up to the
1210
     function to deal with the right-hand object.
1211
1212
   - Otherwise, in-place modification is not supported. Handle it exactly as
1213
     a non in-place operation of the same kind.
1214
1215
   */
1216
1217
static PyObject *
1218
binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot
1219
#ifndef NDEBUG
1220
            , const char *op_name
1221
#endif
1222
            )
1223
790k
{
1224
790k
    PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
1225
790k
    if (mv != NULL) {
1226
789k
        binaryfunc slot = NB_BINOP(mv, iop_slot);
1227
789k
        if (slot) {
1228
47.9k
            PyObject *x = (slot)(v, w);
1229
47.9k
            assert(_Py_CheckSlotResult(v, op_name, x != NULL));
1230
47.9k
            if (x != Py_NotImplemented) {
1231
47.9k
                return x;
1232
47.9k
            }
1233
0
            Py_DECREF(x);
1234
0
        }
1235
789k
    }
1236
742k
#ifdef NDEBUG
1237
742k
    return binary_op1(v, w, op_slot);
1238
#else
1239
    return binary_op1(v, w, op_slot, op_name);
1240
#endif
1241
790k
}
1242
1243
#ifdef NDEBUG
1244
790k
#  define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot)
1245
#else
1246
#  define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot, op_name)
1247
#endif
1248
1249
static PyObject *
1250
binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1251
                const char *op_name)
1252
727k
{
1253
727k
    PyObject *result = BINARY_IOP1(v, w, iop_slot, op_slot, op_name);
1254
727k
    if (result == Py_NotImplemented) {
1255
0
        Py_DECREF(result);
1256
0
        return binop_type_error(v, w, op_name);
1257
0
    }
1258
727k
    return result;
1259
727k
}
1260
1261
static PyObject *
1262
ternary_iop(PyObject *v, PyObject *w, PyObject *z, const int iop_slot, const int op_slot,
1263
                const char *op_name)
1264
0
{
1265
0
    PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
1266
0
    if (mv != NULL) {
1267
0
        ternaryfunc slot = NB_TERNOP(mv, iop_slot);
1268
0
        if (slot) {
1269
0
            PyObject *x = (slot)(v, w, z);
1270
0
            if (x != Py_NotImplemented) {
1271
0
                return x;
1272
0
            }
1273
0
            Py_DECREF(x);
1274
0
        }
1275
0
    }
1276
0
    return ternary_op(v, w, z, op_slot, op_name);
1277
0
}
1278
1279
#define INPLACE_BINOP(func, iop, op, op_name) \
1280
    PyObject * \
1281
727k
    func(PyObject *v, PyObject *w) { \
1282
727k
        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1283
727k
    }
PyNumber_InPlaceOr
Line
Count
Source
1281
48.0k
    func(PyObject *v, PyObject *w) { \
1282
48.0k
        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1283
48.0k
    }
PyNumber_InPlaceXor
Line
Count
Source
1281
8
    func(PyObject *v, PyObject *w) { \
1282
8
        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1283
8
    }
PyNumber_InPlaceAnd
Line
Count
Source
1281
23
    func(PyObject *v, PyObject *w) { \
1282
23
        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1283
23
    }
PyNumber_InPlaceLshift
Line
Count
Source
1281
492
    func(PyObject *v, PyObject *w) { \
1282
492
        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1283
492
    }
Unexecuted instantiation: PyNumber_InPlaceRshift
PyNumber_InPlaceSubtract
Line
Count
Source
1281
18
    func(PyObject *v, PyObject *w) { \
1282
18
        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1283
18
    }
Unexecuted instantiation: PyNumber_InPlaceMatrixMultiply
PyNumber_InPlaceFloorDivide
Line
Count
Source
1281
678k
    func(PyObject *v, PyObject *w) { \
1282
678k
        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1283
678k
    }
Unexecuted instantiation: PyNumber_InPlaceTrueDivide
Unexecuted instantiation: PyNumber_InPlaceRemainder
1284
1285
INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1286
INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1287
INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1288
INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1289
INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1290
INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1291
INPLACE_BINOP(PyNumber_InPlaceMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
1292
INPLACE_BINOP(PyNumber_InPlaceFloorDivide, nb_inplace_floor_divide, nb_floor_divide, "//=")
1293
INPLACE_BINOP(PyNumber_InPlaceTrueDivide, nb_inplace_true_divide, nb_true_divide,  "/=")
1294
INPLACE_BINOP(PyNumber_InPlaceRemainder, nb_inplace_remainder, nb_remainder, "%=")
1295
1296
PyObject *
1297
PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1298
62.6k
{
1299
62.6k
    PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_add),
1300
62.6k
                                   NB_SLOT(nb_add), "+=");
1301
62.6k
    if (result == Py_NotImplemented) {
1302
478
        PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
1303
478
        Py_DECREF(result);
1304
478
        if (m != NULL) {
1305
478
            binaryfunc func = m->sq_inplace_concat;
1306
478
            if (func == NULL)
1307
88
                func = m->sq_concat;
1308
478
            if (func != NULL) {
1309
478
                result = func(v, w);
1310
478
                assert(_Py_CheckSlotResult(v, "+=", result != NULL));
1311
478
                return result;
1312
478
            }
1313
478
        }
1314
0
        result = binop_type_error(v, w, "+=");
1315
0
    }
1316
62.1k
    return result;
1317
62.6k
}
1318
1319
PyObject *
1320
PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1321
0
{
1322
0
    PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_multiply),
1323
0
                                   NB_SLOT(nb_multiply), "*=");
1324
0
    if (result == Py_NotImplemented) {
1325
0
        ssizeargfunc f = NULL;
1326
0
        PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1327
0
        PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
1328
0
        Py_DECREF(result);
1329
0
        if (mv != NULL) {
1330
0
            f = mv->sq_inplace_repeat;
1331
0
            if (f == NULL)
1332
0
                f = mv->sq_repeat;
1333
0
            if (f != NULL)
1334
0
                return sequence_repeat(f, v, w);
1335
0
        }
1336
0
        else if (mw != NULL) {
1337
            /* Note that the right hand operand should not be
1338
             * mutated in this case so sq_inplace_repeat is not
1339
             * used. */
1340
0
            if (mw->sq_repeat)
1341
0
                return sequence_repeat(mw->sq_repeat, w, v);
1342
0
        }
1343
0
        result = binop_type_error(v, w, "*=");
1344
0
    }
1345
0
    return result;
1346
0
}
1347
1348
PyObject *
1349
PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1350
0
{
1351
0
    return ternary_iop(v, w, z, NB_SLOT(nb_inplace_power),
1352
0
                                NB_SLOT(nb_power), "**=");
1353
0
}
1354
1355
PyObject *
1356
_PyNumber_InPlacePowerNoMod(PyObject *lhs, PyObject *rhs)
1357
0
{
1358
0
    return PyNumber_InPlacePower(lhs, rhs, Py_None);
1359
0
}
1360
1361
1362
/* Unary operators and functions */
1363
1364
#define UNARY_FUNC(func, op, meth_name, descr)                           \
1365
    PyObject *                                                           \
1366
14.5k
    func(PyObject *o) {                                                  \
1367
14.5k
        if (o == NULL) {                                                 \
1368
0
            return null_error();                                         \
1369
0
        }                                                                \
1370
14.5k
                                                                         \
1371
14.5k
        PyNumberMethods *m = Py_TYPE(o)->tp_as_number;                   \
1372
14.5k
        if (m && m->op) {                                                \
1373
14.5k
            PyObject *res = (*m->op)(o);                                 \
1374
14.5k
            assert(_Py_CheckSlotResult(o, #meth_name, res != NULL));     \
1375
14.5k
            return res;                                                  \
1376
14.5k
        }                                                                \
1377
14.5k
                                                                         \
1378
14.5k
        return type_error("bad operand type for "descr": '%.200s'", o);  \
1379
14.5k
    }
PyNumber_Negative
Line
Count
Source
1366
14.2k
    func(PyObject *o) {                                                  \
1367
14.2k
        if (o == NULL) {                                                 \
1368
0
            return null_error();                                         \
1369
0
        }                                                                \
1370
14.2k
                                                                         \
1371
14.2k
        PyNumberMethods *m = Py_TYPE(o)->tp_as_number;                   \
1372
14.2k
        if (m && m->op) {                                                \
1373
14.2k
            PyObject *res = (*m->op)(o);                                 \
1374
14.2k
            assert(_Py_CheckSlotResult(o, #meth_name, res != NULL));     \
1375
14.2k
            return res;                                                  \
1376
14.2k
        }                                                                \
1377
14.2k
                                                                         \
1378
14.2k
        return type_error("bad operand type for "descr": '%.200s'", o);  \
1379
14.2k
    }
Unexecuted instantiation: PyNumber_Positive
PyNumber_Invert
Line
Count
Source
1366
270
    func(PyObject *o) {                                                  \
1367
270
        if (o == NULL) {                                                 \
1368
0
            return null_error();                                         \
1369
0
        }                                                                \
1370
270
                                                                         \
1371
270
        PyNumberMethods *m = Py_TYPE(o)->tp_as_number;                   \
1372
270
        if (m && m->op) {                                                \
1373
270
            PyObject *res = (*m->op)(o);                                 \
1374
270
            assert(_Py_CheckSlotResult(o, #meth_name, res != NULL));     \
1375
270
            return res;                                                  \
1376
270
        }                                                                \
1377
270
                                                                         \
1378
270
        return type_error("bad operand type for "descr": '%.200s'", o);  \
1379
270
    }
Unexecuted instantiation: PyNumber_Absolute
1380
1381
UNARY_FUNC(PyNumber_Negative, nb_negative, __neg__, "unary -")
1382
UNARY_FUNC(PyNumber_Positive, nb_positive, __pos__, "unary +")
1383
UNARY_FUNC(PyNumber_Invert, nb_invert, __invert__, "unary ~")
1384
UNARY_FUNC(PyNumber_Absolute, nb_absolute, __abs__, "abs()")
1385
1386
1387
int
1388
PyIndex_Check(PyObject *obj)
1389
190M
{
1390
190M
    return _PyIndex_Check(obj);
1391
190M
}
1392
1393
1394
/* Return a Python int from the object item.
1395
   Can return an instance of int subclass.
1396
   Raise TypeError if the result is not an int
1397
   or if the object cannot be interpreted as an index.
1398
*/
1399
PyObject *
1400
_PyNumber_Index(PyObject *item)
1401
543M
{
1402
543M
    if (item == NULL) {
1403
0
        return null_error();
1404
0
    }
1405
1406
543M
    if (PyLong_Check(item)) {
1407
543M
        return Py_NewRef(item);
1408
543M
    }
1409
3.97k
    if (!_PyIndex_Check(item)) {
1410
3.97k
        PyErr_Format(PyExc_TypeError,
1411
3.97k
                     "'%.200s' object cannot be interpreted "
1412
3.97k
                     "as an integer", Py_TYPE(item)->tp_name);
1413
3.97k
        return NULL;
1414
3.97k
    }
1415
1416
0
    PyObject *result = Py_TYPE(item)->tp_as_number->nb_index(item);
1417
0
    assert(_Py_CheckSlotResult(item, "__index__", result != NULL));
1418
0
    if (!result || PyLong_CheckExact(result)) {
1419
0
        return result;
1420
0
    }
1421
1422
0
    if (!PyLong_Check(result)) {
1423
0
        PyErr_Format(PyExc_TypeError,
1424
0
                     "__index__ returned non-int (type %.200s)",
1425
0
                     Py_TYPE(result)->tp_name);
1426
0
        Py_DECREF(result);
1427
0
        return NULL;
1428
0
    }
1429
    /* Issue #17576: warn if 'result' not of exact type int. */
1430
0
    if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1431
0
            "__index__ returned non-int (type %.200s).  "
1432
0
            "The ability to return an instance of a strict subclass of int "
1433
0
            "is deprecated, and may be removed in a future version of Python.",
1434
0
            Py_TYPE(result)->tp_name)) {
1435
0
        Py_DECREF(result);
1436
0
        return NULL;
1437
0
    }
1438
0
    return result;
1439
0
}
1440
1441
/* Return an exact Python int from the object item.
1442
   Raise TypeError if the result is not an int
1443
   or if the object cannot be interpreted as an index.
1444
*/
1445
PyObject *
1446
PyNumber_Index(PyObject *item)
1447
21.8M
{
1448
21.8M
    PyObject *result = _PyNumber_Index(item);
1449
21.8M
    if (result != NULL && !PyLong_CheckExact(result)) {
1450
0
        Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1451
0
    }
1452
21.8M
    return result;
1453
21.8M
}
1454
1455
/* Return an error on Overflow only if err is not NULL*/
1456
1457
Py_ssize_t
1458
PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1459
416M
{
1460
416M
    Py_ssize_t result;
1461
416M
    PyObject *runerr;
1462
416M
    PyObject *value = _PyNumber_Index(item);
1463
416M
    if (value == NULL)
1464
3.03k
        return -1;
1465
1466
    /* We're done if PyLong_AsSsize_t() returns without error. */
1467
416M
    result = PyLong_AsSsize_t(value);
1468
416M
    if (result != -1)
1469
392M
        goto finish;
1470
1471
23.7M
    PyThreadState *tstate = _PyThreadState_GET();
1472
23.7M
    runerr = _PyErr_Occurred(tstate);
1473
23.7M
    if (!runerr) {
1474
23.7M
        goto finish;
1475
23.7M
    }
1476
1477
    /* Error handling code -- only manage OverflowError differently */
1478
0
    if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
1479
0
        goto finish;
1480
0
    }
1481
0
    _PyErr_Clear(tstate);
1482
1483
    /* If no error-handling desired then the default clipping
1484
       is sufficient. */
1485
0
    if (!err) {
1486
0
        assert(PyLong_Check(value));
1487
        /* Whether or not it is less than or equal to
1488
           zero is determined by the sign of ob_size
1489
        */
1490
0
        if (_PyLong_IsNegative((PyLongObject *)value))
1491
0
            result = PY_SSIZE_T_MIN;
1492
0
        else
1493
0
            result = PY_SSIZE_T_MAX;
1494
0
    }
1495
0
    else {
1496
        /* Otherwise replace the error with caller's error object. */
1497
0
        _PyErr_Format(tstate, err,
1498
0
                      "cannot fit '%.200s' into an index-sized integer",
1499
0
                      Py_TYPE(item)->tp_name);
1500
0
    }
1501
1502
416M
 finish:
1503
416M
    Py_DECREF(value);
1504
416M
    return result;
1505
0
}
1506
1507
1508
PyObject *
1509
PyNumber_Long(PyObject *o)
1510
3.44M
{
1511
3.44M
    PyObject *result;
1512
3.44M
    PyNumberMethods *m;
1513
3.44M
    Py_buffer view;
1514
1515
3.44M
    if (o == NULL) {
1516
0
        return null_error();
1517
0
    }
1518
1519
3.44M
    if (PyLong_CheckExact(o)) {
1520
2.74k
        return Py_NewRef(o);
1521
2.74k
    }
1522
3.44M
    m = Py_TYPE(o)->tp_as_number;
1523
3.44M
    if (m && m->nb_int) { /* This should include subclasses of int */
1524
        /* Convert using the nb_int slot, which should return something
1525
           of exact type int. */
1526
14.3k
        result = m->nb_int(o);
1527
14.3k
        assert(_Py_CheckSlotResult(o, "__int__", result != NULL));
1528
14.3k
        if (!result || PyLong_CheckExact(result)) {
1529
14.3k
            return result;
1530
14.3k
        }
1531
1532
0
        if (!PyLong_Check(result)) {
1533
0
            PyErr_Format(PyExc_TypeError,
1534
0
                         "__int__ returned non-int (type %.200s)",
1535
0
                         Py_TYPE(result)->tp_name);
1536
0
            Py_DECREF(result);
1537
0
            return NULL;
1538
0
        }
1539
        /* Issue #17576: warn if 'result' not of exact type int. */
1540
0
        if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1541
0
                "__int__ returned non-int (type %.200s).  "
1542
0
                "The ability to return an instance of a strict subclass of int "
1543
0
                "is deprecated, and may be removed in a future version of Python.",
1544
0
                Py_TYPE(result)->tp_name)) {
1545
0
            Py_DECREF(result);
1546
0
            return NULL;
1547
0
        }
1548
0
        Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1549
0
        return result;
1550
0
    }
1551
3.42M
    if (m && m->nb_index) {
1552
0
        return PyNumber_Index(o);
1553
0
    }
1554
1555
3.42M
    if (PyUnicode_Check(o))
1556
        /* The below check is done in PyLong_FromUnicodeObject(). */
1557
3.42M
        return PyLong_FromUnicodeObject(o, 10);
1558
1559
0
    if (PyBytes_Check(o))
1560
        /* need to do extra error checking that PyLong_FromString()
1561
         * doesn't do.  In particular int('9\x005') must raise an
1562
         * exception, not truncate at the null.
1563
         */
1564
0
        return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1565
0
                                 PyBytes_GET_SIZE(o), 10);
1566
1567
0
    if (PyByteArray_Check(o))
1568
0
        return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1569
0
                                 PyByteArray_GET_SIZE(o), 10);
1570
1571
0
    if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
1572
0
        PyObject *bytes;
1573
1574
        /* Copy to NUL-terminated buffer. */
1575
0
        bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1576
0
        if (bytes == NULL) {
1577
0
            PyBuffer_Release(&view);
1578
0
            return NULL;
1579
0
        }
1580
0
        result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1581
0
                                   PyBytes_GET_SIZE(bytes), 10);
1582
0
        Py_DECREF(bytes);
1583
0
        PyBuffer_Release(&view);
1584
0
        return result;
1585
0
    }
1586
1587
0
    return type_error("int() argument must be a string, a bytes-like object "
1588
0
                      "or a real number, not '%.200s'", o);
1589
0
}
1590
1591
PyObject *
1592
PyNumber_Float(PyObject *o)
1593
0
{
1594
0
    if (o == NULL) {
1595
0
        return null_error();
1596
0
    }
1597
1598
0
    if (PyFloat_CheckExact(o)) {
1599
0
        return Py_NewRef(o);
1600
0
    }
1601
1602
0
    PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1603
0
    if (m && m->nb_float) { /* This should include subclasses of float */
1604
0
        PyObject *res = m->nb_float(o);
1605
0
        assert(_Py_CheckSlotResult(o, "__float__", res != NULL));
1606
0
        if (!res || PyFloat_CheckExact(res)) {
1607
0
            return res;
1608
0
        }
1609
1610
0
        if (!PyFloat_Check(res)) {
1611
0
            PyErr_Format(PyExc_TypeError,
1612
0
                         "%.50s.__float__ returned non-float (type %.50s)",
1613
0
                         Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name);
1614
0
            Py_DECREF(res);
1615
0
            return NULL;
1616
0
        }
1617
        /* Issue #26983: warn if 'res' not of exact type float. */
1618
0
        if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1619
0
                "%.50s.__float__ returned non-float (type %.50s).  "
1620
0
                "The ability to return an instance of a strict subclass of float "
1621
0
                "is deprecated, and may be removed in a future version of Python.",
1622
0
                Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) {
1623
0
            Py_DECREF(res);
1624
0
            return NULL;
1625
0
        }
1626
0
        double val = PyFloat_AS_DOUBLE(res);
1627
0
        Py_DECREF(res);
1628
0
        return PyFloat_FromDouble(val);
1629
0
    }
1630
1631
0
    if (m && m->nb_index) {
1632
0
        PyObject *res = _PyNumber_Index(o);
1633
0
        if (!res) {
1634
0
            return NULL;
1635
0
        }
1636
0
        double val = PyLong_AsDouble(res);
1637
0
        Py_DECREF(res);
1638
0
        if (val == -1.0 && PyErr_Occurred()) {
1639
0
            return NULL;
1640
0
        }
1641
0
        return PyFloat_FromDouble(val);
1642
0
    }
1643
1644
    /* A float subclass with nb_float == NULL */
1645
0
    if (PyFloat_Check(o)) {
1646
0
        return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
1647
0
    }
1648
0
    return PyFloat_FromString(o);
1649
0
}
1650
1651
1652
PyObject *
1653
PyNumber_ToBase(PyObject *n, int base)
1654
1.53k
{
1655
1.53k
    if (!(base == 2 || base == 8 || base == 10 || base == 16)) {
1656
0
        PyErr_SetString(PyExc_SystemError,
1657
0
                        "PyNumber_ToBase: base must be 2, 8, 10 or 16");
1658
0
        return NULL;
1659
0
    }
1660
1.53k
    PyObject *index = _PyNumber_Index(n);
1661
1.53k
    if (!index)
1662
0
        return NULL;
1663
1.53k
    PyObject *res = _PyLong_Format(index, base);
1664
1.53k
    Py_DECREF(index);
1665
1.53k
    return res;
1666
1.53k
}
1667
1668
1669
/* Operations on sequences */
1670
1671
int
1672
PySequence_Check(PyObject *s)
1673
1.19k
{
1674
1.19k
    if (PyDict_Check(s))
1675
0
        return 0;
1676
1.19k
    return Py_TYPE(s)->tp_as_sequence &&
1677
1.19k
        Py_TYPE(s)->tp_as_sequence->sq_item != NULL;
1678
1.19k
}
1679
1680
Py_ssize_t
1681
PySequence_Size(PyObject *s)
1682
10
{
1683
10
    if (s == NULL) {
1684
0
        null_error();
1685
0
        return -1;
1686
0
    }
1687
1688
10
    PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1689
10
    if (m && m->sq_length) {
1690
10
        Py_ssize_t len = m->sq_length(s);
1691
10
        assert(_Py_CheckSlotResult(s, "__len__", len >= 0));
1692
10
        return len;
1693
10
    }
1694
1695
0
    if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) {
1696
0
        type_error("%.200s is not a sequence", s);
1697
0
        return -1;
1698
0
    }
1699
0
    type_error("object of type '%.200s' has no len()", s);
1700
0
    return -1;
1701
0
}
1702
1703
#undef PySequence_Length
1704
Py_ssize_t
1705
PySequence_Length(PyObject *s)
1706
0
{
1707
0
    return PySequence_Size(s);
1708
0
}
1709
#define PySequence_Length PySequence_Size
1710
1711
PyObject *
1712
PySequence_Concat(PyObject *s, PyObject *o)
1713
0
{
1714
0
    if (s == NULL || o == NULL) {
1715
0
        return null_error();
1716
0
    }
1717
1718
0
    PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1719
0
    if (m && m->sq_concat) {
1720
0
        PyObject *res = m->sq_concat(s, o);
1721
0
        assert(_Py_CheckSlotResult(s, "+", res != NULL));
1722
0
        return res;
1723
0
    }
1724
1725
    /* Instances of user classes defining an __add__() method only
1726
       have an nb_add slot, not an sq_concat slot.      So we fall back
1727
       to nb_add if both arguments appear to be sequences. */
1728
0
    if (PySequence_Check(s) && PySequence_Check(o)) {
1729
0
        PyObject *result = BINARY_OP1(s, o, NB_SLOT(nb_add), "+");
1730
0
        if (result != Py_NotImplemented)
1731
0
            return result;
1732
0
        Py_DECREF(result);
1733
0
    }
1734
0
    return type_error("'%.200s' object can't be concatenated", s);
1735
0
}
1736
1737
PyObject *
1738
PySequence_Repeat(PyObject *o, Py_ssize_t count)
1739
0
{
1740
0
    if (o == NULL) {
1741
0
        return null_error();
1742
0
    }
1743
1744
0
    PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1745
0
    if (m && m->sq_repeat) {
1746
0
        PyObject *res = m->sq_repeat(o, count);
1747
0
        assert(_Py_CheckSlotResult(o, "*", res != NULL));
1748
0
        return res;
1749
0
    }
1750
1751
    /* Instances of user classes defining a __mul__() method only
1752
       have an nb_multiply slot, not an sq_repeat slot. so we fall back
1753
       to nb_multiply if o appears to be a sequence. */
1754
0
    if (PySequence_Check(o)) {
1755
0
        PyObject *n, *result;
1756
0
        n = PyLong_FromSsize_t(count);
1757
0
        if (n == NULL)
1758
0
            return NULL;
1759
0
        result = BINARY_OP1(o, n, NB_SLOT(nb_multiply), "*");
1760
0
        Py_DECREF(n);
1761
0
        if (result != Py_NotImplemented)
1762
0
            return result;
1763
0
        Py_DECREF(result);
1764
0
    }
1765
0
    return type_error("'%.200s' object can't be repeated", o);
1766
0
}
1767
1768
PyObject *
1769
PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1770
0
{
1771
0
    if (s == NULL || o == NULL) {
1772
0
        return null_error();
1773
0
    }
1774
1775
0
    PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1776
0
    if (m && m->sq_inplace_concat) {
1777
0
        PyObject *res = m->sq_inplace_concat(s, o);
1778
0
        assert(_Py_CheckSlotResult(s, "+=", res != NULL));
1779
0
        return res;
1780
0
    }
1781
0
    if (m && m->sq_concat) {
1782
0
        PyObject *res = m->sq_concat(s, o);
1783
0
        assert(_Py_CheckSlotResult(s, "+", res != NULL));
1784
0
        return res;
1785
0
    }
1786
1787
0
    if (PySequence_Check(s) && PySequence_Check(o)) {
1788
0
        PyObject *result = BINARY_IOP1(s, o, NB_SLOT(nb_inplace_add),
1789
0
                                       NB_SLOT(nb_add), "+=");
1790
0
        if (result != Py_NotImplemented)
1791
0
            return result;
1792
0
        Py_DECREF(result);
1793
0
    }
1794
0
    return type_error("'%.200s' object can't be concatenated", s);
1795
0
}
1796
1797
PyObject *
1798
PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
1799
0
{
1800
0
    if (o == NULL) {
1801
0
        return null_error();
1802
0
    }
1803
1804
0
    PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1805
0
    if (m && m->sq_inplace_repeat) {
1806
0
        PyObject *res = m->sq_inplace_repeat(o, count);
1807
0
        assert(_Py_CheckSlotResult(o, "*=", res != NULL));
1808
0
        return res;
1809
0
    }
1810
0
    if (m && m->sq_repeat) {
1811
0
        PyObject *res = m->sq_repeat(o, count);
1812
0
        assert(_Py_CheckSlotResult(o, "*", res != NULL));
1813
0
        return res;
1814
0
    }
1815
1816
0
    if (PySequence_Check(o)) {
1817
0
        PyObject *n, *result;
1818
0
        n = PyLong_FromSsize_t(count);
1819
0
        if (n == NULL)
1820
0
            return NULL;
1821
0
        result = BINARY_IOP1(o, n, NB_SLOT(nb_inplace_multiply),
1822
0
                             NB_SLOT(nb_multiply), "*=");
1823
0
        Py_DECREF(n);
1824
0
        if (result != Py_NotImplemented)
1825
0
            return result;
1826
0
        Py_DECREF(result);
1827
0
    }
1828
0
    return type_error("'%.200s' object can't be repeated", o);
1829
0
}
1830
1831
PyObject *
1832
PySequence_GetItem(PyObject *s, Py_ssize_t i)
1833
17.6M
{
1834
17.6M
    if (s == NULL) {
1835
0
        return null_error();
1836
0
    }
1837
1838
17.6M
    PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1839
17.6M
    if (m && m->sq_item) {
1840
17.6M
        if (i < 0) {
1841
0
            if (m->sq_length) {
1842
0
                Py_ssize_t l = (*m->sq_length)(s);
1843
0
                assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
1844
0
                if (l < 0) {
1845
0
                    return NULL;
1846
0
                }
1847
0
                i += l;
1848
0
            }
1849
0
        }
1850
17.6M
        PyObject *res = m->sq_item(s, i);
1851
17.6M
        assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
1852
17.6M
        return res;
1853
17.6M
    }
1854
1855
0
    if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) {
1856
0
        return type_error("%.200s is not a sequence", s);
1857
0
    }
1858
0
    return type_error("'%.200s' object does not support indexing", s);
1859
0
}
1860
1861
PyObject *
1862
PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
1863
0
{
1864
0
    if (!s) {
1865
0
        return null_error();
1866
0
    }
1867
1868
0
    PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
1869
0
    if (mp && mp->mp_subscript) {
1870
0
        PyObject *slice = _PySlice_FromIndices(i1, i2);
1871
0
        if (!slice) {
1872
0
            return NULL;
1873
0
        }
1874
0
        PyObject *res = mp->mp_subscript(s, slice);
1875
0
        assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
1876
0
        Py_DECREF(slice);
1877
0
        return res;
1878
0
    }
1879
1880
0
    return type_error("'%.200s' object is unsliceable", s);
1881
0
}
1882
1883
int
1884
PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
1885
0
{
1886
0
    if (s == NULL) {
1887
0
        null_error();
1888
0
        return -1;
1889
0
    }
1890
1891
0
    PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1892
0
    if (m && m->sq_ass_item) {
1893
0
        if (i < 0) {
1894
0
            if (m->sq_length) {
1895
0
                Py_ssize_t l = (*m->sq_length)(s);
1896
0
                assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
1897
0
                if (l < 0) {
1898
0
                    return -1;
1899
0
                }
1900
0
                i += l;
1901
0
            }
1902
0
        }
1903
0
        int res = m->sq_ass_item(s, i, o);
1904
0
        assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
1905
0
        return res;
1906
0
    }
1907
1908
0
    if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
1909
0
        type_error("%.200s is not a sequence", s);
1910
0
        return -1;
1911
0
    }
1912
0
    type_error("'%.200s' object does not support item assignment", s);
1913
0
    return -1;
1914
0
}
1915
1916
int
1917
PySequence_DelItem(PyObject *s, Py_ssize_t i)
1918
5.45k
{
1919
5.45k
    if (s == NULL) {
1920
0
        null_error();
1921
0
        return -1;
1922
0
    }
1923
1924
5.45k
    PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1925
5.45k
    if (m && m->sq_ass_item) {
1926
5.45k
        if (i < 0) {
1927
0
            if (m->sq_length) {
1928
0
                Py_ssize_t l = (*m->sq_length)(s);
1929
0
                assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
1930
0
                if (l < 0) {
1931
0
                    return -1;
1932
0
                }
1933
0
                i += l;
1934
0
            }
1935
0
        }
1936
5.45k
        int res = m->sq_ass_item(s, i, (PyObject *)NULL);
1937
5.45k
        assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
1938
5.45k
        return res;
1939
5.45k
    }
1940
1941
0
    if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
1942
0
        type_error("%.200s is not a sequence", s);
1943
0
        return -1;
1944
0
    }
1945
0
    type_error("'%.200s' object doesn't support item deletion", s);
1946
0
    return -1;
1947
0
}
1948
1949
int
1950
PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
1951
0
{
1952
0
    if (s == NULL) {
1953
0
        null_error();
1954
0
        return -1;
1955
0
    }
1956
1957
0
    PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
1958
0
    if (mp && mp->mp_ass_subscript) {
1959
0
        PyObject *slice = _PySlice_FromIndices(i1, i2);
1960
0
        if (!slice)
1961
0
            return -1;
1962
0
        int res = mp->mp_ass_subscript(s, slice, o);
1963
0
        assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
1964
0
        Py_DECREF(slice);
1965
0
        return res;
1966
0
    }
1967
1968
0
    type_error("'%.200s' object doesn't support slice assignment", s);
1969
0
    return -1;
1970
0
}
1971
1972
int
1973
PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
1974
0
{
1975
0
    if (s == NULL) {
1976
0
        null_error();
1977
0
        return -1;
1978
0
    }
1979
1980
0
    PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
1981
0
    if (mp && mp->mp_ass_subscript) {
1982
0
        PyObject *slice = _PySlice_FromIndices(i1, i2);
1983
0
        if (!slice) {
1984
0
            return -1;
1985
0
        }
1986
0
        int res = mp->mp_ass_subscript(s, slice, NULL);
1987
0
        assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
1988
0
        Py_DECREF(slice);
1989
0
        return res;
1990
0
    }
1991
0
    type_error("'%.200s' object doesn't support slice deletion", s);
1992
0
    return -1;
1993
0
}
1994
1995
PyObject *
1996
PySequence_Tuple(PyObject *v)
1997
1.92M
{
1998
1.92M
    PyObject *it;  /* iter(v) */
1999
2000
1.92M
    if (v == NULL) {
2001
0
        return null_error();
2002
0
    }
2003
2004
    /* Special-case the common tuple and list cases, for efficiency. */
2005
1.92M
    if (PyTuple_CheckExact(v)) {
2006
        /* Note that we can't know whether it's safe to return
2007
           a tuple *subclass* instance as-is, hence the restriction
2008
           to exact tuples here.  In contrast, lists always make
2009
           a copy, so there's no need for exactness below. */
2010
1.66M
        return Py_NewRef(v);
2011
1.66M
    }
2012
261k
    if (PyList_CheckExact(v))
2013
261k
        return PyList_AsTuple(v);
2014
2015
    /* Get iterator. */
2016
195
    it = PyObject_GetIter(v);
2017
195
    if (it == NULL)
2018
0
        return NULL;
2019
2020
195
    Py_ssize_t n;
2021
195
    PyObject *buffer[8];
2022
939
    for (n = 0; n < 8; n++) {
2023
939
        PyObject *item = PyIter_Next(it);
2024
939
        if (item == NULL) {
2025
195
            if (PyErr_Occurred()) {
2026
0
                goto fail;
2027
0
            }
2028
195
            Py_DECREF(it);
2029
195
            return _PyTuple_FromArraySteal(buffer, n);
2030
195
        }
2031
744
        buffer[n] = item;
2032
744
    }
2033
0
    PyListObject *list = (PyListObject *)PyList_New(16);
2034
0
    if (list == NULL) {
2035
0
        goto fail;
2036
0
    }
2037
0
    assert(n == 8);
2038
0
    Py_SET_SIZE(list, n);
2039
0
    for (Py_ssize_t j = 0; j < n; j++) {
2040
0
        PyList_SET_ITEM(list, j, buffer[j]);
2041
0
    }
2042
0
    for (;;) {
2043
0
        PyObject *item = PyIter_Next(it);
2044
0
        if (item == NULL) {
2045
0
            if (PyErr_Occurred()) {
2046
0
                Py_DECREF(list);
2047
0
                Py_DECREF(it);
2048
0
                return NULL;
2049
0
            }
2050
0
            break;
2051
0
        }
2052
0
        if (_PyList_AppendTakeRef(list, item) < 0) {
2053
0
            Py_DECREF(list);
2054
0
            Py_DECREF(it);
2055
0
            return NULL;
2056
0
        }
2057
0
    }
2058
0
    Py_DECREF(it);
2059
0
    PyObject *res = _PyList_AsTupleAndClear(list);
2060
0
    Py_DECREF(list);
2061
0
    return res;
2062
0
fail:
2063
0
    Py_DECREF(it);
2064
0
    while (n > 0) {
2065
0
        n--;
2066
0
        Py_DECREF(buffer[n]);
2067
0
    }
2068
0
    return NULL;
2069
0
}
2070
2071
PyObject *
2072
PySequence_List(PyObject *v)
2073
5.47M
{
2074
5.47M
    PyObject *result;  /* result list */
2075
5.47M
    PyObject *rv;          /* return value from PyList_Extend */
2076
2077
5.47M
    if (v == NULL) {
2078
0
        return null_error();
2079
0
    }
2080
2081
5.47M
    result = PyList_New(0);
2082
5.47M
    if (result == NULL)
2083
0
        return NULL;
2084
2085
5.47M
    rv = _PyList_Extend((PyListObject *)result, v);
2086
5.47M
    if (rv == NULL) {
2087
703
        Py_DECREF(result);
2088
703
        return NULL;
2089
703
    }
2090
5.47M
    Py_DECREF(rv);
2091
5.47M
    return result;
2092
5.47M
}
2093
2094
PyObject *
2095
PySequence_Fast(PyObject *v, const char *m)
2096
48.1M
{
2097
48.1M
    PyObject *it;
2098
2099
48.1M
    if (v == NULL) {
2100
0
        return null_error();
2101
0
    }
2102
2103
48.1M
    if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
2104
44.5M
        return Py_NewRef(v);
2105
44.5M
    }
2106
2107
3.64M
    it = PyObject_GetIter(v);
2108
3.64M
    if (it == NULL) {
2109
0
        PyThreadState *tstate = _PyThreadState_GET();
2110
0
        if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2111
0
            _PyErr_SetString(tstate, PyExc_TypeError, m);
2112
0
        }
2113
0
        return NULL;
2114
0
    }
2115
2116
3.64M
    v = PySequence_List(it);
2117
3.64M
    Py_DECREF(it);
2118
2119
3.64M
    return v;
2120
3.64M
}
2121
2122
/* Iterate over seq.  Result depends on the operation:
2123
   PY_ITERSEARCH_COUNT:  -1 if error, else # of times obj appears in seq.
2124
   PY_ITERSEARCH_INDEX:  0-based index of first occurrence of obj in seq;
2125
    set ValueError and return -1 if none found; also return -1 on error.
2126
   PY_ITERSEARCH_CONTAINS:  return 1 if obj in seq, else 0; -1 on error.
2127
*/
2128
Py_ssize_t
2129
_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
2130
0
{
2131
0
    Py_ssize_t n;
2132
0
    int wrapped;  /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2133
0
    PyObject *it;  /* iter(seq) */
2134
2135
0
    if (seq == NULL || obj == NULL) {
2136
0
        null_error();
2137
0
        return -1;
2138
0
    }
2139
2140
0
    it = PyObject_GetIter(seq);
2141
0
    if (it == NULL) {
2142
0
        if (PyErr_ExceptionMatches(PyExc_TypeError)) {
2143
0
            if (operation == PY_ITERSEARCH_CONTAINS) {
2144
0
                type_error(
2145
0
                    "argument of type '%.200s' is not a container or iterable",
2146
0
                    seq
2147
0
                    );
2148
0
            }
2149
0
            else {
2150
0
                type_error("argument of type '%.200s' is not iterable", seq);
2151
0
            }
2152
0
        }
2153
0
        return -1;
2154
0
    }
2155
2156
0
    n = wrapped = 0;
2157
0
    for (;;) {
2158
0
        int cmp;
2159
0
        PyObject *item = PyIter_Next(it);
2160
0
        if (item == NULL) {
2161
0
            if (PyErr_Occurred())
2162
0
                goto Fail;
2163
0
            break;
2164
0
        }
2165
2166
0
        cmp = PyObject_RichCompareBool(item, obj, Py_EQ);
2167
0
        Py_DECREF(item);
2168
0
        if (cmp < 0)
2169
0
            goto Fail;
2170
0
        if (cmp > 0) {
2171
0
            switch (operation) {
2172
0
            case PY_ITERSEARCH_COUNT:
2173
0
                if (n == PY_SSIZE_T_MAX) {
2174
0
                    PyErr_SetString(PyExc_OverflowError,
2175
0
                           "count exceeds C integer size");
2176
0
                    goto Fail;
2177
0
                }
2178
0
                ++n;
2179
0
                break;
2180
2181
0
            case PY_ITERSEARCH_INDEX:
2182
0
                if (wrapped) {
2183
0
                    PyErr_SetString(PyExc_OverflowError,
2184
0
                           "index exceeds C integer size");
2185
0
                    goto Fail;
2186
0
                }
2187
0
                goto Done;
2188
2189
0
            case PY_ITERSEARCH_CONTAINS:
2190
0
                n = 1;
2191
0
                goto Done;
2192
2193
0
            default:
2194
0
                Py_UNREACHABLE();
2195
0
            }
2196
0
        }
2197
2198
0
        if (operation == PY_ITERSEARCH_INDEX) {
2199
0
            if (n == PY_SSIZE_T_MAX)
2200
0
                wrapped = 1;
2201
0
            ++n;
2202
0
        }
2203
0
    }
2204
2205
0
    if (operation != PY_ITERSEARCH_INDEX)
2206
0
        goto Done;
2207
2208
0
    PyErr_SetString(PyExc_ValueError,
2209
0
                    "sequence.index(x): x not in sequence");
2210
    /* fall into failure code */
2211
0
Fail:
2212
0
    n = -1;
2213
    /* fall through */
2214
0
Done:
2215
0
    Py_DECREF(it);
2216
0
    return n;
2217
2218
0
}
2219
2220
/* Return # of times o appears in s. */
2221
Py_ssize_t
2222
PySequence_Count(PyObject *s, PyObject *o)
2223
0
{
2224
0
    return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
2225
0
}
2226
2227
/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
2228
 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
2229
 */
2230
int
2231
PySequence_Contains(PyObject *seq, PyObject *ob)
2232
105M
{
2233
105M
    PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence;
2234
105M
    if (sqm != NULL && sqm->sq_contains != NULL) {
2235
105M
        int res = (*sqm->sq_contains)(seq, ob);
2236
105M
        assert(_Py_CheckSlotResult(seq, "__contains__", res >= 0));
2237
105M
        return res;
2238
105M
    }
2239
0
    Py_ssize_t result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2240
0
    return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
2241
105M
}
2242
2243
/* Backwards compatibility */
2244
#undef PySequence_In
2245
int
2246
PySequence_In(PyObject *w, PyObject *v)
2247
0
{
2248
0
    return PySequence_Contains(w, v);
2249
0
}
2250
2251
Py_ssize_t
2252
PySequence_Index(PyObject *s, PyObject *o)
2253
0
{
2254
0
    return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
2255
0
}
2256
2257
/* Operations on mappings */
2258
2259
int
2260
PyMapping_Check(PyObject *o)
2261
26.5M
{
2262
26.5M
    return o && Py_TYPE(o)->tp_as_mapping &&
2263
26.5M
        Py_TYPE(o)->tp_as_mapping->mp_subscript;
2264
26.5M
}
2265
2266
Py_ssize_t
2267
PyMapping_Size(PyObject *o)
2268
424
{
2269
424
    if (o == NULL) {
2270
0
        null_error();
2271
0
        return -1;
2272
0
    }
2273
2274
424
    PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
2275
424
    if (m && m->mp_length) {
2276
424
        Py_ssize_t len = m->mp_length(o);
2277
424
        assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
2278
424
        return len;
2279
424
    }
2280
2281
0
    if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) {
2282
0
        type_error("%.200s is not a mapping", o);
2283
0
        return -1;
2284
0
    }
2285
    /* PyMapping_Size() can be called from PyObject_Size(). */
2286
0
    type_error("object of type '%.200s' has no len()", o);
2287
0
    return -1;
2288
0
}
2289
2290
#undef PyMapping_Length
2291
Py_ssize_t
2292
PyMapping_Length(PyObject *o)
2293
0
{
2294
0
    return PyMapping_Size(o);
2295
0
}
2296
#define PyMapping_Length PyMapping_Size
2297
2298
PyObject *
2299
PyMapping_GetItemString(PyObject *o, const char *key)
2300
80
{
2301
80
    PyObject *okey, *r;
2302
2303
80
    if (key == NULL) {
2304
0
        return null_error();
2305
0
    }
2306
2307
80
    okey = PyUnicode_FromString(key);
2308
80
    if (okey == NULL)
2309
0
        return NULL;
2310
80
    r = PyObject_GetItem(o, okey);
2311
80
    Py_DECREF(okey);
2312
80
    return r;
2313
80
}
2314
2315
int
2316
PyMapping_GetOptionalItemString(PyObject *obj, const char *key, PyObject **result)
2317
0
{
2318
0
    if (key == NULL) {
2319
0
        *result = NULL;
2320
0
        null_error();
2321
0
        return -1;
2322
0
    }
2323
0
    PyObject *okey = PyUnicode_FromString(key);
2324
0
    if (okey == NULL) {
2325
0
        *result = NULL;
2326
0
        return -1;
2327
0
    }
2328
0
    int rc = PyMapping_GetOptionalItem(obj, okey, result);
2329
0
    Py_DECREF(okey);
2330
0
    return rc;
2331
0
}
2332
2333
int
2334
PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
2335
16
{
2336
16
    PyObject *okey;
2337
16
    int r;
2338
2339
16
    if (key == NULL) {
2340
0
        null_error();
2341
0
        return -1;
2342
0
    }
2343
2344
16
    okey = PyUnicode_FromString(key);
2345
16
    if (okey == NULL)
2346
0
        return -1;
2347
16
    r = PyObject_SetItem(o, okey, value);
2348
16
    Py_DECREF(okey);
2349
16
    return r;
2350
16
}
2351
2352
int
2353
PyMapping_HasKeyStringWithError(PyObject *obj, const char *key)
2354
0
{
2355
0
    PyObject *res;
2356
0
    int rc = PyMapping_GetOptionalItemString(obj, key, &res);
2357
0
    Py_XDECREF(res);
2358
0
    return rc;
2359
0
}
2360
2361
int
2362
PyMapping_HasKeyWithError(PyObject *obj, PyObject *key)
2363
0
{
2364
0
    PyObject *res;
2365
0
    int rc = PyMapping_GetOptionalItem(obj, key, &res);
2366
0
    Py_XDECREF(res);
2367
0
    return rc;
2368
0
}
2369
2370
int
2371
PyMapping_HasKeyString(PyObject *obj, const char *key)
2372
0
{
2373
0
    PyObject *value;
2374
0
    int rc;
2375
0
    if (obj == NULL) {
2376
        // For backward compatibility.
2377
        // PyMapping_GetOptionalItemString() crashes if obj is NULL.
2378
0
        null_error();
2379
0
        rc = -1;
2380
0
    }
2381
0
    else {
2382
0
        rc = PyMapping_GetOptionalItemString(obj, key, &value);
2383
0
    }
2384
0
    if (rc < 0) {
2385
0
        PyErr_FormatUnraisable(
2386
0
            "Exception ignored in PyMapping_HasKeyString(); consider using "
2387
0
            "PyMapping_HasKeyStringWithError(), "
2388
0
            "PyMapping_GetOptionalItemString() or PyMapping_GetItemString()");
2389
0
        return 0;
2390
0
    }
2391
0
    Py_XDECREF(value);
2392
0
    return rc;
2393
0
}
2394
2395
int
2396
PyMapping_HasKey(PyObject *obj, PyObject *key)
2397
0
{
2398
0
    PyObject *value;
2399
0
    int rc;
2400
0
    if (obj == NULL || key == NULL) {
2401
        // For backward compatibility.
2402
        // PyMapping_GetOptionalItem() crashes if any of them is NULL.
2403
0
        null_error();
2404
0
        rc = -1;
2405
0
    }
2406
0
    else {
2407
0
        rc = PyMapping_GetOptionalItem(obj, key, &value);
2408
0
    }
2409
0
    if (rc < 0) {
2410
0
        PyErr_FormatUnraisable(
2411
0
            "Exception ignored in PyMapping_HasKey(); consider using "
2412
0
            "PyMapping_HasKeyWithError(), "
2413
0
            "PyMapping_GetOptionalItem() or PyObject_GetItem()");
2414
0
        return 0;
2415
0
    }
2416
0
    Py_XDECREF(value);
2417
0
    return rc;
2418
0
}
2419
2420
/* This function is quite similar to PySequence_Fast(), but specialized to be
2421
   a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
2422
 */
2423
static PyObject *
2424
method_output_as_list(PyObject *o, PyObject *meth)
2425
810
{
2426
810
    PyObject *it, *result, *meth_output;
2427
2428
810
    assert(o != NULL);
2429
810
    meth_output = PyObject_CallMethodNoArgs(o, meth);
2430
810
    if (meth_output == NULL || PyList_CheckExact(meth_output)) {
2431
0
        return meth_output;
2432
0
    }
2433
810
    it = PyObject_GetIter(meth_output);
2434
810
    if (it == NULL) {
2435
0
        PyThreadState *tstate = _PyThreadState_GET();
2436
0
        if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2437
0
            _PyErr_Format(tstate, PyExc_TypeError,
2438
0
                          "%.200s.%U() returned a non-iterable (type %.200s)",
2439
0
                          Py_TYPE(o)->tp_name,
2440
0
                          meth,
2441
0
                          Py_TYPE(meth_output)->tp_name);
2442
0
        }
2443
0
        Py_DECREF(meth_output);
2444
0
        return NULL;
2445
0
    }
2446
810
    Py_DECREF(meth_output);
2447
810
    result = PySequence_List(it);
2448
810
    Py_DECREF(it);
2449
810
    return result;
2450
810
}
2451
2452
PyObject *
2453
PyMapping_Keys(PyObject *o)
2454
256
{
2455
256
    if (o == NULL) {
2456
0
        return null_error();
2457
0
    }
2458
256
    if (PyDict_CheckExact(o)) {
2459
120
        return PyDict_Keys(o);
2460
120
    }
2461
136
    return method_output_as_list(o, &_Py_ID(keys));
2462
256
}
2463
2464
PyObject *
2465
PyMapping_Items(PyObject *o)
2466
674
{
2467
674
    if (o == NULL) {
2468
0
        return null_error();
2469
0
    }
2470
674
    if (PyDict_CheckExact(o)) {
2471
0
        return PyDict_Items(o);
2472
0
    }
2473
674
    return method_output_as_list(o, &_Py_ID(items));
2474
674
}
2475
2476
PyObject *
2477
PyMapping_Values(PyObject *o)
2478
0
{
2479
0
    if (o == NULL) {
2480
0
        return null_error();
2481
0
    }
2482
0
    if (PyDict_CheckExact(o)) {
2483
0
        return PyDict_Values(o);
2484
0
    }
2485
0
    return method_output_as_list(o, &_Py_ID(values));
2486
0
}
2487
2488
/* isinstance(), issubclass() */
2489
2490
/* abstract_get_bases() has logically 4 return states:
2491
 *
2492
 * 1. getattr(cls, '__bases__') could raise an AttributeError
2493
 * 2. getattr(cls, '__bases__') could raise some other exception
2494
 * 3. getattr(cls, '__bases__') could return a tuple
2495
 * 4. getattr(cls, '__bases__') could return something other than a tuple
2496
 *
2497
 * Only state #3 is a non-error state and only it returns a non-NULL object
2498
 * (it returns the retrieved tuple).
2499
 *
2500
 * Any raised AttributeErrors are masked by clearing the exception and
2501
 * returning NULL.  If an object other than a tuple comes out of __bases__,
2502
 * then again, the return value is NULL.  So yes, these two situations
2503
 * produce exactly the same results: NULL is returned and no error is set.
2504
 *
2505
 * If some exception other than AttributeError is raised, then NULL is also
2506
 * returned, but the exception is not cleared.  That's because we want the
2507
 * exception to be propagated along.
2508
 *
2509
 * Callers are expected to test for PyErr_Occurred() when the return value
2510
 * is NULL to decide whether a valid exception should be propagated or not.
2511
 * When there's no exception to propagate, it's customary for the caller to
2512
 * set a TypeError.
2513
 */
2514
static PyObject *
2515
abstract_get_bases(PyObject *cls)
2516
0
{
2517
0
    PyObject *bases;
2518
2519
0
    (void)PyObject_GetOptionalAttr(cls, &_Py_ID(__bases__), &bases);
2520
0
    if (bases != NULL && !PyTuple_Check(bases)) {
2521
0
        Py_DECREF(bases);
2522
0
        return NULL;
2523
0
    }
2524
0
    return bases;
2525
0
}
2526
2527
2528
static int
2529
abstract_issubclass(PyObject *derived, PyObject *cls)
2530
0
{
2531
0
    PyObject *bases = NULL;
2532
0
    Py_ssize_t i, n;
2533
0
    int r = 0;
2534
2535
0
    while (1) {
2536
0
        if (derived == cls) {
2537
0
            Py_XDECREF(bases); /* See below comment */
2538
0
            return 1;
2539
0
        }
2540
        /* Use XSETREF to drop bases reference *after* finishing with
2541
           derived; bases might be the only reference to it.
2542
           XSETREF is used instead of SETREF, because bases is NULL on the
2543
           first iteration of the loop.
2544
        */
2545
0
        Py_XSETREF(bases, abstract_get_bases(derived));
2546
0
        if (bases == NULL) {
2547
0
            if (PyErr_Occurred())
2548
0
                return -1;
2549
0
            return 0;
2550
0
        }
2551
0
        n = PyTuple_GET_SIZE(bases);
2552
0
        if (n == 0) {
2553
0
            Py_DECREF(bases);
2554
0
            return 0;
2555
0
        }
2556
        /* Avoid recursivity in the single inheritance case */
2557
0
        if (n == 1) {
2558
0
            derived = PyTuple_GET_ITEM(bases, 0);
2559
0
            continue;
2560
0
        }
2561
0
        break;
2562
0
    }
2563
0
    assert(n >= 2);
2564
0
    if (_Py_EnterRecursiveCall(" in __issubclass__")) {
2565
0
        Py_DECREF(bases);
2566
0
        return -1;
2567
0
    }
2568
0
    for (i = 0; i < n; i++) {
2569
0
        r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2570
0
        if (r != 0) {
2571
0
            break;
2572
0
        }
2573
0
    }
2574
0
    _Py_LeaveRecursiveCall();
2575
0
    Py_DECREF(bases);
2576
0
    return r;
2577
0
}
2578
2579
static int
2580
check_class(PyObject *cls, const char *error)
2581
0
{
2582
0
    PyObject *bases = abstract_get_bases(cls);
2583
0
    if (bases == NULL) {
2584
        /* Do not mask errors. */
2585
0
        PyThreadState *tstate = _PyThreadState_GET();
2586
0
        if (!_PyErr_Occurred(tstate)) {
2587
0
            _PyErr_SetString(tstate, PyExc_TypeError, error);
2588
0
        }
2589
0
        return 0;
2590
0
    }
2591
0
    Py_DECREF(bases);
2592
0
    return -1;
2593
0
}
2594
2595
static int
2596
object_isinstance(PyObject *inst, PyObject *cls)
2597
1.37M
{
2598
1.37M
    PyObject *icls;
2599
1.37M
    int retval;
2600
1.37M
    if (PyType_Check(cls)) {
2601
1.37M
        retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2602
1.37M
        if (retval == 0) {
2603
1.28M
            retval = PyObject_GetOptionalAttr(inst, &_Py_ID(__class__), &icls);
2604
1.28M
            if (icls != NULL) {
2605
1.28M
                if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) {
2606
0
                    retval = PyType_IsSubtype(
2607
0
                        (PyTypeObject *)icls,
2608
0
                        (PyTypeObject *)cls);
2609
0
                }
2610
1.28M
                else {
2611
1.28M
                    retval = 0;
2612
1.28M
                }
2613
1.28M
                Py_DECREF(icls);
2614
1.28M
            }
2615
1.28M
        }
2616
1.37M
    }
2617
0
    else {
2618
0
        if (!check_class(cls,
2619
0
            "isinstance() arg 2 must be a type, a tuple of types, or a union"))
2620
0
            return -1;
2621
0
        retval = PyObject_GetOptionalAttr(inst, &_Py_ID(__class__), &icls);
2622
0
        if (icls != NULL) {
2623
0
            retval = abstract_issubclass(icls, cls);
2624
0
            Py_DECREF(icls);
2625
0
        }
2626
0
    }
2627
2628
1.37M
    return retval;
2629
1.37M
}
2630
2631
static int
2632
object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls)
2633
14.8M
{
2634
    /* Quick test for an exact match */
2635
14.8M
    if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) {
2636
13.3M
        return 1;
2637
13.3M
    }
2638
2639
    /* We know what type's __instancecheck__ does. */
2640
1.48M
    if (PyType_CheckExact(cls)) {
2641
1.36M
        return object_isinstance(inst, cls);
2642
1.36M
    }
2643
2644
119k
    if (_PyUnion_Check(cls)) {
2645
0
        cls = _Py_union_args(cls);
2646
0
    }
2647
2648
119k
    if (PyTuple_Check(cls)) {
2649
        /* Not a general sequence -- that opens up the road to
2650
           recursion and stack overflow. */
2651
110k
        if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) {
2652
0
            return -1;
2653
0
        }
2654
110k
        Py_ssize_t n = PyTuple_GET_SIZE(cls);
2655
110k
        int r = 0;
2656
201k
        for (Py_ssize_t i = 0; i < n; ++i) {
2657
170k
            PyObject *item = PyTuple_GET_ITEM(cls, i);
2658
170k
            r = object_recursive_isinstance(tstate, inst, item);
2659
170k
            if (r != 0) {
2660
                /* either found it, or got an error */
2661
79.9k
                break;
2662
79.9k
            }
2663
170k
        }
2664
110k
        _Py_LeaveRecursiveCallTstate(tstate);
2665
110k
        return r;
2666
110k
    }
2667
2668
8.65k
    PyObject *checker = _PyObject_LookupSpecial(cls, &_Py_ID(__instancecheck__));
2669
8.65k
    if (checker != NULL) {
2670
8.65k
        if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) {
2671
0
            Py_DECREF(checker);
2672
0
            return -1;
2673
0
        }
2674
2675
8.65k
        PyObject *res = PyObject_CallOneArg(checker, inst);
2676
8.65k
        _Py_LeaveRecursiveCallTstate(tstate);
2677
8.65k
        Py_DECREF(checker);
2678
2679
8.65k
        if (res == NULL) {
2680
0
            return -1;
2681
0
        }
2682
8.65k
        int ok = PyObject_IsTrue(res);
2683
8.65k
        Py_DECREF(res);
2684
2685
8.65k
        return ok;
2686
8.65k
    }
2687
0
    else if (_PyErr_Occurred(tstate)) {
2688
0
        return -1;
2689
0
    }
2690
2691
    /* cls has no __instancecheck__() method */
2692
0
    return object_isinstance(inst, cls);
2693
8.65k
}
2694
2695
2696
int
2697
PyObject_IsInstance(PyObject *inst, PyObject *cls)
2698
14.6M
{
2699
14.6M
    PyThreadState *tstate = _PyThreadState_GET();
2700
14.6M
    return object_recursive_isinstance(tstate, inst, cls);
2701
14.6M
}
2702
2703
2704
static  int
2705
recursive_issubclass(PyObject *derived, PyObject *cls)
2706
15.2M
{
2707
15.2M
    if (PyType_Check(cls) && PyType_Check(derived)) {
2708
        /* Fast path (non-recursive) */
2709
15.2M
        return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2710
15.2M
    }
2711
0
    if (!check_class(derived,
2712
0
                     "issubclass() arg 1 must be a class"))
2713
0
        return -1;
2714
2715
0
    if (!_PyUnion_Check(cls) && !check_class(cls,
2716
0
                            "issubclass() arg 2 must be a class,"
2717
0
                            " a tuple of classes, or a union")) {
2718
0
        return -1;
2719
0
    }
2720
2721
0
    return abstract_issubclass(derived, cls);
2722
0
}
2723
2724
static int
2725
object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
2726
16.1M
{
2727
16.1M
    PyObject *checker;
2728
2729
    /* We know what type's __subclasscheck__ does. */
2730
16.1M
    if (PyType_CheckExact(cls)) {
2731
        /* Quick test for an exact match */
2732
16.1M
        if (derived == cls)
2733
16.1M
            return 1;
2734
16.1k
        return recursive_issubclass(derived, cls);
2735
16.1M
    }
2736
2737
2.31k
    if (_PyUnion_Check(cls)) {
2738
0
        cls = _Py_union_args(cls);
2739
0
    }
2740
2741
2.31k
    if (PyTuple_Check(cls)) {
2742
2743
0
        if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) {
2744
0
            return -1;
2745
0
        }
2746
0
        Py_ssize_t n = PyTuple_GET_SIZE(cls);
2747
0
        int r = 0;
2748
0
        for (Py_ssize_t i = 0; i < n; ++i) {
2749
0
            PyObject *item = PyTuple_GET_ITEM(cls, i);
2750
0
            r = object_issubclass(tstate, derived, item);
2751
0
            if (r != 0)
2752
                /* either found it, or got an error */
2753
0
                break;
2754
0
        }
2755
0
        _Py_LeaveRecursiveCallTstate(tstate);
2756
0
        return r;
2757
0
    }
2758
2759
2.31k
    checker = _PyObject_LookupSpecial(cls, &_Py_ID(__subclasscheck__));
2760
2.31k
    if (checker != NULL) {
2761
2.31k
        int ok = -1;
2762
2.31k
        if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) {
2763
0
            Py_DECREF(checker);
2764
0
            return ok;
2765
0
        }
2766
2.31k
        PyObject *res = PyObject_CallOneArg(checker, derived);
2767
2.31k
        _Py_LeaveRecursiveCallTstate(tstate);
2768
2.31k
        Py_DECREF(checker);
2769
2.31k
        if (res != NULL) {
2770
2.31k
            ok = PyObject_IsTrue(res);
2771
2.31k
            Py_DECREF(res);
2772
2.31k
        }
2773
2.31k
        return ok;
2774
2.31k
    }
2775
0
    else if (_PyErr_Occurred(tstate)) {
2776
0
        return -1;
2777
0
    }
2778
2779
    /* Can be reached when infinite recursion happens. */
2780
0
    return recursive_issubclass(derived, cls);
2781
2.31k
}
2782
2783
2784
int
2785
PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2786
16.1M
{
2787
16.1M
    PyThreadState *tstate = _PyThreadState_GET();
2788
16.1M
    return object_issubclass(tstate, derived, cls);
2789
16.1M
}
2790
2791
2792
int
2793
_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2794
8.65k
{
2795
8.65k
    return object_isinstance(inst, cls);
2796
8.65k
}
2797
2798
int
2799
_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2800
15.2M
{
2801
15.2M
    return recursive_issubclass(derived, cls);
2802
15.2M
}
2803
2804
2805
PyObject *
2806
PyObject_GetIter(PyObject *o)
2807
131M
{
2808
131M
    PyTypeObject *t = Py_TYPE(o);
2809
131M
    getiterfunc f;
2810
2811
131M
    f = t->tp_iter;
2812
131M
    if (f == NULL) {
2813
595
        if (PySequence_Check(o))
2814
595
            return PySeqIter_New(o);
2815
0
        return type_error("'%.200s' object is not iterable", o);
2816
595
    }
2817
131M
    else {
2818
131M
        PyObject *res = (*f)(o);
2819
131M
        if (res != NULL && !PyIter_Check(res)) {
2820
0
            PyErr_Format(PyExc_TypeError,
2821
0
                         "iter() returned non-iterator "
2822
0
                         "of type '%.100s'",
2823
0
                         Py_TYPE(res)->tp_name);
2824
0
            Py_SETREF(res, NULL);
2825
0
        }
2826
131M
        return res;
2827
131M
    }
2828
131M
}
2829
2830
PyObject *
2831
0
PyObject_GetAIter(PyObject *o) {
2832
0
    PyTypeObject *t = Py_TYPE(o);
2833
0
    unaryfunc f;
2834
2835
0
    if (t->tp_as_async == NULL || t->tp_as_async->am_aiter == NULL) {
2836
0
        return type_error("'%.200s' object is not an async iterable", o);
2837
0
    }
2838
0
    f = t->tp_as_async->am_aiter;
2839
0
    PyObject *it = (*f)(o);
2840
0
    if (it != NULL && !PyAIter_Check(it)) {
2841
0
        PyErr_Format(PyExc_TypeError,
2842
0
                     "aiter() returned not an async iterator of type '%.100s'",
2843
0
                     Py_TYPE(it)->tp_name);
2844
0
        Py_SETREF(it, NULL);
2845
0
    }
2846
0
    return it;
2847
0
}
2848
2849
int
2850
PyIter_Check(PyObject *obj)
2851
149M
{
2852
149M
    PyTypeObject *tp = Py_TYPE(obj);
2853
149M
    return (tp->tp_iternext != NULL &&
2854
149M
            tp->tp_iternext != &_PyObject_NextNotImplemented);
2855
149M
}
2856
2857
int
2858
PyAIter_Check(PyObject *obj)
2859
0
{
2860
0
    PyTypeObject *tp = Py_TYPE(obj);
2861
0
    return (tp->tp_as_async != NULL &&
2862
0
            tp->tp_as_async->am_anext != NULL &&
2863
0
            tp->tp_as_async->am_anext != &_PyObject_NextNotImplemented);
2864
0
}
2865
2866
static int
2867
iternext(PyObject *iter, PyObject **item)
2868
86.7M
{
2869
86.7M
    iternextfunc tp_iternext = Py_TYPE(iter)->tp_iternext;
2870
86.7M
    if ((*item = tp_iternext(iter))) {
2871
63.6M
        return 1;
2872
63.6M
    }
2873
2874
23.0M
    PyThreadState *tstate = _PyThreadState_GET();
2875
    /* When the iterator is exhausted it must return NULL;
2876
     * a StopIteration exception may or may not be set. */
2877
23.0M
    if (!_PyErr_Occurred(tstate)) {
2878
23.0M
        return 0;
2879
23.0M
    }
2880
19.2k
    if (_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
2881
0
        _PyErr_Clear(tstate);
2882
0
        return 0;
2883
0
    }
2884
2885
    /* Error case: an exception (different than StopIteration) is set. */
2886
19.2k
    return -1;
2887
19.2k
}
2888
2889
/* Return 1 and set 'item' to the next item of 'iter' on success.
2890
 * Return 0 and set 'item' to NULL when there are no remaining values.
2891
 * Return -1, set 'item' to NULL and set an exception on error.
2892
 */
2893
int
2894
PyIter_NextItem(PyObject *iter, PyObject **item)
2895
0
{
2896
0
    assert(iter != NULL);
2897
0
    assert(item != NULL);
2898
2899
0
    if (Py_TYPE(iter)->tp_iternext == NULL) {
2900
0
        *item = NULL;
2901
0
        PyErr_Format(PyExc_TypeError, "expected an iterator, got '%T'", iter);
2902
0
        return -1;
2903
0
    }
2904
2905
0
    return iternext(iter, item);
2906
0
}
2907
2908
/* Return next item.
2909
 *
2910
 * If an error occurs, return NULL.  PyErr_Occurred() will be true.
2911
 * If the iteration terminates normally, return NULL and clear the
2912
 * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
2913
 * will be false.
2914
 * Else return the next object.  PyErr_Occurred() will be false.
2915
 */
2916
PyObject *
2917
PyIter_Next(PyObject *iter)
2918
86.7M
{
2919
86.7M
    PyObject *item;
2920
86.7M
    (void)iternext(iter, &item);
2921
86.7M
    return item;
2922
86.7M
}
2923
2924
PySendResult
2925
PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result)
2926
0
{
2927
0
    assert(arg != NULL);
2928
0
    assert(result != NULL);
2929
0
    if (Py_TYPE(iter)->tp_as_async && Py_TYPE(iter)->tp_as_async->am_send) {
2930
0
        PySendResult res = Py_TYPE(iter)->tp_as_async->am_send(iter, arg, result);
2931
0
        assert(_Py_CheckSlotResult(iter, "am_send", res != PYGEN_ERROR));
2932
0
        return res;
2933
0
    }
2934
0
    if (arg == Py_None && PyIter_Check(iter)) {
2935
0
        *result = Py_TYPE(iter)->tp_iternext(iter);
2936
0
    }
2937
0
    else {
2938
0
        *result = PyObject_CallMethodOneArg(iter, &_Py_ID(send), arg);
2939
0
    }
2940
0
    if (*result != NULL) {
2941
0
        return PYGEN_NEXT;
2942
0
    }
2943
0
    if (_PyGen_FetchStopIterationValue(result) == 0) {
2944
0
        return PYGEN_RETURN;
2945
0
    }
2946
0
    return PYGEN_ERROR;
2947
0
}