in starlark/src/eval/bc/writer.rs [116:190]
fn flush_instrs(&mut self) {
let mut queued_locals = mem::take(&mut self.queued_locals);
let mut queued_consts = mem::take(&mut self.queued_consts);
let mut locals_slice = queued_locals.as_slice();
let mut consts_slice = queued_consts.as_slice();
while let [l0, l1, l2, l3, rem @ ..] = locals_slice {
self.do_write_generic_explicit::<InstrLoadLocal4>(
BcInstrSlowArg {
span: l0.span.merge(&l1.span).merge(&l2.span).merge(&l3.span),
spans: vec![l0.span, l1.span, l2.span, l3.span],
},
[l0.node, l1.node, l2.node, l3.node],
);
locals_slice = rem;
}
match (locals_slice, consts_slice) {
([], _) => {}
([l0], [c0, rem @ ..]) => {
self.do_write_generic::<InstrLoadLocalAndConst>(l0.span, (l0.node, c0.node));
consts_slice = rem;
}
([l0], _) => {
self.do_write_generic::<InstrLoadLocal>(l0.span, l0.node);
}
([l0, l1], _) => {
self.do_write_generic_explicit::<InstrLoadLocal2>(
BcInstrSlowArg {
span: l0.span.merge(&l1.span),
spans: vec![l0.span, l1.span],
},
[l0.node, l1.node],
);
}
([l0, l1, l2], _) => {
self.do_write_generic_explicit::<InstrLoadLocal3>(
BcInstrSlowArg {
span: l0.span.merge(&l1.span).merge(&l2.span),
spans: vec![l0.span, l1.span, l2.span],
},
[l0.node, l1.node, l2.node],
);
}
_ => unreachable!(),
}
while let [v0, v1, v2, v3, rem @ ..] = consts_slice {
self.do_write_generic::<InstrConst4>(
v0.span.merge(&v1.span).merge(&v2.span).merge(&v3.span),
[v0.node, v1.node, v2.node, v3.node],
);
consts_slice = rem;
}
match consts_slice {
[] => {}
[v0] => {
self.do_write_generic::<InstrConst>(v0.span, v0.node);
}
[v0, v1] => {
self.do_write_generic::<InstrConst2>(v0.span.merge(&v1.span), [v0.node, v1.node]);
}
[v0, v1, v2] => {
self.do_write_generic::<InstrConst3>(
v0.span.merge(&v1.span).merge(&v2.span),
[v0.node, v1.node, v2.node],
);
}
_ => unreachable!(),
}
queued_locals.clear();
queued_consts.clear();
self.queued_locals = queued_locals;
self.queued_consts = queued_consts;
}