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