diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_int.py b/graalpython/com.oracle.graal.python.test/src/tests/test_int.py index a6934f0e9c..cc2810a67b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_int.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_int.py @@ -853,6 +853,15 @@ def test_WrongInput(self): self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True) self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False) self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True) + self.assertRaises(OverflowError, (32768).to_bytes, 2, 'big', signed=True) + self.assertRaises(OverflowError, (32768).to_bytes, 2, 'little', signed=True) + self.assertRaises(OverflowError, (-32769).to_bytes, 2, 'big', signed=True) + self.assertRaises(OverflowError, (-32769).to_bytes, 2, 'little', signed=True) + self.assertRaises(OverflowError, (-5242881).to_bytes, 2, 'big', signed=True) + self.assertRaises(OverflowError, (-5242881).to_bytes, 2, 'little', signed=True) + self.assertRaises(OverflowError, self.MyInt(32768).to_bytes, 2, 'big', signed=True) + self.assertRaises(OverflowError, self.MyInt(-32769).to_bytes, 2, 'big', signed=True) + self.assertRaises(OverflowError, self.MyInt(-5242881).to_bytes, 2, 'big', signed=True) self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False) self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False) self.assertRaises(OverflowError, (1).to_bytes, 0, 'big') diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java index 63c8209d8c..2c81fcea3d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java @@ -2327,25 +2327,29 @@ public static byte[] fromLong(long self, int byteCount, boolean isBigEndian, boo byte[] bytes = new byte[byteCount]; long number = self; - while (number != 0 && 0 <= index && index <= (byteCount - 1)) { + while (number != signByte && 0 <= index && index <= (byteCount - 1)) { bytes[index] = (byte) (number & 0xFF); - if (number == signByte) { - number = 0; - } number >>= 8; index += delta; } - if (overflowProfile.profile(inliningTarget, !signed && number != 0 || (signed && bytes.length == 1 && bytes[0] != self) || (byteCount == 0 && self != 0 && self != -1))) { - throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.MESSAGE_INT_TO_BIG); - } - if (signed) { while (0 <= index && index <= (byteCount - 1)) { bytes[index] = signByte; index += delta; } } + + boolean overflow = number != signByte; + if (signed && byteCount > 0) { + int mostSignificantByte = isBigEndian ? bytes[0] : bytes[byteCount - 1]; + if ((mostSignificantByte < 0) != (self < 0)) { + overflow = true; + } + } + if (overflowProfile.profile(inliningTarget, overflow)) { + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.MESSAGE_INT_TO_BIG); + } return bytes; }