Coverage Report

Created: 2026-06-07 06:26

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