/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]*/ |