LCOV - code coverage report
Current view: top level - Modules - symtablemodule.c (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit 5e6661bce9] Lines: 26 53 49.1 %
Date: 2023-03-20 08:15:36 Functions: 3 4 75.0 %
Branches: 20 50 40.0 %

           Branch data     Line data    Source code
       1                 :            : #include "Python.h"
       2                 :            : #include "pycore_symtable.h"      // struct symtable
       3                 :            : 
       4                 :            : #include "clinic/symtablemodule.c.h"
       5                 :            : /*[clinic input]
       6                 :            : module _symtable
       7                 :            : [clinic start generated code]*/
       8                 :            : /*[clinic end generated code: output=da39a3ee5e6b4b0d input=f4685845a7100605]*/
       9                 :            : 
      10                 :            : 
      11                 :            : /*[clinic input]
      12                 :            : _symtable.symtable
      13                 :            : 
      14                 :            :     source:    object
      15                 :            :     filename:  object(converter='PyUnicode_FSDecoder')
      16                 :            :     startstr:  str
      17                 :            :     /
      18                 :            : 
      19                 :            : Return symbol and scope dictionaries used internally by compiler.
      20                 :            : [clinic start generated code]*/
      21                 :            : 
      22                 :            : static PyObject *
      23                 :          0 : _symtable_symtable_impl(PyObject *module, PyObject *source,
      24                 :            :                         PyObject *filename, const char *startstr)
      25                 :            : /*[clinic end generated code: output=59eb0d5fc7285ac4 input=9dd8a50c0c36a4d7]*/
      26                 :            : {
      27                 :            :     struct symtable *st;
      28                 :            :     PyObject *t;
      29                 :            :     int start;
      30                 :          0 :     PyCompilerFlags cf = _PyCompilerFlags_INIT;
      31                 :          0 :     PyObject *source_copy = NULL;
      32                 :            : 
      33                 :          0 :     cf.cf_flags = PyCF_SOURCE_IS_UTF8;
      34                 :            : 
      35                 :          0 :     const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy);
      36         [ #  # ]:          0 :     if (str == NULL) {
      37                 :          0 :         return NULL;
      38                 :            :     }
      39                 :            : 
      40         [ #  # ]:          0 :     if (strcmp(startstr, "exec") == 0)
      41                 :          0 :         start = Py_file_input;
      42         [ #  # ]:          0 :     else if (strcmp(startstr, "eval") == 0)
      43                 :          0 :         start = Py_eval_input;
      44         [ #  # ]:          0 :     else if (strcmp(startstr, "single") == 0)
      45                 :          0 :         start = Py_single_input;
      46                 :            :     else {
      47                 :          0 :         PyErr_SetString(PyExc_ValueError,
      48                 :            :            "symtable() arg 3 must be 'exec' or 'eval' or 'single'");
      49                 :          0 :         Py_DECREF(filename);
      50                 :          0 :         Py_XDECREF(source_copy);
      51                 :          0 :         return NULL;
      52                 :            :     }
      53                 :          0 :     st = _Py_SymtableStringObjectFlags(str, filename, start, &cf);
      54                 :          0 :     Py_DECREF(filename);
      55                 :          0 :     Py_XDECREF(source_copy);
      56         [ #  # ]:          0 :     if (st == NULL) {
      57                 :          0 :         return NULL;
      58                 :            :     }
      59                 :          0 :     t = Py_NewRef(st->st_top);
      60                 :          0 :     _PySymtable_Free(st);
      61                 :          0 :     return t;
      62                 :            : }
      63                 :            : 
      64                 :            : static PyMethodDef symtable_methods[] = {
      65                 :            :     _SYMTABLE_SYMTABLE_METHODDEF
      66                 :            :     {NULL,              NULL}           /* sentinel */
      67                 :            : };
      68                 :            : 
      69                 :            : static int
      70                 :          1 : symtable_init_stentry_type(PyObject *m)
      71                 :            : {
      72                 :          1 :     return PyType_Ready(&PySTEntry_Type);
      73                 :            : }
      74                 :            : 
      75                 :            : static int
      76                 :          1 : symtable_init_constants(PyObject *m)
      77                 :            : {
      78         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, USE) < 0) return -1;
      79         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_GLOBAL) < 0) return -1;
      80         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_NONLOCAL) < 0) return -1;
      81         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_LOCAL) < 0) return -1;
      82         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_PARAM) < 0) return -1;
      83         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_FREE) < 0) return -1;
      84         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_FREE_CLASS) < 0) return -1;
      85         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_IMPORT) < 0) return -1;
      86         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_BOUND) < 0) return -1;
      87         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, DEF_ANNOT) < 0) return -1;
      88                 :            : 
      89         [ -  + ]:          1 :     if (PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock) < 0)
      90                 :          0 :         return -1;
      91         [ -  + ]:          1 :     if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0) return -1;
      92         [ -  + ]:          1 :     if (PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock) < 0)
      93                 :          0 :         return -1;
      94                 :            : 
      95         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, LOCAL) < 0) return -1;
      96         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, GLOBAL_EXPLICIT) < 0) return -1;
      97         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, GLOBAL_IMPLICIT) < 0) return -1;
      98         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, FREE) < 0) return -1;
      99         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, CELL) < 0) return -1;
     100                 :            : 
     101         [ -  + ]:          1 :     if (PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET) < 0) return -1;
     102         [ -  + ]:          1 :     if (PyModule_AddIntMacro(m, SCOPE_MASK) < 0) return -1;
     103                 :            : 
     104                 :          1 :     return 0;
     105                 :            : }
     106                 :            : 
     107                 :            : static PyModuleDef_Slot symtable_slots[] = {
     108                 :            :     {Py_mod_exec, symtable_init_stentry_type},
     109                 :            :     {Py_mod_exec, symtable_init_constants},
     110                 :            :     {0, NULL}
     111                 :            : };
     112                 :            : 
     113                 :            : static struct PyModuleDef symtablemodule = {
     114                 :            :     PyModuleDef_HEAD_INIT,
     115                 :            :     .m_name = "_symtable",
     116                 :            :     .m_size = 0,
     117                 :            :     .m_methods = symtable_methods,
     118                 :            :     .m_slots = symtable_slots,
     119                 :            : };
     120                 :            : 
     121                 :            : PyMODINIT_FUNC
     122                 :          1 : PyInit__symtable(void)
     123                 :            : {
     124                 :          1 :     return PyModuleDef_Init(&symtablemodule);
     125                 :            : }

Generated by: LCOV version 1.14