| #include "Python.h" |
| #include "opcode.h" |
| |
| /*[clinic input] |
| module _opcode |
| [clinic start generated code]*/ |
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=117442e66eb376e6]*/ |
| |
| #include "clinic/_opcode.c.h" |
| |
| /*[clinic input] |
| |
| _opcode.stack_effect -> int |
| |
| opcode: int |
| oparg: object = None |
| / |
| |
| Compute the stack effect of the opcode. |
| [clinic start generated code]*/ |
| |
| static int |
| _opcode_stack_effect_impl(PyModuleDef *module, int opcode, PyObject *oparg) |
| /*[clinic end generated code: output=1fcafd5596c6b050 input=2d0a9ee53c0418f5]*/ |
| { |
| int effect; |
| int oparg_int = 0; |
| if (HAS_ARG(opcode)) { |
| if (oparg == Py_None) { |
| PyErr_SetString(PyExc_ValueError, |
| "stack_effect: opcode requires oparg but oparg was not specified"); |
| return -1; |
| } |
| oparg_int = (int)PyLong_AsLong(oparg); |
| if ((oparg_int == -1) && PyErr_Occurred()) |
| return -1; |
| } |
| else if (oparg != Py_None) { |
| PyErr_SetString(PyExc_ValueError, |
| "stack_effect: opcode does not permit oparg but oparg was specified"); |
| return -1; |
| } |
| effect = PyCompile_OpcodeStackEffect(opcode, oparg_int); |
| if (effect == PY_INVALID_STACK_EFFECT) { |
| PyErr_SetString(PyExc_ValueError, |
| "invalid opcode or oparg"); |
| return -1; |
| } |
| return effect; |
| } |
| |
| |
| |
| |
| static PyMethodDef |
| opcode_functions[] = { |
| _OPCODE_STACK_EFFECT_METHODDEF |
| {NULL, NULL, 0, NULL} |
| }; |
| |
| |
| static struct PyModuleDef opcodemodule = { |
| PyModuleDef_HEAD_INIT, |
| "_opcode", |
| "Opcode support module.", |
| -1, |
| opcode_functions, |
| NULL, |
| NULL, |
| NULL, |
| NULL |
| }; |
| |
| PyMODINIT_FUNC |
| PyInit__opcode(void) |
| { |
| return PyModule_Create(&opcodemodule); |
| } |