mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
GH-101291: Rearrange the size bits in PyLongObject (GH-102464)
* Eliminate all remaining uses of Py_SIZE and Py_SET_SIZE on PyLongObject, adding asserts. * Change layout of size/sign bits in longobject to support future addition of immortal ints and tagged medium ints. * Add functions to hide some internals of long object, and for setting sign and digit count. * Replace uses of IS_MEDIUM_VALUE macro with _PyLong_IsCompact().
This commit is contained in:
parent
713df2c534
commit
7559f5fda9
25 changed files with 982 additions and 898 deletions
|
@ -5,6 +5,7 @@
|
|||
#include "pycore_ast.h" // _PyAST_Validate()
|
||||
#include "pycore_call.h" // _PyObject_CallNoArgs()
|
||||
#include "pycore_compile.h" // _PyAST_Compile()
|
||||
#include "pycore_long.h" // _PyLong_CompactValue
|
||||
#include "pycore_object.h" // _Py_AddToAllObjects()
|
||||
#include "pycore_pyerrors.h" // _PyErr_NoMemory()
|
||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||
|
@ -2491,7 +2492,7 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
|
|||
*/
|
||||
if (PyLong_CheckExact(result)) {
|
||||
int overflow;
|
||||
long i_result = PyLong_AsLongAndOverflow(result, &overflow);
|
||||
Py_ssize_t i_result = PyLong_AsLongAndOverflow(result, &overflow);
|
||||
/* If this already overflowed, don't even enter the loop. */
|
||||
if (overflow == 0) {
|
||||
Py_SETREF(result, NULL);
|
||||
|
@ -2505,15 +2506,14 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
|
|||
return PyLong_FromLong(i_result);
|
||||
}
|
||||
if (PyLong_CheckExact(item) || PyBool_Check(item)) {
|
||||
long b;
|
||||
Py_ssize_t b;
|
||||
overflow = 0;
|
||||
/* Single digits are common, fast, and cannot overflow on unpacking. */
|
||||
switch (Py_SIZE(item)) {
|
||||
case -1: b = -(sdigit) ((PyLongObject*)item)->long_value.ob_digit[0]; break;
|
||||
// Note: the continue goes to the top of the "while" loop that iterates over the elements
|
||||
case 0: Py_DECREF(item); continue;
|
||||
case 1: b = ((PyLongObject*)item)->long_value.ob_digit[0]; break;
|
||||
default: b = PyLong_AsLongAndOverflow(item, &overflow); break;
|
||||
if (_PyLong_IsCompact((PyLongObject *)item)) {
|
||||
b = _PyLong_CompactValue((PyLongObject *)item);
|
||||
}
|
||||
else {
|
||||
b = PyLong_AsLongAndOverflow(item, &overflow);
|
||||
}
|
||||
if (overflow == 0 &&
|
||||
(i_result >= 0 ? (b <= LONG_MAX - i_result)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue