diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2024-04-04 16:47:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-04 15:47:26 +0000 |
commit | 04697bcfaf5dd34c9312f4f405083b6d33b3511f (patch) | |
tree | 6a046068f8d90eaa725a52e116192edb7c47ff4f /Include/internal/pycore_instruction_sequence.h | |
parent | 060a96f1a9a901b01ed304aa82b886d248ca1cb6 (diff) | |
download | cpython-04697bcfaf5dd34c9312f4f405083b6d33b3511f.tar.gz cpython-04697bcfaf5dd34c9312f4f405083b6d33b3511f.zip |
gh-117494: extract the Instruction Sequence data structure into a separate file (#117496)
Diffstat (limited to 'Include/internal/pycore_instruction_sequence.h')
-rw-r--r-- | Include/internal/pycore_instruction_sequence.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Include/internal/pycore_instruction_sequence.h b/Include/internal/pycore_instruction_sequence.h new file mode 100644 index 00000000000..b57484fa053 --- /dev/null +++ b/Include/internal/pycore_instruction_sequence.h @@ -0,0 +1,60 @@ +#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 + +#ifdef __cplusplus +extern "C" { +#endif + +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; + +typedef struct { + _PyInstruction *s_instrs; + int s_allocated; + int s_used; + + int s_next_free_label; /* next free label id */ + /* 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. + */ + int *s_labelmap; /* label id --> instr offset */ + int s_labelmap_size; +} _PyInstructionSequence; + +typedef struct { + int id; +} _PyJumpTargetLabel; + +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); +void PyInstructionSequence_Fini(_PyInstructionSequence *seq); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_INSTRUCTION_SEQUENCE_H */ |