2024-04-04 12:47:26 -03:00
|
|
|
#ifndef Py_INTERNAL_INSTRUCTION_SEQUENCE_H
|
|
|
|
#define Py_INTERNAL_INSTRUCTION_SEQUENCE_H
|
|
|
|
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
|
|
#endif
|
|
|
|
|
2024-04-17 12:42:04 -03:00
|
|
|
#include "pycore_symtable.h"
|
|
|
|
|
2024-04-04 12:47:26 -03:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2024-04-17 12:42:04 -03:00
|
|
|
|
2024-04-04 12:47:26 -03:00
|
|
|
typedef struct {
|
|
|
|
int h_label;
|
|
|
|
int h_startdepth;
|
|
|
|
int h_preserve_lasti;
|
|
|
|
} _PyExceptHandlerInfo;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
int i_opcode;
|
|
|
|
int i_oparg;
|
|
|
|
_Py_SourceLocation i_loc;
|
|
|
|
_PyExceptHandlerInfo i_except_handler_info;
|
|
|
|
|
|
|
|
/* Temporary fields, used by the assembler and in instr_sequence_to_cfg */
|
|
|
|
int i_target;
|
|
|
|
int i_offset;
|
|
|
|
} _PyInstruction;
|
|
|
|
|
2024-04-17 12:42:04 -03:00
|
|
|
typedef struct instruction_sequence {
|
|
|
|
PyObject_HEAD
|
2024-04-04 12:47:26 -03:00
|
|
|
_PyInstruction *s_instrs;
|
|
|
|
int s_allocated;
|
|
|
|
int s_used;
|
|
|
|
|
|
|
|
int s_next_free_label; /* next free label id */
|
2024-04-17 12:42:04 -03:00
|
|
|
|
2024-04-04 12:47:26 -03:00
|
|
|
/* Map of a label id to instruction offset (index into s_instrs).
|
|
|
|
* If s_labelmap is NULL, then each label id is the offset itself.
|
|
|
|
*/
|
2024-04-17 12:42:04 -03:00
|
|
|
int *s_labelmap;
|
2024-04-04 12:47:26 -03:00
|
|
|
int s_labelmap_size;
|
2024-04-17 12:42:04 -03:00
|
|
|
|
|
|
|
/* PyList of instruction sequences of nested functions */
|
|
|
|
PyObject *s_nested;
|
2024-04-04 12:47:26 -03:00
|
|
|
} _PyInstructionSequence;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
int id;
|
|
|
|
} _PyJumpTargetLabel;
|
|
|
|
|
2024-09-09 14:21:51 -03:00
|
|
|
#define NO_LABEL ((const _PyJumpTargetLabel){-1})
|
|
|
|
|
|
|
|
#define SAME_JUMP_TARGET_LABEL(L1, L2) ((L1).id == (L2).id)
|
|
|
|
#define IS_JUMP_TARGET_LABEL(L) (!SAME_JUMP_TARGET_LABEL((L), (NO_LABEL)))
|
|
|
|
|
2024-04-17 12:42:04 -03:00
|
|
|
PyAPI_FUNC(PyObject*)_PyInstructionSequence_New(void);
|
|
|
|
|
2024-04-04 12:47:26 -03:00
|
|
|
int _PyInstructionSequence_UseLabel(_PyInstructionSequence *seq, int lbl);
|
|
|
|
int _PyInstructionSequence_Addop(_PyInstructionSequence *seq,
|
|
|
|
int opcode, int oparg,
|
|
|
|
_Py_SourceLocation loc);
|
|
|
|
_PyJumpTargetLabel _PyInstructionSequence_NewLabel(_PyInstructionSequence *seq);
|
|
|
|
int _PyInstructionSequence_ApplyLabelMap(_PyInstructionSequence *seq);
|
|
|
|
int _PyInstructionSequence_InsertInstruction(_PyInstructionSequence *seq, int pos,
|
|
|
|
int opcode, int oparg, _Py_SourceLocation loc);
|
2024-04-24 06:46:17 -03:00
|
|
|
int _PyInstructionSequence_AddNested(_PyInstructionSequence *seq, _PyInstructionSequence *nested);
|
2024-04-04 12:47:26 -03:00
|
|
|
void PyInstructionSequence_Fini(_PyInstructionSequence *seq);
|
|
|
|
|
2024-04-17 12:42:04 -03:00
|
|
|
extern PyTypeObject _PyInstructionSequence_Type;
|
|
|
|
#define _PyInstructionSequence_Check(v) Py_IS_TYPE((v), &_PyInstructionSequence_Type)
|
2024-04-04 12:47:26 -03:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* !Py_INTERNAL_INSTRUCTION_SEQUENCE_H */
|