@@ -835,6 +835,36 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
835
835
}
836
836
837
837
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
+
838
868
// PEP 634: Structural Pattern Matching
839
869
840
870
@@ -4697,89 +4727,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4697
4727
STAT_INC (BINARY_OP , unquickened );
4698
4728
PyObject * rhs = POP ();
4699
4729
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 );
4783
4734
Py_DECREF (lhs );
4784
4735
Py_DECREF (rhs );
4785
4736
SET_TOP (res );
0 commit comments