@@ -1117,53 +1117,18 @@ _resolve_endianness(int *endianness)
1117
1117
return 0 ;
1118
1118
}
1119
1119
1120
- Py_ssize_t
1121
- PyLong_AsNativeBytes (PyObject * vv , void * buffer , Py_ssize_t n , int flags )
1120
+
1121
+ static Py_ssize_t
1122
+ long_asnativebytes (PyLongObject * v , void * buffer , Py_ssize_t n ,
1123
+ int little_endian , int unsigned_buffer )
1122
1124
{
1123
- PyLongObject * v ;
1125
+ Py_ssize_t res = 0 ;
1124
1126
union {
1125
1127
Py_ssize_t v ;
1126
1128
unsigned char b [sizeof (Py_ssize_t )];
1127
1129
} cv ;
1128
- int do_decref = 0 ;
1129
- Py_ssize_t res = 0 ;
1130
-
1131
- if (vv == NULL || n < 0 ) {
1132
- PyErr_BadInternalCall ();
1133
- return -1 ;
1134
- }
1135
-
1136
- int little_endian = flags ;
1137
- if (_resolve_endianness (& little_endian ) < 0 ) {
1138
- return -1 ;
1139
- }
1140
-
1141
- if (PyLong_Check (vv )) {
1142
- v = (PyLongObject * )vv ;
1143
- }
1144
- else if (flags != -1 && (flags & Py_ASNATIVEBYTES_ALLOW_INDEX )) {
1145
- v = (PyLongObject * )_PyNumber_Index (vv );
1146
- if (v == NULL ) {
1147
- return -1 ;
1148
- }
1149
- do_decref = 1 ;
1150
- }
1151
- else {
1152
- PyErr_Format (PyExc_TypeError , "expect int, got %T" , vv );
1153
- return -1 ;
1154
- }
1155
-
1156
- if ((flags != -1 && (flags & Py_ASNATIVEBYTES_REJECT_NEGATIVE ))
1157
- && _PyLong_IsNegative (v )) {
1158
- PyErr_SetString (PyExc_ValueError , "Cannot convert negative int" );
1159
- if (do_decref ) {
1160
- Py_DECREF (v );
1161
- }
1162
- return -1 ;
1163
- }
1164
1130
1165
1131
if (_PyLong_IsCompact (v )) {
1166
- res = 0 ;
1167
1132
cv .v = _PyLong_CompactValue (v );
1168
1133
/* Most paths result in res = sizeof(compact value). Only the case
1169
1134
* where 0 < n < sizeof(compact value) do we need to check and adjust
@@ -1200,7 +1165,7 @@ PyLong_AsNativeBytes(PyObject* vv, void* buffer, Py_ssize_t n, int flags)
1200
1165
/* Positive values with the MSB set do not require an
1201
1166
* additional bit when the caller's intent is to treat them
1202
1167
* as unsigned. */
1203
- if (flags == -1 || ( flags & Py_ASNATIVEBYTES_UNSIGNED_BUFFER ) ) {
1168
+ if (unsigned_buffer ) {
1204
1169
res = n ;
1205
1170
} else {
1206
1171
res = n + 1 ;
@@ -1287,7 +1252,7 @@ PyLong_AsNativeBytes(PyObject* vv, void* buffer, Py_ssize_t n, int flags)
1287
1252
* as unsigned. */
1288
1253
unsigned char * b = (unsigned char * )buffer ;
1289
1254
if (b [little_endian ? n - 1 : 0 ] & 0x80 ) {
1290
- if (flags == -1 || ( flags & Py_ASNATIVEBYTES_UNSIGNED_BUFFER ) ) {
1255
+ if (unsigned_buffer ) {
1291
1256
res = n ;
1292
1257
} else {
1293
1258
res = n + 1 ;
@@ -1296,6 +1261,54 @@ PyLong_AsNativeBytes(PyObject* vv, void* buffer, Py_ssize_t n, int flags)
1296
1261
}
1297
1262
}
1298
1263
}
1264
+ return res ;
1265
+ }
1266
+
1267
+
1268
+ Py_ssize_t
1269
+ PyLong_AsNativeBytes (PyObject * vv , void * buffer , Py_ssize_t n , int flags )
1270
+ {
1271
+ PyLongObject * v ;
1272
+ int do_decref = 0 ;
1273
+ Py_ssize_t res = 0 ;
1274
+
1275
+ if (vv == NULL || n < 0 ) {
1276
+ PyErr_BadInternalCall ();
1277
+ return -1 ;
1278
+ }
1279
+
1280
+ int little_endian = flags ;
1281
+ if (_resolve_endianness (& little_endian ) < 0 ) {
1282
+ return -1 ;
1283
+ }
1284
+
1285
+ if (PyLong_Check (vv )) {
1286
+ v = (PyLongObject * )vv ;
1287
+ }
1288
+ else if (flags != -1 && (flags & Py_ASNATIVEBYTES_ALLOW_INDEX )) {
1289
+ v = (PyLongObject * )_PyNumber_Index (vv );
1290
+ if (v == NULL ) {
1291
+ return -1 ;
1292
+ }
1293
+ do_decref = 1 ;
1294
+ }
1295
+ else {
1296
+ PyErr_Format (PyExc_TypeError , "expect int, got %T" , vv );
1297
+ return -1 ;
1298
+ }
1299
+
1300
+ if ((flags != -1 && (flags & Py_ASNATIVEBYTES_REJECT_NEGATIVE ))
1301
+ && _PyLong_IsNegative (v )) {
1302
+ PyErr_SetString (PyExc_ValueError , "Cannot convert negative int" );
1303
+ if (do_decref ) {
1304
+ Py_DECREF (v );
1305
+ }
1306
+ return -1 ;
1307
+ }
1308
+
1309
+ int unsigned_buffer = (flags == -1
1310
+ || (flags & Py_ASNATIVEBYTES_UNSIGNED_BUFFER ));
1311
+ res = long_asnativebytes (v , buffer , n , little_endian , unsigned_buffer );
1299
1312
1300
1313
if (do_decref ) {
1301
1314
Py_DECREF (v );
@@ -6797,13 +6810,11 @@ PyLong_Export(PyObject *obj, PyLongExport *export_long)
6797
6810
PyErr_Format (PyExc_TypeError , "expect int, got %T" , obj );
6798
6811
return -1 ;
6799
6812
}
6813
+ PyLongObject * self = (PyLongObject * )obj ;
6800
6814
6801
6815
int64_t value ;
6802
- int flags = Py_ASNATIVEBYTES_NATIVE_ENDIAN ;
6803
- Py_ssize_t bytes = PyLong_AsNativeBytes (obj , & value , sizeof (value ), flags );
6804
- if (bytes < 0 ) {
6805
- return -1 ;
6806
- }
6816
+ Py_ssize_t bytes = long_asnativebytes (self , & value , sizeof (value ),
6817
+ PY_LITTLE_ENDIAN , 0 );
6807
6818
6808
6819
if ((size_t )bytes <= sizeof (value )) {
6809
6820
export_long -> value = value ;
@@ -6813,7 +6824,6 @@ PyLong_Export(PyObject *obj, PyLongExport *export_long)
6813
6824
export_long -> _reserved = 0 ;
6814
6825
}
6815
6826
else {
6816
- PyLongObject * self = (PyLongObject * )obj ;
6817
6827
export_long -> value = 0 ;
6818
6828
export_long -> negative = _PyLong_IsNegative (self );
6819
6829
export_long -> ndigits = _PyLong_DigitCount (self );
0 commit comments