Coverage Report

Created: 2025-07-11 06:59

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