2021-03-23 20:51:50 -03:00
|
|
|
#ifndef Py_INTERNAL_COMPILE_H
|
|
|
|
#define Py_INTERNAL_COMPILE_H
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
|
|
#endif
|
|
|
|
|
2024-09-09 14:21:51 -03:00
|
|
|
#include "pycore_ast.h" // mod_ty
|
2024-04-02 07:34:49 -03:00
|
|
|
#include "pycore_symtable.h" // _Py_SourceLocation
|
2024-04-04 12:47:26 -03:00
|
|
|
#include "pycore_instruction_sequence.h"
|
2024-04-02 07:34:49 -03:00
|
|
|
|
2021-03-23 22:23:01 -03:00
|
|
|
struct _arena; // Type defined in pycore_pyarena.h
|
|
|
|
struct _mod; // Type defined in pycore_ast.h
|
2021-03-23 20:51:50 -03:00
|
|
|
|
2023-07-24 22:44:11 -03:00
|
|
|
// Export for 'test_peg_generator' shared extension
|
2021-03-23 20:51:50 -03:00
|
|
|
PyAPI_FUNC(PyCodeObject*) _PyAST_Compile(
|
|
|
|
struct _mod *mod,
|
|
|
|
PyObject *filename,
|
|
|
|
PyCompilerFlags *flags,
|
|
|
|
int optimize,
|
2021-03-23 22:23:01 -03:00
|
|
|
struct _arena *arena);
|
2022-11-02 12:13:07 -03:00
|
|
|
|
2023-08-23 05:01:17 -03:00
|
|
|
/* AST optimizations */
|
2023-08-24 13:06:53 -03:00
|
|
|
extern int _PyCompile_AstOptimize(
|
2023-08-23 05:01:17 -03:00
|
|
|
struct _mod *mod,
|
|
|
|
PyObject *filename,
|
|
|
|
PyCompilerFlags *flags,
|
|
|
|
int optimize,
|
|
|
|
struct _arena *arena);
|
|
|
|
|
2024-04-02 07:34:49 -03:00
|
|
|
struct _Py_SourceLocation;
|
2021-03-23 20:51:50 -03:00
|
|
|
|
|
|
|
extern int _PyAST_Optimize(
|
|
|
|
struct _mod *,
|
2021-03-23 22:23:01 -03:00
|
|
|
struct _arena *arena,
|
2023-05-31 16:21:46 -03:00
|
|
|
int optimize,
|
|
|
|
int ff_features);
|
2021-03-23 20:51:50 -03:00
|
|
|
|
2023-08-10 09:03:47 -03:00
|
|
|
|
2023-04-11 07:15:09 -03:00
|
|
|
typedef struct {
|
|
|
|
PyObject *u_name;
|
|
|
|
PyObject *u_qualname; /* dot-separated qualified name (lazy) */
|
|
|
|
|
|
|
|
/* The following fields are dicts that map objects to
|
|
|
|
the index of them in co_XXX. The index is used as
|
|
|
|
the argument for opcodes that refer to those collections.
|
|
|
|
*/
|
|
|
|
PyObject *u_consts; /* all constants */
|
|
|
|
PyObject *u_names; /* all names */
|
|
|
|
PyObject *u_varnames; /* local variables */
|
|
|
|
PyObject *u_cellvars; /* cell variables */
|
|
|
|
PyObject *u_freevars; /* free variables */
|
2023-05-09 14:02:14 -03:00
|
|
|
PyObject *u_fasthidden; /* dict; keys are names that are fast-locals only
|
|
|
|
temporarily within an inlined comprehension. When
|
|
|
|
value is True, treat as fast-local. */
|
2023-04-11 07:15:09 -03:00
|
|
|
|
|
|
|
Py_ssize_t u_argcount; /* number of arguments for block */
|
|
|
|
Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */
|
|
|
|
Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
|
|
|
|
|
|
|
|
int u_firstlineno; /* the first lineno of the block */
|
|
|
|
} _PyCompile_CodeUnitMetadata;
|
|
|
|
|
2024-09-09 14:21:51 -03:00
|
|
|
struct _PyCompiler;
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
COMPILE_OP_FAST,
|
|
|
|
COMPILE_OP_GLOBAL,
|
|
|
|
COMPILE_OP_DEREF,
|
|
|
|
COMPILE_OP_NAME,
|
|
|
|
} _PyCompile_optype;
|
|
|
|
|
|
|
|
/* _PyCompile_FBlockInfo tracks the current frame block.
|
|
|
|
*
|
|
|
|
* A frame block is used to handle loops, try/except, and try/finally.
|
|
|
|
* It's called a frame block to distinguish it from a basic block in the
|
|
|
|
* compiler IR.
|
|
|
|
*/
|
|
|
|
|
|
|
|
enum _PyCompile_FBlockType {
|
|
|
|
COMPILE_FBLOCK_WHILE_LOOP,
|
|
|
|
COMPILE_FBLOCK_FOR_LOOP,
|
|
|
|
COMPILE_FBLOCK_TRY_EXCEPT,
|
|
|
|
COMPILE_FBLOCK_FINALLY_TRY,
|
|
|
|
COMPILE_FBLOCK_FINALLY_END,
|
|
|
|
COMPILE_FBLOCK_WITH,
|
|
|
|
COMPILE_FBLOCK_ASYNC_WITH,
|
|
|
|
COMPILE_FBLOCK_HANDLER_CLEANUP,
|
|
|
|
COMPILE_FBLOCK_POP_VALUE,
|
|
|
|
COMPILE_FBLOCK_EXCEPTION_HANDLER,
|
|
|
|
COMPILE_FBLOCK_EXCEPTION_GROUP_HANDLER,
|
|
|
|
COMPILE_FBLOCK_ASYNC_COMPREHENSION_GENERATOR,
|
|
|
|
COMPILE_FBLOCK_STOP_ITERATION,
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
enum _PyCompile_FBlockType fb_type;
|
|
|
|
_PyJumpTargetLabel fb_block;
|
|
|
|
_Py_SourceLocation fb_loc;
|
|
|
|
/* (optional) type-specific exit or cleanup block */
|
|
|
|
_PyJumpTargetLabel fb_exit;
|
|
|
|
/* (optional) additional information required for unwinding */
|
|
|
|
void *fb_datum;
|
|
|
|
} _PyCompile_FBlockInfo;
|
|
|
|
|
|
|
|
|
|
|
|
int _PyCompile_PushFBlock(struct _PyCompiler *c, _Py_SourceLocation loc,
|
|
|
|
enum _PyCompile_FBlockType t,
|
|
|
|
_PyJumpTargetLabel block_label,
|
|
|
|
_PyJumpTargetLabel exit, void *datum);
|
|
|
|
void _PyCompile_PopFBlock(struct _PyCompiler *c, enum _PyCompile_FBlockType t,
|
|
|
|
_PyJumpTargetLabel block_label);
|
|
|
|
_PyCompile_FBlockInfo *_PyCompile_TopFBlock(struct _PyCompiler *c);
|
|
|
|
|
|
|
|
int _PyCompile_EnterScope(struct _PyCompiler *c, identifier name, int scope_type,
|
|
|
|
void *key, int lineno, PyObject *private,
|
|
|
|
_PyCompile_CodeUnitMetadata *umd);
|
|
|
|
void _PyCompile_ExitScope(struct _PyCompiler *c);
|
|
|
|
Py_ssize_t _PyCompile_AddConst(struct _PyCompiler *c, PyObject *o);
|
|
|
|
_PyInstructionSequence *_PyCompile_InstrSequence(struct _PyCompiler *c);
|
|
|
|
int _PyCompile_FutureFeatures(struct _PyCompiler *c);
|
|
|
|
PyObject *_PyCompile_DeferredAnnotations(struct _PyCompiler *c);
|
|
|
|
PyObject *_PyCompile_Mangle(struct _PyCompiler *c, PyObject *name);
|
|
|
|
PyObject *_PyCompile_MaybeMangle(struct _PyCompiler *c, PyObject *name);
|
|
|
|
int _PyCompile_MaybeAddStaticAttributeToClass(struct _PyCompiler *c, expr_ty e);
|
|
|
|
int _PyCompile_GetRefType(struct _PyCompiler *c, PyObject *name);
|
|
|
|
int _PyCompile_LookupCellvar(struct _PyCompiler *c, PyObject *name);
|
|
|
|
int _PyCompile_ResolveNameop(struct _PyCompiler *c, PyObject *mangled, int scope,
|
|
|
|
_PyCompile_optype *optype, Py_ssize_t *arg);
|
|
|
|
|
|
|
|
int _PyCompile_IsInteractive(struct _PyCompiler *c);
|
|
|
|
int _PyCompile_IsNestedScope(struct _PyCompiler *c);
|
|
|
|
int _PyCompile_IsInInlinedComp(struct _PyCompiler *c);
|
|
|
|
int _PyCompile_ScopeType(struct _PyCompiler *c);
|
|
|
|
int _PyCompile_OptimizationLevel(struct _PyCompiler *c);
|
|
|
|
PyArena *_PyCompile_Arena(struct _PyCompiler *c);
|
|
|
|
int _PyCompile_LookupArg(struct _PyCompiler *c, PyCodeObject *co, PyObject *name);
|
|
|
|
PyObject *_PyCompile_Qualname(struct _PyCompiler *c);
|
|
|
|
_PyCompile_CodeUnitMetadata *_PyCompile_Metadata(struct _PyCompiler *c);
|
|
|
|
PyObject *_PyCompile_StaticAttributesAsTuple(struct _PyCompiler *c);
|
|
|
|
|
|
|
|
#ifndef NDEBUG
|
|
|
|
int _PyCompile_IsTopLevelAwait(struct _PyCompiler *c);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
struct symtable *_PyCompile_Symtable(struct _PyCompiler *c);
|
|
|
|
PySTEntryObject *_PyCompile_SymtableEntry(struct _PyCompiler *c);
|
|
|
|
|
|
|
|
enum {
|
|
|
|
COMPILE_SCOPE_MODULE,
|
|
|
|
COMPILE_SCOPE_CLASS,
|
|
|
|
COMPILE_SCOPE_FUNCTION,
|
|
|
|
COMPILE_SCOPE_ASYNC_FUNCTION,
|
|
|
|
COMPILE_SCOPE_LAMBDA,
|
|
|
|
COMPILE_SCOPE_COMPREHENSION,
|
|
|
|
COMPILE_SCOPE_ANNOTATIONS,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
PyObject *pushed_locals;
|
|
|
|
PyObject *temp_symbols;
|
|
|
|
PyObject *fast_hidden;
|
|
|
|
_PyJumpTargetLabel cleanup;
|
|
|
|
} _PyCompile_InlinedComprehensionState;
|
|
|
|
|
|
|
|
int _PyCompile_TweakInlinedComprehensionScopes(struct _PyCompiler *c, _Py_SourceLocation loc,
|
|
|
|
PySTEntryObject *entry,
|
|
|
|
_PyCompile_InlinedComprehensionState *state);
|
|
|
|
int _PyCompile_RevertInlinedComprehensionScopes(struct _PyCompiler *c, _Py_SourceLocation loc,
|
|
|
|
_PyCompile_InlinedComprehensionState *state);
|
|
|
|
int _PyCompile_AddDeferredAnnotaion(struct _PyCompiler *c, stmt_ty s);
|
|
|
|
|
|
|
|
int _PyCodegen_AddReturnAtEnd(struct _PyCompiler *c, int addNone);
|
|
|
|
int _PyCodegen_EnterAnonymousScope(struct _PyCompiler* c, mod_ty mod);
|
|
|
|
int _PyCodegen_Expression(struct _PyCompiler *c, expr_ty e);
|
|
|
|
int _PyCodegen_Body(struct _PyCompiler *c, _Py_SourceLocation loc, asdl_stmt_seq *stmts);
|
2023-04-11 07:15:09 -03:00
|
|
|
|
2023-03-31 14:17:59 -03:00
|
|
|
/* Utility for a number of growing arrays used in the compiler */
|
|
|
|
int _PyCompile_EnsureArrayLargeEnough(
|
|
|
|
int idx,
|
|
|
|
void **array,
|
|
|
|
int *alloc,
|
|
|
|
int default_alloc,
|
|
|
|
size_t item_size);
|
|
|
|
|
|
|
|
int _PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj);
|
|
|
|
|
2024-09-09 14:21:51 -03:00
|
|
|
PyCodeObject *_PyCompile_OptimizeAndAssemble(struct _PyCompiler *c, int addNone);
|
|
|
|
|
|
|
|
Py_ssize_t _PyCompile_DictAddObj(PyObject *dict, PyObject *o);
|
|
|
|
int _PyCompile_Error(struct _PyCompiler *c, _Py_SourceLocation loc, const char *format, ...);
|
|
|
|
int _PyCompile_Warn(struct _PyCompiler *c, _Py_SourceLocation loc, const char *format, ...);
|
2023-11-13 20:31:02 -04:00
|
|
|
|
2024-03-05 12:05:52 -04:00
|
|
|
// Export for '_opcode' extension module
|
2023-11-13 20:31:02 -04:00
|
|
|
PyAPI_FUNC(PyObject*) _PyCompile_GetUnaryIntrinsicName(int index);
|
|
|
|
PyAPI_FUNC(PyObject*) _PyCompile_GetBinaryIntrinsicName(int index);
|
|
|
|
|
2022-08-24 07:02:53 -03:00
|
|
|
/* Access compiler internals for unit testing */
|
2022-11-14 09:56:40 -04:00
|
|
|
|
2023-07-24 22:44:11 -03:00
|
|
|
// Export for '_testinternalcapi' shared extension
|
2023-07-15 07:33:32 -03:00
|
|
|
PyAPI_FUNC(PyObject*) _PyCompile_CleanDoc(PyObject *doc);
|
|
|
|
|
2023-08-24 13:06:53 -03:00
|
|
|
// Export for '_testinternalcapi' shared extension
|
2022-11-14 09:56:40 -04:00
|
|
|
PyAPI_FUNC(PyObject*) _PyCompile_CodeGen(
|
|
|
|
PyObject *ast,
|
|
|
|
PyObject *filename,
|
|
|
|
PyCompilerFlags *flags,
|
2023-05-07 14:47:28 -03:00
|
|
|
int optimize,
|
|
|
|
int compile_mode);
|
2022-11-14 09:56:40 -04:00
|
|
|
|
2023-08-24 13:06:53 -03:00
|
|
|
// Export for '_testinternalcapi' shared extension
|
2023-05-01 18:29:30 -03:00
|
|
|
PyAPI_FUNC(PyCodeObject*)
|
|
|
|
_PyCompile_Assemble(_PyCompile_CodeUnitMetadata *umd, PyObject *filename,
|
|
|
|
PyObject *instructions);
|
|
|
|
|
2021-03-23 20:51:50 -03:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* !Py_INTERNAL_COMPILE_H */
|