Coverage Report

Created: 2026-03-23 06:45

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