17db96d56Sopenharmony_ci#include "Python.h"
27db96d56Sopenharmony_ci#include "pycore_symtable.h"      // struct symtable
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci#include "clinic/symtablemodule.c.h"
57db96d56Sopenharmony_ci/*[clinic input]
67db96d56Sopenharmony_cimodule _symtable
77db96d56Sopenharmony_ci[clinic start generated code]*/
87db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f4685845a7100605]*/
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci/*[clinic input]
127db96d56Sopenharmony_ci_symtable.symtable
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    source:    object
157db96d56Sopenharmony_ci    filename:  object(converter='PyUnicode_FSDecoder')
167db96d56Sopenharmony_ci    startstr:  str
177db96d56Sopenharmony_ci    /
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciReturn symbol and scope dictionaries used internally by compiler.
207db96d56Sopenharmony_ci[clinic start generated code]*/
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_cistatic PyObject *
237db96d56Sopenharmony_ci_symtable_symtable_impl(PyObject *module, PyObject *source,
247db96d56Sopenharmony_ci                        PyObject *filename, const char *startstr)
257db96d56Sopenharmony_ci/*[clinic end generated code: output=59eb0d5fc7285ac4 input=9dd8a50c0c36a4d7]*/
267db96d56Sopenharmony_ci{
277db96d56Sopenharmony_ci    struct symtable *st;
287db96d56Sopenharmony_ci    PyObject *t;
297db96d56Sopenharmony_ci    int start;
307db96d56Sopenharmony_ci    PyCompilerFlags cf = _PyCompilerFlags_INIT;
317db96d56Sopenharmony_ci    PyObject *source_copy = NULL;
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    cf.cf_flags = PyCF_SOURCE_IS_UTF8;
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci    const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy);
367db96d56Sopenharmony_ci    if (str == NULL) {
377db96d56Sopenharmony_ci        return NULL;
387db96d56Sopenharmony_ci    }
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci    if (strcmp(startstr, "exec") == 0)
417db96d56Sopenharmony_ci        start = Py_file_input;
427db96d56Sopenharmony_ci    else if (strcmp(startstr, "eval") == 0)
437db96d56Sopenharmony_ci        start = Py_eval_input;
447db96d56Sopenharmony_ci    else if (strcmp(startstr, "single") == 0)
457db96d56Sopenharmony_ci        start = Py_single_input;
467db96d56Sopenharmony_ci    else {
477db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
487db96d56Sopenharmony_ci           "symtable() arg 3 must be 'exec' or 'eval' or 'single'");
497db96d56Sopenharmony_ci        Py_DECREF(filename);
507db96d56Sopenharmony_ci        Py_XDECREF(source_copy);
517db96d56Sopenharmony_ci        return NULL;
527db96d56Sopenharmony_ci    }
537db96d56Sopenharmony_ci    st = _Py_SymtableStringObjectFlags(str, filename, start, &cf);
547db96d56Sopenharmony_ci    Py_DECREF(filename);
557db96d56Sopenharmony_ci    Py_XDECREF(source_copy);
567db96d56Sopenharmony_ci    if (st == NULL) {
577db96d56Sopenharmony_ci        return NULL;
587db96d56Sopenharmony_ci    }
597db96d56Sopenharmony_ci    t = (PyObject *)st->st_top;
607db96d56Sopenharmony_ci    Py_INCREF(t);
617db96d56Sopenharmony_ci    _PySymtable_Free(st);
627db96d56Sopenharmony_ci    return t;
637db96d56Sopenharmony_ci}
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_cistatic PyMethodDef symtable_methods[] = {
667db96d56Sopenharmony_ci    _SYMTABLE_SYMTABLE_METHODDEF
677db96d56Sopenharmony_ci    {NULL,              NULL}           /* sentinel */
687db96d56Sopenharmony_ci};
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_cistatic int
717db96d56Sopenharmony_cisymtable_init_stentry_type(PyObject *m)
727db96d56Sopenharmony_ci{
737db96d56Sopenharmony_ci    return PyType_Ready(&PySTEntry_Type);
747db96d56Sopenharmony_ci}
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_cistatic int
777db96d56Sopenharmony_cisymtable_init_constants(PyObject *m)
787db96d56Sopenharmony_ci{
797db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, USE) < 0) return -1;
807db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_GLOBAL) < 0) return -1;
817db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_NONLOCAL) < 0) return -1;
827db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_LOCAL) < 0) return -1;
837db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_PARAM) < 0) return -1;
847db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_FREE) < 0) return -1;
857db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_FREE_CLASS) < 0) return -1;
867db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_IMPORT) < 0) return -1;
877db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_BOUND) < 0) return -1;
887db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, DEF_ANNOT) < 0) return -1;
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci    if (PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock) < 0)
917db96d56Sopenharmony_ci        return -1;
927db96d56Sopenharmony_ci    if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0) return -1;
937db96d56Sopenharmony_ci    if (PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock) < 0)
947db96d56Sopenharmony_ci        return -1;
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, LOCAL) < 0) return -1;
977db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, GLOBAL_EXPLICIT) < 0) return -1;
987db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, GLOBAL_IMPLICIT) < 0) return -1;
997db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, FREE) < 0) return -1;
1007db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, CELL) < 0) return -1;
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    if (PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET) < 0) return -1;
1037db96d56Sopenharmony_ci    if (PyModule_AddIntMacro(m, SCOPE_MASK) < 0) return -1;
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci    return 0;
1067db96d56Sopenharmony_ci}
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_cistatic PyModuleDef_Slot symtable_slots[] = {
1097db96d56Sopenharmony_ci    {Py_mod_exec, symtable_init_stentry_type},
1107db96d56Sopenharmony_ci    {Py_mod_exec, symtable_init_constants},
1117db96d56Sopenharmony_ci    {0, NULL}
1127db96d56Sopenharmony_ci};
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_cistatic struct PyModuleDef symtablemodule = {
1157db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,
1167db96d56Sopenharmony_ci    .m_name = "_symtable",
1177db96d56Sopenharmony_ci    .m_size = 0,
1187db96d56Sopenharmony_ci    .m_methods = symtable_methods,
1197db96d56Sopenharmony_ci    .m_slots = symtable_slots,
1207db96d56Sopenharmony_ci};
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ciPyMODINIT_FUNC
1237db96d56Sopenharmony_ciPyInit__symtable(void)
1247db96d56Sopenharmony_ci{
1257db96d56Sopenharmony_ci    return PyModuleDef_Init(&symtablemodule);
1267db96d56Sopenharmony_ci}
127