@@ -835,6 +835,36 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
835835}
836836
837837
838+ static const binaryfunc binary_ops [] = {
839+ [NB_ADD ] = PyNumber_Add ,
840+ [NB_AND ] = PyNumber_And ,
841+ [NB_FLOOR_DIVIDE ] = PyNumber_FloorDivide ,
842+ [NB_LSHIFT ] = PyNumber_Lshift ,
843+ [NB_MATRIX_MULTIPLY ] = PyNumber_MatrixMultiply ,
844+ [NB_MULTIPLY ] = PyNumber_Multiply ,
845+ [NB_REMAINDER ] = PyNumber_Remainder ,
846+ [NB_OR ] = PyNumber_Or ,
847+ [NB_POWER ] = _PyNumber_PowerNoMod ,
848+ [NB_RSHIFT ] = PyNumber_Rshift ,
849+ [NB_SUBTRACT ] = PyNumber_Subtract ,
850+ [NB_TRUE_DIVIDE ] = PyNumber_TrueDivide ,
851+ [NB_XOR ] = PyNumber_Xor ,
852+ [NB_INPLACE_ADD ] = PyNumber_InPlaceAdd ,
853+ [NB_INPLACE_AND ] = PyNumber_InPlaceAnd ,
854+ [NB_INPLACE_FLOOR_DIVIDE ] = PyNumber_InPlaceFloorDivide ,
855+ [NB_INPLACE_LSHIFT ] = PyNumber_InPlaceLshift ,
856+ [NB_INPLACE_MATRIX_MULTIPLY ] = PyNumber_InPlaceMatrixMultiply ,
857+ [NB_INPLACE_MULTIPLY ] = PyNumber_InPlaceMultiply ,
858+ [NB_INPLACE_REMAINDER ] = PyNumber_InPlaceRemainder ,
859+ [NB_INPLACE_OR ] = PyNumber_InPlaceOr ,
860+ [NB_INPLACE_POWER ] = _PyNumber_InPlacePowerNoMod ,
861+ [NB_INPLACE_RSHIFT ] = PyNumber_InPlaceRshift ,
862+ [NB_INPLACE_SUBTRACT ] = PyNumber_InPlaceSubtract ,
863+ [NB_INPLACE_TRUE_DIVIDE ] = PyNumber_InPlaceTrueDivide ,
864+ [NB_INPLACE_XOR ] = PyNumber_InPlaceXor ,
865+ };
866+
867+
838868// PEP 634: Structural Pattern Matching
839869
840870
@@ -4697,89 +4727,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
46974727 STAT_INC (BINARY_OP , unquickened );
46984728 PyObject * rhs = POP ();
46994729 PyObject * lhs = TOP ();
4700- PyObject * res ;
4701- switch (oparg ) {
4702- case NB_ADD :
4703- res = PyNumber_Add (lhs , rhs );
4704- break ;
4705- case NB_AND :
4706- res = PyNumber_And (lhs , rhs );
4707- break ;
4708- case NB_FLOOR_DIVIDE :
4709- res = PyNumber_FloorDivide (lhs , rhs );
4710- break ;
4711- case NB_LSHIFT :
4712- res = PyNumber_Lshift (lhs , rhs );
4713- break ;
4714- case NB_MATRIX_MULTIPLY :
4715- res = PyNumber_MatrixMultiply (lhs , rhs );
4716- break ;
4717- case NB_MULTIPLY :
4718- res = PyNumber_Multiply (lhs , rhs );
4719- break ;
4720- case NB_REMAINDER :
4721- res = PyNumber_Remainder (lhs , rhs );
4722- break ;
4723- case NB_OR :
4724- res = PyNumber_Or (lhs , rhs );
4725- break ;
4726- case NB_POWER :
4727- res = PyNumber_Power (lhs , rhs , Py_None );
4728- break ;
4729- case NB_RSHIFT :
4730- res = PyNumber_Rshift (lhs , rhs );
4731- break ;
4732- case NB_SUBTRACT :
4733- res = PyNumber_Subtract (lhs , rhs );
4734- break ;
4735- case NB_TRUE_DIVIDE :
4736- res = PyNumber_TrueDivide (lhs , rhs );
4737- break ;
4738- case NB_XOR :
4739- res = PyNumber_Xor (lhs , rhs );
4740- break ;
4741- case NB_INPLACE_ADD :
4742- res = PyNumber_InPlaceAdd (lhs , rhs );
4743- break ;
4744- case NB_INPLACE_AND :
4745- res = PyNumber_InPlaceAnd (lhs , rhs );
4746- break ;
4747- case NB_INPLACE_FLOOR_DIVIDE :
4748- res = PyNumber_InPlaceFloorDivide (lhs , rhs );
4749- break ;
4750- case NB_INPLACE_LSHIFT :
4751- res = PyNumber_InPlaceLshift (lhs , rhs );
4752- break ;
4753- case NB_INPLACE_MATRIX_MULTIPLY :
4754- res = PyNumber_InPlaceMatrixMultiply (lhs , rhs );
4755- break ;
4756- case NB_INPLACE_MULTIPLY :
4757- res = PyNumber_InPlaceMultiply (lhs , rhs );
4758- break ;
4759- case NB_INPLACE_REMAINDER :
4760- res = PyNumber_InPlaceRemainder (lhs , rhs );
4761- break ;
4762- case NB_INPLACE_OR :
4763- res = PyNumber_InPlaceOr (lhs , rhs );
4764- break ;
4765- case NB_INPLACE_POWER :
4766- res = PyNumber_InPlacePower (lhs , rhs , Py_None );
4767- break ;
4768- case NB_INPLACE_RSHIFT :
4769- res = PyNumber_InPlaceRshift (lhs , rhs );
4770- break ;
4771- case NB_INPLACE_SUBTRACT :
4772- res = PyNumber_InPlaceSubtract (lhs , rhs );
4773- break ;
4774- case NB_INPLACE_TRUE_DIVIDE :
4775- res = PyNumber_InPlaceTrueDivide (lhs , rhs );
4776- break ;
4777- case NB_INPLACE_XOR :
4778- res = PyNumber_InPlaceXor (lhs , rhs );
4779- break ;
4780- default :
4781- Py_UNREACHABLE ();
4782- }
4730+ assert (0 <= oparg );
4731+ assert ((unsigned )oparg < Py_ARRAY_LENGTH (binary_ops ));
4732+ assert (binary_ops [oparg ]);
4733+ PyObject * res = binary_ops [oparg ](lhs , rhs );
47834734 Py_DECREF (lhs );
47844735 Py_DECREF (rhs );
47854736 SET_TOP (res );
0 commit comments