Coverage Report

Created: 2026-10-17 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Objects/clinic/memoryobject.c.h
Line
Count
Source
1
/*[clinic input]
2
preserve
3
[clinic start generated code]*/
4
5
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
6
#  include "pycore_gc.h"          // PyGC_Head
7
#  include "pycore_runtime.h"     // _Py_ID()
8
#endif
9
#include "pycore_abstract.h"      // _PyNumber_Index()
10
#include "pycore_modsupport.h"    // _PyArg_UnpackKeywords()
11
#include "pycore_unicodeobject.h" // _PyUnicode_AsUTF8NoNUL()
12
13
PyDoc_STRVAR(memoryview__doc__,
14
"memoryview(object)\n"
15
"--\n"
16
"\n"
17
"Create a new memoryview object which references the given object.");
18
19
static PyObject *
20
memoryview_impl(PyTypeObject *type, PyObject *object);
21
22
static PyObject *
23
memoryview(PyTypeObject *type, PyObject *args, PyObject *kwargs)
24
129k
{
25
129k
    PyObject *return_value = NULL;
26
129k
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
27
28
129k
    #define NUM_KEYWORDS 1
29
129k
    static struct {
30
129k
        PyGC_Head _this_is_not_used;
31
129k
        PyObject_VAR_HEAD
32
129k
        Py_hash_t ob_hash;
33
129k
        PyObject *ob_item[NUM_KEYWORDS];
34
129k
    } _kwtuple = {
35
129k
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
36
129k
        .ob_hash = -1,
37
129k
        .ob_item = { &_Py_ID(object), },
38
129k
    };
39
129k
    #undef NUM_KEYWORDS
40
129k
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
41
42
    #else  // !Py_BUILD_CORE
43
    #  define KWTUPLE NULL
44
    #endif  // !Py_BUILD_CORE
45
46
129k
    static const char * const _keywords[] = {"object", NULL};
47
129k
    static _PyArg_Parser _parser = {
48
129k
        .keywords = _keywords,
49
129k
        .fname = "memoryview",
50
129k
        .kwtuple = KWTUPLE,
51
129k
    };
52
129k
    #undef KWTUPLE
53
129k
    PyObject *argsbuf[1];
54
129k
    PyObject * const *fastargs;
55
129k
    Py_ssize_t nargs = PyTuple_GET_SIZE(args);
56
129k
    PyObject *object;
57
58
129k
    fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser,
59
129k
            /*minpos*/ 1, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
60
129k
    if (!fastargs) {
61
0
        goto exit;
62
0
    }
63
129k
    object = fastargs[0];
64
129k
    return_value = memoryview_impl(type, object);
65
66
129k
exit:
67
129k
    return return_value;
68
129k
}
69
70
PyDoc_STRVAR(memoryview__from_flags__doc__,
71
"_from_flags($type, /, object, flags)\n"
72
"--\n"
73
"\n"
74
"Create a new memoryview object which references the given object.");
75
76
#define MEMORYVIEW__FROM_FLAGS_METHODDEF    \
77
    {"_from_flags", _PyCFunction_CAST(memoryview__from_flags), METH_FASTCALL|METH_KEYWORDS|METH_CLASS, memoryview__from_flags__doc__},
78
79
static PyObject *
80
memoryview__from_flags_impl(PyTypeObject *type, PyObject *object, int flags);
81
82
static PyObject *
83
memoryview__from_flags(PyObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
84
0
{
85
0
    PyObject *return_value = NULL;
86
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
87
88
0
    #define NUM_KEYWORDS 2
89
0
    static struct {
90
0
        PyGC_Head _this_is_not_used;
91
0
        PyObject_VAR_HEAD
92
0
        Py_hash_t ob_hash;
93
0
        PyObject *ob_item[NUM_KEYWORDS];
94
0
    } _kwtuple = {
95
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
96
0
        .ob_hash = -1,
97
0
        .ob_item = { &_Py_ID(object), &_Py_ID(flags), },
98
0
    };
99
0
    #undef NUM_KEYWORDS
100
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
101
102
    #else  // !Py_BUILD_CORE
103
    #  define KWTUPLE NULL
104
    #endif  // !Py_BUILD_CORE
105
106
0
    static const char * const _keywords[] = {"object", "flags", NULL};
107
0
    static _PyArg_Parser _parser = {
108
0
        .keywords = _keywords,
109
0
        .fname = "_from_flags",
110
0
        .kwtuple = KWTUPLE,
111
0
    };
112
0
    #undef KWTUPLE
113
0
    PyObject *argsbuf[2];
114
0
    PyObject *object;
115
0
    int flags;
116
117
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
118
0
            /*minpos*/ 2, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
119
0
    if (!args) {
120
0
        goto exit;
121
0
    }
122
0
    object = args[0];
123
0
    flags = PyLong_AsInt(args[1]);
124
0
    if (flags == -1 && PyErr_Occurred()) {
125
0
        goto exit;
126
0
    }
127
0
    return_value = memoryview__from_flags_impl((PyTypeObject *)type, object, flags);
128
129
0
exit:
130
0
    return return_value;
131
0
}
132
133
PyDoc_STRVAR(memoryview_release__doc__,
134
"release($self, /)\n"
135
"--\n"
136
"\n"
137
"Release the underlying buffer exposed by the memoryview object.");
138
139
#define MEMORYVIEW_RELEASE_METHODDEF    \
140
    {"release", (PyCFunction)memoryview_release, METH_NOARGS, memoryview_release__doc__},
141
142
static PyObject *
143
memoryview_release_impl(PyMemoryViewObject *self);
144
145
static PyObject *
146
memoryview_release(PyObject *self, PyObject *Py_UNUSED(ignored))
147
0
{
148
0
    return memoryview_release_impl((PyMemoryViewObject *)self);
149
0
}
150
151
PyDoc_STRVAR(memoryview___exit____doc__,
152
"__exit__($self, /, *exc_info)\n"
153
"--\n"
154
"\n"
155
"Release the underlying buffer exposed by the memoryview object.");
156
157
#define MEMORYVIEW___EXIT___METHODDEF    \
158
    {"__exit__", _PyCFunction_CAST(memoryview___exit__), METH_FASTCALL, memoryview___exit____doc__},
159
160
static PyObject *
161
memoryview___exit___impl(PyMemoryViewObject *self,
162
                         PyObject * const *exc_info,
163
                         Py_ssize_t exc_info_length);
164
165
static PyObject *
166
memoryview___exit__(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
167
68.1k
{
168
68.1k
    PyObject *return_value = NULL;
169
68.1k
    PyObject * const *exc_info;
170
68.1k
    Py_ssize_t exc_info_length;
171
172
68.1k
    exc_info = args;
173
68.1k
    exc_info_length = nargs;
174
68.1k
    return_value = memoryview___exit___impl((PyMemoryViewObject *)self, exc_info, exc_info_length);
175
176
68.1k
    return return_value;
177
68.1k
}
178
179
PyDoc_STRVAR(memoryview_cast__doc__,
180
"cast($self, /, format, shape=<unrepresentable>, *, order=\'C\')\n"
181
"--\n"
182
"\n"
183
"Cast a memoryview to a new format or shape.\n"
184
"\n"
185
"With a multidimensional *shape*, *order* selects the result\n"
186
"layout: \'C\' for C-contiguous (row-major, the default) or \'F\'\n"
187
"for Fortran-contiguous (column-major).");
188
189
#define MEMORYVIEW_CAST_METHODDEF    \
190
    {"cast", _PyCFunction_CAST(memoryview_cast), METH_FASTCALL|METH_KEYWORDS, memoryview_cast__doc__},
191
192
static PyObject *
193
memoryview_cast_impl(PyMemoryViewObject *self, PyObject *format,
194
                     PyObject *shape, int order);
195
196
static PyObject *
197
memoryview_cast(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
198
124k
{
199
124k
    PyObject *return_value = NULL;
200
124k
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
201
202
124k
    #define NUM_KEYWORDS 3
203
124k
    static struct {
204
124k
        PyGC_Head _this_is_not_used;
205
124k
        PyObject_VAR_HEAD
206
124k
        Py_hash_t ob_hash;
207
124k
        PyObject *ob_item[NUM_KEYWORDS];
208
124k
    } _kwtuple = {
209
124k
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
210
124k
        .ob_hash = -1,
211
124k
        .ob_item = { &_Py_ID(format), &_Py_ID(shape), &_Py_ID(order), },
212
124k
    };
213
124k
    #undef NUM_KEYWORDS
214
124k
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
215
216
    #else  // !Py_BUILD_CORE
217
    #  define KWTUPLE NULL
218
    #endif  // !Py_BUILD_CORE
219
220
124k
    static const char * const _keywords[] = {"format", "shape", "order", NULL};
221
124k
    static _PyArg_Parser _parser = {
222
124k
        .keywords = _keywords,
223
124k
        .fname = "cast",
224
124k
        .kwtuple = KWTUPLE,
225
124k
    };
226
124k
    #undef KWTUPLE
227
124k
    PyObject *argsbuf[3];
228
124k
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
229
124k
    PyObject *format;
230
124k
    PyObject *shape = NULL;
231
124k
    int order = 'C';
232
233
124k
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
234
124k
            /*minpos*/ 1, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
235
124k
    if (!args) {
236
0
        goto exit;
237
0
    }
238
124k
    if (!PyUnicode_Check(args[0])) {
239
0
        _PyArg_BadArgument("cast", "argument 'format'", "str", args[0]);
240
0
        goto exit;
241
0
    }
242
124k
    format = args[0];
243
124k
    if (!noptargs) {
244
124k
        goto skip_optional_pos;
245
124k
    }
246
0
    if (args[1]) {
247
0
        shape = args[1];
248
0
        if (!--noptargs) {
249
0
            goto skip_optional_pos;
250
0
        }
251
0
    }
252
124k
skip_optional_pos:
253
124k
    if (!noptargs) {
254
124k
        goto skip_optional_kwonly;
255
124k
    }
256
0
    if (!PyUnicode_Check(args[2])) {
257
0
        _PyArg_BadArgument("cast", "argument 'order'", "a unicode character", args[2]);
258
0
        goto exit;
259
0
    }
260
0
    if (PyUnicode_GET_LENGTH(args[2]) != 1) {
261
0
        PyErr_Format(PyExc_TypeError,
262
0
            "cast(): argument 'order' must be a unicode character, "
263
0
            "not a string of length %zd",
264
0
            PyUnicode_GET_LENGTH(args[2]));
265
0
        goto exit;
266
0
    }
267
0
    order = PyUnicode_READ_CHAR(args[2], 0);
268
124k
skip_optional_kwonly:
269
124k
    return_value = memoryview_cast_impl((PyMemoryViewObject *)self, format, shape, order);
270
271
124k
exit:
272
124k
    return return_value;
273
124k
}
274
275
PyDoc_STRVAR(memoryview_toreadonly__doc__,
276
"toreadonly($self, /)\n"
277
"--\n"
278
"\n"
279
"Return a readonly version of the memoryview.");
280
281
#define MEMORYVIEW_TOREADONLY_METHODDEF    \
282
    {"toreadonly", (PyCFunction)memoryview_toreadonly, METH_NOARGS, memoryview_toreadonly__doc__},
283
284
static PyObject *
285
memoryview_toreadonly_impl(PyMemoryViewObject *self);
286
287
static PyObject *
288
memoryview_toreadonly(PyObject *self, PyObject *Py_UNUSED(ignored))
289
0
{
290
0
    return memoryview_toreadonly_impl((PyMemoryViewObject *)self);
291
0
}
292
293
PyDoc_STRVAR(memoryview_tolist__doc__,
294
"tolist($self, /)\n"
295
"--\n"
296
"\n"
297
"Return the data in the buffer as a list of elements.");
298
299
#define MEMORYVIEW_TOLIST_METHODDEF    \
300
    {"tolist", (PyCFunction)memoryview_tolist, METH_NOARGS, memoryview_tolist__doc__},
301
302
static PyObject *
303
memoryview_tolist_impl(PyMemoryViewObject *self);
304
305
static PyObject *
306
memoryview_tolist(PyObject *self, PyObject *Py_UNUSED(ignored))
307
90.1k
{
308
90.1k
    return memoryview_tolist_impl((PyMemoryViewObject *)self);
309
90.1k
}
310
311
PyDoc_STRVAR(memoryview_tobytes__doc__,
312
"tobytes($self, /, order=\'C\')\n"
313
"--\n"
314
"\n"
315
"Return the data in the buffer as a byte string.\n"
316
"\n"
317
"Order can be {\'C\', \'F\', \'A\'}.  When order is \'C\' or \'F\', the data of\n"
318
"the original array is converted to C or Fortran order.  For\n"
319
"contiguous views, \'A\' returns an exact copy of the physical memory.\n"
320
"In particular, in-memory Fortran order is preserved.  For\n"
321
"non-contiguous views, the data is converted to C first.  order=None\n"
322
"is the same as order=\'C\'.");
323
324
#define MEMORYVIEW_TOBYTES_METHODDEF    \
325
    {"tobytes", _PyCFunction_CAST(memoryview_tobytes), METH_FASTCALL|METH_KEYWORDS, memoryview_tobytes__doc__},
326
327
static PyObject *
328
memoryview_tobytes_impl(PyMemoryViewObject *self, const char *order);
329
330
static PyObject *
331
memoryview_tobytes(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
332
0
{
333
0
    PyObject *return_value = NULL;
334
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
335
336
0
    #define NUM_KEYWORDS 1
337
0
    static struct {
338
0
        PyGC_Head _this_is_not_used;
339
0
        PyObject_VAR_HEAD
340
0
        Py_hash_t ob_hash;
341
0
        PyObject *ob_item[NUM_KEYWORDS];
342
0
    } _kwtuple = {
343
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
344
0
        .ob_hash = -1,
345
0
        .ob_item = { &_Py_ID(order), },
346
0
    };
347
0
    #undef NUM_KEYWORDS
348
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
349
350
    #else  // !Py_BUILD_CORE
351
    #  define KWTUPLE NULL
352
    #endif  // !Py_BUILD_CORE
353
354
0
    static const char * const _keywords[] = {"order", NULL};
355
0
    static _PyArg_Parser _parser = {
356
0
        .keywords = _keywords,
357
0
        .fname = "tobytes",
358
0
        .kwtuple = KWTUPLE,
359
0
    };
360
0
    #undef KWTUPLE
361
0
    PyObject *argsbuf[1];
362
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
363
0
    const char *order = NULL;
364
365
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
366
0
            /*minpos*/ 0, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
367
0
    if (!args) {
368
0
        goto exit;
369
0
    }
370
0
    if (!noptargs) {
371
0
        goto skip_optional_pos;
372
0
    }
373
0
    if (args[0] == Py_None) {
374
0
        order = NULL;
375
0
    }
376
0
    else if (PyUnicode_Check(args[0])) {
377
0
        order = _PyUnicode_AsUTF8NoNUL(args[0]);
378
0
        if (order == NULL) {
379
0
            goto exit;
380
0
        }
381
0
    }
382
0
    else {
383
0
        _PyArg_BadArgument("tobytes", "argument 'order'", "str or None", args[0]);
384
0
        goto exit;
385
0
    }
386
0
skip_optional_pos:
387
0
    return_value = memoryview_tobytes_impl((PyMemoryViewObject *)self, order);
388
389
0
exit:
390
0
    return return_value;
391
0
}
392
393
PyDoc_STRVAR(memoryview_hex__doc__,
394
"hex($self, /, sep=<unrepresentable>, bytes_per_sep=1)\n"
395
"--\n"
396
"\n"
397
"Return the data in the buffer as a str of hexadecimal numbers.\n"
398
"\n"
399
"  sep\n"
400
"    An optional single character or byte to separate hex bytes.\n"
401
"  bytes_per_sep\n"
402
"    How many bytes between separators.  Positive values count from\n"
403
"    the right, negative values count from the left.\n"
404
"\n"
405
"Example:\n"
406
">>> value = memoryview(b\'\\xb9\\x01\\xef\')\n"
407
">>> value.hex()\n"
408
"\'b901ef\'\n"
409
">>> value.hex(\':\')\n"
410
"\'b9:01:ef\'\n"
411
">>> value.hex(\':\', 2)\n"
412
"\'b9:01ef\'\n"
413
">>> value.hex(\':\', -2)\n"
414
"\'b901:ef\'");
415
416
#define MEMORYVIEW_HEX_METHODDEF    \
417
    {"hex", _PyCFunction_CAST(memoryview_hex), METH_FASTCALL|METH_KEYWORDS, memoryview_hex__doc__},
418
419
static PyObject *
420
memoryview_hex_impl(PyMemoryViewObject *self, PyObject *sep,
421
                    Py_ssize_t bytes_per_sep);
422
423
static PyObject *
424
memoryview_hex(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
425
0
{
426
0
    PyObject *return_value = NULL;
427
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
428
429
0
    #define NUM_KEYWORDS 2
430
0
    static struct {
431
0
        PyGC_Head _this_is_not_used;
432
0
        PyObject_VAR_HEAD
433
0
        Py_hash_t ob_hash;
434
0
        PyObject *ob_item[NUM_KEYWORDS];
435
0
    } _kwtuple = {
436
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
437
0
        .ob_hash = -1,
438
0
        .ob_item = { &_Py_ID(sep), &_Py_ID(bytes_per_sep), },
439
0
    };
440
0
    #undef NUM_KEYWORDS
441
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
442
443
    #else  // !Py_BUILD_CORE
444
    #  define KWTUPLE NULL
445
    #endif  // !Py_BUILD_CORE
446
447
0
    static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL};
448
0
    static _PyArg_Parser _parser = {
449
0
        .keywords = _keywords,
450
0
        .fname = "hex",
451
0
        .kwtuple = KWTUPLE,
452
0
    };
453
0
    #undef KWTUPLE
454
0
    PyObject *argsbuf[2];
455
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
456
0
    PyObject *sep = NULL;
457
0
    Py_ssize_t bytes_per_sep = 1;
458
459
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
460
0
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
461
0
    if (!args) {
462
0
        goto exit;
463
0
    }
464
0
    if (!noptargs) {
465
0
        goto skip_optional_pos;
466
0
    }
467
0
    if (args[0]) {
468
0
        sep = args[0];
469
0
        if (!--noptargs) {
470
0
            goto skip_optional_pos;
471
0
        }
472
0
    }
473
0
    {
474
0
        Py_ssize_t ival = -1;
475
0
        PyObject *iobj = _PyNumber_Index(args[1]);
476
0
        if (iobj != NULL) {
477
0
            ival = PyLong_AsSsize_t(iobj);
478
0
            Py_DECREF(iobj);
479
0
        }
480
0
        if (ival == -1 && PyErr_Occurred()) {
481
0
            goto exit;
482
0
        }
483
0
        bytes_per_sep = ival;
484
0
    }
485
0
skip_optional_pos:
486
0
    return_value = memoryview_hex_impl((PyMemoryViewObject *)self, sep, bytes_per_sep);
487
488
0
exit:
489
0
    return return_value;
490
0
}
491
492
PyDoc_STRVAR(memoryview_count__doc__,
493
"count($self, value, /)\n"
494
"--\n"
495
"\n"
496
"Count the number of occurrences of a value.");
497
498
#define MEMORYVIEW_COUNT_METHODDEF    \
499
    {"count", (PyCFunction)memoryview_count, METH_O, memoryview_count__doc__},
500
501
static PyObject *
502
memoryview_count_impl(PyMemoryViewObject *self, PyObject *value);
503
504
static PyObject *
505
memoryview_count(PyObject *self, PyObject *value)
506
0
{
507
0
    PyObject *return_value = NULL;
508
509
0
    return_value = memoryview_count_impl((PyMemoryViewObject *)self, value);
510
511
0
    return return_value;
512
0
}
513
514
PyDoc_STRVAR(memoryview_index__doc__,
515
"index($self, value, start=0, stop=sys.maxsize, /)\n"
516
"--\n"
517
"\n"
518
"Return the index of the first occurrence of a value.\n"
519
"\n"
520
"Raises ValueError if the value is not present.");
521
522
#define MEMORYVIEW_INDEX_METHODDEF    \
523
    {"index", _PyCFunction_CAST(memoryview_index), METH_FASTCALL, memoryview_index__doc__},
524
525
static PyObject *
526
memoryview_index_impl(PyMemoryViewObject *self, PyObject *value,
527
                      Py_ssize_t start, Py_ssize_t stop);
528
529
static PyObject *
530
memoryview_index(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
531
0
{
532
0
    PyObject *return_value = NULL;
533
0
    PyObject *value;
534
0
    Py_ssize_t start = 0;
535
0
    Py_ssize_t stop = PY_SSIZE_T_MAX;
536
537
0
    if (!_PyArg_CheckPositional("index", nargs, 1, 3)) {
538
0
        goto exit;
539
0
    }
540
0
    value = args[0];
541
0
    if (nargs < 2) {
542
0
        goto skip_optional;
543
0
    }
544
0
    if (!_PyEval_SliceIndexNotNone(args[1], &start)) {
545
0
        goto exit;
546
0
    }
547
0
    if (nargs < 3) {
548
0
        goto skip_optional;
549
0
    }
550
0
    if (!_PyEval_SliceIndexNotNone(args[2], &stop)) {
551
0
        goto exit;
552
0
    }
553
0
skip_optional:
554
0
    return_value = memoryview_index_impl((PyMemoryViewObject *)self, value, start, stop);
555
556
0
exit:
557
0
    return return_value;
558
0
}
559
/*[clinic end generated code: output=889b7cc1a94bfc9b input=a9049054013a1b77]*/