Author: Armin Rigo <[email protected]>
Branch:
Changeset: r81528:c626616a34fa
Date: 2016-01-03 02:15 +0100
http://bitbucket.org/pypy/pypy/changeset/c626616a34fa/
Log: Fix _PyLong_FromByteArray() for e205bcf52d2f
diff --git a/pypy/module/cpyext/longobject.py b/pypy/module/cpyext/longobject.py
--- a/pypy/module/cpyext/longobject.py
+++ b/pypy/module/cpyext/longobject.py
@@ -5,7 +5,7 @@
from pypy.objspace.std.longobject import W_LongObject
from pypy.interpreter.error import OperationError
from pypy.module.cpyext.intobject import PyInt_AsUnsignedLongMask
-from rpython.rlib.rbigint import rbigint
+from rpython.rlib.rbigint import rbigint, NULLRBIGINT, ONERBIGINT
from rpython.rlib.rarithmetic import intmask
@@ -229,25 +229,21 @@
little_endian = rffi.cast(lltype.Signed, little_endian)
signed = rffi.cast(lltype.Signed, signed)
- result = rbigint()
- negative = False
+ # xxx not the most efficient implementation possible, but should work
+ result = NULLRBIGINT
+ c = 0
for i in range(0, n):
if little_endian:
+ c = intmask(bytes[n - i - 1])
+ else:
c = intmask(bytes[i])
- else:
- c = intmask(bytes[n - i - 1])
- if i == 0 and signed and c & 0x80:
- negative = True
- if negative:
- c = c ^ 0xFF
digit = rbigint.fromint(c)
result = result.lshift(8)
result = result.add(digit)
- if negative:
- result = result.neg()
+ if signed and c >= 0x80:
+ result = result.sub(ONERBIGINT.lshift(8 * n))
return space.newlong_from_rbigint(result)
-
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit