aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Objects/longobject.c
diff options
context:
space:
mode:
authorAlexSm <alex@ydb.tech>2024-08-19 16:16:30 +0200
committerGitHub <noreply@github.com>2024-08-19 17:16:30 +0300
commit9b567afd3339f4525feab53873592cb025b14251 (patch)
tree5c8489f98dc5a9a10f66065055e5a401bbd14767 /contrib/tools/python3/Objects/longobject.c
parent47bd121575c210d4bbb2dddcc2131759a694df05 (diff)
downloadydb-9b567afd3339f4525feab53873592cb025b14251.tar.gz
Library import 240819-0942 (#7994)
Co-authored-by: robot-piglet <robot-piglet@yandex-team.com> Co-authored-by: hiddenpath <hiddenpath@yandex-team.com> Co-authored-by: bulatman <bulatman@yandex-team.com> Co-authored-by: robot-contrib <robot-contrib@yandex-team.com> Co-authored-by: osidorkin <osidorkin@yandex-team.com> Co-authored-by: akhropov <akhropov@yandex-team.com> Co-authored-by: akozhikhov <akozhikhov@yandex-team.com> Co-authored-by: orlovorlov <orlovorlov@yandex-team.com> Co-authored-by: babenko <babenko@yandex-team.com> Co-authored-by: shadchin <shadchin@yandex-team.com> Co-authored-by: dmasloff <dmasloff@yandex-team.com> Co-authored-by: aleksei-le <aleksei-le@yandex-team.com> Co-authored-by: coteeq <coteeq@yandex-team.com> Co-authored-by: dimdim11 <dimdim11@yandex-team.com> Co-authored-by: robot-ya-builder <robot-ya-builder@yandex-team.com> Co-authored-by: iaz1607 <iaz1607@yandex-team.com>
Diffstat (limited to 'contrib/tools/python3/Objects/longobject.c')
-rw-r--r--contrib/tools/python3/Objects/longobject.c70
1 files changed, 56 insertions, 14 deletions
diff --git a/contrib/tools/python3/Objects/longobject.c b/contrib/tools/python3/Objects/longobject.c
index c72e1643c9..c366034fe4 100644
--- a/contrib/tools/python3/Objects/longobject.c
+++ b/contrib/tools/python3/Objects/longobject.c
@@ -484,11 +484,18 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
do_decref = 1;
}
if (_PyLong_IsCompact(v)) {
-#if SIZEOF_LONG < SIZEOF_VOID_P
- intptr_t tmp = _PyLong_CompactValue(v);
- res = (long)tmp;
- if (res != tmp) {
- *overflow = tmp < 0 ? -1 : 1;
+#if SIZEOF_LONG < SIZEOF_SIZE_T
+ Py_ssize_t tmp = _PyLong_CompactValue(v);
+ if (tmp < LONG_MIN) {
+ *overflow = -1;
+ res = -1;
+ }
+ else if (tmp > LONG_MAX) {
+ *overflow = 1;
+ res = -1;
+ }
+ else {
+ res = (long)tmp;
}
#else
res = _PyLong_CompactValue(v);
@@ -633,14 +640,15 @@ PyLong_AsUnsignedLong(PyObject *vv)
v = (PyLongObject *)vv;
if (_PyLong_IsNonNegativeCompact(v)) {
-#if SIZEOF_LONG < SIZEOF_VOID_P
- intptr_t tmp = _PyLong_CompactValue(v);
+#if SIZEOF_LONG < SIZEOF_SIZE_T
+ size_t tmp = (size_t)_PyLong_CompactValue(v);
unsigned long res = (unsigned long)tmp;
if (res != tmp) {
goto overflow;
}
+ return res;
#else
- return _PyLong_CompactValue(v);
+ return (unsigned long)(size_t)_PyLong_CompactValue(v);
#endif
}
if (_PyLong_IsNegative(v)) {
@@ -686,7 +694,7 @@ PyLong_AsSize_t(PyObject *vv)
v = (PyLongObject *)vv;
if (_PyLong_IsNonNegativeCompact(v)) {
- return _PyLong_CompactValue(v);
+ return (size_t)_PyLong_CompactValue(v);
}
if (_PyLong_IsNegative(v)) {
PyErr_SetString(PyExc_OverflowError,
@@ -723,7 +731,11 @@ _PyLong_AsUnsignedLongMask(PyObject *vv)
}
v = (PyLongObject *)vv;
if (_PyLong_IsCompact(v)) {
- return (unsigned long)_PyLong_CompactValue(v);
+#if SIZEOF_LONG < SIZEOF_SIZE_T
+ return (unsigned long)(size_t)_PyLong_CompactValue(v);
+#else
+ return (unsigned long)(long)_PyLong_CompactValue(v);
+#endif
}
i = _PyLong_DigitCount(v);
int sign = _PyLong_NonCompactSign(v);
@@ -1267,7 +1279,18 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
v = (PyLongObject*)vv;
if (_PyLong_IsNonNegativeCompact(v)) {
res = 0;
- bytes = _PyLong_CompactValue(v);
+#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
+ size_t tmp = (size_t)_PyLong_CompactValue(v);
+ bytes = (unsigned long long)tmp;
+ if (bytes != tmp) {
+ PyErr_SetString(PyExc_OverflowError,
+ "Python int too large to convert "
+ "to C unsigned long long");
+ res = -1;
+ }
+#else
+ bytes = (unsigned long long)(size_t)_PyLong_CompactValue(v);
+#endif
}
else {
res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
@@ -1298,7 +1321,11 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
}
v = (PyLongObject *)vv;
if (_PyLong_IsCompact(v)) {
- return (unsigned long long)(signed long long)_PyLong_CompactValue(v);
+#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
+ return (unsigned long long)(size_t)_PyLong_CompactValue(v);
+#else
+ return (unsigned long long)(long long)_PyLong_CompactValue(v);
+#endif
}
i = _PyLong_DigitCount(v);
sign = _PyLong_NonCompactSign(v);
@@ -1370,7 +1397,22 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
do_decref = 1;
}
if (_PyLong_IsCompact(v)) {
+#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
+ Py_ssize_t tmp = _PyLong_CompactValue(v);
+ if (tmp < LLONG_MIN) {
+ *overflow = -1;
+ res = -1;
+ }
+ else if (tmp > LLONG_MAX) {
+ *overflow = 1;
+ res = -1;
+ }
+ else {
+ res = (long long)tmp;
+ }
+#else
res = _PyLong_CompactValue(v);
+#endif
}
else {
i = _PyLong_DigitCount(v);
@@ -3308,7 +3350,7 @@ long_hash(PyLongObject *v)
int sign;
if (_PyLong_IsCompact(v)) {
- x = _PyLong_CompactValue(v);
+ x = (Py_uhash_t)_PyLong_CompactValue(v);
if (x == (Py_uhash_t)-1) {
x = (Py_uhash_t)-2;
}
@@ -6209,7 +6251,7 @@ PyDoc_STRVAR(long_doc,
int(x, base=10) -> integer\n\
\n\
Convert a number or string to an integer, or return 0 if no arguments\n\
-are given. If x is a number, return x.__int__(). For floating point\n\
+are given. If x is a number, return x.__int__(). For floating-point\n\
numbers, this truncates towards zero.\n\
\n\
If x is not a number or if base is given, then x must be a string,\n\