Documentation
¶
Overview ¶
Package compile holds the AST-to-bytecode pipeline. Mirrors cpython/Python/instruction_sequence.c, codegen.c, flowgraph.c, assemble.c, and compile.c.
Index ¶
- Constants
- func AssembleExceptionTable(seq *Sequence) []byte
- func AssembleLineTable(seq *Sequence, firstLineno int) []byte
- func Disassemble(co *Code) string
- func HasTarget(op Opcode) bool
- type Assembler
- type BasicBlock
- type Builder
- type Code
- type Compiler
- type ConstTuple
- type ExceptHandler
- type ExceptHandlerInfo
- type Info
- type Instr
- type JumpTargetLabel
- type Opcode
- func (op Opcode) HasArg() bool
- func (op Opcode) HasConst() bool
- func (op Opcode) HasDeopt() bool
- func (op Opcode) HasError() bool
- func (op Opcode) HasErrorNoPop() bool
- func (op Opcode) HasEscapes() bool
- func (op Opcode) HasEvalBreak() bool
- func (op Opcode) HasExit() bool
- func (op Opcode) HasFree() bool
- func (op Opcode) HasJump() bool
- func (op Opcode) HasLocal() bool
- func (op Opcode) HasName() bool
- func (op Opcode) HasNoSaveIP() bool
- func (op Opcode) HasOpargAnd1() bool
- func (op Opcode) HasPassthrough() bool
- func (op Opcode) HasPure() bool
- func (op Opcode) Name() string
- type Sequence
- func (s *Sequence) AddNested(child *Sequence)
- func (s *Sequence) Addop(op Opcode, oparg int32, loc ast.Pos)
- func (s *Sequence) ApplyLabelMap(hasTarget func(Opcode) bool)
- func (s *Sequence) Insert(pos int, op Opcode, oparg int32, loc ast.Pos)
- func (s *Sequence) NewLabel() JumpTargetLabel
- func (s *Sequence) SetAnnotationsCode(annot *Sequence)
- func (s *Sequence) UseLabel(lbl JumpTargetLabel)
- type Unit
Constants ¶
const ( FastLocal uint8 = 0x20 FastCell uint8 = 0x40 FastFree uint8 = 0x80 FastHidden uint8 = 0x10 )
FastLocalKind bits. Mirror cpython/Include/internal/pycore_code.h CO_FAST_LOCAL / CO_FAST_CELL / CO_FAST_FREE / CO_FAST_HIDDEN.
CPython: Include/internal/pycore_code.h:L42 CO_FAST_*
const ( CoOptimized uint32 = 0x0001 CoNewLocals uint32 = 0x0002 CoVarargs uint32 = 0x0004 CoVarkeywords uint32 = 0x0008 CoNested uint32 = 0x0010 CoGenerator uint32 = 0x0020 CoCoroutine uint32 = 0x0100 CoIterableCoroutine uint32 = 0x0200 CoAsyncGenerator uint32 = 0x0400 CoHasDocstring uint32 = 0x4000000 CoMethod uint32 = 0x8000000 )
CO_* flags. CPython: Include/cpython/code.h.
const ( NB_ADD int32 = 0 NB_AND int32 = 1 NB_FLOOR_DIVIDE int32 = 2 NB_LSHIFT int32 = 3 NB_MATRIX_MULTIPLY int32 = 4 NB_MULTIPLY int32 = 5 NB_REMAINDER int32 = 6 NB_OR int32 = 7 NB_POWER int32 = 8 NB_RSHIFT int32 = 9 NB_SUBTRACT int32 = 10 NB_TRUE_DIVIDE int32 = 11 NB_XOR int32 = 12 NB_INPLACE_ADD int32 = 13 NB_INPLACE_AND int32 = 14 NB_INPLACE_FLOOR_DIVIDE int32 = 15 NB_INPLACE_LSHIFT int32 = 16 NB_INPLACE_MATRIX_MULTIPLY int32 = 17 NB_INPLACE_MULTIPLY int32 = 18 NB_INPLACE_REMAINDER int32 = 19 NB_INPLACE_OR int32 = 20 NB_INPLACE_POWER int32 = 21 NB_INPLACE_RSHIFT int32 = 22 NB_INPLACE_SUBTRACT int32 = 23 NB_INPLACE_TRUE_DIVIDE int32 = 24 NB_INPLACE_XOR int32 = 25 NB_SUBSCR int32 = 26 )
Exported NB_* opargs for the BINARY_OP family. The lowercase constants above are the codegen-side spelling; specializers and dispatch arms read the exported ones.
CPython: Include/opcode.h NB_*
const CoNoFree uint32 = 0x0040
CoNoFree is set when a code object captures no free variables and has no cell variables. CPython sets it in compute_code_flags after flowgraph + symtable agree no closure cells are needed.
CPython: Include/cpython/code.h CO_NOFREE
const MaxOparg = 1 << 30
MaxOparg is 1<<30. CPython asserts oparg < (1<<30).
CPython: Python/instruction_sequence.c:L122
const MaxOpcode = 511
MaxOpcode mirrors MAX_OPCODE in instruction_sequence.c.
CPython: Python/instruction_sequence.c:L113 MAX_OPCODE
Variables ¶
This section is empty.
Functions ¶
func AssembleExceptionTable ¶ added in v0.6.0
AssembleExceptionTable is the exported wrapper for assembleExceptionTable. External tests use it to build exception-table bytes from a curated Sequence and round-trip them through the vm reader without going through the full compile pipeline.
func AssembleLineTable ¶ added in v0.6.0
AssembleLineTable is the exported wrapper for assembleLineTable. External tests use it to build location-table bytes from a curated Sequence and round-trip them through the vm reader without going through the full compile pipeline.
func Disassemble ¶
Disassemble returns a human-readable string listing of co. Output shape matches `dis.dis(co)`: one line per instruction, columns are "lineno offset opname oparg (display)".
CPython: Lib/dis.py _disassemble_bytes
Types ¶
type Assembler ¶
type Assembler struct {
Filename string
FirstLineno int
Code []byte
LineTable []byte
ExceptionTable []byte
// contains filtered or unexported fields
}
Assembler is the per-call state. Public so tests can drive individual phases (emit, varint, location, exception).
CPython: Python/assemble.c struct assembler
type BasicBlock ¶
type BasicBlock struct {
Instrs []Instr
Next *BasicBlock
Label int
StartDepth int
Predecessors int
Visited bool
Cold bool
Warm bool
Reachable bool
}
BasicBlock is one node of the CFG. CPython builds a doubly-linked list rather than a slice so that inline / merge passes can splice cheaply. The Go port does the same with Next.
CPython: Python/flowgraph.c basicblock
type Builder ¶
type Builder struct {
Head *BasicBlock
Tail *BasicBlock
// contains filtered or unexported fields
}
Builder is the CFG builder state: head/tail of the block list plus scratch the optimiser passes share (label table, current block).
CPython: Python/flowgraph.c cfg_builder
func FromSequence ¶
FromSequence builds a CFG from a flat instruction sequence. Each label target starts a new block; terminators (RETURN_VALUE, RAISE_VARARGS, RERAISE, unconditional JUMP) end the current block.
CPython: Python/flowgraph.c:L3923 _PyCfgBuilder_FromInstructionSequence
func (*Builder) ToSequence ¶
ToSequence flattens a CFG back to a flat sequence. Walks blocks in list order, copying each instruction out. Jump targets are already instruction offsets (label resolution happened before the CFG build), so the caller does not need a fresh ApplyLabelMap.
CPython: Python/flowgraph.c:L3988 _PyCfg_ToInstructionSequence
type Code ¶
type Code struct {
Argcount int
PosOnlyArgCount int
KwOnlyArgCount int
NLocals int
Stacksize int
Flags uint32
Code []byte
Consts []any
Names []string
VarNames []string
FreeVars []string
CellVars []string
LocalsPlusNames []string
LocalsPlusKinds []uint8
Filename string
Name string
Qualname string
Firstlineno int
Linetable []byte
ExceptionTable []byte
Nested []*Code
}
Code is the v0.5 placeholder for objects.Code. It carries every field the assembler fills today (marshal parity is the v0.5 gate; fields the VM needs land alongside the v0.6 interpreter port).
CPython: Include/cpython/code.h PyCodeObject
func Assemble ¶
Assemble builds a final Code object from the post-flowgraph Sequence plus per-unit metadata. Mirrors CPython's _PyAssemble_MakeCodeObject.
CPython: Python/assemble.c:L731 _PyAssemble_MakeCodeObject
func Compile ¶
Compile runs the full pipeline on a parsed module and returns the top-level Code object plus any nested code objects (one per nested scope).
Pipeline:
- symtable.Build resolves every name to its scope.
- codegen walks the AST top-down; each scope produces a Unit.
- flowgraph.Optimize resolves labels and runs the optimisation passes that have landed.
- assemble packs the Sequence and pools into a Code object.
CPython: Python/compile.c:L353 _PyAST_Compile
type Compiler ¶
type Compiler struct {
Filename string
Optimize int
Future *future.Features
Symtable *symtable.Table
// contains filtered or unexported fields
}
Compiler is the long-lived driver state shared by every Codegen call within one Compile invocation.
CPython: Python/compile.c compiler
func NewCompiler ¶
NewCompiler builds a fresh driver. Symtable must already be built over mod.
CPython: Python/compile.c new_compiler
type ConstTuple ¶
type ConstTuple struct {
Values []any
}
ConstTuple is the codegen-side placeholder for a Python tuple constant. The assembler converts it to a real PyTuple during marshal.
type ExceptHandler ¶
ExceptHandler is one row in the PEP 657 exception table. Start, End, Target are byte offsets into the final co_code (filled by 1628 assemble); Depth is the stack depth at handler entry; Lasti is the PEP 657 push-lasti bit.
CPython: Python/flowgraph.c ExceptionHandler / Python/assemble.c emit_exception_table_entry
type ExceptHandlerInfo ¶
ExceptHandlerInfo is the per-instruction exception handler slot. h_label < 0 means "no handler". Mirrors _PyExceptHandlerInfo.
CPython: Include/internal/pycore_compile.h _PyExceptHandlerInfo
type Info ¶
type Info struct {
MaxStackDepth int
ExceptionTable []ExceptHandler
Consts []any
LocalsPlus int
NLocals int
NCellvars int
NFreevars int
}
Info is the per-pass metadata flowgraph hands to assemble. Mirrors the bookkeeping CPython attaches to each cfg_builder.
CPython: Python/flowgraph.c cfg_builder + _PyCfg_OptimizeCodeUnit returns
func Optimize ¶
Optimize runs every flowgraph pass on a Sequence in the same order as CPython's _PyCfg_OptimizeCodeUnit. The current port lands the minimum-viable subset (label resolution, stackdepth, NOP cleanup); the rest of the panel arrives in follow-on commits per the 1627 spec.
CPython: Python/flowgraph.c:L3659 _PyCfg_OptimizeCodeUnit
type Instr ¶
type Instr struct {
Op Opcode
Oparg int32
Loc ast.Pos
Handler ExceptHandlerInfo
}
Instr is one entry in a Sequence. Mirrors _PyInstruction.
CPython: Include/internal/pycore_compile.h _PyInstruction
type JumpTargetLabel ¶
type JumpTargetLabel struct {
// contains filtered or unexported fields
}
JumpTargetLabel is an opaque label id created by NewLabel and bound to an instruction position by UseLabel. Mirrors _PyJumpTargetLabel.
CPython: Include/internal/pycore_compile.h _PyJumpTargetLabel
func (JumpTargetLabel) ID ¶
func (l JumpTargetLabel) ID() int
ID returns the underlying label id. CPython exposes the same integer to Python via `InstructionSequence.new_label`.
CPython: Include/internal/pycore_compile.h _PyJumpTargetLabel.id
type Opcode ¶
type Opcode int32
Opcode is a single bytecode opcode. The numeric values match cpython/Lib/opcode.py and are filled in by compile/opcodes_gen.go.
MIN_SPECIALIZED_OPCODE is the lowest opcode value reserved for a specialized variant (LOAD_ATTR_INSTANCE_VALUE and friends). Anything below it is either an unspecialized opcode or a CPython reserved slot. MIN_INSTRUMENTED_OPCODE is the threshold at which the instrumentation shadow opcodes start; the specializer's set_opcode helper bails out when the slot already lives in that range to avoid stomping an instrumented instruction.
CPython: Include/opcode_ids.h:253 MIN_SPECIALIZED_OPCODE CPython: Include/opcode_ids.h:254 MIN_INSTRUMENTED_OPCODE
const ( CACHE Opcode = 0 BINARY_SLICE Opcode = 1 BUILD_TEMPLATE Opcode = 2 BINARY_OP_INPLACE_ADD_UNICODE Opcode = 3 CALL_FUNCTION_EX Opcode = 4 CHECK_EG_MATCH Opcode = 5 CHECK_EXC_MATCH Opcode = 6 CLEANUP_THROW Opcode = 7 DELETE_SUBSCR Opcode = 8 END_FOR Opcode = 9 END_SEND Opcode = 10 EXIT_INIT_CHECK Opcode = 11 FORMAT_SIMPLE Opcode = 12 FORMAT_WITH_SPEC Opcode = 13 GET_AITER Opcode = 14 GET_ANEXT Opcode = 15 GET_ITER Opcode = 16 RESERVED Opcode = 17 GET_LEN Opcode = 18 GET_YIELD_FROM_ITER Opcode = 19 INTERPRETER_EXIT Opcode = 20 LOAD_BUILD_CLASS Opcode = 21 LOAD_LOCALS Opcode = 22 MAKE_FUNCTION Opcode = 23 MATCH_KEYS Opcode = 24 MATCH_MAPPING Opcode = 25 MATCH_SEQUENCE Opcode = 26 NOP Opcode = 27 NOT_TAKEN Opcode = 28 POP_EXCEPT Opcode = 29 POP_ITER Opcode = 30 POP_TOP Opcode = 31 PUSH_EXC_INFO Opcode = 32 PUSH_NULL Opcode = 33 RETURN_GENERATOR Opcode = 34 RETURN_VALUE Opcode = 35 SETUP_ANNOTATIONS Opcode = 36 STORE_SLICE Opcode = 37 STORE_SUBSCR Opcode = 38 TO_BOOL Opcode = 39 UNARY_INVERT Opcode = 40 UNARY_NEGATIVE Opcode = 41 UNARY_NOT Opcode = 42 WITH_EXCEPT_START Opcode = 43 BINARY_OP Opcode = 44 BUILD_INTERPOLATION Opcode = 45 BUILD_LIST Opcode = 46 BUILD_MAP Opcode = 47 BUILD_SET Opcode = 48 BUILD_SLICE Opcode = 49 BUILD_STRING Opcode = 50 BUILD_TUPLE Opcode = 51 CALL Opcode = 52 CALL_INTRINSIC_1 Opcode = 53 CALL_INTRINSIC_2 Opcode = 54 CALL_KW Opcode = 55 COMPARE_OP Opcode = 56 CONTAINS_OP Opcode = 57 CONVERT_VALUE Opcode = 58 COPY Opcode = 59 COPY_FREE_VARS Opcode = 60 DELETE_ATTR Opcode = 61 DELETE_DEREF Opcode = 62 DELETE_FAST Opcode = 63 DELETE_GLOBAL Opcode = 64 DELETE_NAME Opcode = 65 DICT_MERGE Opcode = 66 DICT_UPDATE Opcode = 67 END_ASYNC_FOR Opcode = 68 EXTENDED_ARG Opcode = 69 FOR_ITER Opcode = 70 GET_AWAITABLE Opcode = 71 IMPORT_FROM Opcode = 72 IMPORT_NAME Opcode = 73 IS_OP Opcode = 74 JUMP_BACKWARD Opcode = 75 JUMP_BACKWARD_NO_INTERRUPT Opcode = 76 JUMP_FORWARD Opcode = 77 LIST_APPEND Opcode = 78 LIST_EXTEND Opcode = 79 LOAD_ATTR Opcode = 80 LOAD_COMMON_CONSTANT Opcode = 81 LOAD_CONST Opcode = 82 LOAD_DEREF Opcode = 83 LOAD_FAST Opcode = 84 LOAD_FAST_AND_CLEAR Opcode = 85 LOAD_FAST_BORROW Opcode = 86 LOAD_FAST_BORROW_LOAD_FAST_BORROW Opcode = 87 LOAD_FAST_CHECK Opcode = 88 LOAD_FAST_LOAD_FAST Opcode = 89 LOAD_FROM_DICT_OR_DEREF Opcode = 90 LOAD_FROM_DICT_OR_GLOBALS Opcode = 91 LOAD_GLOBAL Opcode = 92 LOAD_NAME Opcode = 93 LOAD_SMALL_INT Opcode = 94 LOAD_SPECIAL Opcode = 95 LOAD_SUPER_ATTR Opcode = 96 MAKE_CELL Opcode = 97 MAP_ADD Opcode = 98 MATCH_CLASS Opcode = 99 POP_JUMP_IF_FALSE Opcode = 100 POP_JUMP_IF_NONE Opcode = 101 POP_JUMP_IF_NOT_NONE Opcode = 102 POP_JUMP_IF_TRUE Opcode = 103 RAISE_VARARGS Opcode = 104 RERAISE Opcode = 105 SEND Opcode = 106 SET_ADD Opcode = 107 SET_FUNCTION_ATTRIBUTE Opcode = 108 SET_UPDATE Opcode = 109 STORE_ATTR Opcode = 110 STORE_DEREF Opcode = 111 STORE_FAST Opcode = 112 STORE_FAST_LOAD_FAST Opcode = 113 STORE_FAST_STORE_FAST Opcode = 114 STORE_GLOBAL Opcode = 115 STORE_NAME Opcode = 116 SWAP Opcode = 117 UNPACK_EX Opcode = 118 UNPACK_SEQUENCE Opcode = 119 YIELD_VALUE Opcode = 120 RESUME Opcode = 128 BINARY_OP_ADD_FLOAT Opcode = 129 BINARY_OP_ADD_INT Opcode = 130 BINARY_OP_ADD_UNICODE Opcode = 131 BINARY_OP_EXTEND Opcode = 132 BINARY_OP_MULTIPLY_FLOAT Opcode = 133 BINARY_OP_MULTIPLY_INT Opcode = 134 BINARY_OP_SUBSCR_DICT Opcode = 135 BINARY_OP_SUBSCR_GETITEM Opcode = 136 BINARY_OP_SUBSCR_LIST_INT Opcode = 137 BINARY_OP_SUBSCR_LIST_SLICE Opcode = 138 BINARY_OP_SUBSCR_STR_INT Opcode = 139 BINARY_OP_SUBSCR_TUPLE_INT Opcode = 140 BINARY_OP_SUBTRACT_FLOAT Opcode = 141 BINARY_OP_SUBTRACT_INT Opcode = 142 CALL_ALLOC_AND_ENTER_INIT Opcode = 143 CALL_BOUND_METHOD_EXACT_ARGS Opcode = 144 CALL_BOUND_METHOD_GENERAL Opcode = 145 CALL_BUILTIN_CLASS Opcode = 146 CALL_BUILTIN_FAST Opcode = 147 CALL_BUILTIN_FAST_WITH_KEYWORDS Opcode = 148 CALL_BUILTIN_O Opcode = 149 CALL_ISINSTANCE Opcode = 150 CALL_KW_BOUND_METHOD Opcode = 151 CALL_KW_NON_PY Opcode = 152 CALL_KW_PY Opcode = 153 CALL_LEN Opcode = 154 CALL_LIST_APPEND Opcode = 155 CALL_METHOD_DESCRIPTOR_FAST Opcode = 156 CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS Opcode = 157 CALL_METHOD_DESCRIPTOR_NOARGS Opcode = 158 CALL_METHOD_DESCRIPTOR_O Opcode = 159 CALL_NON_PY_GENERAL Opcode = 160 CALL_PY_EXACT_ARGS Opcode = 161 CALL_PY_GENERAL Opcode = 162 CALL_STR_1 Opcode = 163 CALL_TUPLE_1 Opcode = 164 CALL_TYPE_1 Opcode = 165 COMPARE_OP_FLOAT Opcode = 166 COMPARE_OP_INT Opcode = 167 COMPARE_OP_STR Opcode = 168 CONTAINS_OP_DICT Opcode = 169 CONTAINS_OP_SET Opcode = 170 FOR_ITER_GEN Opcode = 171 FOR_ITER_LIST Opcode = 172 FOR_ITER_RANGE Opcode = 173 FOR_ITER_TUPLE Opcode = 174 JUMP_BACKWARD_JIT Opcode = 175 JUMP_BACKWARD_NO_JIT Opcode = 176 LOAD_ATTR_CLASS Opcode = 177 LOAD_ATTR_CLASS_WITH_METACLASS_CHECK Opcode = 178 LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN Opcode = 179 LOAD_ATTR_INSTANCE_VALUE Opcode = 180 LOAD_ATTR_METHOD_LAZY_DICT Opcode = 181 LOAD_ATTR_METHOD_NO_DICT Opcode = 182 LOAD_ATTR_METHOD_WITH_VALUES Opcode = 183 LOAD_ATTR_MODULE Opcode = 184 LOAD_ATTR_NONDESCRIPTOR_NO_DICT Opcode = 185 LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES Opcode = 186 LOAD_ATTR_PROPERTY Opcode = 187 LOAD_ATTR_SLOT Opcode = 188 LOAD_ATTR_WITH_HINT Opcode = 189 LOAD_CONST_IMMORTAL Opcode = 190 LOAD_CONST_MORTAL Opcode = 191 LOAD_GLOBAL_BUILTIN Opcode = 192 LOAD_GLOBAL_MODULE Opcode = 193 LOAD_SUPER_ATTR_ATTR Opcode = 194 LOAD_SUPER_ATTR_METHOD Opcode = 195 RESUME_CHECK Opcode = 196 SEND_GEN Opcode = 197 STORE_ATTR_INSTANCE_VALUE Opcode = 198 STORE_ATTR_SLOT Opcode = 199 STORE_ATTR_WITH_HINT Opcode = 200 STORE_SUBSCR_DICT Opcode = 201 STORE_SUBSCR_LIST_INT Opcode = 202 TO_BOOL_ALWAYS_TRUE Opcode = 203 TO_BOOL_BOOL Opcode = 204 TO_BOOL_INT Opcode = 205 TO_BOOL_LIST Opcode = 206 TO_BOOL_NONE Opcode = 207 TO_BOOL_STR Opcode = 208 UNPACK_SEQUENCE_LIST Opcode = 209 UNPACK_SEQUENCE_TUPLE Opcode = 210 UNPACK_SEQUENCE_TWO_TUPLE Opcode = 211 INSTRUMENTED_END_FOR Opcode = 234 INSTRUMENTED_POP_ITER Opcode = 235 INSTRUMENTED_END_SEND Opcode = 236 INSTRUMENTED_FOR_ITER Opcode = 237 INSTRUMENTED_INSTRUCTION Opcode = 238 INSTRUMENTED_JUMP_FORWARD Opcode = 239 INSTRUMENTED_NOT_TAKEN Opcode = 240 INSTRUMENTED_POP_JUMP_IF_TRUE Opcode = 241 INSTRUMENTED_POP_JUMP_IF_FALSE Opcode = 242 INSTRUMENTED_POP_JUMP_IF_NONE Opcode = 243 INSTRUMENTED_POP_JUMP_IF_NOT_NONE Opcode = 244 INSTRUMENTED_RESUME Opcode = 245 INSTRUMENTED_RETURN_VALUE Opcode = 246 INSTRUMENTED_YIELD_VALUE Opcode = 247 INSTRUMENTED_END_ASYNC_FOR Opcode = 248 INSTRUMENTED_LOAD_SUPER_ATTR Opcode = 249 INSTRUMENTED_CALL Opcode = 250 INSTRUMENTED_CALL_KW Opcode = 251 INSTRUMENTED_CALL_FUNCTION_EX Opcode = 252 INSTRUMENTED_JUMP_BACKWARD Opcode = 253 INSTRUMENTED_LINE Opcode = 254 ENTER_EXECUTOR Opcode = 255 ANNOTATIONS_PLACEHOLDER Opcode = 256 JUMP Opcode = 257 JUMP_IF_FALSE Opcode = 258 JUMP_IF_TRUE Opcode = 259 JUMP_NO_INTERRUPT Opcode = 260 LOAD_CLOSURE Opcode = 261 POP_BLOCK Opcode = 262 SETUP_CLEANUP Opcode = 263 SETUP_FINALLY Opcode = 264 SETUP_WITH Opcode = 265 STORE_FAST_MAYBE_NULL Opcode = 266 )
Opcode constants. Numeric values match cpython 3.14 opmap.
func (Opcode) HasErrorNoPop ¶
HasErrorNoPop reports whether op carries the error no pop metadata flag.
func (Opcode) HasEscapes ¶
HasEscapes reports whether op carries the escapes metadata flag.
func (Opcode) HasEvalBreak ¶
HasEvalBreak reports whether op carries the eval break metadata flag.
func (Opcode) HasNoSaveIP ¶
HasNoSaveIP reports whether op carries the no save ip metadata flag.
func (Opcode) HasOpargAnd1 ¶
HasOpargAnd1 reports whether op carries the oparg and 1 metadata flag.
func (Opcode) HasPassthrough ¶
HasPassthrough reports whether op carries the passthrough metadata flag.
type Sequence ¶
type Sequence struct {
Instrs []Instr
Nested []*Sequence
AnnoCode *Sequence
// contains filtered or unexported fields
}
Sequence is the pre-CFG instruction stream emitted by codegen and consumed by flowgraph. Mirrors _PyInstructionSequence.
CPython: Include/internal/pycore_compile.h _PyInstructionSequence
func (*Sequence) AddNested ¶
AddNested appends a nested instruction sequence (one per nested scope: a function or class definition emits its own Sequence and hangs it off the parent here).
CPython: Python/instruction_sequence.c:L166 _PyInstructionSequence_AddNested
func (*Sequence) Addop ¶
Addop appends an instruction. Caller is responsible for ensuring op is in [0, MaxOpcode] and oparg in [0, MaxOparg). The C code asserts these; here a panic via slice growth would mask the bug, so we panic explicitly to match the assertion semantics.
CPython: Python/instruction_sequence.c:L115 _PyInstructionSequence_Addop
func (*Sequence) ApplyLabelMap ¶
ApplyLabelMap rewrites every jump opcode's oparg from a label id into the bound instruction offset, using hasTarget to recognize which opcodes carry a jump target. Callers pass the OPCODE_HAS_TARGET predicate (defined in the generated opcode metadata, which lands alongside the opcode generator).
Idempotent: a second call is a no-op (s.labelmap == nil). The per-instruction ExceptHandlerInfo.Label is also resolved.
CPython: Python/instruction_sequence.c:L86 _PyInstructionSequence_ApplyLabelMap
func (*Sequence) Insert ¶
Insert inserts at pos and shifts following entries right by one. Any previously-bound label that pointed at pos or later is bumped up by one to preserve its target.
CPython: Python/instruction_sequence.c:L133 _PyInstructionSequence_InsertInstruction
func (*Sequence) NewLabel ¶
func (s *Sequence) NewLabel() JumpTargetLabel
NewLabel allocates a fresh label id (1-based, matching CPython's post-increment of s_next_free_label).
CPython: Python/instruction_sequence.c:L57 _PyInstructionSequence_NewLabel
func (*Sequence) SetAnnotationsCode ¶
SetAnnotationsCode mirrors _PyInstructionSequence_SetAnnotationsCode. CPython asserts s_annotations_code is unset; we do the same.
CPython: Python/instruction_sequence.c:L157
func (*Sequence) UseLabel ¶
func (s *Sequence) UseLabel(lbl JumpTargetLabel)
UseLabel binds lbl to the position of the next instruction to be appended. Calling UseLabel with the same label twice rebinds it (mirrors CPython, which simply overwrites s_labelmap[lbl]).
CPython: Python/instruction_sequence.c:L64 _PyInstructionSequence_UseLabel
type Unit ¶
type Unit struct {
Name string
Qualname string
ScopeType symtable.Block
Argcount int
PosOnlyArgCount int
KwOnlyArgCount int
FirstLineno int
Flags uint32
Seq *Sequence
Consts []any
Names []string
VarNames []string
FreeVars []string
CellVars []string
FastHidden map[string]bool
DeferredAnnotations []deferredAnnotation
}
Unit is the per-scope handoff codegen produces. The flowgraph optimizes Seq in place and the assembler packs the result into a Code object.
CPython: Python/compile.c compiler_unit
Source Files
¶
- assemble.go
- assemble_exceptions.go
- assemble_locations.go
- assemble_varint.go
- code.go
- codegen.go
- codegen_addop.go
- codegen_class.go
- codegen_expr.go
- codegen_expr_call.go
- codegen_expr_comp.go
- codegen_expr_container.go
- codegen_expr_misc.go
- codegen_expr_name.go
- codegen_expr_op.go
- codegen_fblock.go
- codegen_stmt.go
- codegen_stmt_control.go
- codegen_stmt_funclike.go
- codegen_stmt_match.go
- codegen_stmt_misc.go
- codegen_stmt_try.go
- codegen_stmt_with.go
- codegen_typealias.go
- compiler.go
- dis.go
- flowgraph.go
- flowgraph_jumps.go
- flowgraph_passes.go
- flowgraph_stackdepth.go
- instrseq.go
- opcodes_gen.go