@@ -223,6 +223,75 @@ _opcode_get_specialization_stats_impl(PyObject *module)
223223
224224/*[clinic input]
225225
226+ _opcode.get_nb_ops
227+
228+ Return array of symbols of binary ops.
229+
230+ Indexed by the BINARY_OP oparg value.
231+ [clinic start generated code]*/
232+
233+ static PyObject *
234+ _opcode_get_nb_ops_impl (PyObject * module )
235+ /*[clinic end generated code: output=d997d306cc15426f input=9462fc544c823176]*/
236+ {
237+ PyObject * list = PyList_New (NB_OPARG_LAST + 1 );
238+ if (list == NULL ) {
239+ return NULL ;
240+ }
241+ #define ADD_NB_OP (NUM , STR ) \
242+ do { \
243+ PyObject *pair = Py_BuildValue( \
244+ "NN", PyUnicode_FromString(#NUM), PyUnicode_FromString(STR)); \
245+ if (pair == NULL) { \
246+ Py_DECREF(list); \
247+ return NULL; \
248+ } \
249+ PyList_SET_ITEM(list, (NUM), pair); \
250+ } while(0);
251+
252+ ADD_NB_OP (NB_ADD , "+" );
253+ ADD_NB_OP (NB_AND , "&" );
254+ ADD_NB_OP (NB_FLOOR_DIVIDE , "//" );
255+ ADD_NB_OP (NB_LSHIFT , "<<" );
256+ ADD_NB_OP (NB_MATRIX_MULTIPLY , "@" );
257+ ADD_NB_OP (NB_MULTIPLY , "*" );
258+ ADD_NB_OP (NB_REMAINDER , "%" );
259+ ADD_NB_OP (NB_OR , "|" );
260+ ADD_NB_OP (NB_POWER , "**" );
261+ ADD_NB_OP (NB_RSHIFT , ">>" );
262+ ADD_NB_OP (NB_SUBTRACT , "-" );
263+ ADD_NB_OP (NB_TRUE_DIVIDE , "/" );
264+ ADD_NB_OP (NB_XOR , "^" );
265+ ADD_NB_OP (NB_INPLACE_ADD , "+=" );
266+ ADD_NB_OP (NB_INPLACE_AND , "&=" );
267+ ADD_NB_OP (NB_INPLACE_FLOOR_DIVIDE , "//=" );
268+ ADD_NB_OP (NB_INPLACE_LSHIFT , "<<=" );
269+ ADD_NB_OP (NB_INPLACE_MATRIX_MULTIPLY , "@=" );
270+ ADD_NB_OP (NB_INPLACE_MULTIPLY , "*=" );
271+ ADD_NB_OP (NB_INPLACE_REMAINDER , "%=" );
272+ ADD_NB_OP (NB_INPLACE_OR , "|=" );
273+ ADD_NB_OP (NB_INPLACE_POWER , "**=" );
274+ ADD_NB_OP (NB_INPLACE_RSHIFT , ">>=" );
275+ ADD_NB_OP (NB_INPLACE_SUBTRACT , "-=" );
276+ ADD_NB_OP (NB_INPLACE_TRUE_DIVIDE , "/=" );
277+ ADD_NB_OP (NB_INPLACE_XOR , "^=" );
278+
279+ #undef ADD_NB_OP
280+
281+ for (int i = 0 ; i <= NB_OPARG_LAST ; i ++ ) {
282+ if (PyList_GET_ITEM (list , i ) == NULL ) {
283+ Py_DECREF (list );
284+ PyErr_Format (PyExc_ValueError ,
285+ "Missing initialization for NB_OP %d" ,
286+ i );
287+ return NULL ;
288+ }
289+ }
290+ return list ;
291+ }
292+
293+ /*[clinic input]
294+
226295_opcode.get_intrinsic1_descs
227296
228297Return a list of names of the unary intrinsics.
@@ -287,6 +356,7 @@ opcode_functions[] = {
287356 _OPCODE_HAS_LOCAL_METHODDEF
288357 _OPCODE_HAS_EXC_METHODDEF
289358 _OPCODE_GET_SPECIALIZATION_STATS_METHODDEF
359+ _OPCODE_GET_NB_OPS_METHODDEF
290360 _OPCODE_GET_INTRINSIC1_DESCS_METHODDEF
291361 _OPCODE_GET_INTRINSIC2_DESCS_METHODDEF
292362 {NULL , NULL , 0 , NULL }
0 commit comments