Coverage Report

Created: 2026-04-12 06:54

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
86.5k
{
253
86.5k
    return memoryview_tolist_impl((PyMemoryViewObject *)self);
254
86.5k
}
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 the\n"
263
"original array is converted to C or Fortran order. For contiguous views,\n"
264
"\'A\' returns an exact copy of the physical memory. In particular, in-memory\n"
265
"Fortran order is preserved. For non-contiguous views, the data is converted\n"
266
"to C first. order=None is the same as order=\'C\'.");
267
268
#define MEMORYVIEW_TOBYTES_METHODDEF    \
269
    {"tobytes", _PyCFunction_CAST(memoryview_tobytes), METH_FASTCALL|METH_KEYWORDS, memoryview_tobytes__doc__},
270
271
static PyObject *
272
memoryview_tobytes_impl(PyMemoryViewObject *self, const char *order);
273
274
static PyObject *
275
memoryview_tobytes(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
276
0
{
277
0
    PyObject *return_value = NULL;
278
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
279
280
0
    #define NUM_KEYWORDS 1
281
0
    static struct {
282
0
        PyGC_Head _this_is_not_used;
283
0
        PyObject_VAR_HEAD
284
0
        Py_hash_t ob_hash;
285
0
        PyObject *ob_item[NUM_KEYWORDS];
286
0
    } _kwtuple = {
287
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
288
0
        .ob_hash = -1,
289
0
        .ob_item = { &_Py_ID(order), },
290
0
    };
291
0
    #undef NUM_KEYWORDS
292
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
293
294
    #else  // !Py_BUILD_CORE
295
    #  define KWTUPLE NULL
296
    #endif  // !Py_BUILD_CORE
297
298
0
    static const char * const _keywords[] = {"order", NULL};
299
0
    static _PyArg_Parser _parser = {
300
0
        .keywords = _keywords,
301
0
        .fname = "tobytes",
302
0
        .kwtuple = KWTUPLE,
303
0
    };
304
0
    #undef KWTUPLE
305
0
    PyObject *argsbuf[1];
306
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
307
0
    const char *order = NULL;
308
309
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
310
0
            /*minpos*/ 0, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
311
0
    if (!args) {
312
0
        goto exit;
313
0
    }
314
0
    if (!noptargs) {
315
0
        goto skip_optional_pos;
316
0
    }
317
0
    if (args[0] == Py_None) {
318
0
        order = NULL;
319
0
    }
320
0
    else if (PyUnicode_Check(args[0])) {
321
0
        Py_ssize_t order_length;
322
0
        order = PyUnicode_AsUTF8AndSize(args[0], &order_length);
323
0
        if (order == NULL) {
324
0
            goto exit;
325
0
        }
326
0
        if (strlen(order) != (size_t)order_length) {
327
0
            PyErr_SetString(PyExc_ValueError, "embedded null character");
328
0
            goto exit;
329
0
        }
330
0
    }
331
0
    else {
332
0
        _PyArg_BadArgument("tobytes", "argument 'order'", "str or None", args[0]);
333
0
        goto exit;
334
0
    }
335
0
skip_optional_pos:
336
0
    return_value = memoryview_tobytes_impl((PyMemoryViewObject *)self, order);
337
338
0
exit:
339
0
    return return_value;
340
0
}
341
342
PyDoc_STRVAR(memoryview_hex__doc__,
343
"hex($self, /, sep=<unrepresentable>, bytes_per_sep=1)\n"
344
"--\n"
345
"\n"
346
"Return the data in the buffer as a str of hexadecimal numbers.\n"
347
"\n"
348
"  sep\n"
349
"    An optional single character or byte to separate hex bytes.\n"
350
"  bytes_per_sep\n"
351
"    How many bytes between separators.  Positive values count from the\n"
352
"    right, negative values count from the left.\n"
353
"\n"
354
"Example:\n"
355
">>> value = memoryview(b\'\\xb9\\x01\\xef\')\n"
356
">>> value.hex()\n"
357
"\'b901ef\'\n"
358
">>> value.hex(\':\')\n"
359
"\'b9:01:ef\'\n"
360
">>> value.hex(\':\', 2)\n"
361
"\'b9:01ef\'\n"
362
">>> value.hex(\':\', -2)\n"
363
"\'b901:ef\'");
364
365
#define MEMORYVIEW_HEX_METHODDEF    \
366
    {"hex", _PyCFunction_CAST(memoryview_hex), METH_FASTCALL|METH_KEYWORDS, memoryview_hex__doc__},
367
368
static PyObject *
369
memoryview_hex_impl(PyMemoryViewObject *self, PyObject *sep,
370
                    Py_ssize_t bytes_per_sep);
371
372
static PyObject *
373
memoryview_hex(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
374
0
{
375
0
    PyObject *return_value = NULL;
376
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
377
378
0
    #define NUM_KEYWORDS 2
379
0
    static struct {
380
0
        PyGC_Head _this_is_not_used;
381
0
        PyObject_VAR_HEAD
382
0
        Py_hash_t ob_hash;
383
0
        PyObject *ob_item[NUM_KEYWORDS];
384
0
    } _kwtuple = {
385
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
386
0
        .ob_hash = -1,
387
0
        .ob_item = { &_Py_ID(sep), &_Py_ID(bytes_per_sep), },
388
0
    };
389
0
    #undef NUM_KEYWORDS
390
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
391
392
    #else  // !Py_BUILD_CORE
393
    #  define KWTUPLE NULL
394
    #endif  // !Py_BUILD_CORE
395
396
0
    static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL};
397
0
    static _PyArg_Parser _parser = {
398
0
        .keywords = _keywords,
399
0
        .fname = "hex",
400
0
        .kwtuple = KWTUPLE,
401
0
    };
402
0
    #undef KWTUPLE
403
0
    PyObject *argsbuf[2];
404
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
405
0
    PyObject *sep = NULL;
406
0
    Py_ssize_t bytes_per_sep = 1;
407
408
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
409
0
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
410
0
    if (!args) {
411
0
        goto exit;
412
0
    }
413
0
    if (!noptargs) {
414
0
        goto skip_optional_pos;
415
0
    }
416
0
    if (args[0]) {
417
0
        sep = args[0];
418
0
        if (!--noptargs) {
419
0
            goto skip_optional_pos;
420
0
        }
421
0
    }
422
0
    {
423
0
        Py_ssize_t ival = -1;
424
0
        PyObject *iobj = _PyNumber_Index(args[1]);
425
0
        if (iobj != NULL) {
426
0
            ival = PyLong_AsSsize_t(iobj);
427
0
            Py_DECREF(iobj);
428
0
        }
429
0
        if (ival == -1 && PyErr_Occurred()) {
430
0
            goto exit;
431
0
        }
432
0
        bytes_per_sep = ival;
433
0
    }
434
0
skip_optional_pos:
435
0
    return_value = memoryview_hex_impl((PyMemoryViewObject *)self, sep, bytes_per_sep);
436
437
0
exit:
438
0
    return return_value;
439
0
}
440
441
PyDoc_STRVAR(memoryview_count__doc__,
442
"count($self, value, /)\n"
443
"--\n"
444
"\n"
445
"Count the number of occurrences of a value.");
446
447
#define MEMORYVIEW_COUNT_METHODDEF    \
448
    {"count", (PyCFunction)memoryview_count, METH_O, memoryview_count__doc__},
449
450
static PyObject *
451
memoryview_count_impl(PyMemoryViewObject *self, PyObject *value);
452
453
static PyObject *
454
memoryview_count(PyObject *self, PyObject *value)
455
0
{
456
0
    PyObject *return_value = NULL;
457
458
0
    return_value = memoryview_count_impl((PyMemoryViewObject *)self, value);
459
460
0
    return return_value;
461
0
}
462
463
PyDoc_STRVAR(memoryview_index__doc__,
464
"index($self, value, start=0, stop=sys.maxsize, /)\n"
465
"--\n"
466
"\n"
467
"Return the index of the first occurrence of a value.\n"
468
"\n"
469
"Raises ValueError if the value is not present.");
470
471
#define MEMORYVIEW_INDEX_METHODDEF    \
472
    {"index", _PyCFunction_CAST(memoryview_index), METH_FASTCALL, memoryview_index__doc__},
473
474
static PyObject *
475
memoryview_index_impl(PyMemoryViewObject *self, PyObject *value,
476
                      Py_ssize_t start, Py_ssize_t stop);
477
478
static PyObject *
479
memoryview_index(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
480
0
{
481
0
    PyObject *return_value = NULL;
482
0
    PyObject *value;
483
0
    Py_ssize_t start = 0;
484
0
    Py_ssize_t stop = PY_SSIZE_T_MAX;
485
486
0
    if (!_PyArg_CheckPositional("index", nargs, 1, 3)) {
487
0
        goto exit;
488
0
    }
489
0
    value = args[0];
490
0
    if (nargs < 2) {
491
0
        goto skip_optional;
492
0
    }
493
0
    if (!_PyEval_SliceIndexNotNone(args[1], &start)) {
494
0
        goto exit;
495
0
    }
496
0
    if (nargs < 3) {
497
0
        goto skip_optional;
498
0
    }
499
0
    if (!_PyEval_SliceIndexNotNone(args[2], &stop)) {
500
0
        goto exit;
501
0
    }
502
0
skip_optional:
503
0
    return_value = memoryview_index_impl((PyMemoryViewObject *)self, value, start, stop);
504
505
0
exit:
506
0
    return return_value;
507
0
}
508
/*[clinic end generated code: output=348b6ddb98a1f412 input=a9049054013a1b77]*/