Home | History | Annotate | Download | only in Modules
      1 #include "Python.h"
      2 #include "opcode.h"
      3 
      4 /*[clinic input]
      5 module _opcode
      6 [clinic start generated code]*/
      7 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=117442e66eb376e6]*/
      8 
      9 #include "clinic/_opcode.c.h"
     10 
     11 /*[clinic input]
     12 
     13 _opcode.stack_effect -> int
     14 
     15   opcode: int
     16   oparg: object = None
     17   /
     18 
     19 Compute the stack effect of the opcode.
     20 [clinic start generated code]*/
     21 
     22 static int
     23 _opcode_stack_effect_impl(PyObject *module, int opcode, PyObject *oparg)
     24 /*[clinic end generated code: output=ad39467fa3ad22ce input=2d0a9ee53c0418f5]*/
     25 {
     26     int effect;
     27     int oparg_int = 0;
     28     if (HAS_ARG(opcode)) {
     29         if (oparg == Py_None) {
     30             PyErr_SetString(PyExc_ValueError,
     31                     "stack_effect: opcode requires oparg but oparg was not specified");
     32             return -1;
     33         }
     34         oparg_int = (int)PyLong_AsLong(oparg);
     35         if ((oparg_int == -1) && PyErr_Occurred())
     36             return -1;
     37     }
     38     else if (oparg != Py_None) {
     39         PyErr_SetString(PyExc_ValueError,
     40                 "stack_effect: opcode does not permit oparg but oparg was specified");
     41         return -1;
     42     }
     43     effect = PyCompile_OpcodeStackEffect(opcode, oparg_int);
     44     if (effect == PY_INVALID_STACK_EFFECT) {
     45             PyErr_SetString(PyExc_ValueError,
     46                     "invalid opcode or oparg");
     47             return -1;
     48     }
     49     return effect;
     50 }
     51 
     52 
     53 
     54 
     55 static PyMethodDef
     56 opcode_functions[] =  {
     57     _OPCODE_STACK_EFFECT_METHODDEF
     58     {NULL, NULL, 0, NULL}
     59 };
     60 
     61 
     62 static struct PyModuleDef opcodemodule = {
     63     PyModuleDef_HEAD_INIT,
     64     "_opcode",
     65     "Opcode support module.",
     66     -1,
     67     opcode_functions,
     68     NULL,
     69     NULL,
     70     NULL,
     71     NULL
     72 };
     73 
     74 PyMODINIT_FUNC
     75 PyInit__opcode(void)
     76 {
     77     return PyModule_Create(&opcodemodule);
     78 }
     79