mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	bpo-43244: Remove symtable.h header file (GH-24910)
Rename Include/symtable.h to to Include/internal/pycore_symtable.h, don't export symbols anymore (replace PyAPI_FUNC and PyAPI_DATA with extern) and rename functions: * PyST_GetScope() to _PyST_GetScope() * PySymtable_BuildObject() to _PySymtable_Build() * PySymtable_Free() to _PySymtable_Free() Remove PySymtable_Build(), Py_SymtableString() and Py_SymtableStringObject() functions. The Py_SymtableString() function was part the stable ABI by mistake but it could not be used, since the symtable.h header file was excluded from the limited C API. The Python symtable module remains available and is unchanged.
This commit is contained in:
		
							parent
							
								
									32eba61ea4
								
							
						
					
					
						commit
						28ad12f8fe
					
				
					 15 changed files with 100 additions and 115 deletions
				
			
		| 
						 | 
					@ -776,7 +776,6 @@ Py_SetPath
 | 
				
			||||||
Py_SetProgramName
 | 
					Py_SetProgramName
 | 
				
			||||||
Py_SetPythonHome
 | 
					Py_SetPythonHome
 | 
				
			||||||
Py_SetRecursionLimit
 | 
					Py_SetRecursionLimit
 | 
				
			||||||
Py_SymtableString
 | 
					 | 
				
			||||||
Py_UTF8Mode
 | 
					Py_UTF8Mode
 | 
				
			||||||
Py_VaBuildValue
 | 
					Py_VaBuildValue
 | 
				
			||||||
Py_XNewRef
 | 
					Py_XNewRef
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1364,3 +1364,19 @@ Removed
 | 
				
			||||||
  AST object (``mod_ty`` type) with the public C API. The function was already
 | 
					  AST object (``mod_ty`` type) with the public C API. The function was already
 | 
				
			||||||
  excluded from the limited C API (:pep:`384`).
 | 
					  excluded from the limited C API (:pep:`384`).
 | 
				
			||||||
  (Contributed by Victor Stinner in :issue:`43244`.)
 | 
					  (Contributed by Victor Stinner in :issue:`43244`.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Remove the ``symtable.h`` header file and the undocumented functions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * ``PyST_GetScope()``
 | 
				
			||||||
 | 
					  * ``PySymtable_Build()``
 | 
				
			||||||
 | 
					  * ``PySymtable_BuildObject()``
 | 
				
			||||||
 | 
					  * ``PySymtable_Free()``
 | 
				
			||||||
 | 
					  * ``Py_SymtableString()``
 | 
				
			||||||
 | 
					  * ``Py_SymtableStringObject()``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The ``Py_SymtableString()`` function was part the stable ABI by mistake but
 | 
				
			||||||
 | 
					  it could not be used, because the ``symtable.h`` header file was excluded
 | 
				
			||||||
 | 
					  from the limited C API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The Python :mod:`symtable` module remains available and is unchanged.
 | 
				
			||||||
 | 
					  (Contributed by Victor Stinner in :issue:`43244`.)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,17 +77,6 @@ PyAPI_FUNC(const char *) _Py_SourceAsString(
 | 
				
			||||||
    PyCompilerFlags *cf,
 | 
					    PyCompilerFlags *cf,
 | 
				
			||||||
    PyObject **cmd_copy);
 | 
					    PyObject **cmd_copy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PyAPI_FUNC(struct symtable *) Py_SymtableStringObject(
 | 
					 | 
				
			||||||
    const char *str,
 | 
					 | 
				
			||||||
    PyObject *filename,
 | 
					 | 
				
			||||||
    int start);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PyAPI_FUNC(struct symtable *) _Py_SymtableStringObjectFlags(
 | 
					 | 
				
			||||||
    const char *str,
 | 
					 | 
				
			||||||
    PyObject *filename,
 | 
					 | 
				
			||||||
    int start,
 | 
					 | 
				
			||||||
    PyCompilerFlags *flags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* A function flavor is also exported by libpython. It is required when
 | 
					/* A function flavor is also exported by libpython. It is required when
 | 
				
			||||||
    libpython is accessed directly rather than using header files which defines
 | 
					    libpython is accessed directly rather than using header files which defines
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,15 +1,14 @@
 | 
				
			||||||
#ifndef Py_LIMITED_API
 | 
					#ifndef Py_INTERNAL_SYMTABLE_H
 | 
				
			||||||
#ifndef Py_SYMTABLE_H
 | 
					#define Py_INTERNAL_SYMTABLE_H
 | 
				
			||||||
#define Py_SYMTABLE_H
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Python-ast.h"   /* mod_ty */
 | 
					#ifndef Py_BUILD_CORE
 | 
				
			||||||
 | 
					#  error "this header requires Py_BUILD_CORE define"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* XXX(ncoghlan): This is a weird mix of public names and interpreter internal
 | 
					#include "Python-ast.h"   /* mod_ty */
 | 
				
			||||||
 *                names.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock }
 | 
					typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock }
 | 
				
			||||||
    _Py_block_ty;
 | 
					    _Py_block_ty;
 | 
				
			||||||
| 
						 | 
					@ -68,23 +67,19 @@ typedef struct _symtable_entry {
 | 
				
			||||||
    struct symtable *ste_table;
 | 
					    struct symtable *ste_table;
 | 
				
			||||||
} PySTEntryObject;
 | 
					} PySTEntryObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PyAPI_DATA(PyTypeObject) PySTEntry_Type;
 | 
					extern PyTypeObject PySTEntry_Type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type)
 | 
					#define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *);
 | 
					extern int _PyST_GetScope(PySTEntryObject *, PyObject *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PyAPI_FUNC(struct symtable *) PySymtable_Build(
 | 
					extern struct symtable* _PySymtable_Build(
 | 
				
			||||||
    mod_ty mod,
 | 
					 | 
				
			||||||
    const char *filename,       /* decoded from the filesystem encoding */
 | 
					 | 
				
			||||||
    PyFutureFeatures *future);
 | 
					 | 
				
			||||||
PyAPI_FUNC(struct symtable *) PySymtable_BuildObject(
 | 
					 | 
				
			||||||
    mod_ty mod,
 | 
					    mod_ty mod,
 | 
				
			||||||
    PyObject *filename,
 | 
					    PyObject *filename,
 | 
				
			||||||
    PyFutureFeatures *future);
 | 
					    PyFutureFeatures *future);
 | 
				
			||||||
PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *);
 | 
					PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PyAPI_FUNC(void) PySymtable_Free(struct symtable *);
 | 
					extern void _PySymtable_Free(struct symtable *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags for def-use information */
 | 
					/* Flags for def-use information */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,8 +112,14 @@ PyAPI_FUNC(void) PySymtable_Free(struct symtable *);
 | 
				
			||||||
#define GENERATOR 1
 | 
					#define GENERATOR 1
 | 
				
			||||||
#define GENERATOR_EXPRESSION 2
 | 
					#define GENERATOR_EXPRESSION 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Used by symtablemodule.c
 | 
				
			||||||
 | 
					extern struct symtable* _Py_SymtableStringObjectFlags(
 | 
				
			||||||
 | 
					    const char *str,
 | 
				
			||||||
 | 
					    PyObject *filename,
 | 
				
			||||||
 | 
					    int start,
 | 
				
			||||||
 | 
					    PyCompilerFlags *flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif /* !Py_SYMTABLE_H */
 | 
					#endif /* !Py_INTERNAL_SYMTABLE_H */
 | 
				
			||||||
#endif /* !Py_LIMITED_API */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -9,11 +9,6 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PyAPI_FUNC(PyObject *) Py_CompileString(const char *, const char *, int);
 | 
					PyAPI_FUNC(PyObject *) Py_CompileString(const char *, const char *, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PyAPI_FUNC(struct symtable *) Py_SymtableString(
 | 
					 | 
				
			||||||
    const char *str,
 | 
					 | 
				
			||||||
    const char *filename,       /* decoded from the filesystem encoding */
 | 
					 | 
				
			||||||
    int start);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PyAPI_FUNC(void) PyErr_Print(void);
 | 
					PyAPI_FUNC(void) PyErr_Print(void);
 | 
				
			||||||
PyAPI_FUNC(void) PyErr_PrintEx(int);
 | 
					PyAPI_FUNC(void) PyErr_PrintEx(int);
 | 
				
			||||||
PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *);
 | 
					PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1087,7 +1087,6 @@ PYTHON_HEADERS= \
 | 
				
			||||||
		$(srcdir)/Include/sliceobject.h \
 | 
							$(srcdir)/Include/sliceobject.h \
 | 
				
			||||||
		$(srcdir)/Include/structmember.h \
 | 
							$(srcdir)/Include/structmember.h \
 | 
				
			||||||
		$(srcdir)/Include/structseq.h \
 | 
							$(srcdir)/Include/structseq.h \
 | 
				
			||||||
		$(srcdir)/Include/symtable.h \
 | 
					 | 
				
			||||||
		$(srcdir)/Include/sysmodule.h \
 | 
							$(srcdir)/Include/sysmodule.h \
 | 
				
			||||||
		$(srcdir)/Include/token.h \
 | 
							$(srcdir)/Include/token.h \
 | 
				
			||||||
		$(srcdir)/Include/traceback.h \
 | 
							$(srcdir)/Include/traceback.h \
 | 
				
			||||||
| 
						 | 
					@ -1167,6 +1166,7 @@ PYTHON_HEADERS= \
 | 
				
			||||||
		$(srcdir)/Include/internal/pycore_pymem.h \
 | 
							$(srcdir)/Include/internal/pycore_pymem.h \
 | 
				
			||||||
		$(srcdir)/Include/internal/pycore_pystate.h \
 | 
							$(srcdir)/Include/internal/pycore_pystate.h \
 | 
				
			||||||
		$(srcdir)/Include/internal/pycore_runtime.h \
 | 
							$(srcdir)/Include/internal/pycore_runtime.h \
 | 
				
			||||||
 | 
							$(srcdir)/Include/internal/pycore_symtable.h \
 | 
				
			||||||
		$(srcdir)/Include/internal/pycore_sysmodule.h \
 | 
							$(srcdir)/Include/internal/pycore_sysmodule.h \
 | 
				
			||||||
		$(srcdir)/Include/internal/pycore_traceback.h \
 | 
							$(srcdir)/Include/internal/pycore_traceback.h \
 | 
				
			||||||
		$(srcdir)/Include/internal/pycore_tuple.h \
 | 
							$(srcdir)/Include/internal/pycore_tuple.h \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					Remove the ``symtable.h`` header file and the undocumented functions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* ``PyST_GetScope()``
 | 
				
			||||||
 | 
					* ``PySymtable_Build()``
 | 
				
			||||||
 | 
					* ``PySymtable_BuildObject()``
 | 
				
			||||||
 | 
					* ``PySymtable_Free()``
 | 
				
			||||||
 | 
					* ``Py_SymtableString()``
 | 
				
			||||||
 | 
					* ``Py_SymtableStringObject()``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The ``Py_SymtableString()`` function was part the stable ABI by mistake but it
 | 
				
			||||||
 | 
					could not be used, because the ``symtable.h`` header file was excluded from the
 | 
				
			||||||
 | 
					limited C API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The Python :mod:`symtable` module remains available and is unchanged.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Patch by Victor Stinner.
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,7 @@
 | 
				
			||||||
#include "Python.h"
 | 
					#include "Python.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "code.h"
 | 
					 | 
				
			||||||
#include "Python-ast.h"
 | 
					#include "Python-ast.h"
 | 
				
			||||||
#include "symtable.h"
 | 
					#include "pycore_symtable.h"      // struct symtable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "clinic/symtablemodule.c.h"
 | 
					#include "clinic/symtablemodule.c.h"
 | 
				
			||||||
/*[clinic input]
 | 
					/*[clinic input]
 | 
				
			||||||
| 
						 | 
					@ -62,7 +61,7 @@ _symtable_symtable_impl(PyObject *module, PyObject *source,
 | 
				
			||||||
    t = (PyObject *)st->st_top;
 | 
					    t = (PyObject *)st->st_top;
 | 
				
			||||||
    Py_INCREF(t);
 | 
					    Py_INCREF(t);
 | 
				
			||||||
    PyMem_Free((void *)st->st_future);
 | 
					    PyMem_Free((void *)st->st_future);
 | 
				
			||||||
    PySymtable_Free(st);
 | 
					    _PySymtable_Free(st);
 | 
				
			||||||
    return t;
 | 
					    return t;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,7 +80,6 @@ EXPORT_FUNC(Py_SetPath)
 | 
				
			||||||
EXPORT_FUNC(Py_SetProgramName)
 | 
					EXPORT_FUNC(Py_SetProgramName)
 | 
				
			||||||
EXPORT_FUNC(Py_SetPythonHome)
 | 
					EXPORT_FUNC(Py_SetPythonHome)
 | 
				
			||||||
EXPORT_FUNC(Py_SetRecursionLimit)
 | 
					EXPORT_FUNC(Py_SetRecursionLimit)
 | 
				
			||||||
EXPORT_FUNC(Py_SymtableString)
 | 
					 | 
				
			||||||
EXPORT_FUNC(Py_VaBuildValue)
 | 
					EXPORT_FUNC(Py_VaBuildValue)
 | 
				
			||||||
EXPORT_FUNC(Py_XNewRef)
 | 
					EXPORT_FUNC(Py_XNewRef)
 | 
				
			||||||
EXPORT_FUNC(PyArg_Parse)
 | 
					EXPORT_FUNC(PyArg_Parse)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -208,6 +208,7 @@
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_pystate.h" />
 | 
					    <ClInclude Include="..\Include\internal\pycore_pystate.h" />
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_runtime.h" />
 | 
					    <ClInclude Include="..\Include\internal\pycore_runtime.h" />
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_sysmodule.h" />
 | 
					    <ClInclude Include="..\Include\internal\pycore_sysmodule.h" />
 | 
				
			||||||
 | 
					    <ClInclude Include="..\Include\internal\pycore_symtable.h" />
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_traceback.h" />
 | 
					    <ClInclude Include="..\Include\internal\pycore_traceback.h" />
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_tuple.h" />
 | 
					    <ClInclude Include="..\Include\internal\pycore_tuple.h" />
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_ucnhash.h" />
 | 
					    <ClInclude Include="..\Include\internal\pycore_ucnhash.h" />
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -585,6 +585,9 @@
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_sysmodule.h">
 | 
					    <ClInclude Include="..\Include\internal\pycore_sysmodule.h">
 | 
				
			||||||
      <Filter>Include\internal</Filter>
 | 
					      <Filter>Include\internal</Filter>
 | 
				
			||||||
    </ClInclude>
 | 
					    </ClInclude>
 | 
				
			||||||
 | 
					    <ClInclude Include="..\Include\internal\pycore_symtable.h">
 | 
				
			||||||
 | 
					      <Filter>Include\internal</Filter>
 | 
				
			||||||
 | 
					    </ClInclude>
 | 
				
			||||||
    <ClInclude Include="..\Include\internal\pycore_traceback.h">
 | 
					    <ClInclude Include="..\Include\internal\pycore_traceback.h">
 | 
				
			||||||
      <Filter>Include\internal</Filter>
 | 
					      <Filter>Include\internal</Filter>
 | 
				
			||||||
    </ClInclude>
 | 
					    </ClInclude>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,8 +25,8 @@
 | 
				
			||||||
#include "pycore_ast.h"           // _PyAST_GetDocString()
 | 
					#include "pycore_ast.h"           // _PyAST_GetDocString()
 | 
				
			||||||
#include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
 | 
					#include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
 | 
				
			||||||
#include "pycore_long.h"          // _PyLong_GetZero()
 | 
					#include "pycore_long.h"          // _PyLong_GetZero()
 | 
				
			||||||
 | 
					#include "pycore_symtable.h"      // PySTEntryObject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "symtable.h"             // struct symtable
 | 
					 | 
				
			||||||
#define NEED_OPCODE_JUMP_TABLES
 | 
					#define NEED_OPCODE_JUMP_TABLES
 | 
				
			||||||
#include "opcode.h"               // EXTENDED_ARG
 | 
					#include "opcode.h"               // EXTENDED_ARG
 | 
				
			||||||
#include "wordcode_helpers.h"     // instrsize()
 | 
					#include "wordcode_helpers.h"     // instrsize()
 | 
				
			||||||
| 
						 | 
					@ -394,7 +394,7 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
 | 
				
			||||||
        goto finally;
 | 
					        goto finally;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
 | 
					    c.c_st = _PySymtable_Build(mod, filename, c.c_future);
 | 
				
			||||||
    if (c.c_st == NULL) {
 | 
					    if (c.c_st == NULL) {
 | 
				
			||||||
        if (!PyErr_Occurred())
 | 
					        if (!PyErr_Occurred())
 | 
				
			||||||
            PyErr_SetString(PyExc_SystemError, "no symtable");
 | 
					            PyErr_SetString(PyExc_SystemError, "no symtable");
 | 
				
			||||||
| 
						 | 
					@ -428,7 +428,7 @@ static void
 | 
				
			||||||
compiler_free(struct compiler *c)
 | 
					compiler_free(struct compiler *c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (c->c_st)
 | 
					    if (c->c_st)
 | 
				
			||||||
        PySymtable_Free(c->c_st);
 | 
					        _PySymtable_Free(c->c_st);
 | 
				
			||||||
    if (c->c_future)
 | 
					    if (c->c_future)
 | 
				
			||||||
        PyObject_Free(c->c_future);
 | 
					        PyObject_Free(c->c_future);
 | 
				
			||||||
    Py_XDECREF(c->c_filename);
 | 
					    Py_XDECREF(c->c_filename);
 | 
				
			||||||
| 
						 | 
					@ -729,7 +729,7 @@ compiler_set_qualname(struct compiler *c)
 | 
				
			||||||
            mangled = _Py_Mangle(parent->u_private, u->u_name);
 | 
					            mangled = _Py_Mangle(parent->u_private, u->u_name);
 | 
				
			||||||
            if (!mangled)
 | 
					            if (!mangled)
 | 
				
			||||||
                return 0;
 | 
					                return 0;
 | 
				
			||||||
            scope = PyST_GetScope(parent->u_ste, mangled);
 | 
					            scope = _PyST_GetScope(parent->u_ste, mangled);
 | 
				
			||||||
            Py_DECREF(mangled);
 | 
					            Py_DECREF(mangled);
 | 
				
			||||||
            assert(scope != GLOBAL_IMPLICIT);
 | 
					            assert(scope != GLOBAL_IMPLICIT);
 | 
				
			||||||
            if (scope == GLOBAL_EXPLICIT)
 | 
					            if (scope == GLOBAL_EXPLICIT)
 | 
				
			||||||
| 
						 | 
					@ -1920,10 +1920,10 @@ get_ref_type(struct compiler *c, PyObject *name)
 | 
				
			||||||
    if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
 | 
					    if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
 | 
				
			||||||
        _PyUnicode_EqualToASCIIString(name, "__class__"))
 | 
					        _PyUnicode_EqualToASCIIString(name, "__class__"))
 | 
				
			||||||
        return CELL;
 | 
					        return CELL;
 | 
				
			||||||
    scope = PyST_GetScope(c->u->u_ste, name);
 | 
					    scope = _PyST_GetScope(c->u->u_ste, name);
 | 
				
			||||||
    if (scope == 0) {
 | 
					    if (scope == 0) {
 | 
				
			||||||
        PyErr_Format(PyExc_SystemError,
 | 
					        PyErr_Format(PyExc_SystemError,
 | 
				
			||||||
                     "PyST_GetScope(name=%R) failed: "
 | 
					                     "_PyST_GetScope(name=%R) failed: "
 | 
				
			||||||
                     "unknown scope in unit %S (%R); "
 | 
					                     "unknown scope in unit %S (%R); "
 | 
				
			||||||
                     "symbols: %R; locals: %R; globals: %R",
 | 
					                     "symbols: %R; locals: %R; globals: %R",
 | 
				
			||||||
                     name,
 | 
					                     name,
 | 
				
			||||||
| 
						 | 
					@ -3608,7 +3608,7 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    op = 0;
 | 
					    op = 0;
 | 
				
			||||||
    optype = OP_NAME;
 | 
					    optype = OP_NAME;
 | 
				
			||||||
    scope = PyST_GetScope(c->u->u_ste, mangled);
 | 
					    scope = _PyST_GetScope(c->u->u_ste, mangled);
 | 
				
			||||||
    switch (scope) {
 | 
					    switch (scope) {
 | 
				
			||||||
    case FREE:
 | 
					    case FREE:
 | 
				
			||||||
        dict = c->u->u_freevars;
 | 
					        dict = c->u->u_freevars;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,6 @@
 | 
				
			||||||
#include "token.h"                // INDENT
 | 
					#include "token.h"                // INDENT
 | 
				
			||||||
#include "errcode.h"              // E_EOF
 | 
					#include "errcode.h"              // E_EOF
 | 
				
			||||||
#include "code.h"                 // PyCodeObject
 | 
					#include "code.h"                 // PyCodeObject
 | 
				
			||||||
#include "symtable.h"             // PySymtable_BuildObject()
 | 
					 | 
				
			||||||
#include "marshal.h"              // PyMarshal_ReadLongFromFile()
 | 
					#include "marshal.h"              // PyMarshal_ReadLongFromFile()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef MS_WINDOWS
 | 
					#ifdef MS_WINDOWS
 | 
				
			||||||
| 
						 | 
					@ -1369,48 +1368,6 @@ _Py_SourceAsString(PyObject *cmd, const char *funcname, const char *what, PyComp
 | 
				
			||||||
    return str;
 | 
					    return str;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct symtable *
 | 
					 | 
				
			||||||
Py_SymtableStringObject(const char *str, PyObject *filename, int start)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    PyCompilerFlags flags = _PyCompilerFlags_INIT;
 | 
					 | 
				
			||||||
    return _Py_SymtableStringObjectFlags(str, filename, start, &flags);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct symtable *
 | 
					 | 
				
			||||||
_Py_SymtableStringObjectFlags(const char *str, PyObject *filename, int start, PyCompilerFlags *flags)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    struct symtable *st;
 | 
					 | 
				
			||||||
    mod_ty mod;
 | 
					 | 
				
			||||||
    PyArena *arena;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    arena = PyArena_New();
 | 
					 | 
				
			||||||
    if (arena == NULL)
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
 | 
					 | 
				
			||||||
    if (mod == NULL) {
 | 
					 | 
				
			||||||
        PyArena_Free(arena);
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    st = PySymtable_BuildObject(mod, filename, 0);
 | 
					 | 
				
			||||||
    PyArena_Free(arena);
 | 
					 | 
				
			||||||
    return st;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct symtable *
 | 
					 | 
				
			||||||
Py_SymtableString(const char *str, const char *filename_str, int start)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    PyObject *filename;
 | 
					 | 
				
			||||||
    struct symtable *st;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    filename = PyUnicode_DecodeFSDefault(filename_str);
 | 
					 | 
				
			||||||
    if (filename == NULL)
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    st = Py_SymtableStringObject(str, filename, start);
 | 
					 | 
				
			||||||
    Py_DECREF(filename);
 | 
					 | 
				
			||||||
    return st;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if defined(USE_STACKCHECK)
 | 
					#if defined(USE_STACKCHECK)
 | 
				
			||||||
#if defined(WIN32) && defined(_MSC_VER)
 | 
					#if defined(WIN32) && defined(_MSC_VER)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
#include "Python.h"
 | 
					#include "Python.h"
 | 
				
			||||||
#include "pycore_pystate.h"   // _PyThreadState_GET()
 | 
					#include "pycore_pystate.h"       // _PyThreadState_GET()
 | 
				
			||||||
#include "symtable.h"
 | 
					#include "pycore_symtable.h"      // PySTEntryObject
 | 
				
			||||||
#undef Yield   /* undefine macro conflicting with <winbase.h> */
 | 
					#undef Yield   /* undefine macro conflicting with <winbase.h> */
 | 
				
			||||||
#include "structmember.h"         // PyMemberDef
 | 
					#include "structmember.h"         // PyMemberDef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -243,7 +243,7 @@ symtable_new(void)
 | 
				
			||||||
    st->in_pattern = 0;
 | 
					    st->in_pattern = 0;
 | 
				
			||||||
    return st;
 | 
					    return st;
 | 
				
			||||||
 fail:
 | 
					 fail:
 | 
				
			||||||
    PySymtable_Free(st);
 | 
					    _PySymtable_Free(st);
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -260,7 +260,7 @@ symtable_new(void)
 | 
				
			||||||
#define COMPILER_STACK_FRAME_SCALE 3
 | 
					#define COMPILER_STACK_FRAME_SCALE 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct symtable *
 | 
					struct symtable *
 | 
				
			||||||
PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
 | 
					_PySymtable_Build(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    struct symtable *st = symtable_new();
 | 
					    struct symtable *st = symtable_new();
 | 
				
			||||||
    asdl_stmt_seq *seq;
 | 
					    asdl_stmt_seq *seq;
 | 
				
			||||||
| 
						 | 
					@ -272,7 +272,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
 | 
				
			||||||
    if (st == NULL)
 | 
					    if (st == NULL)
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    if (filename == NULL) {
 | 
					    if (filename == NULL) {
 | 
				
			||||||
        PySymtable_Free(st);
 | 
					        _PySymtable_Free(st);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Py_INCREF(filename);
 | 
					    Py_INCREF(filename);
 | 
				
			||||||
| 
						 | 
					@ -282,7 +282,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
 | 
				
			||||||
    /* Setup recursion depth check counters */
 | 
					    /* Setup recursion depth check counters */
 | 
				
			||||||
    tstate = _PyThreadState_GET();
 | 
					    tstate = _PyThreadState_GET();
 | 
				
			||||||
    if (!tstate) {
 | 
					    if (!tstate) {
 | 
				
			||||||
        PySymtable_Free(st);
 | 
					        _PySymtable_Free(st);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /* Be careful here to prevent overflow. */
 | 
					    /* Be careful here to prevent overflow. */
 | 
				
			||||||
| 
						 | 
					@ -295,7 +295,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
 | 
				
			||||||
    /* Make the initial symbol information gathering pass */
 | 
					    /* Make the initial symbol information gathering pass */
 | 
				
			||||||
    if (!GET_IDENTIFIER(top) ||
 | 
					    if (!GET_IDENTIFIER(top) ||
 | 
				
			||||||
        !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
 | 
					        !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
 | 
				
			||||||
        PySymtable_Free(st);
 | 
					        _PySymtable_Free(st);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -325,7 +325,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
 | 
				
			||||||
        goto error;
 | 
					        goto error;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!symtable_exit_block(st)) {
 | 
					    if (!symtable_exit_block(st)) {
 | 
				
			||||||
        PySymtable_Free(st);
 | 
					        _PySymtable_Free(st);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /* Check that the recursion depth counting balanced correctly */
 | 
					    /* Check that the recursion depth counting balanced correctly */
 | 
				
			||||||
| 
						 | 
					@ -333,35 +333,23 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
 | 
				
			||||||
        PyErr_Format(PyExc_SystemError,
 | 
					        PyErr_Format(PyExc_SystemError,
 | 
				
			||||||
            "symtable analysis recursion depth mismatch (before=%d, after=%d)",
 | 
					            "symtable analysis recursion depth mismatch (before=%d, after=%d)",
 | 
				
			||||||
            starting_recursion_depth, st->recursion_depth);
 | 
					            starting_recursion_depth, st->recursion_depth);
 | 
				
			||||||
        PySymtable_Free(st);
 | 
					        _PySymtable_Free(st);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /* Make the second symbol analysis pass */
 | 
					    /* Make the second symbol analysis pass */
 | 
				
			||||||
    if (symtable_analyze(st))
 | 
					    if (symtable_analyze(st))
 | 
				
			||||||
        return st;
 | 
					        return st;
 | 
				
			||||||
    PySymtable_Free(st);
 | 
					    _PySymtable_Free(st);
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
 error:
 | 
					 error:
 | 
				
			||||||
    (void) symtable_exit_block(st);
 | 
					    (void) symtable_exit_block(st);
 | 
				
			||||||
    PySymtable_Free(st);
 | 
					    _PySymtable_Free(st);
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct symtable *
 | 
					 | 
				
			||||||
PySymtable_Build(mod_ty mod, const char *filename_str, PyFutureFeatures *future)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    PyObject *filename;
 | 
					 | 
				
			||||||
    struct symtable *st;
 | 
					 | 
				
			||||||
    filename = PyUnicode_DecodeFSDefault(filename_str);
 | 
					 | 
				
			||||||
    if (filename == NULL)
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    st = PySymtable_BuildObject(mod, filename, future);
 | 
					 | 
				
			||||||
    Py_DECREF(filename);
 | 
					 | 
				
			||||||
    return st;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
PySymtable_Free(struct symtable *st)
 | 
					_PySymtable_Free(struct symtable *st)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Py_XDECREF(st->st_filename);
 | 
					    Py_XDECREF(st->st_filename);
 | 
				
			||||||
    Py_XDECREF(st->st_blocks);
 | 
					    Py_XDECREF(st->st_blocks);
 | 
				
			||||||
| 
						 | 
					@ -402,7 +390,7 @@ _PyST_GetSymbol(PySTEntryObject *ste, PyObject *name)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
PyST_GetScope(PySTEntryObject *ste, PyObject *name)
 | 
					_PyST_GetScope(PySTEntryObject *ste, PyObject *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    long symbol = _PyST_GetSymbol(ste, name);
 | 
					    long symbol = _PyST_GetSymbol(ste, name);
 | 
				
			||||||
    return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
 | 
					    return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
 | 
				
			||||||
| 
						 | 
					@ -1971,3 +1959,26 @@ symtable_visit_dictcomp(struct symtable *st, expr_ty e)
 | 
				
			||||||
                                         e->v.DictComp.key,
 | 
					                                         e->v.DictComp.key,
 | 
				
			||||||
                                         e->v.DictComp.value);
 | 
					                                         e->v.DictComp.value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct symtable *
 | 
				
			||||||
 | 
					_Py_SymtableStringObjectFlags(const char *str, PyObject *filename,
 | 
				
			||||||
 | 
					                              int start, PyCompilerFlags *flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct symtable *st;
 | 
				
			||||||
 | 
					    mod_ty mod;
 | 
				
			||||||
 | 
					    PyArena *arena;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    arena = PyArena_New();
 | 
				
			||||||
 | 
					    if (arena == NULL)
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
 | 
				
			||||||
 | 
					    if (mod == NULL) {
 | 
				
			||||||
 | 
					        PyArena_Free(arena);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    st = _PySymtable_Build(mod, filename, 0);
 | 
				
			||||||
 | 
					    PyArena_Free(arena);
 | 
				
			||||||
 | 
					    return st;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,6 @@
 | 
				
			||||||
    "parsetok.h",
 | 
					    "parsetok.h",
 | 
				
			||||||
    "pyatomic.h",
 | 
					    "pyatomic.h",
 | 
				
			||||||
    "pytime.h",
 | 
					    "pytime.h",
 | 
				
			||||||
    "symtable.h",
 | 
					 | 
				
			||||||
    "token.h",
 | 
					    "token.h",
 | 
				
			||||||
    "ucnhash.h",
 | 
					    "ucnhash.h",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue