@@ -200,7 +200,6 @@ pub fn lower_for_loop(
200
200
} ;
201
201
let next_value_type = some_variant. ty ;
202
202
builder. update_ref ( ctx, & loop_expr. into_iter_member_path , next_iterator. var_id ) ;
203
- let pattern = ctx. function_body . arenas . patterns [ loop_expr. pattern ] . clone ( ) ;
204
203
let unit_ty = corelib:: unit_ty ( db) ;
205
204
let some_block: cairo_lang_semantic:: ExprBlock =
206
205
extract_matches ! ( & ctx. function_body. arenas. exprs[ loop_expr. body] , semantic:: Expr :: Block )
@@ -215,7 +214,8 @@ pub fn lower_for_loop(
215
214
var_id : some_var_id,
216
215
location : ctx. get_location ( some_block. stable_ptr . untyped ( ) ) ,
217
216
} ) ;
218
- let lowered_pattern = lower_single_pattern ( ctx, & mut some_subscope, pattern, variant_expr) ;
217
+ let lowered_pattern =
218
+ lower_single_pattern ( ctx, & mut some_subscope, loop_expr. pattern , variant_expr) ;
219
219
let sealed_some = match lowered_pattern {
220
220
Ok ( _) => {
221
221
let block_expr = ( || {
@@ -651,8 +651,7 @@ pub fn lower_statement(
651
651
semantic:: Statement :: Let ( semantic:: StatementLet { pattern, expr, stable_ptr : _ } ) => {
652
652
log:: trace!( "Lowering a let statement." ) ;
653
653
let lowered_expr = lower_expr ( ctx, builder, * expr) ?;
654
- let pattern = ctx. function_body . arenas . patterns [ * pattern] . clone ( ) ;
655
- lower_single_pattern ( ctx, builder, pattern, lowered_expr) ?
654
+ lower_single_pattern ( ctx, builder, * pattern, lowered_expr) ?
656
655
}
657
656
semantic:: Statement :: Continue ( semantic:: StatementContinue { stable_ptr } ) => {
658
657
log:: trace!( "Lowering a continue statement." ) ;
@@ -698,24 +697,26 @@ pub fn lower_statement(
698
697
fn lower_single_pattern (
699
698
ctx : & mut LoweringContext < ' _ , ' _ > ,
700
699
builder : & mut BlockBuilder ,
701
- pattern : semantic:: Pattern ,
700
+ pattern_id : semantic:: PatternId ,
702
701
lowered_expr : LoweredExpr ,
703
702
) -> Result < ( ) , LoweringFlowError > {
704
703
log:: trace!( "Lowering a single pattern." ) ;
704
+ let pattern = & ctx. function_body . arenas . patterns [ pattern_id] ;
705
705
match pattern {
706
706
semantic:: Pattern :: Literal ( _)
707
707
| semantic:: Pattern :: StringLiteral ( _)
708
708
| semantic:: Pattern :: EnumVariant ( _) => {
709
709
return Err ( LoweringFlowError :: Failed (
710
- ctx. diagnostics . report ( & pattern, UnsupportedPattern ) ,
710
+ ctx. diagnostics . report ( pattern. stable_ptr ( ) , UnsupportedPattern ) ,
711
711
) ) ;
712
712
}
713
713
semantic:: Pattern :: Variable ( semantic:: PatternVariable {
714
714
name : _,
715
715
var : sem_var,
716
716
stable_ptr,
717
717
} ) => {
718
- let sem_var = semantic:: Binding :: LocalVar ( sem_var) ;
718
+ let sem_var = semantic:: Binding :: LocalVar ( sem_var. clone ( ) ) ;
719
+ let stable_ptr = * stable_ptr;
719
720
// Deposit the owned variable in the semantic variables store.
720
721
let var = lowered_expr. as_var_usage ( ctx, builder) ?. var_id ;
721
722
// Override variable location.
@@ -730,23 +731,25 @@ fn lower_single_pattern(
730
731
. concrete_struct_members ( structure. concrete_struct_id )
731
732
. map_err ( LoweringFlowError :: Failed ) ?;
732
733
let mut required_members = UnorderedHashMap :: < _ , _ > :: from_iter (
733
- structure. field_patterns . iter ( ) . map ( |( member, pattern) | ( member. id , pattern) ) ,
734
+ structure. field_patterns . iter ( ) . map ( |( member, pattern) | ( member. id , * pattern) ) ,
734
735
) ;
736
+ let n_snapshots = structure. n_snapshots ;
737
+ let stable_ptr = structure. stable_ptr . untyped ( ) ;
735
738
let generator = generators:: StructDestructure {
736
739
input : lowered_expr. as_var_usage ( ctx, builder) ?,
737
740
var_reqs : members
738
741
. iter ( )
739
742
. map ( |( _, member) | VarRequest {
740
- ty : wrap_in_snapshots ( ctx. db , member. ty , structure . n_snapshots ) ,
743
+ ty : wrap_in_snapshots ( ctx. db , member. ty , n_snapshots) ,
741
744
location : ctx. get_location (
742
745
required_members
743
746
. get ( & member. id )
744
747
. map ( |pattern| {
745
- ctx. function_body . arenas . patterns [ * * pattern]
748
+ ctx. function_body . arenas . patterns [ * pattern]
746
749
. stable_ptr ( )
747
750
. untyped ( )
748
751
} )
749
- . unwrap_or_else ( || structure . stable_ptr . untyped ( ) ) ,
752
+ . unwrap_or_else ( || stable_ptr) ,
750
753
) ,
751
754
} )
752
755
. collect ( ) ,
@@ -755,8 +758,7 @@ fn lower_single_pattern(
755
758
izip ! ( generator. add( ctx, & mut builder. statements) , members. iter( ) )
756
759
{
757
760
if let Some ( member_pattern) = required_members. remove ( & member. id ) {
758
- let member_pattern = ctx. function_body . arenas . patterns [ * member_pattern] . clone ( ) ;
759
- let stable_ptr = member_pattern. stable_ptr ( ) ;
761
+ let stable_ptr = ctx. function_body . arenas . patterns [ member_pattern] . stable_ptr ( ) ;
760
762
lower_single_pattern (
761
763
ctx,
762
764
builder,
@@ -777,11 +779,13 @@ fn lower_single_pattern(
777
779
ty,
778
780
..
779
781
} ) => {
780
- lower_tuple_like_pattern_helper ( ctx, builder, lowered_expr, & patterns, ty) ?;
782
+ let patterns = patterns. clone ( ) ;
783
+ lower_tuple_like_pattern_helper ( ctx, builder, lowered_expr, & patterns, * ty) ?;
781
784
}
782
785
semantic:: Pattern :: Otherwise ( pattern) => {
786
+ let stable_ptr = pattern. stable_ptr . untyped ( ) ;
783
787
let var = lowered_expr. as_var_usage ( ctx, builder) ?. var_id ;
784
- ctx. variables . variables [ var] . location = ctx. get_location ( pattern . stable_ptr . untyped ( ) ) ;
788
+ ctx. variables . variables [ var] . location = ctx. get_location ( stable_ptr) ;
785
789
}
786
790
semantic:: Pattern :: Missing ( _) => unreachable ! ( "Missing pattern in semantic model." ) ,
787
791
}
@@ -840,12 +844,7 @@ fn lower_tuple_like_pattern_helper(
840
844
}
841
845
} ;
842
846
for ( var, pattern) in zip_eq ( outputs, patterns) {
843
- lower_single_pattern (
844
- ctx,
845
- builder,
846
- ctx. function_body . arenas . patterns [ * pattern] . clone ( ) ,
847
- var,
848
- ) ?;
847
+ lower_single_pattern ( ctx, builder, * pattern, var) ?;
849
848
}
850
849
Ok ( ( ) )
851
850
}
0 commit comments