@@ -2875,17 +2875,18 @@ impl<'a> ExecPass<'a> {
28752875 }
28762876
28772877 fn eval_partial ( & mut self , vid : ValueId ) -> Result < bool , ( ) > {
2878- let v = self . values . swap_remove ( & vid) ;
2878+ let v = self . values . get ( & vid) ;
28792879 if v. is_none ( ) {
2880+ self . values . swap_remove ( & vid) ;
28802881 return Ok ( false ) ;
28812882 }
28822883 let mut v = v. unwrap ( ) ;
2883- let vref = v. as_mut ( ) ;
2884+ let vref = v. as_ref ( ) ;
28842885 if vref. is_ready ( ) {
2885- self . values . insert ( vid, v) ;
28862886 return Ok ( false ) ;
28872887 }
2888- let vref = vref. unwrap_deferred ( ) ;
2888+ let mut vref = vref. unwrap_deferred ( ) . clone ( ) ;
2889+ let cell_id = vref. loc . cell ;
28892890 let state = self . cell_states . get_mut ( & vref. loc . cell ) . unwrap ( ) ;
28902891 let progress = match & mut vref. state {
28912892 PartialEvalState :: Call ( c) => match c. expr . func . path . last ( ) . unwrap ( ) . name . as_str ( ) {
@@ -3597,6 +3598,7 @@ impl<'a> ExecPass<'a> {
35973598 ) ;
35983599 if_. state = IfExprState :: Else ( else_) ;
35993600 }
3601+ self . values . insert ( vid, Defer :: Deferred ( vref) ) ;
36003602 true
36013603 } else {
36023604 false
@@ -3631,6 +3633,7 @@ impl<'a> ExecPass<'a> {
36313633 . unwrap ( ) ;
36323634 let value = self . visit_expr ( vref. loc , & arm. expr ) ;
36333635 match_. state = MatchExprState :: Value ( value) ;
3636+ self . values . insert ( vid, Defer :: Deferred ( vref) ) ;
36343637 true
36353638 } else {
36363639 false
@@ -3956,8 +3959,6 @@ impl<'a> ExecPass<'a> {
39563959 }
39573960 } ;
39583961
3959- let cell_id = vref. loc . cell ;
3960- self . values . entry ( vid) . or_insert ( v) ;
39613962 if self . values [ & vid] . is_ready ( ) {
39623963 self . cell_state_mut ( cell_id) . deferred . swap_remove ( & vid) ;
39633964 }
0 commit comments