Skip to content

Commit 3f7fd58

Browse files
Jeremy Braunfacebook-github-bot
Jeremy Braun
authored andcommitted
improve bytecode printing w/ padding and AST locations
Summary: In developing D73038348, it was helpful to have the annotated source locations displayed in the bytecode dumps. This also computes the maximum length used to display an `IP` value, and padds all such values so that all of the `:` for a particular loop depth are aligned. Reviewed By: cjhopman Differential Revision: D73038341 fbshipit-source-id: 914e044a014fb19859f5c1817d94a1a57b2dca38
1 parent 7ae7b47 commit 3f7fd58

File tree

68 files changed

+192
-98
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+192
-98
lines changed

starlark/src/eval/bc/instrs.rs

+21-9
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,12 @@ impl BcInstrs {
218218

219219
pub(crate) fn fmt_impl(&self, f: &mut dyn Write, newline: bool) -> fmt::Result {
220220
let end_arg = self.end_arg();
221+
let ip_pad = if newline {
222+
let max_ip = self.iter().map(|(_, ip)| ip).max().unwrap_or(BcAddr(0));
223+
format!("{}", (max_ip).0).len()
224+
} else {
225+
0
226+
};
221227

222228
let mut loop_ends = Vec::new();
223229
let mut jump_targets = HashSet::new();
@@ -227,13 +233,21 @@ impl BcInstrs {
227233
});
228234
}
229235
for (ptr, ip) in self.iter() {
230-
if ptr != self.start_ptr() && !newline {
231-
write!(f, "; ")?;
232-
}
233-
234236
if loop_ends.last() == Some(&ip) {
235237
loop_ends.pop().unwrap();
236238
}
239+
let loop_pad = loop_ends.len() * 2;
240+
241+
if newline {
242+
if let Some(loc) = self.stmt_locs.stmt_at(ip) {
243+
writeln!(f, "{:loop_pad$} {:ip_pad$} # {}", "", "", loc.span.span)?;
244+
}
245+
} else {
246+
if ptr != self.start_ptr() {
247+
write!(f, "; ")?;
248+
}
249+
}
250+
237251
let opcode = ptr.get_opcode();
238252
if !jump_targets.is_empty() {
239253
if jump_targets.contains(&ip) {
@@ -243,11 +257,9 @@ impl BcInstrs {
243257
}
244258
}
245259
if newline {
246-
for _ in &loop_ends {
247-
write!(f, " ")?;
248-
}
260+
write!(f, "{:loop_pad$}", "")?;
249261
}
250-
write!(f, "{}: {:?}", ip.0, opcode)?;
262+
write!(f, "{:ip_pad$}: {:?}", ip.0, opcode)?;
251263
if opcode != BcOpcode::End {
252264
// `End` args are too verbose and not really instruction args.
253265
opcode.fmt_append_arg(ptr, ip, end_arg, f)?;
@@ -402,7 +414,7 @@ mod tests {
402414
bc.to_string()
403415
);
404416
assert_eq!(
405-
"0: Const True ->&abc\n24: Return &abc\n32: End\n",
417+
" 0: Const True ->&abc\n24: Return &abc\n32: End\n",
406418
bc.dump_debug()
407419
);
408420
} else if mem::size_of::<usize>() == 4 {

starlark/src/tests/bc/golden/and_or_false_and_x.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ def test(x): return False and x
1010

1111
Max stack size: 0
1212
Instructions:
13-
0: ReturnConst False
13+
# instrs.star.bzl:1:14-32
14+
0: ReturnConst False
1415
16: End

starlark/src/tests/bc/golden/and_or_false_or_x.golden

+1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ def test(x): return False or x
1010

1111
Max stack size: 0
1212
Instructions:
13+
# instrs.star.bzl:1:14-31
1314
0: Return &x
1415
8: End

starlark/src/tests/bc/golden/and_or_true_and_x.golden

+1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ def test(x): return True and x
1010

1111
Max stack size: 0
1212
Instructions:
13+
# instrs.star.bzl:1:14-31
1314
0: Return &x
1415
8: End

starlark/src/tests/bc/golden/and_or_true_or_x.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ def test(x): return True or x
1010

1111
Max stack size: 0
1212
Instructions:
13-
0: ReturnConst True
13+
# instrs.star.bzl:1:14-30
14+
0: ReturnConst True
1415
16: End

starlark/src/tests/bc/golden/and_or_x_and_false.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def test(x): return x and False
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: IfNotBr &x 48
13+
# instrs.star.bzl:1:14-32
14+
0: IfNotBr &x 48
1415
16: Const False ->&1
1516
40: Br 64
1617
>48: Mov &x ->&1

starlark/src/tests/bc/golden/and_or_x_and_true.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def test(x): return x and True
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: IfNotBr &x 48
13+
# instrs.star.bzl:1:14-31
14+
0: IfNotBr &x 48
1415
16: Const True ->&1
1516
40: Br 64
1617
>48: Mov &x ->&1

starlark/src/tests/bc/golden/and_or_x_or_false.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def test(x): return x or False
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: IfNotBr &x 40
13+
# instrs.star.bzl:1:14-31
14+
0: IfNotBr &x 40
1415
16: Mov &x ->&1
1516
32: Br 64
1617
>40: Const False ->&1

starlark/src/tests/bc/golden/and_or_x_or_true.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def test(x): return x or True
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: IfNotBr &x 40
13+
# instrs.star.bzl:1:14-30
14+
0: IfNotBr &x 40
1415
16: Mov &x ->&1
1516
32: Br 64
1617
>40: Const True ->&1

starlark/src/tests/bc/golden/call.golden

+6-5
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ def test(a, k):
1919

2020
Max stack size: 6
2121
Instructions:
22-
0: Const 10 ->&3
23-
24: Const 20 ->&4
24-
48: Const 30 ->&5
25-
72: Const 40 ->&6
26-
96: Const 50 ->&7
22+
# instrs.star.bzl:2:5-10:6
23+
0: Const 10 ->&3
24+
24: Const 20 ->&4
25+
48: Const 30 ->&5
26+
72: Const 40 ->&6
27+
96: Const 50 ->&7
2728
120: CallFrozenNative noop {&3..&8 2 p q r *&0 **&1} instrs.star.bzl:2:5-10:6 ->&2
2829
208: ReturnConst None
2930
224: End

starlark/src/tests/bc/golden/compr_if_true_clause.golden

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ def test(y): return [x for x in y if True]
1010

1111
Max stack size: 3
1212
Instructions:
13-
0: ListNew ->&3
14-
8: Iter &y 0 ->&4 ->&x 72
13+
# instrs.star.bzl:1:14-43
14+
0: ListNew ->&3
15+
8: Iter &y 0 ->&4 ->&x 72
1516
> 32: ComprListAppend &3 &x
1617
48: Continue &4 0 ->&x 32 72
1718
>72: Mov &3 ->&2

starlark/src/tests/bc/golden/compr_if_true_clause_on_freeze.golden

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ C = True
1212

1313
Max stack size: 3
1414
Instructions:
15-
0: ListNew ->&3
16-
8: Iter &y 0 ->&4 ->&x 72
15+
# instrs.star.bzl:1:14-40
16+
0: ListNew ->&3
17+
8: Iter &y 0 ->&4 ->&x 72
1718
> 32: ComprListAppend &3 &x
1819
48: Continue &4 0 ->&x 32 72
1920
>72: Mov &3 ->&2

starlark/src/tests/bc/golden/compr_no_loop_if_top_collection_is_empty.golden

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test(): return [x for x in []]
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: ListNew ->&1
14-
8: Return &1
13+
# instrs.star.bzl:1:13-35
14+
0: ListNew ->&1
15+
8: Return &1
1516
16: End

starlark/src/tests/bc/golden/compr_no_loop_if_top_collection_is_empty_on_freeze.golden

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ D = {}
1111

1212
Max stack size: 1
1313
Instructions:
14-
0: ListNew ->&1
15-
8: Return &1
14+
# instrs.star.bzl:1:13-34
15+
0: ListNew ->&1
16+
8: Return &1
1617
16: End

starlark/src/tests/bc/golden/constant_folding_list_add.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test(): return [1] + [2]
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: ListOfConsts [1, 2] ->&0
13+
# instrs.star.bzl:1:13-29
14+
0: ListOfConsts [1, 2] ->&0
1415
32: Return &0
1516
40: End

starlark/src/tests/bc/golden/def_inline_const_args_inlined.golden

+4-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ def test():
1515

1616
Max stack size: 3
1717
Instructions:
18-
0: Const True ->&1
19-
24: Const 10 ->&2
20-
48: CallFrozenNativePos noop &1..&3 instrs.star.bzl:2:12-22 ->&0
18+
# instrs.star.bzl:6:5-25
19+
0: Const True ->&1
20+
24: Const 10 ->&2
21+
48: CallFrozenNativePos noop &1..&3 instrs.star.bzl:2:12-22 ->&0
2122
104: Return &0
2223
112: End

starlark/src/tests/bc/golden/def_inline_const_inlined.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ def test():
1414

1515
Max stack size: 0
1616
Instructions:
17-
0: ReturnConst 10
17+
# instrs.star.bzl:5:5-21
18+
0: ReturnConst 10
1819
16: End

starlark/src/tests/bc/golden/def_inline_dict_inlined.golden

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ def test():
1515

1616
Max stack size: 3
1717
Instructions:
18-
0: ListNew ->&1
19-
8: Const 10 ->&2
18+
# instrs.star.bzl:6:5-26
19+
0: ListNew ->&1
20+
8: Const 10 ->&2
2021
32: DictNPop [&1, &2] ->&0
2122
48: Return &0
2223
56: End

starlark/src/tests/bc/golden/def_inline_list_inlined.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def returns_list():
1515

1616
Max stack size: 1
1717
Instructions:
18-
0: ListOfConsts [10, True] ->&0
18+
# instrs.star.bzl:2:5-26
19+
0: ListOfConsts [10, True] ->&0
1920
32: Return &0
2021
40: End

starlark/src/tests/bc/golden/def_inline_locals_inlined.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def test(x, y):
1515

1616
Max stack size: 1
1717
Instructions:
18-
0: CallFrozenNativePos noop &0..&2 instrs.star.bzl:2:12-22 ->&2
18+
# instrs.star.bzl:6:5-21
19+
0: CallFrozenNativePos noop &0..&2 instrs.star.bzl:2:12-22 ->&2
1920
56: Return &2
2021
64: End

starlark/src/tests/bc/golden/def_inline_return_type_inlined.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def test():
1515

1616
Max stack size: 1
1717
Instructions:
18-
0: CallFrozenDefPos instrs.star.bzl.smth &0..&0 instrs.star.bzl:6:12-18 ->&0
18+
# instrs.star.bzl:6:5-18
19+
0: CallFrozenDefPos instrs.star.bzl.smth &0..&0 instrs.star.bzl:6:12-18 ->&0
1920
40: Return &0
2021
48: End

starlark/src/tests/bc/golden/definitely_assigned_mov_is_used.golden

+5-4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ def test(x, y): noop(y, x)
1010

1111
Max stack size: 3
1212
Instructions:
13-
0: Mov &y ->&3
14-
16: Mov &x ->&4
15-
32: CallFrozenNativePos noop &3..&5 instrs.star.bzl:1:17-27 ->&2
16-
88: ReturnConst None
13+
# instrs.star.bzl:1:17-27
14+
0: Mov &y ->&3
15+
16: Mov &x ->&4
16+
32: CallFrozenNativePos noop &3..&5 instrs.star.bzl:1:17-27 ->&2
17+
88: ReturnConst None
1718
104: End

starlark/src/tests/bc/golden/definitely_assigned_no_op_movs.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ def test(x): x = x
1010

1111
Max stack size: 0
1212
Instructions:
13-
0: ReturnConst None
13+
# instrs.star.bzl:1:14-19
14+
0: ReturnConst None
1415
16: End

starlark/src/tests/bc/golden/definitely_assigned_slot_range_in_call.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test(x, y): noop(x, y)
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: CallFrozenNativePos noop &0..&2 instrs.star.bzl:1:17-27 ->&2
13+
# instrs.star.bzl:1:17-27
14+
0: CallFrozenNativePos noop &0..&2 instrs.star.bzl:1:17-27 ->&2
1415
56: ReturnConst None
1516
72: End

starlark/src/tests/bc/golden/definitely_assigned_slot_range_in_list.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test(x, y): return [x, y]
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: ListNPop [&x, &y] ->&2
13+
# instrs.star.bzl:1:17-30
14+
0: ListNPop [&x, &y] ->&2
1415
16: Return &2
1516
24: End

starlark/src/tests/bc/golden/eq_bool.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def test(x):
1111

1212
Max stack size: 1
1313
Instructions:
14-
0: EqPtr &x True ->&1
14+
# instrs.star.bzl:2:5-21
15+
0: EqPtr &x True ->&1
1516
24: Return &1
1617
32: End

starlark/src/tests/bc/golden/eq_const.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def test(x):
1313

1414
Max stack size: 1
1515
Instructions:
16-
0: EqConst &x struct(a=2) ->&1
16+
# instrs.star.bzl:4:5-18
17+
0: EqConst &x struct(a=2) ->&1
1718
24: Return &1
1819
32: End

starlark/src/tests/bc/golden/eq_enum.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def test(x):
1313

1414
Max stack size: 1
1515
Instructions:
16-
0: EqPtr &x Color("RED") ->&1
16+
# instrs.star.bzl:4:5-29
17+
0: EqPtr &x Color("RED") ->&1
1718
24: Return &1
1819
32: End

starlark/src/tests/bc/golden/eq_int.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def test(x):
1111

1212
Max stack size: 1
1313
Instructions:
14-
0: EqInt &x 10 ->&1
14+
# instrs.star.bzl:2:5-19
15+
0: EqInt &x 10 ->&1
1516
24: Return &1
1617
32: End

starlark/src/tests/bc/golden/eq_short_str.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def test(x):
1111

1212
Max stack size: 1
1313
Instructions:
14-
0: EqPtr &x "a" ->&1
14+
# instrs.star.bzl:2:5-20
15+
0: EqPtr &x "a" ->&1
1516
24: Return &1
1617
32: End

starlark/src/tests/bc/golden/eq_str.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def test(x):
1111

1212
Max stack size: 1
1313
Instructions:
14-
0: EqStr &x "hello" ->&1
14+
# instrs.star.bzl:2:5-24
15+
0: EqStr &x "hello" ->&1
1516
24: Return &1
1617
32: End

starlark/src/tests/bc/golden/expr_call_maybe_known_method.golden

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def test(x): x.append(1)
1010

1111
Max stack size: 2
1212
Instructions:
13-
0: Const 1 ->&2
14-
24: CallMaybeKnownMethodPos &x append <m> &2..&3 instrs.star.bzl:1:14-25 ->&1
13+
# instrs.star.bzl:1:14-25
14+
0: Const 1 ->&2
15+
24: CallMaybeKnownMethodPos &x append <m> &2..&3 instrs.star.bzl:1:14-25 ->&1
1516
120: ReturnConst None
1617
136: End

starlark/src/tests/bc/golden/expr_format_one.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test(x): return '(({}))'.format(x)
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: FormatOne "((" &x "))" ->&1
13+
# instrs.star.bzl:1:14-39
14+
0: FormatOne "((" &x "))" ->&1
1415
32: Return &1
1516
40: End

starlark/src/tests/bc/golden/expr_fstring.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test(x): return f'test: {x}'
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: FormatOne "test: " &x "" ->&1
13+
# instrs.star.bzl:1:14-33
14+
0: FormatOne "test: " &x "" ->&1
1415
32: Return &1
1516
40: End

starlark/src/tests/bc/golden/expr_percent_s_one.golden

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test(x): return '((%s))' % x
1010

1111
Max stack size: 1
1212
Instructions:
13-
0: PercentSOne "((" &x "))" ->&1
13+
# instrs.star.bzl:1:14-33
14+
0: PercentSOne "((" &x "))" ->&1
1415
32: Return &1
1516
40: End

0 commit comments

Comments
 (0)