Skip to content

Commit 31fec8d

Browse files
committed
gh-100239: reorganize binary op specs into one table
1 parent d3c54f3 commit 31fec8d

File tree

2 files changed

+28
-32
lines changed

2 files changed

+28
-32
lines changed

Include/internal/pycore_code.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,7 @@ typedef int (*binaryopguardfunc)(PyObject *lhs, PyObject *rhs);
586586
typedef PyObject *(*binaryopactionfunc)(PyObject *lhs, PyObject *rhs);
587587

588588
typedef struct {
589+
int oparg;
589590
binaryopguardfunc guard;
590591
binaryopactionfunc action;
591592
} _PyBinaryOpSpecializationDescr;

Python/specialize.c

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2535,45 +2535,40 @@ LONG_FLOAT_ACTION(compactlong_float_multiply, *)
25352535
LONG_FLOAT_ACTION(compactlong_float_true_div, /)
25362536
#undef LONG_FLOAT_ACTION
25372537

2538-
static _PyBinaryOpSpecializationDescr compactlongs_specs[NB_OPARG_LAST+1] = {
2539-
[NB_OR] = {compactlongs_guard, compactlongs_or},
2540-
[NB_AND] = {compactlongs_guard, compactlongs_and},
2541-
[NB_XOR] = {compactlongs_guard, compactlongs_xor},
2542-
[NB_INPLACE_OR] = {compactlongs_guard, compactlongs_or},
2543-
[NB_INPLACE_AND] = {compactlongs_guard, compactlongs_and},
2544-
[NB_INPLACE_XOR] = {compactlongs_guard, compactlongs_xor},
2545-
};
2546-
2547-
static _PyBinaryOpSpecializationDescr float_compactlong_specs[NB_OPARG_LAST+1] = {
2548-
[NB_ADD] = {float_compactlong_guard, float_compactlong_add},
2549-
[NB_SUBTRACT] = {float_compactlong_guard, float_compactlong_subtract},
2550-
[NB_TRUE_DIVIDE] = {nonzero_float_compactlong_guard, float_compactlong_true_div},
2551-
[NB_MULTIPLY] = {float_compactlong_guard, float_compactlong_multiply},
2552-
};
2553-
2554-
static _PyBinaryOpSpecializationDescr compactlong_float_specs[NB_OPARG_LAST+1] = {
2555-
[NB_ADD] = {compactlong_float_guard, compactlong_float_add},
2556-
[NB_SUBTRACT] = {compactlong_float_guard, compactlong_float_subtract},
2557-
[NB_TRUE_DIVIDE] = {nonzero_compactlong_float_guard, compactlong_float_true_div},
2558-
[NB_MULTIPLY] = {compactlong_float_guard, compactlong_float_multiply},
2538+
static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = {
2539+
/* long-long arithmetic */
2540+
{NB_OR, compactlongs_guard, compactlongs_or},
2541+
{NB_AND, compactlongs_guard, compactlongs_and},
2542+
{NB_XOR, compactlongs_guard, compactlongs_xor},
2543+
{NB_INPLACE_OR, compactlongs_guard, compactlongs_or},
2544+
{NB_INPLACE_AND, compactlongs_guard, compactlongs_and},
2545+
{NB_INPLACE_XOR, compactlongs_guard, compactlongs_xor},
2546+
2547+
/* float-long arithemetic */
2548+
{NB_ADD, float_compactlong_guard, float_compactlong_add},
2549+
{NB_SUBTRACT, float_compactlong_guard, float_compactlong_subtract},
2550+
{NB_TRUE_DIVIDE, nonzero_float_compactlong_guard, float_compactlong_true_div},
2551+
{NB_MULTIPLY, float_compactlong_guard, float_compactlong_multiply},
2552+
2553+
/* float-float arithmetic */
2554+
{NB_ADD, compactlong_float_guard, compactlong_float_add},
2555+
{NB_SUBTRACT, compactlong_float_guard, compactlong_float_subtract},
2556+
{NB_TRUE_DIVIDE, nonzero_compactlong_float_guard, compactlong_float_true_div},
2557+
{NB_MULTIPLY, compactlong_float_guard, compactlong_float_multiply},
25592558
};
25602559

25612560
static int
25622561
binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg,
25632562
_PyBinaryOpSpecializationDescr **descr)
25642563
{
2565-
#define LOOKUP_SPEC(TABLE, OPARG) \
2566-
if ((TABLE)[(OPARG)].action) { \
2567-
if ((TABLE)[(OPARG)].guard(lhs, rhs)) { \
2568-
*descr = &((TABLE)[OPARG]); \
2569-
return 1; \
2570-
} \
2564+
size_t n = sizeof(binaryop_extend_descrs)/sizeof(_PyBinaryOpSpecializationDescr);
2565+
for (size_t i = 0; i < n; i++) {
2566+
_PyBinaryOpSpecializationDescr *d = &binaryop_extend_descrs[i];
2567+
if (d->oparg == oparg && d->guard(lhs, rhs)) {
2568+
*descr = d;
2569+
return 1;
2570+
}
25712571
}
2572-
2573-
LOOKUP_SPEC(compactlong_float_specs, oparg);
2574-
LOOKUP_SPEC(float_compactlong_specs, oparg);
2575-
LOOKUP_SPEC(compactlongs_specs, oparg);
2576-
#undef LOOKUP_SPEC
25772572
return 0;
25782573
}
25792574

0 commit comments

Comments
 (0)