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);
|
2005-10-20 16:59:25 -03:00
|
|
|
PyAPI_FUNC(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 */
|
|
|
|
|
|
|
|
#define DEF_GLOBAL 1 /* global stmt */
|
|
|
|
#define DEF_LOCAL 2 /* assignment in code block */
|
|
|
|
#define DEF_PARAM 2<<1 /* formal parameter */
|
2007-02-27 02:50:52 -04:00
|
|
|
#define DEF_NONLOCAL 2<<2 /* nonlocal stmt */
|
|
|
|
#define USE 2<<3 /* name is used */
|
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r73376 | benjamin.peterson | 2009-06-11 17:29:23 -0500 (Thu, 11 Jun 2009) | 1 line
remove check for case handled in sub-function
........
r73393 | alexandre.vassalotti | 2009-06-12 13:56:57 -0500 (Fri, 12 Jun 2009) | 2 lines
Clear reference to the static PyExc_RecursionErrorInst in _PyExc_Fini.
........
r73398 | alexandre.vassalotti | 2009-06-12 15:57:12 -0500 (Fri, 12 Jun 2009) | 3 lines
Add const qualifier to PyErr_SetFromErrnoWithFilename and to
PyErr_SetFromErrnoWithUnicodeFilename.
........
r73400 | alexandre.vassalotti | 2009-06-12 16:43:47 -0500 (Fri, 12 Jun 2009) | 2 lines
Delete outdated make file for building the parser with MSVC 6.
........
r73404 | benjamin.peterson | 2009-06-12 20:40:00 -0500 (Fri, 12 Jun 2009) | 1 line
keep the slice.step field as NULL if no step expression is given
........
r73405 | benjamin.peterson | 2009-06-12 22:46:30 -0500 (Fri, 12 Jun 2009) | 1 line
prevent import statements from assigning to None
........
r73409 | benjamin.peterson | 2009-06-13 08:06:21 -0500 (Sat, 13 Jun 2009) | 1 line
allow importing from a module named None if it has an 'as' clause
........
r73419 | benjamin.peterson | 2009-06-13 11:19:19 -0500 (Sat, 13 Jun 2009) | 1 line
set Print.values to NULL if there are no values
........
r73420 | benjamin.peterson | 2009-06-13 12:08:53 -0500 (Sat, 13 Jun 2009) | 1 line
give a better error message when deleting ()
........
r73421 | benjamin.peterson | 2009-06-13 15:23:33 -0500 (Sat, 13 Jun 2009) | 1 line
when no module is given in a 'from' relative import, make ImportFrom.module NULL
........
r73432 | amaury.forgeotdarc | 2009-06-14 16:20:40 -0500 (Sun, 14 Jun 2009) | 3 lines
#6227: Because of a wrong indentation, the test was not testing what it should.
Ensure that the snippet in doctest_aliases actually contains aliases.
........
r73457 | benjamin.peterson | 2009-06-16 18:13:09 -0500 (Tue, 16 Jun 2009) | 1 line
add underscores
........
r73460 | benjamin.peterson | 2009-06-16 22:23:04 -0500 (Tue, 16 Jun 2009) | 1 line
remove unused 'encoding' member from the compiler struct
........
r73485 | benjamin.peterson | 2009-06-19 17:07:47 -0500 (Fri, 19 Jun 2009) | 1 line
remove duplicate test
........
r73486 | benjamin.peterson | 2009-06-19 17:09:17 -0500 (Fri, 19 Jun 2009) | 1 line
add missing assertion #6313
........
r73488 | benjamin.peterson | 2009-06-19 17:16:28 -0500 (Fri, 19 Jun 2009) | 1 line
show that this one isn't used
........
r73489 | benjamin.peterson | 2009-06-19 17:21:12 -0500 (Fri, 19 Jun 2009) | 1 line
use closures
........
r73501 | benjamin.peterson | 2009-06-21 18:01:07 -0500 (Sun, 21 Jun 2009) | 1 line
don't need to add the name 'lambda' as assigned
........
r73502 | benjamin.peterson | 2009-06-21 18:03:36 -0500 (Sun, 21 Jun 2009) | 1 line
remove tmpname support since it's no longer used
........
r73513 | benjamin.peterson | 2009-06-22 20:18:57 -0500 (Mon, 22 Jun 2009) | 1 line
fix grammar
........
r73514 | benjamin.peterson | 2009-06-22 22:01:56 -0500 (Mon, 22 Jun 2009) | 1 line
remove some unused symtable constants
........
2009-06-28 16:19:51 -03:00
|
|
|
#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 */
|
2016-09-09 00:50:03 -03:00
|
|
|
#define DEF_ANNOT 2<<7 /* this name is annotated */
|
2019-08-25 10:45:40 -03:00
|
|
|
#define DEF_COMP_ITER 2<<8 /* this name is a comprehension iteration variable */
|
2023-05-16 00:36:23 -03:00
|
|
|
#define DEF_TYPE_PARAM 2<<9 /* this name is a type parameter */
|
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.
|
2007-02-27 02:50:52 -04:00
|
|
|
It is stored in ste_symbols at bits 12-15.
|
2005-10-20 16:59:25 -03:00
|
|
|
*/
|
2007-04-15 09:05:43 -03:00
|
|
|
#define SCOPE_OFFSET 11
|
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 */
|