| #include "Python.h" | |
| #include "code.h" | |
| #include "Python-ast.h" | |
| #include "symtable.h" | |
| #include "clinic/symtablemodule.c.h" | |
| /*[clinic input] | |
| module _symtable | |
| [clinic start generated code]*/ | |
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=f4685845a7100605]*/ | |
| /*[clinic input] | |
| _symtable.symtable | |
| str: str | |
| filename: object(converter='PyUnicode_FSDecoder') | |
| startstr: str | |
| / | |
| Return symbol and scope dictionaries used internally by compiler. | |
| [clinic start generated code]*/ | |
| static PyObject * | |
| _symtable_symtable_impl(PyObject *module, const char *str, | |
| PyObject *filename, const char *startstr) | |
| /*[clinic end generated code: output=914b369c9b785956 input=6c615e84d5f408e3]*/ | |
| { | |
| struct symtable *st; | |
| PyObject *t; | |
| int start; | |
| if (strcmp(startstr, "exec") == 0) | |
| start = Py_file_input; | |
| else if (strcmp(startstr, "eval") == 0) | |
| start = Py_eval_input; | |
| else if (strcmp(startstr, "single") == 0) | |
| start = Py_single_input; | |
| else { | |
| PyErr_SetString(PyExc_ValueError, | |
| "symtable() arg 3 must be 'exec' or 'eval' or 'single'"); | |
| Py_DECREF(filename); | |
| return NULL; | |
| } | |
| st = Py_SymtableStringObject(str, filename, start); | |
| Py_DECREF(filename); | |
| if (st == NULL) | |
| return NULL; | |
| t = (PyObject *)st->st_top; | |
| Py_INCREF(t); | |
| PyMem_Free((void *)st->st_future); | |
| PySymtable_Free(st); | |
| return t; | |
| } | |
| static PyMethodDef symtable_methods[] = { | |
| _SYMTABLE_SYMTABLE_METHODDEF | |
| {NULL, NULL} /* sentinel */ | |
| }; | |
| static struct PyModuleDef symtablemodule = { | |
| PyModuleDef_HEAD_INIT, | |
| "_symtable", | |
| NULL, | |
| -1, | |
| symtable_methods, | |
| NULL, | |
| NULL, | |
| NULL, | |
| NULL | |
| }; | |
| PyMODINIT_FUNC | |
| PyInit__symtable(void) | |
| { | |
| PyObject *m; | |
| if (PyType_Ready(&PySTEntry_Type) < 0) | |
| return NULL; | |
| m = PyModule_Create(&symtablemodule); | |
| if (m == NULL) | |
| return NULL; | |
| PyModule_AddIntMacro(m, USE); | |
| PyModule_AddIntMacro(m, DEF_GLOBAL); | |
| PyModule_AddIntMacro(m, DEF_LOCAL); | |
| PyModule_AddIntMacro(m, DEF_PARAM); | |
| PyModule_AddIntMacro(m, DEF_FREE); | |
| PyModule_AddIntMacro(m, DEF_FREE_CLASS); | |
| PyModule_AddIntMacro(m, DEF_IMPORT); | |
| PyModule_AddIntMacro(m, DEF_BOUND); | |
| PyModule_AddIntMacro(m, DEF_ANNOT); | |
| PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock); | |
| PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock); | |
| PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock); | |
| PyModule_AddIntMacro(m, LOCAL); | |
| PyModule_AddIntMacro(m, GLOBAL_EXPLICIT); | |
| PyModule_AddIntMacro(m, GLOBAL_IMPLICIT); | |
| PyModule_AddIntMacro(m, FREE); | |
| PyModule_AddIntMacro(m, CELL); | |
| PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET); | |
| PyModule_AddIntMacro(m, SCOPE_MASK); | |
| if (PyErr_Occurred()) { | |
| Py_DECREF(m); | |
| m = 0; | |
| } | |
| return m; | |
| } |