2021-03-19 08:41:49 -03:00
|
|
|
#ifndef Py_INTERNAL_SYMTABLE_H
|
|
|
|
#define Py_INTERNAL_SYMTABLE_H
|
2001-02-02 14:19:15 -04:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2021-03-19 08:41:49 -03:00
|
|
|
#ifndef Py_BUILD_CORE
|
|
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
|
|
#endif
|
2018-11-11 19:56:19 -04:00
|
|
|
|
2021-03-23 16:47:40 -03:00
|
|
|
struct _mod; // Type defined in pycore_ast.h
|
2007-04-15 09:05:43 -03:00
|
|
|
|
2023-05-16 00:36:23 -03:00
|
|
|
typedef enum _block_type {
|
|
|
|
FunctionBlock, ClassBlock, ModuleBlock,
|
|
|
|
// Used for annotations if 'from __future__ import annotations' is active.
|
|
|
|
// Annotation blocks cannot bind names and are not evaluated.
|
|
|
|
AnnotationBlock,
|
|
|
|
// Used for generics and type aliases. These work mostly like functions
|
|
|
|
// (see PEP 695 for details). The three different blocks function identically;
|
|
|
|
// they are different enum entries only so that error messages can be more
|
|
|
|
// precise.
|
|
|
|
TypeVarBoundBlock, TypeAliasBlock, TypeParamBlock
|
|
|
|
} _Py_block_ty;
|
2001-02-02 14:19:15 -04:00
|
|
|
|
2021-12-11 17:28:24 -04:00
|
|
|
typedef enum _comprehension_type {
|
|
|
|
NoComprehension = 0,
|
|
|
|
ListComprehension = 1,
|
|
|
|
DictComprehension = 2,
|
|
|
|
SetComprehension = 3,
|
|
|
|
GeneratorExpression = 4 } _Py_comprehension_ty;
|
|
|
|
|
2001-02-09 18:22:18 -04:00
|
|
|
struct _symtable_entry;
|
|
|
|
|
2001-02-02 14:19:15 -04:00
|
|
|
struct symtable {
|
2013-08-26 17:28:21 -03:00
|
|
|
PyObject *st_filename; /* name of file being compiled,
|
2010-12-26 21:49:31 -04:00
|
|
|
decoded from the filesystem encoding */
|
2010-05-09 12:52:27 -03:00
|
|
|
struct _symtable_entry *st_cur; /* current symbol table entry */
|
|
|
|
struct _symtable_entry *st_top; /* symbol table entry for module */
|
|
|
|
PyObject *st_blocks; /* dict: map AST node addresses
|
|
|
|
* to symbol table entries */
|
|
|
|
PyObject *st_stack; /* list: stack of namespace info */
|
2011-04-10 01:37:26 -03:00
|
|
|
PyObject *st_global; /* borrowed ref to st_top->ste_symbols */
|
|
|
|
int st_nblocks; /* number of blocks used. kept for
|
|
|
|
consistency with the corresponding
|
|
|
|
compiler structure */
|
2010-05-09 12:52:27 -03:00
|
|
|
PyObject *st_private; /* name of current class or NULL */
|
2011-04-10 01:37:26 -03:00
|
|
|
PyFutureFeatures *st_future; /* module's future features that affect
|
|
|
|
the symbol table */
|
2012-11-04 09:14:34 -04:00
|
|
|
int recursion_depth; /* current recursion depth */
|
|
|
|
int recursion_limit; /* recursion limit */
|
2001-02-02 14:19:15 -04:00
|
|
|
};
|
|
|
|
|
2001-02-09 18:22:18 -04:00
|
|
|
typedef struct _symtable_entry {
|
2010-05-09 12:52:27 -03:00
|
|
|
PyObject_HEAD
|
|
|
|
PyObject *ste_id; /* int: key in ste_table->st_blocks */
|
|
|
|
PyObject *ste_symbols; /* dict: variable names to flags */
|
|
|
|
PyObject *ste_name; /* string: name of current block */
|
2011-04-10 01:37:26 -03:00
|
|
|
PyObject *ste_varnames; /* list of function parameters */
|
2010-05-09 12:52:27 -03:00
|
|
|
PyObject *ste_children; /* list of child blocks */
|
2012-10-31 21:26:20 -03:00
|
|
|
PyObject *ste_directives;/* locations of global and nonlocal statements */
|
2023-05-16 00:36:23 -03:00
|
|
|
_Py_block_ty ste_type;
|
2010-05-09 12:52:27 -03:00
|
|
|
int ste_nested; /* true if block is nested */
|
|
|
|
unsigned ste_free : 1; /* true if block has free variables */
|
|
|
|
unsigned ste_child_free : 1; /* true if a child block has free vars,
|
|
|
|
including free refs to globals */
|
|
|
|
unsigned ste_generator : 1; /* true if namespace is a generator */
|
2016-09-09 02:01:51 -03:00
|
|
|
unsigned ste_coroutine : 1; /* true if namespace is a coroutine */
|
2021-12-11 17:28:24 -04:00
|
|
|
_Py_comprehension_ty ste_comprehension; /* Kind of comprehension (if any) */
|
2010-05-09 12:52:27 -03:00
|
|
|
unsigned ste_varargs : 1; /* true if block has varargs */
|
|
|
|
unsigned ste_varkeywords : 1; /* true if block has varkeywords */
|
|
|
|
unsigned ste_returns_value : 1; /* true if namespace uses return with
|
|
|
|
an argument */
|
2013-05-15 17:26:42 -03:00
|
|
|
unsigned ste_needs_class_closure : 1; /* for class scopes, true if a
|
|
|
|
closure over __class__
|
|
|
|
should be created */
|
2023-05-16 00:36:23 -03:00
|
|
|
unsigned ste_needs_classdict : 1; /* for class scopes, true if a closure
|
|
|
|
over the class dict should be created */
|
2023-05-09 14:02:14 -03:00
|
|
|
unsigned ste_comp_inlined : 1; /* true if this comprehension is inlined */
|
2019-08-25 10:45:40 -03:00
|
|
|
unsigned ste_comp_iter_target : 1; /* true if visiting comprehension target */
|
2023-05-16 00:36:23 -03:00
|
|
|
unsigned ste_can_see_class_scope : 1; /* true if this block can see names bound in an
|
|
|
|
enclosing class scope */
|
2019-08-25 10:45:40 -03:00
|
|
|
int ste_comp_iter_expr; /* non-zero if visiting a comprehension range expression */
|
2010-05-09 12:52:27 -03:00
|
|
|
int ste_lineno; /* first line of block */
|
2010-09-20 20:02:10 -03:00
|
|
|
int ste_col_offset; /* offset of first line of block */
|
bpo-43914: Highlight invalid ranges in SyntaxErrors (#25525)
To improve the user experience understanding what part of the error messages associated with SyntaxErrors is wrong, we can highlight the whole error range and not only place the caret at the first character. In this way:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
becomes
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
2021-04-23 10:27:05 -03:00
|
|
|
int ste_end_lineno; /* end line of block */
|
|
|
|
int ste_end_col_offset; /* end offset of first line of block */
|
2010-05-09 12:52:27 -03:00
|
|
|
int ste_opt_lineno; /* lineno of last exec or import * */
|
2010-09-20 20:02:10 -03:00
|
|
|
int ste_opt_col_offset; /* offset of last exec or import * */
|
2010-05-09 12:52:27 -03:00
|
|
|
struct symtable *ste_table;
|
2005-10-20 16:59:25 -03:00
|
|
|
} PySTEntryObject;
|
2001-02-09 18:22:18 -04:00
|
|
|
|
2021-03-19 08:41:49 -03:00
|
|
|
extern PyTypeObject PySTEntry_Type;
|
2001-02-09 18:22:18 -04:00
|
|
|
|
2022-06-16 08:49:43 -03:00
|
|
|
#define PySTEntry_Check(op) Py_IS_TYPE((op), &PySTEntry_Type)
|
2001-02-09 18:22:18 -04:00
|
|
|
|
2021-06-30 19:53:36 -03:00
|
|
|
extern long _PyST_GetSymbol(PySTEntryObject *, PyObject *);
|
2021-03-19 08:41:49 -03:00
|
|
|
extern int _PyST_GetScope(PySTEntryObject *, PyObject *);
|
2023-05-16 00:36:23 -03:00
|
|
|
extern int _PyST_IsFunctionLike(PySTEntryObject *);
|
2001-02-02 14:19:15 -04:00
|
|
|
|
2021-03-19 08:41:49 -03:00
|
|
|
extern struct symtable* _PySymtable_Build(
|
2021-03-23 16:47:40 -03:00
|
|
|
struct _mod *mod,
|
2013-08-26 17:28:21 -03:00
|
|
|
PyObject *filename,
|
|
|
|
PyFutureFeatures *future);
|
2023-07-24 21:54:09 -03:00
|
|
|
extern PySTEntryObject* _PySymtable_Lookup(struct symtable *, void *);
|
2001-02-02 14:19:15 -04:00
|
|
|
|
2021-03-19 08:41:49 -03:00
|
|
|
extern void _PySymtable_Free(struct symtable *);
|
2001-02-02 14:19:15 -04:00
|
|
|
|
2023-03-02 14:38:22 -04:00
|
|
|
extern PyObject* _Py_Mangle(PyObject *p, PyObject *name);
|
|
|
|
|
2001-02-02 14:19:15 -04:00
|
|
|
/* Flags for def-use information */
|
|
|
|
|
2024-02-07 16:19:47 -04:00
|
|
|
#define DEF_GLOBAL 1 /* global stmt */
|
|
|
|
#define DEF_LOCAL 2 /* assignment in code block */
|
|
|
|
#define DEF_PARAM (2<<1) /* formal parameter */
|
|
|
|
#define DEF_NONLOCAL (2<<2) /* nonlocal stmt */
|
|
|
|
#define USE (2<<3) /* name is used */
|
|
|
|
#define DEF_FREE (2<<4) /* name used but not defined in nested block */
|
|
|
|
#define DEF_FREE_CLASS (2<<5) /* free variable from class's method */
|
|
|
|
#define DEF_IMPORT (2<<6) /* assignment occurred via import */
|
|
|
|
#define DEF_ANNOT (2<<7) /* this name is annotated */
|
|
|
|
#define DEF_COMP_ITER (2<<8) /* this name is a comprehension iteration variable */
|
|
|
|
#define DEF_TYPE_PARAM (2<<9) /* this name is a type parameter */
|
|
|
|
#define DEF_COMP_CELL (2<<10) /* this name is a cell in an inlined comprehension */
|
2001-02-02 14:19:15 -04:00
|
|
|
|
2001-02-28 19:03:39 -04:00
|
|
|
#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT)
|
|
|
|
|
2005-10-20 16:59:25 -03:00
|
|
|
/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol
|
2010-05-09 12:52:27 -03:00
|
|
|
table. GLOBAL is returned from PyST_GetScope() for either of them.
|
2023-05-18 21:07:35 -03:00
|
|
|
It is stored in ste_symbols at bits 13-16.
|
2005-10-20 16:59:25 -03:00
|
|
|
*/
|
2023-05-18 21:07:35 -03:00
|
|
|
#define SCOPE_OFFSET 12
|
2007-02-27 02:50:52 -04:00
|
|
|
#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL)
|
2001-02-02 14:19:15 -04:00
|
|
|
|
|
|
|
#define LOCAL 1
|
|
|
|
#define GLOBAL_EXPLICIT 2
|
|
|
|
#define GLOBAL_IMPLICIT 3
|
|
|
|
#define FREE 4
|
|
|
|
#define CELL 5
|
|
|
|
|
2005-10-20 16:59:25 -03:00
|
|
|
#define GENERATOR 1
|
|
|
|
#define GENERATOR_EXPRESSION 2
|
2001-02-27 00:23:34 -04:00
|
|
|
|
2021-03-19 08:41:49 -03:00
|
|
|
// Used by symtablemodule.c
|
|
|
|
extern struct symtable* _Py_SymtableStringObjectFlags(
|
|
|
|
const char *str,
|
|
|
|
PyObject *filename,
|
|
|
|
int start,
|
|
|
|
PyCompilerFlags *flags);
|
|
|
|
|
2023-03-02 14:38:22 -04:00
|
|
|
int _PyFuture_FromAST(
|
|
|
|
struct _mod * mod,
|
|
|
|
PyObject *filename,
|
|
|
|
PyFutureFeatures* futures);
|
|
|
|
|
2001-02-02 14:19:15 -04:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
2021-03-19 08:41:49 -03:00
|
|
|
#endif /* !Py_INTERNAL_SYMTABLE_H */
|