Skip to content

Commit c3309ee

Browse files
Merge pull request #555 from RustPython/dis_dis
Dis dis
2 parents 587f871 + 73a65a1 commit c3309ee

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

tests/snippets/dismod.py

+28-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,34 @@
11
import dis
22

3-
dis.disassemble(compile("5 + x + 5 or 2", "", "eval"))
3+
dis.dis(compile("5 + x + 5 or 2", "", "eval"))
44
print("\n")
5-
dis.disassemble(compile("def f(x):\n return 1", "", "exec"))
5+
dis.dis(compile("def f(x):\n return 1", "", "exec"))
66
print("\n")
7-
dis.disassemble(compile("if a:\n 1 or 2\nelif x == 'hello':\n 3\nelse:\n 4", "", "exec"))
7+
dis.dis(compile("if a:\n 1 or 2\nelif x == 'hello':\n 3\nelse:\n 4", "", "exec"))
88
print("\n")
9-
dis.disassemble(compile("f(x=1, y=2)", "", "eval"))
9+
dis.dis(compile("f(x=1, y=2)", "", "eval"))
1010
print("\n")
11+
12+
def f():
13+
with g():
14+
try:
15+
for a in {1: 4, 2: 5}:
16+
yield [True and False or True, []]
17+
except Exception:
18+
raise not ValueError({1 for i in [1,2,3]})
19+
20+
dis.dis(f)
21+
22+
class A(object):
23+
def f():
24+
x += 1
25+
pass
26+
def g():
27+
for i in range(5):
28+
if i:
29+
continue
30+
else:
31+
break
32+
33+
print("A.f\n")
34+
dis.dis(A.f)

vm/src/stdlib/dis.rs

+13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@ use crate::obj::objcode;
22
use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
33
use crate::vm::VirtualMachine;
44

5+
fn dis_dis(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
6+
arg_check!(vm, args, required = [(obj, None)]);
7+
8+
// Method or function:
9+
let code_name = vm.new_str("__code__".to_string());
10+
if let Ok(co) = vm.get_attribute(obj.clone(), code_name) {
11+
return dis_disassemble(vm, PyFuncArgs::new(vec![co], vec![]));
12+
}
13+
14+
dis_disassemble(vm, PyFuncArgs::new(vec![obj.clone()], vec![]))
15+
}
16+
517
fn dis_disassemble(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
618
arg_check!(vm, args, required = [(co, Some(vm.ctx.code_type()))]);
719

@@ -12,6 +24,7 @@ fn dis_disassemble(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
1224

1325
pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
1426
py_module!(ctx, "dis", {
27+
"dis" => ctx.new_rustfunc(dis_dis),
1528
"disassemble" => ctx.new_rustfunc(dis_disassemble)
1629
})
1730
}

0 commit comments

Comments
 (0)