Coverage Report

Created: 2026-06-07 06:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython3/Objects/clinic/longobject.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
static PyObject *
13
long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase);
14
15
static PyObject *
16
long_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
17
473
{
18
473
    PyObject *return_value = NULL;
19
473
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
20
21
473
    #define NUM_KEYWORDS 1
22
473
    static struct {
23
473
        PyGC_Head _this_is_not_used;
24
473
        PyObject_VAR_HEAD
25
473
        Py_hash_t ob_hash;
26
473
        PyObject *ob_item[NUM_KEYWORDS];
27
473
    } _kwtuple = {
28
473
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
29
473
        .ob_hash = -1,
30
473
        .ob_item = { &_Py_ID(base), },
31
473
    };
32
473
    #undef NUM_KEYWORDS
33
473
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
34
35
    #else  // !Py_BUILD_CORE
36
    #  define KWTUPLE NULL
37
    #endif  // !Py_BUILD_CORE
38
39
473
    static const char * const _keywords[] = {"", "base", NULL};
40
473
    static _PyArg_Parser _parser = {
41
473
        .keywords = _keywords,
42
473
        .fname = "int",
43
473
        .kwtuple = KWTUPLE,
44
473
    };
45
473
    #undef KWTUPLE
46
473
    PyObject *argsbuf[2];
47
473
    PyObject * const *fastargs;
48
473
    Py_ssize_t nargs = PyTuple_GET_SIZE(args);
49
473
    Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
50
473
    PyObject *x = NULL;
51
473
    PyObject *obase = NULL;
52
53
473
    fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser,
54
473
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
55
473
    if (!fastargs) {
56
0
        goto exit;
57
0
    }
58
473
    if (nargs < 1) {
59
5
        goto skip_optional_posonly;
60
5
    }
61
468
    noptargs--;
62
468
    x = fastargs[0];
63
473
skip_optional_posonly:
64
473
    if (!noptargs) {
65
473
        goto skip_optional_pos;
66
473
    }
67
0
    obase = fastargs[1];
68
473
skip_optional_pos:
69
473
    return_value = long_new_impl(type, x, obase);
70
71
473
exit:
72
473
    return return_value;
73
473
}
74
75
PyDoc_STRVAR(int___getnewargs____doc__,
76
"__getnewargs__($self, /)\n"
77
"--\n"
78
"\n");
79
80
#define INT___GETNEWARGS___METHODDEF    \
81
    {"__getnewargs__", (PyCFunction)int___getnewargs__, METH_NOARGS, int___getnewargs____doc__},
82
83
static PyObject *
84
int___getnewargs___impl(PyObject *self);
85
86
static PyObject *
87
int___getnewargs__(PyObject *self, PyObject *Py_UNUSED(ignored))
88
0
{
89
0
    return int___getnewargs___impl(self);
90
0
}
91
92
PyDoc_STRVAR(int___format____doc__,
93
"__format__($self, format_spec, /)\n"
94
"--\n"
95
"\n"
96
"Convert to a string according to format_spec.");
97
98
#define INT___FORMAT___METHODDEF    \
99
    {"__format__", (PyCFunction)int___format__, METH_O, int___format____doc__},
100
101
static PyObject *
102
int___format___impl(PyObject *self, PyObject *format_spec);
103
104
static PyObject *
105
int___format__(PyObject *self, PyObject *arg)
106
37
{
107
37
    PyObject *return_value = NULL;
108
37
    PyObject *format_spec;
109
110
37
    if (!PyUnicode_Check(arg)) {
111
0
        _PyArg_BadArgument("__format__", "argument", "str", arg);
112
0
        goto exit;
113
0
    }
114
37
    format_spec = arg;
115
37
    return_value = int___format___impl(self, format_spec);
116
117
37
exit:
118
37
    return return_value;
119
37
}
120
121
PyDoc_STRVAR(int___round____doc__,
122
"__round__($self, ndigits=None, /)\n"
123
"--\n"
124
"\n"
125
"Rounding an Integral returns itself.\n"
126
"\n"
127
"Rounding with an ndigits argument also returns an integer.");
128
129
#define INT___ROUND___METHODDEF    \
130
    {"__round__", _PyCFunction_CAST(int___round__), METH_FASTCALL, int___round____doc__},
131
132
static PyObject *
133
int___round___impl(PyObject *self, PyObject *o_ndigits);
134
135
static PyObject *
136
int___round__(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
137
0
{
138
0
    PyObject *return_value = NULL;
139
0
    PyObject *o_ndigits = Py_None;
140
141
0
    if (!_PyArg_CheckPositional("__round__", nargs, 0, 1)) {
142
0
        goto exit;
143
0
    }
144
0
    if (nargs < 1) {
145
0
        goto skip_optional;
146
0
    }
147
0
    o_ndigits = args[0];
148
0
skip_optional:
149
0
    return_value = int___round___impl(self, o_ndigits);
150
151
0
exit:
152
0
    return return_value;
153
0
}
154
155
PyDoc_STRVAR(int___sizeof____doc__,
156
"__sizeof__($self, /)\n"
157
"--\n"
158
"\n"
159
"Returns size in memory, in bytes.");
160
161
#define INT___SIZEOF___METHODDEF    \
162
    {"__sizeof__", (PyCFunction)int___sizeof__, METH_NOARGS, int___sizeof____doc__},
163
164
static Py_ssize_t
165
int___sizeof___impl(PyObject *self);
166
167
static PyObject *
168
int___sizeof__(PyObject *self, PyObject *Py_UNUSED(ignored))
169
0
{
170
0
    PyObject *return_value = NULL;
171
0
    Py_ssize_t _return_value;
172
173
0
    _return_value = int___sizeof___impl(self);
174
0
    if ((_return_value == -1) && PyErr_Occurred()) {
175
0
        goto exit;
176
0
    }
177
0
    return_value = PyLong_FromSsize_t(_return_value);
178
179
0
exit:
180
0
    return return_value;
181
0
}
182
183
PyDoc_STRVAR(int_bit_length__doc__,
184
"bit_length($self, /)\n"
185
"--\n"
186
"\n"
187
"Number of bits necessary to represent self in binary.\n"
188
"\n"
189
">>> bin(37)\n"
190
"\'0b100101\'\n"
191
">>> (37).bit_length()\n"
192
"6");
193
194
#define INT_BIT_LENGTH_METHODDEF    \
195
    {"bit_length", (PyCFunction)int_bit_length, METH_NOARGS, int_bit_length__doc__},
196
197
static PyObject *
198
int_bit_length_impl(PyObject *self);
199
200
static PyObject *
201
int_bit_length(PyObject *self, PyObject *Py_UNUSED(ignored))
202
5
{
203
5
    return int_bit_length_impl(self);
204
5
}
205
206
PyDoc_STRVAR(int_bit_count__doc__,
207
"bit_count($self, /)\n"
208
"--\n"
209
"\n"
210
"Number of ones in the binary representation of the absolute value of self.\n"
211
"\n"
212
"Also known as the population count.\n"
213
"\n"
214
">>> bin(13)\n"
215
"\'0b1101\'\n"
216
">>> (13).bit_count()\n"
217
"3");
218
219
#define INT_BIT_COUNT_METHODDEF    \
220
    {"bit_count", (PyCFunction)int_bit_count, METH_NOARGS, int_bit_count__doc__},
221
222
static PyObject *
223
int_bit_count_impl(PyObject *self);
224
225
static PyObject *
226
int_bit_count(PyObject *self, PyObject *Py_UNUSED(ignored))
227
0
{
228
0
    return int_bit_count_impl(self);
229
0
}
230
231
PyDoc_STRVAR(int_as_integer_ratio__doc__,
232
"as_integer_ratio($self, /)\n"
233
"--\n"
234
"\n"
235
"Return a pair of integers, whose ratio is equal to the original int.\n"
236
"\n"
237
"The ratio is in lowest terms and has a positive denominator.\n"
238
"\n"
239
">>> (10).as_integer_ratio()\n"
240
"(10, 1)\n"
241
">>> (-10).as_integer_ratio()\n"
242
"(-10, 1)\n"
243
">>> (0).as_integer_ratio()\n"
244
"(0, 1)");
245
246
#define INT_AS_INTEGER_RATIO_METHODDEF    \
247
    {"as_integer_ratio", (PyCFunction)int_as_integer_ratio, METH_NOARGS, int_as_integer_ratio__doc__},
248
249
static PyObject *
250
int_as_integer_ratio_impl(PyObject *self);
251
252
static PyObject *
253
int_as_integer_ratio(PyObject *self, PyObject *Py_UNUSED(ignored))
254
0
{
255
0
    return int_as_integer_ratio_impl(self);
256
0
}
257
258
PyDoc_STRVAR(int_to_bytes__doc__,
259
"to_bytes($self, /, length=1, byteorder=\'big\', *, signed=False)\n"
260
"--\n"
261
"\n"
262
"Return an array of bytes representing an integer.\n"
263
"\n"
264
"  length\n"
265
"    Length of bytes object to use.  An OverflowError is raised if\n"
266
"    the integer is not representable with the given number of bytes.\n"
267
"    Default is length 1.\n"
268
"  byteorder\n"
269
"    The byte order used to represent the integer.  If byteorder is\n"
270
"    \'big\', the most significant byte is at the beginning of the byte\n"
271
"    array.  If byteorder is \'little\', the most significant byte is at\n"
272
"    the end of the byte array.  To request the native byte order of\n"
273
"    the host system, use sys.byteorder as the byte order value.\n"
274
"    Default is to use \'big\'.\n"
275
"  signed\n"
276
"    Determines whether two\'s complement is used to represent the\n"
277
"    integer.  If signed is False and a negative integer is given,\n"
278
"    an OverflowError is raised.");
279
280
#define INT_TO_BYTES_METHODDEF    \
281
    {"to_bytes", _PyCFunction_CAST(int_to_bytes), METH_FASTCALL|METH_KEYWORDS, int_to_bytes__doc__},
282
283
static PyObject *
284
int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
285
                  int is_signed);
286
287
static PyObject *
288
int_to_bytes(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
289
19
{
290
19
    PyObject *return_value = NULL;
291
19
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
292
293
19
    #define NUM_KEYWORDS 3
294
19
    static struct {
295
19
        PyGC_Head _this_is_not_used;
296
19
        PyObject_VAR_HEAD
297
19
        Py_hash_t ob_hash;
298
19
        PyObject *ob_item[NUM_KEYWORDS];
299
19
    } _kwtuple = {
300
19
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
301
19
        .ob_hash = -1,
302
19
        .ob_item = { &_Py_ID(length), &_Py_ID(byteorder), &_Py_ID(signed), },
303
19
    };
304
19
    #undef NUM_KEYWORDS
305
19
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
306
307
    #else  // !Py_BUILD_CORE
308
    #  define KWTUPLE NULL
309
    #endif  // !Py_BUILD_CORE
310
311
19
    static const char * const _keywords[] = {"length", "byteorder", "signed", NULL};
312
19
    static _PyArg_Parser _parser = {
313
19
        .keywords = _keywords,
314
19
        .fname = "to_bytes",
315
19
        .kwtuple = KWTUPLE,
316
19
    };
317
19
    #undef KWTUPLE
318
19
    PyObject *argsbuf[3];
319
19
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
320
19
    Py_ssize_t length = 1;
321
19
    PyObject *byteorder = NULL;
322
19
    int is_signed = 0;
323
324
19
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
325
19
            /*minpos*/ 0, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
326
19
    if (!args) {
327
0
        goto exit;
328
0
    }
329
19
    if (!noptargs) {
330
0
        goto skip_optional_pos;
331
0
    }
332
19
    if (args[0]) {
333
19
        {
334
19
            Py_ssize_t ival = -1;
335
19
            PyObject *iobj = _PyNumber_Index(args[0]);
336
19
            if (iobj != NULL) {
337
19
                ival = PyLong_AsSsize_t(iobj);
338
19
                Py_DECREF(iobj);
339
19
            }
340
19
            if (ival == -1 && PyErr_Occurred()) {
341
0
                goto exit;
342
0
            }
343
19
            length = ival;
344
19
            if (length < 0) {
345
0
                PyErr_SetString(PyExc_ValueError,
346
0
                                "length cannot be negative");
347
0
                goto exit;
348
0
            }
349
19
        }
350
19
        if (!--noptargs) {
351
0
            goto skip_optional_pos;
352
0
        }
353
19
    }
354
19
    if (args[1]) {
355
19
        if (!PyUnicode_Check(args[1])) {
356
0
            _PyArg_BadArgument("to_bytes", "argument 'byteorder'", "str", args[1]);
357
0
            goto exit;
358
0
        }
359
19
        byteorder = args[1];
360
19
        if (!--noptargs) {
361
19
            goto skip_optional_pos;
362
19
        }
363
19
    }
364
19
skip_optional_pos:
365
19
    if (!noptargs) {
366
19
        goto skip_optional_kwonly;
367
19
    }
368
0
    is_signed = PyObject_IsTrue(args[2]);
369
0
    if (is_signed < 0) {
370
0
        goto exit;
371
0
    }
372
19
skip_optional_kwonly:
373
19
    return_value = int_to_bytes_impl(self, length, byteorder, is_signed);
374
375
19
exit:
376
19
    return return_value;
377
19
}
378
379
PyDoc_STRVAR(int_from_bytes__doc__,
380
"from_bytes($type, /, bytes, byteorder=\'big\', *, signed=False)\n"
381
"--\n"
382
"\n"
383
"Return the integer represented by the given array of bytes.\n"
384
"\n"
385
"  bytes\n"
386
"    Holds the array of bytes to convert.  The argument must either\n"
387
"    support the buffer protocol or be an iterable object producing\n"
388
"    bytes.  Bytes and bytearray are examples of built-in objects that\n"
389
"    support the buffer protocol.\n"
390
"  byteorder\n"
391
"    The byte order used to represent the integer.  If byteorder is\n"
392
"    \'big\', the most significant byte is at the beginning of the byte\n"
393
"    array.  If byteorder is \'little\', the most significant byte is at\n"
394
"    the end of the byte array.  To request the native byte order of\n"
395
"    the host system, use sys.byteorder as the byte order value.\n"
396
"    Default is to use \'big\'.\n"
397
"  signed\n"
398
"    Indicates whether two\'s complement is used to represent the\n"
399
"    integer.");
400
401
#define INT_FROM_BYTES_METHODDEF    \
402
    {"from_bytes", _PyCFunction_CAST(int_from_bytes), METH_FASTCALL|METH_KEYWORDS|METH_CLASS, int_from_bytes__doc__},
403
404
static PyObject *
405
int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj,
406
                    PyObject *byteorder, int is_signed);
407
408
static PyObject *
409
int_from_bytes(PyObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
410
450
{
411
450
    PyObject *return_value = NULL;
412
450
    #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
413
414
450
    #define NUM_KEYWORDS 3
415
450
    static struct {
416
450
        PyGC_Head _this_is_not_used;
417
450
        PyObject_VAR_HEAD
418
450
        Py_hash_t ob_hash;
419
450
        PyObject *ob_item[NUM_KEYWORDS];
420
450
    } _kwtuple = {
421
450
        .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
422
450
        .ob_hash = -1,
423
450
        .ob_item = { &_Py_ID(bytes), &_Py_ID(byteorder), &_Py_ID(signed), },
424
450
    };
425
450
    #undef NUM_KEYWORDS
426
450
    #define KWTUPLE (&_kwtuple.ob_base.ob_base)
427
428
    #else  // !Py_BUILD_CORE
429
    #  define KWTUPLE NULL
430
    #endif  // !Py_BUILD_CORE
431
432
450
    static const char * const _keywords[] = {"bytes", "byteorder", "signed", NULL};
433
450
    static _PyArg_Parser _parser = {
434
450
        .keywords = _keywords,
435
450
        .fname = "from_bytes",
436
450
        .kwtuple = KWTUPLE,
437
450
    };
438
450
    #undef KWTUPLE
439
450
    PyObject *argsbuf[3];
440
450
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
441
450
    PyObject *bytes_obj;
442
450
    PyObject *byteorder = NULL;
443
450
    int is_signed = 0;
444
445
450
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser,
446
450
            /*minpos*/ 1, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
447
450
    if (!args) {
448
0
        goto exit;
449
0
    }
450
450
    bytes_obj = args[0];
451
450
    if (!noptargs) {
452
0
        goto skip_optional_pos;
453
0
    }
454
450
    if (args[1]) {
455
450
        if (!PyUnicode_Check(args[1])) {
456
0
            _PyArg_BadArgument("from_bytes", "argument 'byteorder'", "str", args[1]);
457
0
            goto exit;
458
0
        }
459
450
        byteorder = args[1];
460
450
        if (!--noptargs) {
461
450
            goto skip_optional_pos;
462
450
        }
463
450
    }
464
450
skip_optional_pos:
465
450
    if (!noptargs) {
466
450
        goto skip_optional_kwonly;
467
450
    }
468
0
    is_signed = PyObject_IsTrue(args[2]);
469
0
    if (is_signed < 0) {
470
0
        goto exit;
471
0
    }
472
450
skip_optional_kwonly:
473
450
    return_value = int_from_bytes_impl((PyTypeObject *)type, bytes_obj, byteorder, is_signed);
474
475
450
exit:
476
450
    return return_value;
477
450
}
478
479
PyDoc_STRVAR(int_is_integer__doc__,
480
"is_integer($self, /)\n"
481
"--\n"
482
"\n"
483
"Returns True. Exists for duck type compatibility with float.is_integer.");
484
485
#define INT_IS_INTEGER_METHODDEF    \
486
    {"is_integer", (PyCFunction)int_is_integer, METH_NOARGS, int_is_integer__doc__},
487
488
static PyObject *
489
int_is_integer_impl(PyObject *self);
490
491
static PyObject *
492
int_is_integer(PyObject *self, PyObject *Py_UNUSED(ignored))
493
0
{
494
0
    return int_is_integer_impl(self);
495
0
}
496
/*[clinic end generated code: output=d95766fb7ff46963 input=a9049054013a1b77]*/