Coverage Report

Created: 2026-05-30 06:18

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