1- use crate :: chunk:: { Chunk , OpCode } ;
1+ use crate :: chunk:: { Chunk , JumpOffset , OpCode } ;
22use crate :: value:: { CompiledFunction , Function } ;
33use crate :: { Object , Value } ;
44use ndc_core:: { StaticType , TypeSignature } ;
@@ -139,13 +139,17 @@ impl Compiler {
139139 self . compile_expr ( * left) ?;
140140 match operator {
141141 LogicalOperator :: And => {
142- let end_jump = self . chunk . write ( OpCode :: JumpIfFalse ( 0 ) , left_span) ;
142+ let end_jump = self
143+ . chunk
144+ . write ( OpCode :: JumpIfFalse ( JumpOffset :: ZERO ) , left_span) ;
143145 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
144146 self . compile_expr ( * right) ?;
145147 self . patch_jump ( end_jump) ;
146148 }
147149 LogicalOperator :: Or => {
148- let end_jump = self . chunk . write ( OpCode :: JumpIfTrue ( 0 ) , left_span) ;
150+ let end_jump = self
151+ . chunk
152+ . write ( OpCode :: JumpIfTrue ( JumpOffset :: ZERO ) , left_span) ;
149153 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
150154 self . compile_expr ( * right) ?;
151155 self . patch_jump ( end_jump) ;
@@ -420,7 +424,7 @@ impl Compiler {
420424 self . chunk . write ( OpCode :: Return , span) ;
421425 }
422426 Expression :: Break => {
423- let idx = self . chunk . write ( OpCode :: Jump ( 0 ) , span) ; // will be backpatched
427+ let idx = self . chunk . write ( OpCode :: Jump ( JumpOffset :: ZERO ) , span) ; // will be backpatched
424428 self . current_loop_context_mut ( )
425429 . ok_or ( CompileError :: unexpected_break ( span) ) ?
426430 . break_instructions
@@ -589,14 +593,15 @@ impl Compiler {
589593 fn patch_jump ( & mut self , op_idx : usize ) {
590594 let offset =
591595 isize:: try_from ( self . chunk . len ( ) - op_idx - 1 ) . expect ( "jump too large to patch" ) ;
592- self . chunk . set_jump_offset ( op_idx, offset) ;
596+ self . chunk . set_jump_offset ( op_idx, JumpOffset :: new ( offset) ) ;
593597 }
594598
595599 /// Emits a `Jump` that goes back to `target` (a previously recorded chunk offset).
596600 fn write_jump_back ( & mut self , target : usize , span : Span ) -> usize {
597601 let offset =
598602 -isize:: try_from ( self . chunk . len ( ) - target + 1 ) . expect ( "loop too large to jump back" ) ;
599- self . chunk . write ( OpCode :: Jump ( offset) , span)
603+ self . chunk
604+ . write ( OpCode :: Jump ( JumpOffset :: new ( offset) ) , span)
600605 }
601606
602607 fn compile_block (
@@ -633,18 +638,24 @@ impl Compiler {
633638 ) -> Result < ( ) , CompileError > {
634639 let condition_span = condition. span ;
635640 self . compile_expr ( condition) ?;
636- let conditional_jump_idx = self . chunk . write ( OpCode :: JumpIfFalse ( 0 ) , condition_span) ;
641+ let conditional_jump_idx = self
642+ . chunk
643+ . write ( OpCode :: JumpIfFalse ( JumpOffset :: ZERO ) , condition_span) ;
637644 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
638645 self . compile_expr ( on_true) ?;
639646 if let Some ( on_false) = on_false {
640- let jump_to_end = self . chunk . write ( OpCode :: Jump ( 0 ) , Span :: synthetic ( ) ) ;
647+ let jump_to_end = self
648+ . chunk
649+ . write ( OpCode :: Jump ( JumpOffset :: ZERO ) , Span :: synthetic ( ) ) ;
641650 self . patch_jump ( conditional_jump_idx) ;
642651 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
643652 self . compile_expr ( on_false) ?;
644653 self . patch_jump ( jump_to_end) ;
645654 } else {
646655 // No else branch — push unit so the if-expression always produces a value.
647- let jump_to_end = self . chunk . write ( OpCode :: Jump ( 0 ) , Span :: synthetic ( ) ) ;
656+ let jump_to_end = self
657+ . chunk
658+ . write ( OpCode :: Jump ( JumpOffset :: ZERO ) , Span :: synthetic ( ) ) ;
648659 self . patch_jump ( conditional_jump_idx) ;
649660 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
650661 let idx = self . chunk . add_constant ( Value :: unit ( ) ) ;
@@ -664,7 +675,9 @@ impl Compiler {
664675 let condition_span = condition. span ;
665676 let loop_start = self . new_loop_context ( ) ;
666677 self . compile_expr ( condition) ?;
667- let conditional_jump_idx = self . chunk . write ( OpCode :: JumpIfFalse ( 0 ) , condition_span) ;
678+ let conditional_jump_idx = self
679+ . chunk
680+ . write ( OpCode :: JumpIfFalse ( JumpOffset :: ZERO ) , condition_span) ;
668681 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
669682 self . compile_expr ( loop_body) ?;
670683 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
@@ -848,7 +861,7 @@ impl Compiler {
848861 self . chunk . write ( OpCode :: GetIterator , sequence. span ) ;
849862
850863 let loop_start = self . new_loop_context ( ) ;
851- let iter_next = self . chunk . write ( OpCode :: IterNext ( 0 ) , span) ;
864+ let iter_next = self . chunk . write ( OpCode :: IterNext ( JumpOffset :: ZERO ) , span) ;
852865 self . compile_declare_lvalue ( l_value. clone ( ) , span) ?;
853866
854867 self . compile_for_iterations ( rest, span, compile_leaf) ?;
@@ -876,10 +889,12 @@ impl Compiler {
876889 }
877890 ForIteration :: Guard ( condition) => {
878891 self . compile_expr ( condition. clone ( ) ) ?;
879- let skip_jump = self . chunk . write ( OpCode :: JumpIfFalse ( 0 ) , span) ;
892+ let skip_jump = self
893+ . chunk
894+ . write ( OpCode :: JumpIfFalse ( JumpOffset :: ZERO ) , span) ;
880895 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
881896 self . compile_for_iterations ( rest, span, compile_leaf) ?;
882- let end_jump = self . chunk . write ( OpCode :: Jump ( 0 ) , span) ;
897+ let end_jump = self . chunk . write ( OpCode :: Jump ( JumpOffset :: ZERO ) , span) ;
883898 self . patch_jump ( skip_jump) ;
884899 self . chunk . write ( OpCode :: Pop , Span :: synthetic ( ) ) ;
885900 self . patch_jump ( end_jump) ;
0 commit comments