17db96d56Sopenharmony_ci#include "Python.h" 27db96d56Sopenharmony_ci#include "opcode.h" 37db96d56Sopenharmony_ci#include "internal/pycore_code.h" 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci/*[clinic input] 67db96d56Sopenharmony_cimodule _opcode 77db96d56Sopenharmony_ci[clinic start generated code]*/ 87db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=117442e66eb376e6]*/ 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci#include "clinic/_opcode.c.h" 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci/*[clinic input] 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci_opcode.stack_effect -> int 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci opcode: int 177db96d56Sopenharmony_ci oparg: object = None 187db96d56Sopenharmony_ci / 197db96d56Sopenharmony_ci * 207db96d56Sopenharmony_ci jump: object = None 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ciCompute the stack effect of the opcode. 237db96d56Sopenharmony_ci[clinic start generated code]*/ 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_cistatic int 267db96d56Sopenharmony_ci_opcode_stack_effect_impl(PyObject *module, int opcode, PyObject *oparg, 277db96d56Sopenharmony_ci PyObject *jump) 287db96d56Sopenharmony_ci/*[clinic end generated code: output=64a18f2ead954dbb input=461c9d4a44851898]*/ 297db96d56Sopenharmony_ci{ 307db96d56Sopenharmony_ci int effect; 317db96d56Sopenharmony_ci int oparg_int = 0; 327db96d56Sopenharmony_ci int jump_int; 337db96d56Sopenharmony_ci if (HAS_ARG(opcode)) { 347db96d56Sopenharmony_ci if (oparg == Py_None) { 357db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 367db96d56Sopenharmony_ci "stack_effect: opcode requires oparg but oparg was not specified"); 377db96d56Sopenharmony_ci return -1; 387db96d56Sopenharmony_ci } 397db96d56Sopenharmony_ci oparg_int = (int)PyLong_AsLong(oparg); 407db96d56Sopenharmony_ci if ((oparg_int == -1) && PyErr_Occurred()) { 417db96d56Sopenharmony_ci return -1; 427db96d56Sopenharmony_ci } 437db96d56Sopenharmony_ci } 447db96d56Sopenharmony_ci else if (oparg != Py_None) { 457db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 467db96d56Sopenharmony_ci "stack_effect: opcode does not permit oparg but oparg was specified"); 477db96d56Sopenharmony_ci return -1; 487db96d56Sopenharmony_ci } 497db96d56Sopenharmony_ci if (jump == Py_None) { 507db96d56Sopenharmony_ci jump_int = -1; 517db96d56Sopenharmony_ci } 527db96d56Sopenharmony_ci else if (jump == Py_True) { 537db96d56Sopenharmony_ci jump_int = 1; 547db96d56Sopenharmony_ci } 557db96d56Sopenharmony_ci else if (jump == Py_False) { 567db96d56Sopenharmony_ci jump_int = 0; 577db96d56Sopenharmony_ci } 587db96d56Sopenharmony_ci else { 597db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 607db96d56Sopenharmony_ci "stack_effect: jump must be False, True or None"); 617db96d56Sopenharmony_ci return -1; 627db96d56Sopenharmony_ci } 637db96d56Sopenharmony_ci if (IS_ARTIFICIAL(opcode)) { 647db96d56Sopenharmony_ci effect = PY_INVALID_STACK_EFFECT; 657db96d56Sopenharmony_ci } 667db96d56Sopenharmony_ci else { 677db96d56Sopenharmony_ci effect = PyCompile_OpcodeStackEffectWithJump(opcode, oparg_int, jump_int); 687db96d56Sopenharmony_ci } 697db96d56Sopenharmony_ci if (effect == PY_INVALID_STACK_EFFECT) { 707db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 717db96d56Sopenharmony_ci "invalid opcode or oparg"); 727db96d56Sopenharmony_ci return -1; 737db96d56Sopenharmony_ci } 747db96d56Sopenharmony_ci return effect; 757db96d56Sopenharmony_ci} 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci/*[clinic input] 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ci_opcode.get_specialization_stats 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ciReturn the specialization stats 827db96d56Sopenharmony_ci[clinic start generated code]*/ 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_cistatic PyObject * 857db96d56Sopenharmony_ci_opcode_get_specialization_stats_impl(PyObject *module) 867db96d56Sopenharmony_ci/*[clinic end generated code: output=fcbc32fdfbec5c17 input=e1f60db68d8ce5f6]*/ 877db96d56Sopenharmony_ci{ 887db96d56Sopenharmony_ci#ifdef Py_STATS 897db96d56Sopenharmony_ci return _Py_GetSpecializationStats(); 907db96d56Sopenharmony_ci#else 917db96d56Sopenharmony_ci Py_RETURN_NONE; 927db96d56Sopenharmony_ci#endif 937db96d56Sopenharmony_ci} 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_cistatic PyMethodDef 967db96d56Sopenharmony_ciopcode_functions[] = { 977db96d56Sopenharmony_ci _OPCODE_STACK_EFFECT_METHODDEF 987db96d56Sopenharmony_ci _OPCODE_GET_SPECIALIZATION_STATS_METHODDEF 997db96d56Sopenharmony_ci {NULL, NULL, 0, NULL} 1007db96d56Sopenharmony_ci}; 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_cistatic struct PyModuleDef opcodemodule = { 1037db96d56Sopenharmony_ci PyModuleDef_HEAD_INIT, 1047db96d56Sopenharmony_ci .m_name = "_opcode", 1057db96d56Sopenharmony_ci .m_doc = "Opcode support module.", 1067db96d56Sopenharmony_ci .m_size = 0, 1077db96d56Sopenharmony_ci .m_methods = opcode_functions 1087db96d56Sopenharmony_ci}; 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ciPyMODINIT_FUNC 1117db96d56Sopenharmony_ciPyInit__opcode(void) 1127db96d56Sopenharmony_ci{ 1137db96d56Sopenharmony_ci return PyModuleDef_Init(&opcodemodule); 1147db96d56Sopenharmony_ci} 115