mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 13:11:29 +00:00 
			
		
		
		
	 d5b4f1b5a0
			
		
	
	
		d5b4f1b5a0
		
			
		
	
	
	
	
		
			
			The symbol table was not exposing functionality to query the nonlocal symbols in a function or to check if a particular symbol is nonlocal.
		
			
				
	
	
		
			114 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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_NONLOCAL);
 | |
|     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;
 | |
| }
 |