mirror of
https://github.com/python/cpython
synced 2024-09-16 02:09:58 +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
|
@ -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…
Reference in a new issue