Align opcode names in dis (#6526)

* opcodes dis repr like cpython. POP-> POP_TOP

* Adjust frame.rs

* Fix codegen

* snapshots

* Add doc for `PopTop`

* fix jit
This commit is contained in:
Shahar Naveh authored and GitHub committed 2025-12-25 22:17:31 +09:00
1 parent 61ddd98b89
commit bcdf37bef1
8 files changed
+234 -230

No files matched your search

+23 -23
View File
@@ -1063,7 +1063,7 @@ impl Compiler {
}
);
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
} else {
self.compile_statement(statement)?;
}
@@ -1079,7 +1079,7 @@ impl Compiler {
}
);
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
} else {
self.compile_statement(last)?;
self.emit_load_const(ConstantData::None);
@@ -1104,7 +1104,7 @@ impl Compiler {
if let Some(last_statement) = body.last() {
match last_statement {
Stmt::Expr(_) => {
self.current_block().instructions.pop(); // pop Instruction::Pop
self.current_block().instructions.pop(); // pop Instruction::PopTop
}
Stmt::FunctionDef(_) | Stmt::ClassDef(_) => {
let pop_instructions = self.current_block().instructions.pop();
@@ -1401,14 +1401,14 @@ impl Compiler {
}
// Pop module from stack:
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
}
Stmt::Expr(StmtExpr { value, .. }) => {
self.compile_expression(value)?;
// Pop result of stack, since we not use it:
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
Stmt::Global(_) | Stmt::Nonlocal(_) => {
// Handled during symbol table construction.
@@ -2051,12 +2051,12 @@ impl Compiler {
self.store_name(alias.as_str())?
} else {
// Drop exception from top of stack:
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
} else {
// Catch all!
// Drop exception from top of stack:
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
// Handler code:
@@ -2950,7 +2950,7 @@ impl Compiler {
self.compile_store(var)?;
}
None => {
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
}
final_block
@@ -3143,7 +3143,7 @@ impl Compiler {
for &label in pc.fail_pop.iter().skip(1).rev() {
self.switch_to_block(label);
// Emit the POP instruction.
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
// Finally, use the first label.
self.switch_to_block(pc.fail_pop[0]);
@@ -3187,7 +3187,7 @@ impl Compiler {
match n {
// If no name is provided, simply pop the top of the stack.
None => {
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
Ok(())
}
Some(name) => {
@@ -3313,7 +3313,7 @@ impl Compiler {
}
// Pop the subject off the stack.
pc.on_top -= 1;
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
Ok(())
}
@@ -3497,7 +3497,7 @@ impl Compiler {
pc.on_top -= 1;
if is_true_wildcard {
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
continue; // Don't compile wildcard patterns
}
@@ -3548,7 +3548,7 @@ impl Compiler {
if size == 0 && star_target.is_none() {
// If the pattern is just "{}", we're done! Pop the subject
pc.on_top -= 1;
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
return Ok(());
}
@@ -3703,8 +3703,8 @@ impl Compiler {
// Non-rest pattern: just clean up the stack
// Pop them as we're not using them
emit!(self, Instruction::Pop); // Pop keys_tuple
emit!(self, Instruction::Pop); // Pop subject
emit!(self, Instruction::PopTop); // Pop keys_tuple
emit!(self, Instruction::PopTop); // Pop subject
}
Ok(())
@@ -3792,7 +3792,7 @@ impl Compiler {
// In Rust, old_pc is a local clone, so we need not worry about that.
// No alternative matched: pop the subject and fail.
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
self.jump_to_fail_pop(pc, JumpOp::Jump)?;
// Use the label "end".
@@ -3814,7 +3814,7 @@ impl Compiler {
// Old context and control will be dropped automatically.
// Finally, pop the copy of the subject.
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
Ok(())
}
@@ -3888,7 +3888,7 @@ impl Compiler {
pc.on_top -= 1;
if only_wildcard {
// Patterns like: [] / [_] / [_, _] / [*_] / [_, *_] / [_, _, *_] / etc.
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
} else if star_wildcard {
self.pattern_helper_sequence_subscr(patterns, star.unwrap(), pc)?;
} else {
@@ -4012,7 +4012,7 @@ impl Compiler {
}
if i != case_count - 1 {
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
self.compile_statements(&m.body)?;
@@ -4023,7 +4023,7 @@ impl Compiler {
if has_default {
let m = &cases[num_cases - 1];
if num_cases == 1 {
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
} else {
emit!(self, Instruction::Nop);
}
@@ -4125,7 +4125,7 @@ impl Compiler {
// early exit left us with stack: `rhs, comparison_result`. We need to clean up rhs.
self.switch_to_block(break_block);
emit!(self, Instruction::Swap { index: 2 });
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
self.switch_to_block(after_block);
}
@@ -4192,7 +4192,7 @@ impl Compiler {
emit!(self, Instruction::StoreSubscript);
} else {
// Drop annotation if not assigned to simple identifier.
emit!(self, Instruction::Pop);
emit!(self, Instruction::PopTop);
}
Ok(())
@@ -4823,7 +4823,7 @@ impl Compiler {
arg: bytecode::ResumeType::AfterYield as u32
}
);
emit!(compiler, Instruction::Pop);
emit!(compiler, Instruction::PopTop);
Ok(())
},
@@ -1,12 +1,12 @@
---
source: compiler/codegen/src/compile.rs
source: crates/codegen/src/compile.rs
expression: "compile_exec(\"\\\nif True and False and False:\n pass\n\")"
---
1 0 LoadConst (True)
1 PopJumpIfFalse (6)
2 LoadConst (False)
3 PopJumpIfFalse (6)
4 LoadConst (False)
5 PopJumpIfFalse (6)
1 0 LOAD_CONST (True)
1 POP_JUMP_IF_FALSE (6)
2 LOAD_CONST (False)
3 POP_JUMP_IF_FALSE (6)
4 LOAD_CONST (False)
5 POP_JUMP_IF_FALSE (6)
2 >> 6 ReturnConst (None)
2 >> 6 RETURN_CONST (None)
@@ -1,14 +1,14 @@
---
source: compiler/codegen/src/compile.rs
source: crates/codegen/src/compile.rs
expression: "compile_exec(\"\\\nif (True and False) or (False and True):\n pass\n\")"
---
1 0 LoadConst (True)
1 PopJumpIfFalse (4)
2 LoadConst (False)
3 PopJumpIfTrue (8)
>> 4 LoadConst (False)
5 PopJumpIfFalse (8)
6 LoadConst (True)
7 PopJumpIfFalse (8)
1 0 LOAD_CONST (True)
1 POP_JUMP_IF_FALSE (4)
2 LOAD_CONST (False)
3 POP_JUMP_IF_TRUE (8)
>> 4 LOAD_CONST (False)
5 POP_JUMP_IF_FALSE (8)
6 LOAD_CONST (True)
7 POP_JUMP_IF_FALSE (8)
2 >> 8 ReturnConst (None)
2 >> 8 RETURN_CONST (None)
@@ -1,12 +1,12 @@
---
source: compiler/codegen/src/compile.rs
source: crates/codegen/src/compile.rs
expression: "compile_exec(\"\\\nif True or False or False:\n pass\n\")"
---
1 0 LoadConst (True)
1 PopJumpIfTrue (6)
2 LoadConst (False)
3 PopJumpIfTrue (6)
4 LoadConst (False)
5 PopJumpIfFalse (6)
1 0 LOAD_CONST (True)
1 POP_JUMP_IF_TRUE (6)
2 LOAD_CONST (False)
3 POP_JUMP_IF_TRUE (6)
4 LOAD_CONST (False)
5 POP_JUMP_IF_FALSE (6)
2 >> 6 ReturnConst (None)
2 >> 6 RETURN_CONST (None)
@@ -2,85 +2,85 @@
source: crates/codegen/src/compile.rs
expression: "compile_exec(\"\\\nfor stop_exc in (StopIteration('spam'), StopAsyncIteration('ham')):\n with self.subTest(type=type(stop_exc)):\n try:\n async with egg():\n raise stop_exc\n except Exception as ex:\n self.assertIs(ex, stop_exc)\n else:\n self.fail(f'{stop_exc} was suppressed')\n\")"
---
1 0 SetupLoop
1 LoadNameAny (0, StopIteration)
2 LoadConst ("spam")
3 CallFunctionPositional(1)
4 LoadNameAny (1, StopAsyncIteration)
5 LoadConst ("ham")
6 CallFunctionPositional(1)
7 BuildTuple (2)
8 GetIter
>> 9 ForIter (71)
10 StoreLocal (2, stop_exc)
1 0 SETUP_LOOP
1 LOAD_NAME_ANY (0, StopIteration)
2 LOAD_CONST ("spam")
3 CALL_FUNCTION_POSITIONAL(1)
4 LOAD_NAME_ANY (1, StopAsyncIteration)
5 LOAD_CONST ("ham")
6 CALL_FUNCTION_POSITIONAL(1)
7 BUILD_TUPLE (2)
8 GET_ITER
>> 9 FOR_ITER (71)
10 STORE_LOCAL (2, stop_exc)
2 11 LoadNameAny (3, self)
12 LoadMethod (4, subTest)
13 LoadNameAny (5, type)
14 LoadNameAny (2, stop_exc)
15 CallFunctionPositional(1)
16 LoadConst (("type"))
17 CallMethodKeyword (1)
18 SetupWith (68)
19 Pop
2 11 LOAD_NAME_ANY (3, self)
12 LOAD_METHOD (4, subTest)
13 LOAD_NAME_ANY (5, type)
14 LOAD_NAME_ANY (2, stop_exc)
15 CALL_FUNCTION_POSITIONAL(1)
16 LOAD_CONST (("type"))
17 CALL_METHOD_KEYWORD (1)
18 SETUP_WITH (68)
19 POP_TOP
3 20 SetupExcept (42)
3 20 SETUP_EXCEPT (42)
4 21 LoadNameAny (6, egg)
22 CallFunctionPositional(0)
23 BeforeAsyncWith
24 GetAwaitable
25 LoadConst (None)
26 YieldFrom
27 Resume (3)
28 SetupAsyncWith (34)
29 Pop
4 21 LOAD_NAME_ANY (6, egg)
22 CALL_FUNCTION_POSITIONAL(0)
23 BEFORE_ASYNC_WITH
24 GET_AWAITABLE
25 LOAD_CONST (None)
26 YIELD_FROM
27 RESUME (3)
28 SETUP_ASYNC_WITH (34)
29 POP_TOP
5 30 LoadNameAny (2, stop_exc)
31 Raise (Raise)
5 30 LOAD_NAME_ANY (2, stop_exc)
31 RAISE (Raise)
4 32 PopBlock
33 EnterFinally
>> 34 WithCleanupStart
35 GetAwaitable
36 LoadConst (None)
37 YieldFrom
38 Resume (3)
39 WithCleanupFinish
40 PopBlock
41 Jump (58)
>> 42 CopyItem (1)
4 32 POP_BLOCK
33 ENTER_FINALLY
>> 34 WITH_CLEANUP_START
35 GET_AWAITABLE
36 LOAD_CONST (None)
37 YIELD_FROM
38 RESUME (3)
39 WITH_CLEANUP_FINISH
40 POP_BLOCK
41 JUMP (58)
>> 42 COPY (1)
6 43 LoadNameAny (7, Exception)
6 43 LOAD_NAME_ANY (7, Exception)
44 JUMP_IF_NOT_EXC_MATCH(57)
45 StoreLocal (8, ex)
45 STORE_LOCAL (8, ex)
7 46 LoadNameAny (3, self)
47 LoadMethod (9, assertIs)
48 LoadNameAny (8, ex)
49 LoadNameAny (2, stop_exc)
50 CallMethodPositional (2)
51 Pop
52 PopException
53 LoadConst (None)
54 StoreLocal (8, ex)
55 DeleteLocal (8, ex)
56 Jump (66)
>> 57 Raise (Reraise)
7 46 LOAD_NAME_ANY (3, self)
47 LOAD_METHOD (9, assertIs)
48 LOAD_NAME_ANY (8, ex)
49 LOAD_NAME_ANY (2, stop_exc)
50 CALL_METHOD_POSITIONAL(2)
51 POP_TOP
52 POP_EXCEPTION
53 LOAD_CONST (None)
54 STORE_LOCAL (8, ex)
55 DELETE_LOCAL (8, ex)
56 JUMP (66)
>> 57 RAISE (Reraise)
9 >> 58 LoadNameAny (3, self)
59 LoadMethod (10, fail)
60 LoadNameAny (2, stop_exc)
9 >> 58 LOAD_NAME_ANY (3, self)
59 LOAD_METHOD (10, fail)
60 LOAD_NAME_ANY (2, stop_exc)
61 FORMAT_SIMPLE
62 LoadConst (" was suppressed")
63 BuildString (2)
64 CallMethodPositional (1)
65 Pop
62 LOAD_CONST (" was suppressed")
63 BUILD_STRING (2)
64 CALL_METHOD_POSITIONAL(1)
65 POP_TOP
2 >> 66 PopBlock
67 EnterFinally
>> 68 WithCleanupStart
69 WithCleanupFinish
70 Jump (9)
>> 71 PopBlock
72 ReturnConst (None)
2 >> 66 POP_BLOCK
67 ENTER_FINALLY
>> 68 WITH_CLEANUP_START
69 WITH_CLEANUP_FINISH
70 JUMP (9)
>> 71 POP_BLOCK
72 RETURN_CONST (None)