Skip to content

Commit 8547393

Browse files
committed
Fix zero division
1 parent d95ba9f commit 8547393

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

Lib/test/test_opcache.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,6 +1362,19 @@ def binary_op_add_extend():
13621362
self.assert_specialized(binary_op_add_extend, "BINARY_OP_EXTEND")
13631363
self.assert_no_opcode(binary_op_add_extend, "BINARY_OP")
13641364

1365+
def compactlong_lhs(arg):
1366+
42 / arg
1367+
def float_lhs(arg):
1368+
42.0 / arg
1369+
1370+
with self.assertRaises(ZeroDivisionError):
1371+
compactlong_lhs(0)
1372+
with self.assertRaises(ZeroDivisionError):
1373+
compactlong_lhs(0.0)
1374+
with self.assertRaises(ZeroDivisionError):
1375+
float_lhs(0)
1376+
with self.assertRaises(ZeroDivisionError):
1377+
float_lhs(0.0)
13651378

13661379
@cpython_only
13671380
@requires_specialization_ft

Python/specialize.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,6 +2426,18 @@ float_compactlong_guard(PyObject *lhs, PyObject *rhs)
24262426
);
24272427
}
24282428

2429+
static int
2430+
float_compactlong_guard_true_div(PyObject *lhs, PyObject *rhs)
2431+
{
2432+
// guards should check if rhs has a non-zero value
2433+
return (
2434+
PyFloat_CheckExact(lhs) &&
2435+
PyLong_CheckExact(rhs) &&
2436+
_PyLong_IsCompact((PyLongObject *)rhs) &&
2437+
!PyLong_IsZero(rhs)
2438+
);
2439+
}
2440+
24292441
#define FLOAT_LONG_ACTION(NAME, OP) \
24302442
static PyObject * \
24312443
(NAME)(PyObject *lhs, PyObject *rhs) \
@@ -2452,6 +2464,18 @@ compactlong_float_guard(PyObject *lhs, PyObject *rhs)
24522464
);
24532465
}
24542466

2467+
static int
2468+
compactlong_float_guard_true_div(PyObject *lhs, PyObject *rhs)
2469+
{
2470+
// guards should check if rhs has a non-zero value
2471+
return (
2472+
PyFloat_CheckExact(rhs) &&
2473+
PyLong_CheckExact(lhs) &&
2474+
_PyLong_IsCompact((PyLongObject *)lhs) &&
2475+
PyFloat_AsDouble(rhs) != 0.0
2476+
);
2477+
}
2478+
24552479
#define LONG_FLOAT_ACTION(NAME, OP) \
24562480
static PyObject * \
24572481
(NAME)(PyObject *lhs, PyObject *rhs) \
@@ -2469,14 +2493,14 @@ LONG_FLOAT_ACTION(compactlong_float_true_div, /)
24692493
static _PyBinaryOpSpecializationDescr float_compactlong_specs[NB_OPARG_LAST+1] = {
24702494
[NB_ADD] = {float_compactlong_guard, float_compactlong_add},
24712495
[NB_SUBTRACT] = {float_compactlong_guard, float_compactlong_subtract},
2472-
[NB_TRUE_DIVIDE] = {float_compactlong_guard, float_compactlong_true_div},
2496+
[NB_TRUE_DIVIDE] = {float_compactlong_guard_true_div, float_compactlong_true_div},
24732497
[NB_MULTIPLY] = {float_compactlong_guard, float_compactlong_multiply},
24742498
};
24752499

24762500
static _PyBinaryOpSpecializationDescr compactlong_float_specs[NB_OPARG_LAST+1] = {
24772501
[NB_ADD] = {compactlong_float_guard, compactlong_float_add},
24782502
[NB_SUBTRACT] = {compactlong_float_guard, compactlong_float_subtract},
2479-
[NB_TRUE_DIVIDE] = {compactlong_float_guard, compactlong_float_true_div},
2503+
[NB_TRUE_DIVIDE] = {compactlong_float_guard_true_div, compactlong_float_true_div},
24802504
[NB_MULTIPLY] = {compactlong_float_guard, compactlong_float_multiply},
24812505
};
24822506

0 commit comments

Comments
 (0)