Coverage Report

Created: 2026-10-17 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Objects/clinic/bytesobject.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(bytes___bytes____doc__,
14
"__bytes__($self, /)\n"
15
"--\n"
16
"\n"
17
"Convert this value to exact type bytes.");
18
19
#define BYTES___BYTES___METHODDEF    \
20
    {"__bytes__", (PyCFunction)bytes___bytes__, METH_NOARGS, bytes___bytes____doc__},
21
22
static PyObject *
23
bytes___bytes___impl(PyBytesObject *self);
24
25
static PyObject *
26
bytes___bytes__(PyObject *self, PyObject *Py_UNUSED(ignored))
27
39.0k
{
28
39.0k
    return bytes___bytes___impl((PyBytesObject *)self);
29
39.0k
}
30
31
PyDoc_STRVAR(bytes_split__doc__,
32
"split($self, /, sep=None, maxsplit=-1)\n"
33
"--\n"
34
"\n"
35
"Return a list of the sections in the bytes, using sep as the delimiter.\n"
36
"\n"
37
"  sep\n"
38
"    The delimiter according which to split the bytes.\n"
39
"    None (the default value) means split on ASCII whitespace\n"
40
"    characters (space, tab, return, newline, formfeed, vertical tab).\n"
41
"  maxsplit\n"
42
"    Maximum number of splits to do.\n"
43
"    -1 (the default value) means no limit.");
44
45
#define BYTES_SPLIT_METHODDEF    \
46
    {"split", _PyCFunction_CAST(bytes_split), METH_FASTCALL|METH_KEYWORDS, bytes_split__doc__},
47
48
static PyObject *
49
bytes_split_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit);
50
51
static PyObject *
52
bytes_split(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
53
2.89M
{
54
2.89M
    PyObject *return_value = NULL;
55
2.89M
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
56
57
2.89M
    #define NUM_KEYWORDS 2
58
2.89M
    static struct {
59
2.89M
        PyGC_Head _this_is_not_used;
60
2.89M
        PyObject_VAR_HEAD
61
2.89M
        Py_hash_t ob_hash;
62
2.89M
        PyObject *ob_item[NUM_KEYWORDS];
63
2.89M
    } _kwtuple = {
64
2.89M
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
65
2.89M
        .ob_hash = -1,
66
2.89M
        .ob_item = { &_Py_ID(sep), &_Py_ID(maxsplit), },
67
2.89M
    };
68
2.89M
    #undef NUM_KEYWORDS
69
2.89M
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
70
71
    #else  // !Py_BUILD_CORE
72
    #  define KWTUPLE NULL
73
    #endif  // !Py_BUILD_CORE
74
75
2.89M
    static const char * const _keywords[] = {"sep", "maxsplit", NULL};
76
2.89M
    static _PyArg_Parser _parser = {
77
2.89M
        .keywords = _keywords,
78
2.89M
        .fname = "split",
79
2.89M
        .kwtuple = KWTUPLE,
80
2.89M
    };
81
2.89M
    #undef KWTUPLE
82
2.89M
    PyObject *argsbuf[2];
83
2.89M
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
84
2.89M
    PyObject *sep = Py_None;
85
2.89M
    Py_ssize_t maxsplit = -1;
86
87
2.89M
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
88
2.89M
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
89
2.89M
    if (!args) {
90
0
        goto exit;
91
0
    }
92
2.89M
    if (!noptargs) {
93
0
        goto skip_optional_pos;
94
0
    }
95
2.89M
    if (args[0]) {
96
2.89M
        sep = args[0];
97
2.89M
        if (!--noptargs) {
98
2.89M
            goto skip_optional_pos;
99
2.89M
        }
100
2.89M
    }
101
0
    {
102
0
        Py_ssize_t ival = -1;
103
0
        PyObject *iobj = _PyNumber_Index(args[1]);
104
0
        if (iobj != NULL) {
105
0
            ival = PyLong_AsSsize_t(iobj);
106
0
            Py_DECREF(iobj);
107
0
        }
108
0
        if (ival == -1 && PyErr_Occurred()) {
109
0
            goto exit;
110
0
        }
111
0
        maxsplit = ival;
112
0
    }
113
2.89M
skip_optional_pos:
114
2.89M
    return_value = bytes_split_impl((PyBytesObject *)self, sep, maxsplit);
115
116
2.89M
exit:
117
2.89M
    return return_value;
118
2.89M
}
119
120
PyDoc_STRVAR(bytes_partition__doc__,
121
"partition($self, sep, /)\n"
122
"--\n"
123
"\n"
124
"Partition the bytes into three parts using the given separator.\n"
125
"\n"
126
"This will search for the separator sep in the bytes.  If the\n"
127
"separator is found, returns a 3-tuple containing the part before the\n"
128
"separator, the separator itself, and the part after it.\n"
129
"\n"
130
"If the separator is not found, returns a 3-tuple containing the\n"
131
"original bytes object and two empty bytes objects.");
132
133
#define BYTES_PARTITION_METHODDEF    \
134
    {"partition", (PyCFunction)bytes_partition, METH_O, bytes_partition__doc__},
135
136
static PyObject *
137
bytes_partition_impl(PyBytesObject *self, Py_buffer *sep);
138
139
static PyObject *
140
bytes_partition(PyObject *self, PyObject *arg)
141
281k
{
142
281k
    PyObject *return_value = NULL;
143
281k
    Py_buffer sep = {NULL, NULL};
144
145
281k
    if (PyObject_GetBuffer(arg, &sep, PyBUF_SIMPLE) != 0) {
146
0
        goto exit;
147
0
    }
148
281k
    return_value = bytes_partition_impl((PyBytesObject *)self, &sep);
149
150
281k
exit:
151
    /* Cleanup for sep */
152
281k
    if (sep.obj) {
153
281k
       PyBuffer_Release(&sep);
154
281k
    }
155
156
281k
    return return_value;
157
281k
}
158
159
PyDoc_STRVAR(bytes_rpartition__doc__,
160
"rpartition($self, sep, /)\n"
161
"--\n"
162
"\n"
163
"Partition the bytes into three parts using the given separator.\n"
164
"\n"
165
"This will search for the separator sep in the bytes, starting at the\n"
166
"end.  If the separator is found, returns a 3-tuple containing the\n"
167
"part before the separator, the separator itself, and the part after\n"
168
"it.\n"
169
"\n"
170
"If the separator is not found, returns a 3-tuple containing two\n"
171
"empty bytes objects and the original bytes object.");
172
173
#define BYTES_RPARTITION_METHODDEF    \
174
    {"rpartition", (PyCFunction)bytes_rpartition, METH_O, bytes_rpartition__doc__},
175
176
static PyObject *
177
bytes_rpartition_impl(PyBytesObject *self, Py_buffer *sep);
178
179
static PyObject *
180
bytes_rpartition(PyObject *self, PyObject *arg)
181
0
{
182
0
    PyObject *return_value = NULL;
183
0
    Py_buffer sep = {NULL, NULL};
184
185
0
    if (PyObject_GetBuffer(arg, &sep, PyBUF_SIMPLE) != 0) {
186
0
        goto exit;
187
0
    }
188
0
    return_value = bytes_rpartition_impl((PyBytesObject *)self, &sep);
189
190
0
exit:
191
    /* Cleanup for sep */
192
0
    if (sep.obj) {
193
0
       PyBuffer_Release(&sep);
194
0
    }
195
196
0
    return return_value;
197
0
}
198
199
PyDoc_STRVAR(bytes_rsplit__doc__,
200
"rsplit($self, /, sep=None, maxsplit=-1)\n"
201
"--\n"
202
"\n"
203
"Return a list of the sections in the bytes, using sep as the delimiter.\n"
204
"\n"
205
"  sep\n"
206
"    The delimiter according which to split the bytes.\n"
207
"    None (the default value) means split on ASCII whitespace\n"
208
"    characters (space, tab, return, newline, formfeed, vertical tab).\n"
209
"  maxsplit\n"
210
"    Maximum number of splits to do.\n"
211
"    -1 (the default value) means no limit.\n"
212
"\n"
213
"Splitting is done starting at the end of the bytes and working to\n"
214
"the front.");
215
216
#define BYTES_RSPLIT_METHODDEF    \
217
    {"rsplit", _PyCFunction_CAST(bytes_rsplit), METH_FASTCALL|METH_KEYWORDS, bytes_rsplit__doc__},
218
219
static PyObject *
220
bytes_rsplit_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit);
221
222
static PyObject *
223
bytes_rsplit(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
224
0
{
225
0
    PyObject *return_value = NULL;
226
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
227
228
0
    #define NUM_KEYWORDS 2
229
0
    static struct {
230
0
        PyGC_Head _this_is_not_used;
231
0
        PyObject_VAR_HEAD
232
0
        Py_hash_t ob_hash;
233
0
        PyObject *ob_item[NUM_KEYWORDS];
234
0
    } _kwtuple = {
235
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
236
0
        .ob_hash = -1,
237
0
        .ob_item = { &_Py_ID(sep), &_Py_ID(maxsplit), },
238
0
    };
239
0
    #undef NUM_KEYWORDS
240
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
241
242
    #else  // !Py_BUILD_CORE
243
    #  define KWTUPLE NULL
244
    #endif  // !Py_BUILD_CORE
245
246
0
    static const char * const _keywords[] = {"sep", "maxsplit", NULL};
247
0
    static _PyArg_Parser _parser = {
248
0
        .keywords = _keywords,
249
0
        .fname = "rsplit",
250
0
        .kwtuple = KWTUPLE,
251
0
    };
252
0
    #undef KWTUPLE
253
0
    PyObject *argsbuf[2];
254
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
255
0
    PyObject *sep = Py_None;
256
0
    Py_ssize_t maxsplit = -1;
257
258
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
259
0
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
260
0
    if (!args) {
261
0
        goto exit;
262
0
    }
263
0
    if (!noptargs) {
264
0
        goto skip_optional_pos;
265
0
    }
266
0
    if (args[0]) {
267
0
        sep = args[0];
268
0
        if (!--noptargs) {
269
0
            goto skip_optional_pos;
270
0
        }
271
0
    }
272
0
    {
273
0
        Py_ssize_t ival = -1;
274
0
        PyObject *iobj = _PyNumber_Index(args[1]);
275
0
        if (iobj != NULL) {
276
0
            ival = PyLong_AsSsize_t(iobj);
277
0
            Py_DECREF(iobj);
278
0
        }
279
0
        if (ival == -1 && PyErr_Occurred()) {
280
0
            goto exit;
281
0
        }
282
0
        maxsplit = ival;
283
0
    }
284
0
skip_optional_pos:
285
0
    return_value = bytes_rsplit_impl((PyBytesObject *)self, sep, maxsplit);
286
287
0
exit:
288
0
    return return_value;
289
0
}
290
291
PyDoc_STRVAR(bytes_join__doc__,
292
"join($self, iterable_of_bytes, /)\n"
293
"--\n"
294
"\n"
295
"Concatenate any number of bytes objects.\n"
296
"\n"
297
"The bytes whose method is called is inserted in between each pair.\n"
298
"\n"
299
"The result is returned as a new bytes object.\n"
300
"\n"
301
"Example: b\'.\'.join([b\'ab\', b\'pq\', b\'rs\']) -> b\'ab.pq.rs\'.");
302
303
#define BYTES_JOIN_METHODDEF    \
304
    {"join", (PyCFunction)bytes_join, METH_O, bytes_join__doc__},
305
306
static PyObject *
307
bytes_join_impl(PyBytesObject *self, PyObject *iterable_of_bytes);
308
309
static PyObject *
310
bytes_join(PyObject *self, PyObject *iterable_of_bytes)
311
140k
{
312
140k
    PyObject *return_value = NULL;
313
314
140k
    return_value = bytes_join_impl((PyBytesObject *)self, iterable_of_bytes);
315
316
140k
    return return_value;
317
140k
}
318
319
PyDoc_STRVAR(bytes_find__doc__,
320
"find($self, sub[, start[, end]], /)\n"
321
"--\n"
322
"\n"
323
"Return the lowest index in B where subsection \'sub\' is found, such that \'sub\' is contained within B[start,end].\n"
324
"\n"
325
"  start\n"
326
"    Optional start position. Default: start of the bytes.\n"
327
"  end\n"
328
"    Optional stop position. Default: end of the bytes.\n"
329
"\n"
330
"Return -1 on failure.");
331
332
#define BYTES_FIND_METHODDEF    \
333
    {"find", _PyCFunction_CAST(bytes_find), METH_FASTCALL, bytes_find__doc__},
334
335
static PyObject *
336
bytes_find_impl(PyBytesObject *self, PyObject *sub, Py_ssize_t start,
337
                Py_ssize_t end);
338
339
static PyObject *
340
bytes_find(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
341
11.2M
{
342
11.2M
    PyObject *return_value = NULL;
343
11.2M
    PyObject *sub;
344
11.2M
    Py_ssize_t start = 0;
345
11.2M
    Py_ssize_t end = PY_SSIZE_T_MAX;
346
347
11.2M
    if (!_PyArg_CheckPositional("find", nargs, 1, 3)) {
348
0
        goto exit;
349
0
    }
350
11.2M
    sub = args[0];
351
11.2M
    if (nargs < 2) {
352
11.1M
        goto skip_optional;
353
11.1M
    }
354
119k
    if (!_PyEval_SliceIndex(args[1], &start)) {
355
0
        goto exit;
356
0
    }
357
119k
    if (nargs < 3) {
358
119k
        goto skip_optional;
359
119k
    }
360
0
    if (!_PyEval_SliceIndex(args[2], &end)) {
361
0
        goto exit;
362
0
    }
363
11.2M
skip_optional:
364
11.2M
    return_value = bytes_find_impl((PyBytesObject *)self, sub, start, end);
365
366
11.2M
exit:
367
11.2M
    return return_value;
368
11.2M
}
369
370
PyDoc_STRVAR(bytes_index__doc__,
371
"index($self, sub[, start[, end]], /)\n"
372
"--\n"
373
"\n"
374
"Return the lowest index in B where subsection \'sub\' is found, such that \'sub\' is contained within B[start,end].\n"
375
"\n"
376
"  start\n"
377
"    Optional start position. Default: start of the bytes.\n"
378
"  end\n"
379
"    Optional stop position. Default: end of the bytes.\n"
380
"\n"
381
"Raise ValueError if the subsection is not found.");
382
383
#define BYTES_INDEX_METHODDEF    \
384
    {"index", _PyCFunction_CAST(bytes_index), METH_FASTCALL, bytes_index__doc__},
385
386
static PyObject *
387
bytes_index_impl(PyBytesObject *self, PyObject *sub, Py_ssize_t start,
388
                 Py_ssize_t end);
389
390
static PyObject *
391
bytes_index(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
392
0
{
393
0
    PyObject *return_value = NULL;
394
0
    PyObject *sub;
395
0
    Py_ssize_t start = 0;
396
0
    Py_ssize_t end = PY_SSIZE_T_MAX;
397
398
0
    if (!_PyArg_CheckPositional("index", nargs, 1, 3)) {
399
0
        goto exit;
400
0
    }
401
0
    sub = args[0];
402
0
    if (nargs < 2) {
403
0
        goto skip_optional;
404
0
    }
405
0
    if (!_PyEval_SliceIndex(args[1], &start)) {
406
0
        goto exit;
407
0
    }
408
0
    if (nargs < 3) {
409
0
        goto skip_optional;
410
0
    }
411
0
    if (!_PyEval_SliceIndex(args[2], &end)) {
412
0
        goto exit;
413
0
    }
414
0
skip_optional:
415
0
    return_value = bytes_index_impl((PyBytesObject *)self, sub, start, end);
416
417
0
exit:
418
0
    return return_value;
419
0
}
420
421
PyDoc_STRVAR(bytes_rfind__doc__,
422
"rfind($self, sub[, start[, end]], /)\n"
423
"--\n"
424
"\n"
425
"Return the highest index in B where subsection \'sub\' is found, such that \'sub\' is contained within B[start,end].\n"
426
"\n"
427
"  start\n"
428
"    Optional start position. Default: start of the bytes.\n"
429
"  end\n"
430
"    Optional stop position. Default: end of the bytes.\n"
431
"\n"
432
"Return -1 on failure.");
433
434
#define BYTES_RFIND_METHODDEF    \
435
    {"rfind", _PyCFunction_CAST(bytes_rfind), METH_FASTCALL, bytes_rfind__doc__},
436
437
static PyObject *
438
bytes_rfind_impl(PyBytesObject *self, PyObject *sub, Py_ssize_t start,
439
                 Py_ssize_t end);
440
441
static PyObject *
442
bytes_rfind(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
443
1.19M
{
444
1.19M
    PyObject *return_value = NULL;
445
1.19M
    PyObject *sub;
446
1.19M
    Py_ssize_t start = 0;
447
1.19M
    Py_ssize_t end = PY_SSIZE_T_MAX;
448
449
1.19M
    if (!_PyArg_CheckPositional("rfind", nargs, 1, 3)) {
450
0
        goto exit;
451
0
    }
452
1.19M
    sub = args[0];
453
1.19M
    if (nargs < 2) {
454
1.19M
        goto skip_optional;
455
1.19M
    }
456
0
    if (!_PyEval_SliceIndex(args[1], &start)) {
457
0
        goto exit;
458
0
    }
459
0
    if (nargs < 3) {
460
0
        goto skip_optional;
461
0
    }
462
0
    if (!_PyEval_SliceIndex(args[2], &end)) {
463
0
        goto exit;
464
0
    }
465
1.19M
skip_optional:
466
1.19M
    return_value = bytes_rfind_impl((PyBytesObject *)self, sub, start, end);
467
468
1.19M
exit:
469
1.19M
    return return_value;
470
1.19M
}
471
472
PyDoc_STRVAR(bytes_rindex__doc__,
473
"rindex($self, sub[, start[, end]], /)\n"
474
"--\n"
475
"\n"
476
"Return the highest index in B where subsection \'sub\' is found, such that \'sub\' is contained within B[start,end].\n"
477
"\n"
478
"  start\n"
479
"    Optional start position. Default: start of the bytes.\n"
480
"  end\n"
481
"    Optional stop position. Default: end of the bytes.\n"
482
"\n"
483
"Raise ValueError if the subsection is not found.");
484
485
#define BYTES_RINDEX_METHODDEF    \
486
    {"rindex", _PyCFunction_CAST(bytes_rindex), METH_FASTCALL, bytes_rindex__doc__},
487
488
static PyObject *
489
bytes_rindex_impl(PyBytesObject *self, PyObject *sub, Py_ssize_t start,
490
                  Py_ssize_t end);
491
492
static PyObject *
493
bytes_rindex(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
494
0
{
495
0
    PyObject *return_value = NULL;
496
0
    PyObject *sub;
497
0
    Py_ssize_t start = 0;
498
0
    Py_ssize_t end = PY_SSIZE_T_MAX;
499
500
0
    if (!_PyArg_CheckPositional("rindex", nargs, 1, 3)) {
501
0
        goto exit;
502
0
    }
503
0
    sub = args[0];
504
0
    if (nargs < 2) {
505
0
        goto skip_optional;
506
0
    }
507
0
    if (!_PyEval_SliceIndex(args[1], &start)) {
508
0
        goto exit;
509
0
    }
510
0
    if (nargs < 3) {
511
0
        goto skip_optional;
512
0
    }
513
0
    if (!_PyEval_SliceIndex(args[2], &end)) {
514
0
        goto exit;
515
0
    }
516
0
skip_optional:
517
0
    return_value = bytes_rindex_impl((PyBytesObject *)self, sub, start, end);
518
519
0
exit:
520
0
    return return_value;
521
0
}
522
523
PyDoc_STRVAR(bytes_strip__doc__,
524
"strip($self, bytes=None, /)\n"
525
"--\n"
526
"\n"
527
"Strip leading and trailing bytes contained in the argument.\n"
528
"\n"
529
"If the argument is omitted or None, strip leading and trailing ASCII\n"
530
"whitespace.");
531
532
#define BYTES_STRIP_METHODDEF    \
533
    {"strip", _PyCFunction_CAST(bytes_strip), METH_FASTCALL, bytes_strip__doc__},
534
535
static PyObject *
536
bytes_strip_impl(PyBytesObject *self, PyObject *bytes);
537
538
static PyObject *
539
bytes_strip(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
540
0
{
541
0
    PyObject *return_value = NULL;
542
0
    PyObject *bytes = Py_None;
543
544
0
    if (!_PyArg_CheckPositional("strip", nargs, 0, 1)) {
545
0
        goto exit;
546
0
    }
547
0
    if (nargs < 1) {
548
0
        goto skip_optional;
549
0
    }
550
0
    bytes = args[0];
551
0
skip_optional:
552
0
    return_value = bytes_strip_impl((PyBytesObject *)self, bytes);
553
554
0
exit:
555
0
    return return_value;
556
0
}
557
558
PyDoc_STRVAR(bytes_lstrip__doc__,
559
"lstrip($self, bytes=None, /)\n"
560
"--\n"
561
"\n"
562
"Strip leading bytes contained in the argument.\n"
563
"\n"
564
"If the argument is omitted or None, strip leading  ASCII whitespace.");
565
566
#define BYTES_LSTRIP_METHODDEF    \
567
    {"lstrip", _PyCFunction_CAST(bytes_lstrip), METH_FASTCALL, bytes_lstrip__doc__},
568
569
static PyObject *
570
bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes);
571
572
static PyObject *
573
bytes_lstrip(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
574
0
{
575
0
    PyObject *return_value = NULL;
576
0
    PyObject *bytes = Py_None;
577
578
0
    if (!_PyArg_CheckPositional("lstrip", nargs, 0, 1)) {
579
0
        goto exit;
580
0
    }
581
0
    if (nargs < 1) {
582
0
        goto skip_optional;
583
0
    }
584
0
    bytes = args[0];
585
0
skip_optional:
586
0
    return_value = bytes_lstrip_impl((PyBytesObject *)self, bytes);
587
588
0
exit:
589
0
    return return_value;
590
0
}
591
592
PyDoc_STRVAR(bytes_rstrip__doc__,
593
"rstrip($self, bytes=None, /)\n"
594
"--\n"
595
"\n"
596
"Strip trailing bytes contained in the argument.\n"
597
"\n"
598
"If the argument is omitted or None, strip trailing ASCII whitespace.");
599
600
#define BYTES_RSTRIP_METHODDEF    \
601
    {"rstrip", _PyCFunction_CAST(bytes_rstrip), METH_FASTCALL, bytes_rstrip__doc__},
602
603
static PyObject *
604
bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes);
605
606
static PyObject *
607
bytes_rstrip(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
608
683
{
609
683
    PyObject *return_value = NULL;
610
683
    PyObject *bytes = Py_None;
611
612
683
    if (!_PyArg_CheckPositional("rstrip", nargs, 0, 1)) {
613
0
        goto exit;
614
0
    }
615
683
    if (nargs < 1) {
616
0
        goto skip_optional;
617
0
    }
618
683
    bytes = args[0];
619
683
skip_optional:
620
683
    return_value = bytes_rstrip_impl((PyBytesObject *)self, bytes);
621
622
683
exit:
623
683
    return return_value;
624
683
}
625
626
PyDoc_STRVAR(bytes_count__doc__,
627
"count($self, sub[, start[, end]], /)\n"
628
"--\n"
629
"\n"
630
"Return the number of non-overlapping occurrences of subsection \'sub\' in bytes B[start:end].\n"
631
"\n"
632
"  start\n"
633
"    Optional start position. Default: start of the bytes.\n"
634
"  end\n"
635
"    Optional stop position. Default: end of the bytes.");
636
637
#define BYTES_COUNT_METHODDEF    \
638
    {"count", _PyCFunction_CAST(bytes_count), METH_FASTCALL, bytes_count__doc__},
639
640
static PyObject *
641
bytes_count_impl(PyBytesObject *self, PyObject *sub, Py_ssize_t start,
642
                 Py_ssize_t end);
643
644
static PyObject *
645
bytes_count(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
646
5.54M
{
647
5.54M
    PyObject *return_value = NULL;
648
5.54M
    PyObject *sub;
649
5.54M
    Py_ssize_t start = 0;
650
5.54M
    Py_ssize_t end = PY_SSIZE_T_MAX;
651
652
5.54M
    if (!_PyArg_CheckPositional("count", nargs, 1, 3)) {
653
0
        goto exit;
654
0
    }
655
5.54M
    sub = args[0];
656
5.54M
    if (nargs < 2) {
657
5.54M
        goto skip_optional;
658
5.54M
    }
659
0
    if (!_PyEval_SliceIndex(args[1], &start)) {
660
0
        goto exit;
661
0
    }
662
0
    if (nargs < 3) {
663
0
        goto skip_optional;
664
0
    }
665
0
    if (!_PyEval_SliceIndex(args[2], &end)) {
666
0
        goto exit;
667
0
    }
668
5.54M
skip_optional:
669
5.54M
    return_value = bytes_count_impl((PyBytesObject *)self, sub, start, end);
670
671
5.54M
exit:
672
5.54M
    return return_value;
673
5.54M
}
674
675
PyDoc_STRVAR(bytes_translate__doc__,
676
"translate($self, table, /, delete=b\'\')\n"
677
"--\n"
678
"\n"
679
"Return a copy with each character mapped by the given translation table.\n"
680
"\n"
681
"  table\n"
682
"    Translation table, which must be a bytes object of length 256.\n"
683
"\n"
684
"All characters occurring in the optional argument delete are\n"
685
"removed.  The remaining characters are mapped through the given\n"
686
"translation table.");
687
688
#define BYTES_TRANSLATE_METHODDEF    \
689
    {"translate", _PyCFunction_CAST(bytes_translate), METH_FASTCALL|METH_KEYWORDS, bytes_translate__doc__},
690
691
static PyObject *
692
bytes_translate_impl(PyBytesObject *self, PyObject *table,
693
                     PyObject *deletechars);
694
695
static PyObject *
696
bytes_translate(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
697
0
{
698
0
    PyObject *return_value = NULL;
699
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
700
701
0
    #define NUM_KEYWORDS 1
702
0
    static struct {
703
0
        PyGC_Head _this_is_not_used;
704
0
        PyObject_VAR_HEAD
705
0
        Py_hash_t ob_hash;
706
0
        PyObject *ob_item[NUM_KEYWORDS];
707
0
    } _kwtuple = {
708
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
709
0
        .ob_hash = -1,
710
0
        .ob_item = { &_Py_ID(delete), },
711
0
    };
712
0
    #undef NUM_KEYWORDS
713
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
714
715
    #else  // !Py_BUILD_CORE
716
    #  define KWTUPLE NULL
717
    #endif  // !Py_BUILD_CORE
718
719
0
    static const char * const _keywords[] = {"", "delete", NULL};
720
0
    static _PyArg_Parser _parser = {
721
0
        .keywords = _keywords,
722
0
        .fname = "translate",
723
0
        .kwtuple = KWTUPLE,
724
0
    };
725
0
    #undef KWTUPLE
726
0
    PyObject *argsbuf[2];
727
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
728
0
    PyObject *table;
729
0
    PyObject *deletechars = NULL;
730
731
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
732
0
            /*minpos*/ 1, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
733
0
    if (!args) {
734
0
        goto exit;
735
0
    }
736
0
    table = args[0];
737
0
    if (!noptargs) {
738
0
        goto skip_optional_pos;
739
0
    }
740
0
    deletechars = args[1];
741
0
skip_optional_pos:
742
0
    return_value = bytes_translate_impl((PyBytesObject *)self, table, deletechars);
743
744
0
exit:
745
0
    return return_value;
746
0
}
747
748
PyDoc_STRVAR(bytes_maketrans__doc__,
749
"maketrans(frm, to, /)\n"
750
"--\n"
751
"\n"
752
"Return a translation table usable for the bytes or bytearray translate method.\n"
753
"\n"
754
"The returned table will be one where each byte in frm is mapped to\n"
755
"the byte at the same position in to.\n"
756
"\n"
757
"The bytes objects frm and to must be of the same length.");
758
759
#define BYTES_MAKETRANS_METHODDEF    \
760
    {"maketrans", _PyCFunction_CAST(bytes_maketrans), METH_FASTCALL|METH_STATIC, bytes_maketrans__doc__},
761
762
static PyObject *
763
bytes_maketrans_impl(Py_buffer *frm, Py_buffer *to);
764
765
static PyObject *
766
bytes_maketrans(PyObject *null, PyObject *const *args, Py_ssize_t nargs)
767
9
{
768
9
    PyObject *return_value = NULL;
769
9
    Py_buffer frm = {NULL, NULL};
770
9
    Py_buffer to = {NULL, NULL};
771
772
9
    if (!_PyArg_CheckPositional("maketrans", nargs, 2, 2)) {
773
0
        goto exit;
774
0
    }
775
9
    if (PyObject_GetBuffer(args[0], &frm, PyBUF_SIMPLE) != 0) {
776
0
        goto exit;
777
0
    }
778
9
    if (PyObject_GetBuffer(args[1], &to, PyBUF_SIMPLE) != 0) {
779
0
        goto exit;
780
0
    }
781
9
    return_value = bytes_maketrans_impl(&frm, &to);
782
783
9
exit:
784
    /* Cleanup for frm */
785
9
    if (frm.obj) {
786
9
       PyBuffer_Release(&frm);
787
9
    }
788
    /* Cleanup for to */
789
9
    if (to.obj) {
790
9
       PyBuffer_Release(&to);
791
9
    }
792
793
9
    return return_value;
794
9
}
795
796
PyDoc_STRVAR(bytes_replace__doc__,
797
"replace($self, old, new, /, count=-1)\n"
798
"--\n"
799
"\n"
800
"Return a copy with all occurrences of substring old replaced by new.\n"
801
"\n"
802
"  count\n"
803
"    Maximum number of occurrences to replace.\n"
804
"    -1 (the default value) means replace all occurrences.\n"
805
"\n"
806
"If count is given, only the first count occurrences are replaced.\n"
807
"If count is not specified or -1, then all occurrences are replaced.");
808
809
#define BYTES_REPLACE_METHODDEF    \
810
    {"replace", _PyCFunction_CAST(bytes_replace), METH_FASTCALL|METH_KEYWORDS, bytes_replace__doc__},
811
812
static PyObject *
813
bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new,
814
                   Py_ssize_t count);
815
816
static PyObject *
817
bytes_replace(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
818
32.5k
{
819
32.5k
    PyObject *return_value = NULL;
820
32.5k
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
821
822
32.5k
    #define NUM_KEYWORDS 1
823
32.5k
    static struct {
824
32.5k
        PyGC_Head _this_is_not_used;
825
32.5k
        PyObject_VAR_HEAD
826
32.5k
        Py_hash_t ob_hash;
827
32.5k
        PyObject *ob_item[NUM_KEYWORDS];
828
32.5k
    } _kwtuple = {
829
32.5k
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
830
32.5k
        .ob_hash = -1,
831
32.5k
        .ob_item = { &_Py_ID(count), },
832
32.5k
    };
833
32.5k
    #undef NUM_KEYWORDS
834
32.5k
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
835
836
    #else  // !Py_BUILD_CORE
837
    #  define KWTUPLE NULL
838
    #endif  // !Py_BUILD_CORE
839
840
32.5k
    static const char * const _keywords[] = {"", "", "count", NULL};
841
32.5k
    static _PyArg_Parser _parser = {
842
32.5k
        .keywords = _keywords,
843
32.5k
        .fname = "replace",
844
32.5k
        .kwtuple = KWTUPLE,
845
32.5k
    };
846
32.5k
    #undef KWTUPLE
847
32.5k
    PyObject *argsbuf[3];
848
32.5k
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
849
32.5k
    Py_buffer old = {NULL, NULL};
850
32.5k
    Py_buffer new = {NULL, NULL};
851
32.5k
    Py_ssize_t count = -1;
852
853
32.5k
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
854
32.5k
            /*minpos*/ 2, /*maxpos*/ 3, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
855
32.5k
    if (!args) {
856
0
        goto exit;
857
0
    }
858
32.5k
    if (PyObject_GetBuffer(args[0], &old, PyBUF_SIMPLE) != 0) {
859
0
        goto exit;
860
0
    }
861
32.5k
    if (PyObject_GetBuffer(args[1], &new, PyBUF_SIMPLE) != 0) {
862
0
        goto exit;
863
0
    }
864
32.5k
    if (!noptargs) {
865
32.5k
        goto skip_optional_pos;
866
32.5k
    }
867
0
    {
868
0
        Py_ssize_t ival = -1;
869
0
        PyObject *iobj = _PyNumber_Index(args[2]);
870
0
        if (iobj != NULL) {
871
0
            ival = PyLong_AsSsize_t(iobj);
872
0
            Py_DECREF(iobj);
873
0
        }
874
0
        if (ival == -1 && PyErr_Occurred()) {
875
0
            goto exit;
876
0
        }
877
0
        count = ival;
878
0
    }
879
32.5k
skip_optional_pos:
880
32.5k
    return_value = bytes_replace_impl((PyBytesObject *)self, &old, &new, count);
881
882
32.5k
exit:
883
    /* Cleanup for old */
884
32.5k
    if (old.obj) {
885
32.5k
       PyBuffer_Release(&old);
886
32.5k
    }
887
    /* Cleanup for new */
888
32.5k
    if (new.obj) {
889
32.5k
       PyBuffer_Release(&new);
890
32.5k
    }
891
892
32.5k
    return return_value;
893
32.5k
}
894
895
PyDoc_STRVAR(bytes_removeprefix__doc__,
896
"removeprefix($self, prefix, /)\n"
897
"--\n"
898
"\n"
899
"Return a bytes object with the given prefix string removed if present.\n"
900
"\n"
901
"If the bytes starts with the prefix string, return\n"
902
"bytes[len(prefix):].  Otherwise, return a copy of the original\n"
903
"bytes.");
904
905
#define BYTES_REMOVEPREFIX_METHODDEF    \
906
    {"removeprefix", (PyCFunction)bytes_removeprefix, METH_O, bytes_removeprefix__doc__},
907
908
static PyObject *
909
bytes_removeprefix_impl(PyBytesObject *self, Py_buffer *prefix);
910
911
static PyObject *
912
bytes_removeprefix(PyObject *self, PyObject *arg)
913
0
{
914
0
    PyObject *return_value = NULL;
915
0
    Py_buffer prefix = {NULL, NULL};
916
917
0
    if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) {
918
0
        goto exit;
919
0
    }
920
0
    return_value = bytes_removeprefix_impl((PyBytesObject *)self, &prefix);
921
922
0
exit:
923
    /* Cleanup for prefix */
924
0
    if (prefix.obj) {
925
0
       PyBuffer_Release(&prefix);
926
0
    }
927
928
0
    return return_value;
929
0
}
930
931
PyDoc_STRVAR(bytes_removesuffix__doc__,
932
"removesuffix($self, suffix, /)\n"
933
"--\n"
934
"\n"
935
"Return a bytes object with the given suffix string removed if present.\n"
936
"\n"
937
"If the bytes ends with the suffix string and that suffix is not\n"
938
"empty, return bytes[:-len(prefix)].  Otherwise, return a copy of the\n"
939
"original bytes.");
940
941
#define BYTES_REMOVESUFFIX_METHODDEF    \
942
    {"removesuffix", (PyCFunction)bytes_removesuffix, METH_O, bytes_removesuffix__doc__},
943
944
static PyObject *
945
bytes_removesuffix_impl(PyBytesObject *self, Py_buffer *suffix);
946
947
static PyObject *
948
bytes_removesuffix(PyObject *self, PyObject *arg)
949
0
{
950
0
    PyObject *return_value = NULL;
951
0
    Py_buffer suffix = {NULL, NULL};
952
953
0
    if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) {
954
0
        goto exit;
955
0
    }
956
0
    return_value = bytes_removesuffix_impl((PyBytesObject *)self, &suffix);
957
958
0
exit:
959
    /* Cleanup for suffix */
960
0
    if (suffix.obj) {
961
0
       PyBuffer_Release(&suffix);
962
0
    }
963
964
0
    return return_value;
965
0
}
966
967
PyDoc_STRVAR(bytes_startswith__doc__,
968
"startswith($self, prefix[, start[, end]], /)\n"
969
"--\n"
970
"\n"
971
"Return True if the bytes starts with the specified prefix, False otherwise.\n"
972
"\n"
973
"  prefix\n"
974
"    A bytes or a tuple of bytes to try.\n"
975
"  start\n"
976
"    Optional start position. Default: start of the bytes.\n"
977
"  end\n"
978
"    Optional stop position. Default: end of the bytes.");
979
980
#define BYTES_STARTSWITH_METHODDEF    \
981
    {"startswith", _PyCFunction_CAST(bytes_startswith), METH_FASTCALL, bytes_startswith__doc__},
982
983
static PyObject *
984
bytes_startswith_impl(PyBytesObject *self, PyObject *subobj,
985
                      Py_ssize_t start, Py_ssize_t end);
986
987
static PyObject *
988
bytes_startswith(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
989
7.56M
{
990
7.56M
    PyObject *return_value = NULL;
991
7.56M
    PyObject *subobj;
992
7.56M
    Py_ssize_t start = 0;
993
7.56M
    Py_ssize_t end = PY_SSIZE_T_MAX;
994
995
7.56M
    if (!_PyArg_CheckPositional("startswith", nargs, 1, 3)) {
996
0
        goto exit;
997
0
    }
998
7.56M
    subobj = args[0];
999
7.56M
    if (nargs < 2) {
1000
7.56M
        goto skip_optional;
1001
7.56M
    }
1002
0
    if (!_PyEval_SliceIndex(args[1], &start)) {
1003
0
        goto exit;
1004
0
    }
1005
0
    if (nargs < 3) {
1006
0
        goto skip_optional;
1007
0
    }
1008
0
    if (!_PyEval_SliceIndex(args[2], &end)) {
1009
0
        goto exit;
1010
0
    }
1011
7.56M
skip_optional:
1012
7.56M
    return_value = bytes_startswith_impl((PyBytesObject *)self, subobj, start, end);
1013
1014
7.56M
exit:
1015
7.56M
    return return_value;
1016
7.56M
}
1017
1018
PyDoc_STRVAR(bytes_endswith__doc__,
1019
"endswith($self, suffix[, start[, end]], /)\n"
1020
"--\n"
1021
"\n"
1022
"Return True if the bytes ends with the specified suffix, False otherwise.\n"
1023
"\n"
1024
"  suffix\n"
1025
"    A bytes or a tuple of bytes to try.\n"
1026
"  start\n"
1027
"    Optional start position. Default: start of the bytes.\n"
1028
"  end\n"
1029
"    Optional stop position. Default: end of the bytes.");
1030
1031
#define BYTES_ENDSWITH_METHODDEF    \
1032
    {"endswith", _PyCFunction_CAST(bytes_endswith), METH_FASTCALL, bytes_endswith__doc__},
1033
1034
static PyObject *
1035
bytes_endswith_impl(PyBytesObject *self, PyObject *subobj, Py_ssize_t start,
1036
                    Py_ssize_t end);
1037
1038
static PyObject *
1039
bytes_endswith(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
1040
713
{
1041
713
    PyObject *return_value = NULL;
1042
713
    PyObject *subobj;
1043
713
    Py_ssize_t start = 0;
1044
713
    Py_ssize_t end = PY_SSIZE_T_MAX;
1045
1046
713
    if (!_PyArg_CheckPositional("endswith", nargs, 1, 3)) {
1047
0
        goto exit;
1048
0
    }
1049
713
    subobj = args[0];
1050
713
    if (nargs < 2) {
1051
713
        goto skip_optional;
1052
713
    }
1053
0
    if (!_PyEval_SliceIndex(args[1], &start)) {
1054
0
        goto exit;
1055
0
    }
1056
0
    if (nargs < 3) {
1057
0
        goto skip_optional;
1058
0
    }
1059
0
    if (!_PyEval_SliceIndex(args[2], &end)) {
1060
0
        goto exit;
1061
0
    }
1062
713
skip_optional:
1063
713
    return_value = bytes_endswith_impl((PyBytesObject *)self, subobj, start, end);
1064
1065
713
exit:
1066
713
    return return_value;
1067
713
}
1068
1069
PyDoc_STRVAR(bytes_decode__doc__,
1070
"decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n"
1071
"--\n"
1072
"\n"
1073
"Decode the bytes using the codec registered for encoding.\n"
1074
"\n"
1075
"  encoding\n"
1076
"    The encoding with which to decode the bytes.\n"
1077
"  errors\n"
1078
"    The error handling scheme to use for the handling of decoding\n"
1079
"    errors.  The default is \'strict\' meaning that decoding errors\n"
1080
"    raise a UnicodeDecodeError.  Other possible values are \'ignore\'\n"
1081
"    and \'replace\' as well as any other name registered with\n"
1082
"    codecs.register_error that can handle UnicodeDecodeErrors.");
1083
1084
#define BYTES_DECODE_METHODDEF    \
1085
    {"decode", _PyCFunction_CAST(bytes_decode), METH_FASTCALL|METH_KEYWORDS, bytes_decode__doc__},
1086
1087
static PyObject *
1088
bytes_decode_impl(PyBytesObject *self, const char *encoding,
1089
                  const char *errors);
1090
1091
static PyObject *
1092
bytes_decode(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1093
18.4M
{
1094
18.4M
    PyObject *return_value = NULL;
1095
18.4M
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1096
1097
18.4M
    #define NUM_KEYWORDS 2
1098
18.4M
    static struct {
1099
18.4M
        PyGC_Head _this_is_not_used;
1100
18.4M
        PyObject_VAR_HEAD
1101
18.4M
        Py_hash_t ob_hash;
1102
18.4M
        PyObject *ob_item[NUM_KEYWORDS];
1103
18.4M
    } _kwtuple = {
1104
18.4M
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1105
18.4M
        .ob_hash = -1,
1106
18.4M
        .ob_item = { &_Py_ID(encoding), &_Py_ID(errors), },
1107
18.4M
    };
1108
18.4M
    #undef NUM_KEYWORDS
1109
18.4M
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1110
1111
    #else  // !Py_BUILD_CORE
1112
    #  define KWTUPLE NULL
1113
    #endif  // !Py_BUILD_CORE
1114
1115
18.4M
    static const char * const _keywords[] = {"encoding", "errors", NULL};
1116
18.4M
    static _PyArg_Parser _parser = {
1117
18.4M
        .keywords = _keywords,
1118
18.4M
        .fname = "decode",
1119
18.4M
        .kwtuple = KWTUPLE,
1120
18.4M
    };
1121
18.4M
    #undef KWTUPLE
1122
18.4M
    PyObject *argsbuf[2];
1123
18.4M
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
1124
18.4M
    const char *encoding = NULL;
1125
18.4M
    const char *errors = NULL;
1126
1127
18.4M
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
1128
18.4M
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
1129
18.4M
    if (!args) {
1130
0
        goto exit;
1131
0
    }
1132
18.4M
    if (!noptargs) {
1133
88.9k
        goto skip_optional_pos;
1134
88.9k
    }
1135
18.4M
    if (args[0]) {
1136
18.4M
        if (!PyUnicode_Check(args[0])) {
1137
0
            _PyArg_BadArgument("decode", "argument 'encoding'", "str", args[0]);
1138
0
            goto exit;
1139
0
        }
1140
18.4M
        encoding = _PyUnicode_AsUTF8NoNUL(args[0]);
1141
18.4M
        if (encoding == NULL) {
1142
1.64k
            goto exit;
1143
1.64k
        }
1144
18.4M
        if (!--noptargs) {
1145
3.42M
            goto skip_optional_pos;
1146
3.42M
        }
1147
18.4M
    }
1148
14.9M
    if (!PyUnicode_Check(args[1])) {
1149
0
        _PyArg_BadArgument("decode", "argument 'errors'", "str", args[1]);
1150
0
        goto exit;
1151
0
    }
1152
14.9M
    errors = _PyUnicode_AsUTF8NoNUL(args[1]);
1153
14.9M
    if (errors == NULL) {
1154
0
        goto exit;
1155
0
    }
1156
18.4M
skip_optional_pos:
1157
18.4M
    return_value = bytes_decode_impl((PyBytesObject *)self, encoding, errors);
1158
1159
18.4M
exit:
1160
18.4M
    return return_value;
1161
18.4M
}
1162
1163
PyDoc_STRVAR(bytes_splitlines__doc__,
1164
"splitlines($self, /, keepends=False)\n"
1165
"--\n"
1166
"\n"
1167
"Return a list of the lines in the bytes, breaking at line boundaries.\n"
1168
"\n"
1169
"Line breaks are not included in the resulting list unless keepends\n"
1170
"is given and true.");
1171
1172
#define BYTES_SPLITLINES_METHODDEF    \
1173
    {"splitlines", _PyCFunction_CAST(bytes_splitlines), METH_FASTCALL|METH_KEYWORDS, bytes_splitlines__doc__},
1174
1175
static PyObject *
1176
bytes_splitlines_impl(PyBytesObject *self, int keepends);
1177
1178
static PyObject *
1179
bytes_splitlines(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1180
0
{
1181
0
    PyObject *return_value = NULL;
1182
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1183
1184
0
    #define NUM_KEYWORDS 1
1185
0
    static struct {
1186
0
        PyGC_Head _this_is_not_used;
1187
0
        PyObject_VAR_HEAD
1188
0
        Py_hash_t ob_hash;
1189
0
        PyObject *ob_item[NUM_KEYWORDS];
1190
0
    } _kwtuple = {
1191
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1192
0
        .ob_hash = -1,
1193
0
        .ob_item = { &_Py_ID(keepends), },
1194
0
    };
1195
0
    #undef NUM_KEYWORDS
1196
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1197
1198
    #else  // !Py_BUILD_CORE
1199
    #  define KWTUPLE NULL
1200
    #endif  // !Py_BUILD_CORE
1201
1202
0
    static const char * const _keywords[] = {"keepends", NULL};
1203
0
    static _PyArg_Parser _parser = {
1204
0
        .keywords = _keywords,
1205
0
        .fname = "splitlines",
1206
0
        .kwtuple = KWTUPLE,
1207
0
    };
1208
0
    #undef KWTUPLE
1209
0
    PyObject *argsbuf[1];
1210
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
1211
0
    int keepends = 0;
1212
1213
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
1214
0
            /*minpos*/ 0, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
1215
0
    if (!args) {
1216
0
        goto exit;
1217
0
    }
1218
0
    if (!noptargs) {
1219
0
        goto skip_optional_pos;
1220
0
    }
1221
0
    keepends = PyObject_IsTrue(args[0]);
1222
0
    if (keepends < 0) {
1223
0
        goto exit;
1224
0
    }
1225
0
skip_optional_pos:
1226
0
    return_value = bytes_splitlines_impl((PyBytesObject *)self, keepends);
1227
1228
0
exit:
1229
0
    return return_value;
1230
0
}
1231
1232
PyDoc_STRVAR(bytes_fromhex__doc__,
1233
"fromhex($type, string, /)\n"
1234
"--\n"
1235
"\n"
1236
"Create a bytes object from a string of hexadecimal numbers.\n"
1237
"\n"
1238
"Spaces between two numbers are accepted.\n"
1239
"Example: bytes.fromhex(\'B9 01EF\') -> b\'\\\\xb9\\\\x01\\\\xef\'.");
1240
1241
#define BYTES_FROMHEX_METHODDEF    \
1242
    {"fromhex", (PyCFunction)bytes_fromhex, METH_O|METH_CLASS, bytes_fromhex__doc__},
1243
1244
static PyObject *
1245
bytes_fromhex_impl(PyTypeObject *type, PyObject *string);
1246
1247
static PyObject *
1248
bytes_fromhex(PyObject *type, PyObject *string)
1249
31.8k
{
1250
31.8k
    PyObject *return_value = NULL;
1251
1252
31.8k
    return_value = bytes_fromhex_impl((PyTypeObject *)type, string);
1253
1254
31.8k
    return return_value;
1255
31.8k
}
1256
1257
PyDoc_STRVAR(bytes_hex__doc__,
1258
"hex($self, /, sep=<unrepresentable>, bytes_per_sep=1)\n"
1259
"--\n"
1260
"\n"
1261
"Create a string of hexadecimal numbers from a bytes object.\n"
1262
"\n"
1263
"  sep\n"
1264
"    An optional single character or byte to separate hex bytes.\n"
1265
"  bytes_per_sep\n"
1266
"    How many bytes between separators.  Positive values count from\n"
1267
"    the right, negative values count from the left.\n"
1268
"\n"
1269
"Example:\n"
1270
">>> value = b\'\\xb9\\x01\\xef\'\n"
1271
">>> value.hex()\n"
1272
"\'b901ef\'\n"
1273
">>> value.hex(\':\')\n"
1274
"\'b9:01:ef\'\n"
1275
">>> value.hex(\':\', 2)\n"
1276
"\'b9:01ef\'\n"
1277
">>> value.hex(\':\', -2)\n"
1278
"\'b901:ef\'");
1279
1280
#define BYTES_HEX_METHODDEF    \
1281
    {"hex", _PyCFunction_CAST(bytes_hex), METH_FASTCALL|METH_KEYWORDS, bytes_hex__doc__},
1282
1283
static PyObject *
1284
bytes_hex_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t bytes_per_sep);
1285
1286
static PyObject *
1287
bytes_hex(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1288
0
{
1289
0
    PyObject *return_value = NULL;
1290
0
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1291
1292
0
    #define NUM_KEYWORDS 2
1293
0
    static struct {
1294
0
        PyGC_Head _this_is_not_used;
1295
0
        PyObject_VAR_HEAD
1296
0
        Py_hash_t ob_hash;
1297
0
        PyObject *ob_item[NUM_KEYWORDS];
1298
0
    } _kwtuple = {
1299
0
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1300
0
        .ob_hash = -1,
1301
0
        .ob_item = { &_Py_ID(sep), &_Py_ID(bytes_per_sep), },
1302
0
    };
1303
0
    #undef NUM_KEYWORDS
1304
0
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1305
1306
    #else  // !Py_BUILD_CORE
1307
    #  define KWTUPLE NULL
1308
    #endif  // !Py_BUILD_CORE
1309
1310
0
    static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL};
1311
0
    static _PyArg_Parser _parser = {
1312
0
        .keywords = _keywords,
1313
0
        .fname = "hex",
1314
0
        .kwtuple = KWTUPLE,
1315
0
    };
1316
0
    #undef KWTUPLE
1317
0
    PyObject *argsbuf[2];
1318
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
1319
0
    PyObject *sep = NULL;
1320
0
    Py_ssize_t bytes_per_sep = 1;
1321
1322
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
1323
0
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
1324
0
    if (!args) {
1325
0
        goto exit;
1326
0
    }
1327
0
    if (!noptargs) {
1328
0
        goto skip_optional_pos;
1329
0
    }
1330
0
    if (args[0]) {
1331
0
        sep = args[0];
1332
0
        if (!--noptargs) {
1333
0
            goto skip_optional_pos;
1334
0
        }
1335
0
    }
1336
0
    {
1337
0
        Py_ssize_t ival = -1;
1338
0
        PyObject *iobj = _PyNumber_Index(args[1]);
1339
0
        if (iobj != NULL) {
1340
0
            ival = PyLong_AsSsize_t(iobj);
1341
0
            Py_DECREF(iobj);
1342
0
        }
1343
0
        if (ival == -1 && PyErr_Occurred()) {
1344
0
            goto exit;
1345
0
        }
1346
0
        bytes_per_sep = ival;
1347
0
    }
1348
0
skip_optional_pos:
1349
0
    return_value = bytes_hex_impl((PyBytesObject *)self, sep, bytes_per_sep);
1350
1351
0
exit:
1352
0
    return return_value;
1353
0
}
1354
1355
static PyObject *
1356
bytes_new_impl(PyTypeObject *type, PyObject *x, const char *encoding,
1357
               const char *errors);
1358
1359
static PyObject *
1360
bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1361
14.2M
{
1362
14.2M
    PyObject *return_value = NULL;
1363
14.2M
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1364
1365
14.2M
    #define NUM_KEYWORDS 3
1366
14.2M
    static struct {
1367
14.2M
        PyGC_Head _this_is_not_used;
1368
14.2M
        PyObject_VAR_HEAD
1369
14.2M
        Py_hash_t ob_hash;
1370
14.2M
        PyObject *ob_item[NUM_KEYWORDS];
1371
14.2M
    } _kwtuple = {
1372
14.2M
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1373
14.2M
        .ob_hash = -1,
1374
14.2M
        .ob_item = { &_Py_ID(source), &_Py_ID(encoding), &_Py_ID(errors), },
1375
14.2M
    };
1376
14.2M
    #undef NUM_KEYWORDS
1377
14.2M
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1378
1379
    #else  // !Py_BUILD_CORE
1380
    #  define KWTUPLE NULL
1381
    #endif  // !Py_BUILD_CORE
1382
1383
14.2M
    static const char * const _keywords[] = {"source", "encoding", "errors", NULL};
1384
14.2M
    static _PyArg_Parser _parser = {
1385
14.2M
        .keywords = _keywords,
1386
14.2M
        .fname = "bytes",
1387
14.2M
        .kwtuple = KWTUPLE,
1388
14.2M
    };
1389
14.2M
    #undef KWTUPLE
1390
14.2M
    PyObject *argsbuf[3];
1391
14.2M
    PyObject * const *fastargs;
1392
14.2M
    Py_ssize_t nargs = PyTuple_GET_SIZE(args);
1393
14.2M
    Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
1394
14.2M
    PyObject *x = NULL;
1395
14.2M
    const char *encoding = NULL;
1396
14.2M
    const char *errors = NULL;
1397
1398
14.2M
    fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser,
1399
14.2M
            /*minpos*/ 0, /*maxpos*/ 3, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
1400
14.2M
    if (!fastargs) {
1401
0
        goto exit;
1402
0
    }
1403
14.2M
    if (!noptargs) {
1404
0
        goto skip_optional_pos;
1405
0
    }
1406
14.2M
    if (fastargs[0]) {
1407
14.2M
        x = fastargs[0];
1408
14.2M
        if (!--noptargs) {
1409
13.9M
            goto skip_optional_pos;
1410
13.9M
        }
1411
14.2M
    }
1412
284k
    if (fastargs[1]) {
1413
284k
        if (!PyUnicode_Check(fastargs[1])) {
1414
0
            _PyArg_BadArgument("bytes", "argument 'encoding'", "str", fastargs[1]);
1415
0
            goto exit;
1416
0
        }
1417
284k
        encoding = _PyUnicode_AsUTF8NoNUL(fastargs[1]);
1418
284k
        if (encoding == NULL) {
1419
0
            goto exit;
1420
0
        }
1421
284k
        if (!--noptargs) {
1422
284k
            goto skip_optional_pos;
1423
284k
        }
1424
284k
    }
1425
0
    if (!PyUnicode_Check(fastargs[2])) {
1426
0
        _PyArg_BadArgument("bytes", "argument 'errors'", "str", fastargs[2]);
1427
0
        goto exit;
1428
0
    }
1429
0
    errors = _PyUnicode_AsUTF8NoNUL(fastargs[2]);
1430
0
    if (errors == NULL) {
1431
0
        goto exit;
1432
0
    }
1433
14.2M
skip_optional_pos:
1434
14.2M
    return_value = bytes_new_impl(type, x, encoding, errors);
1435
1436
14.2M
exit:
1437
14.2M
    return return_value;
1438
14.2M
}
1439
/*[clinic end generated code: output=2de57d656cc2f041 input=a9049054013a1b77]*/