From 77f16271325b964cac8a4acaa50fc3ff656c0fd7 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Wed, 18 Jun 2025 15:00:46 -0400 Subject: [PATCH] update dict pattern for new jumps --- src/compiler.rs | 28 ++++++++++++---------------- src/main.rs | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/compiler.rs b/src/compiler.rs index a6c79ef..f2f61c4 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -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!() diff --git a/src/main.rs b/src/main.rs index 00d8897..94b10ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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); }