update dict pattern for new jumps
This commit is contained in:
parent
6bd419125f
commit
77f1627132
|
@ -809,9 +809,8 @@ impl<'a> Compiler<'a> {
|
|||
DictPattern(pairs) => {
|
||||
self.emit_op(Op::MatchDict);
|
||||
self.emit_byte(pairs.len());
|
||||
self.emit_op(Op::JumpIfNoMatch);
|
||||
let before_load_dict_idx = self.len();
|
||||
self.emit_byte(0xff);
|
||||
let before_load_dict_idx = self.jump_stub(Op::JumpIfNoMatch);
|
||||
|
||||
let mut jump_idxes = vec![];
|
||||
let dict_stack_pos = self.stack_depth - 1;
|
||||
for pair in pairs {
|
||||
|
@ -822,22 +821,19 @@ impl<'a> Compiler<'a> {
|
|||
self.emit_op(Op::LoadDictValue);
|
||||
self.emit_byte(dict_stack_pos);
|
||||
self.visit(pattern);
|
||||
self.emit_op(Op::JumpIfNoMatch);
|
||||
jump_idxes.push(self.len());
|
||||
self.emit_byte(0xff);
|
||||
jump_idxes.push(self.jump_stub(Op::JumpIfNoMatch));
|
||||
}
|
||||
self.emit_op(Op::Jump);
|
||||
let jump_idx = self.len();
|
||||
self.emit_byte(0xff);
|
||||
let jump_idx = self.jump_stub(Op::Jump);
|
||||
|
||||
for idx in jump_idxes {
|
||||
self.chunk.bytecode[idx] = (self.len() - idx) as u8 - 1;
|
||||
self.patch_jump(idx, self.len() - idx - 2);
|
||||
}
|
||||
for _ in 0..pairs.len() {
|
||||
self.emit_op(Op::Pop);
|
||||
}
|
||||
self.chunk.bytecode[before_load_dict_idx] =
|
||||
(self.len() - before_load_dict_idx) as u8 - 1;
|
||||
self.chunk.bytecode[jump_idx] = (self.len() - jump_idx) as u8 - 1;
|
||||
|
||||
self.emit_op(Op::PopN);
|
||||
self.emit_byte(pairs.len());
|
||||
|
||||
self.patch_jump(before_load_dict_idx, self.len() - before_load_dict_idx - 3);
|
||||
self.patch_jump(jump_idx, self.len() - jump_idx - 3);
|
||||
}
|
||||
Splattern(..) => {
|
||||
todo!()
|
||||
|
|
|
@ -75,7 +75,7 @@ pub fn run(src: &'static str) {
|
|||
pub fn main() {
|
||||
// env::set_var("RUST_BACKTRACE", "1");
|
||||
let src = "
|
||||
let ((1)) = ((1))
|
||||
let #{:a 1, :b (2, #{:c 3})} = #{:a 1, :b (1, #{:c 3})}
|
||||
";
|
||||
run(src);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user