| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											2023-08-29 04:18:52 +02:00
										 |  |  | #include "pycore_pythonrun.h"     // _Py_SourceAsString()
 | 
					
						
							| 
									
										
										
										
											2021-03-19 12:41:49 +01:00
										 |  |  | #include "pycore_symtable.h"      // struct symtable
 | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-04 12:13:20 +02:00
										 |  |  | #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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  |     source:    object | 
					
						
							| 
									
										
										
										
											2017-02-04 12:13:20 +02:00
										 |  |  |     filename:  object(converter='PyUnicode_FSDecoder') | 
					
						
							|  |  |  |     startstr:  str | 
					
						
							|  |  |  |     / | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Return symbol and scope dictionaries used internally by compiler. | 
					
						
							|  |  |  | [clinic start generated code]*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  | _symtable_symtable_impl(PyObject *module, PyObject *source, | 
					
						
							| 
									
										
										
										
											2017-02-04 12:13:20 +02:00
										 |  |  |                         PyObject *filename, const char *startstr) | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  | /*[clinic end generated code: output=59eb0d5fc7285ac4 input=9dd8a50c0c36a4d7]*/ | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     struct symtable *st; | 
					
						
							|  |  |  |     PyObject *t; | 
					
						
							|  |  |  |     int start; | 
					
						
							| 
									
										
										
										
											2019-06-13 02:16:41 +02:00
										 |  |  |     PyCompilerFlags cf = _PyCompilerFlags_INIT; | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  |     PyObject *source_copy = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cf.cf_flags = PyCF_SOURCE_IS_UTF8; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy); | 
					
						
							|  |  |  |     if (str == NULL) { | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     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'"); | 
					
						
							| 
									
										
										
										
											2013-08-26 22:28:21 +02:00
										 |  |  |         Py_DECREF(filename); | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  |         Py_XDECREF(source_copy); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  |     st = _Py_SymtableStringObjectFlags(str, filename, start, &cf); | 
					
						
							| 
									
										
										
										
											2013-08-26 22:28:21 +02:00
										 |  |  |     Py_DECREF(filename); | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  |     Py_XDECREF(source_copy); | 
					
						
							|  |  |  |     if (st == NULL) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2019-05-28 16:21:17 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-11-14 16:21:40 +01:00
										 |  |  |     t = Py_NewRef(st->st_top); | 
					
						
							| 
									
										
										
										
											2021-03-19 12:41:49 +01:00
										 |  |  |     _PySymtable_Free(st); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return t; | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef symtable_methods[] = { | 
					
						
							| 
									
										
										
										
											2017-02-04 12:13:20 +02:00
										 |  |  |     _SYMTABLE_SYMTABLE_METHODDEF | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {NULL,              NULL}           /* sentinel */ | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-18 16:03:51 +01:00
										 |  |  | static int | 
					
						
							|  |  |  | symtable_init_constants(PyObject *m) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, USE) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_GLOBAL) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_NONLOCAL) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_LOCAL) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_PARAM) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_FREE) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_FREE_CLASS) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_IMPORT) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_BOUND) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, DEF_ANNOT) < 0) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2023-09-28 19:08:04 -07:00
										 |  |  |     if (PyModule_AddIntConstant(m, "TYPE_ANNOTATION", AnnotationBlock) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntConstant(m, "TYPE_TYPE_VAR_BOUND", TypeVarBoundBlock) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntConstant(m, "TYPE_TYPE_ALIAS", TypeAliasBlock) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntConstant(m, "TYPE_TYPE_PARAM", TypeParamBlock) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2020-11-18 16:03:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, LOCAL) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, GLOBAL_EXPLICIT) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, GLOBAL_IMPLICIT) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, FREE) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, CELL) < 0) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET) < 0) return -1; | 
					
						
							|  |  |  |     if (PyModule_AddIntMacro(m, SCOPE_MASK) < 0) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyModuleDef_Slot symtable_slots[] = { | 
					
						
							|  |  |  |     {Py_mod_exec, symtable_init_constants}, | 
					
						
							| 
									
										
										
										
											2023-05-05 15:11:27 -06:00
										 |  |  |     {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}, | 
					
						
							| 
									
										
										
										
											2020-11-18 16:03:51 +01:00
										 |  |  |     {0, NULL} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | static struct PyModuleDef symtablemodule = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyModuleDef_HEAD_INIT, | 
					
						
							| 
									
										
										
										
											2020-11-18 16:03:51 +01:00
										 |  |  |     .m_name = "_symtable", | 
					
						
							|  |  |  |     .m_size = 0, | 
					
						
							|  |  |  |     .m_methods = symtable_methods, | 
					
						
							|  |  |  |     .m_slots = symtable_slots, | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-02 02:27:13 +00:00
										 |  |  | PyMODINIT_FUNC | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | PyInit__symtable(void) | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-18 16:03:51 +01:00
										 |  |  |     return PyModuleDef_Init(&symtablemodule); | 
					
						
							| 
									
										
										
										
											2001-02-02 18:24:26 +00:00
										 |  |  | } |