self.assert_specialized(binary_op_add_int, "BINARY_OP_ADD_INT")
self.assert_no_opcode(binary_op_add_int, "BINARY_OP")
+ def binary_op_int_non_compact():
+ for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
+ a, b = 10000000000, 1
+ c = a + b
+ self.assertEqual(c, 10000000001)
+ c = a - b
+ self.assertEqual(c, 9999999999)
+ c = a * b
+ self.assertEqual(c, 10000000000)
+
+ binary_op_int_non_compact()
+ self.assert_no_opcode(binary_op_int_non_compact, "BINARY_OP_ADD_INT")
+ self.assert_no_opcode(binary_op_int_non_compact, "BINARY_OP_SUBTRACT_INT")
+ self.assert_no_opcode(binary_op_int_non_compact, "BINARY_OP_MULTIPLY_INT")
+
def binary_op_add_unicode():
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
a, b = "foo", "bar"
specialize(instr, BINARY_OP_ADD_UNICODE);
return;
}
- if (PyLong_CheckExact(lhs)) {
+ if (_PyLong_CheckExactAndCompact(lhs) && _PyLong_CheckExactAndCompact(rhs)) {
specialize(instr, BINARY_OP_ADD_INT);
return;
}
if (!Py_IS_TYPE(lhs, Py_TYPE(rhs))) {
break;
}
- if (PyLong_CheckExact(lhs)) {
+ if (_PyLong_CheckExactAndCompact(lhs) && _PyLong_CheckExactAndCompact(rhs)) {
specialize(instr, BINARY_OP_MULTIPLY_INT);
return;
}
if (!Py_IS_TYPE(lhs, Py_TYPE(rhs))) {
break;
}
- if (PyLong_CheckExact(lhs)) {
+ if (_PyLong_CheckExactAndCompact(lhs) && _PyLong_CheckExactAndCompact(rhs)) {
specialize(instr, BINARY_OP_SUBTRACT_INT);
return;
}