@@ -1009,18 +1009,32 @@ impl CairoRunner {
10091009        Ok ( ( ) ) 
10101010    } 
10111011
1012-     // Returns a map from  builtin base's segment index to  stop_ptr offset 
1013-     // Aka the builtin's segment number and its maximum offset 
1012+     ///  Returns a tuple of  builtin base's segment index and  stop_ptr offset 
1013+ ///  Aka the builtin's segment number and its maximum offset 
10141014pub  fn  get_builtin_segments_info ( & self )  -> Result < Vec < ( usize ,  usize ) > ,  RunnerError >  { 
1015+         let  proof_mode = self . is_proof_mode ( ) ; 
10151016        let  mut  builtin_segment_info = Vec :: new ( ) ; 
10161017
10171018        for  builtin in  & self . vm . builtin_runners  { 
10181019            let  ( index,  stop_ptr)  = builtin. get_memory_segment_addresses ( ) ; 
10191020
1020-             builtin_segment_info. push ( ( 
1021-                 index, 
1022-                 stop_ptr. ok_or_else ( || RunnerError :: NoStopPointer ( Box :: new ( builtin. name ( ) ) ) ) ?, 
1023-             ) ) ; 
1021+             match  ( proof_mode,  stop_ptr)  { 
1022+                 // Segment present (same handling in both modes). 
1023+                 ( _,  Some ( sp) )  => builtin_segment_info. push ( ( index,  sp) ) , 
1024+ 
1025+                 // If non proof-mode, only builtins in the program are present and they must 
1026+                 // point to a segment (so `stop_ptr` must be set). Throw an error if not. 
1027+                 ( false ,  None )  => { 
1028+                     return  Err ( RunnerError :: NoStopPointer ( Box :: new ( 
1029+                         builtin. name ( ) . to_owned ( ) , 
1030+                     ) ) ) ; 
1031+                 } 
1032+ 
1033+                 // In proof‐mode there are builtin runners for all builtins in the layout, but only 
1034+                 // the ones that are in the program point to a segment (so `stop_ptr` is set). 
1035+                 // Only collect those and silently ignore the rest. 
1036+                 ( true ,  None )  => { } 
1037+             } 
10241038        } 
10251039
10261040        Ok ( builtin_segment_info) 
@@ -3915,6 +3929,49 @@ mod tests {
39153929        ) ; 
39163930    } 
39173931
3932+     #[ test]  
3933+     #[ cfg_attr( target_arch = "wasm32" ,  wasm_bindgen_test) ]  
3934+     fn  get_builtin_segments_info_non_proof_mode ( )  { 
3935+         let  program_data =
3936+             include_bytes ! ( "../../../../cairo_programs/proof_programs/assert_nn.json" ) ; 
3937+         let  cairo_run_config = CairoRunConfig  { 
3938+             entrypoint :  "main" , 
3939+             trace_enabled :  false , 
3940+             relocate_mem :  false , 
3941+             layout :  LayoutName :: small, 
3942+             proof_mode :  false , 
3943+             secure_run :  Some ( true ) , 
3944+             ..Default :: default ( ) 
3945+         } ; 
3946+         let  mut  hint_executor = BuiltinHintProcessor :: new_empty ( ) ; 
3947+         let  runner = cairo_run ( program_data,  & cairo_run_config,  & mut  hint_executor) . unwrap ( ) ; 
3948+         // Only the range_check builtin is used in this program, and in non-proof mode, it will 
3949+         // be the first and only builtin segment initialized (and used). 
3950+         assert_eq ! ( runner. get_builtin_segments_info( ) ,  Ok ( vec![ ( 2 ,  6 ) ] ) ) ; 
3951+     } 
3952+ 
3953+     #[ test]  
3954+     #[ cfg_attr( target_arch = "wasm32" ,  wasm_bindgen_test) ]  
3955+     fn  get_builtin_segments_info_proof_mode ( )  { 
3956+         let  program_data =
3957+             include_bytes ! ( "../../../../cairo_programs/proof_programs/assert_nn.json" ) ; 
3958+         let  cairo_run_config = CairoRunConfig  { 
3959+             entrypoint :  "main" , 
3960+             trace_enabled :  false , 
3961+             relocate_mem :  false , 
3962+             layout :  LayoutName :: small, 
3963+             proof_mode :  true , 
3964+             secure_run :  Some ( true ) , 
3965+             ..Default :: default ( ) 
3966+         } ; 
3967+         let  mut  hint_executor = BuiltinHintProcessor :: new_empty ( ) ; 
3968+         let  runner = cairo_run ( program_data,  & cairo_run_config,  & mut  hint_executor) . unwrap ( ) ; 
3969+         // Only the range_check builtin is used in this program, and in proof mode, it will 
3970+         // be the first and only builtin segment used, but initialized after the other builtins 
3971+         // in the layout. 
3972+         assert_eq ! ( runner. get_builtin_segments_info( ) ,  Ok ( vec![ ( 4 ,  6 ) ] ) ) ; 
3973+     } 
3974+ 
39183975    #[ test]  
39193976    #[ cfg_attr( target_arch = "wasm32" ,  wasm_bindgen_test) ]  
39203977    fn  get_execution_resources_trace_not_enabled ( )  { 
0 commit comments