@@ -27,7 +27,7 @@ use crate::{
2727
2828#[ allow( dead_code) ]
2929pub struct CairoRunner2 {
30- virtual_machine : VirtualMachine ,
30+ vm : VirtualMachine ,
3131 program_base : Relocatable ,
3232 execution_base : Relocatable ,
3333 final_pc : Relocatable ,
@@ -68,54 +68,32 @@ impl CairoRunner2 {
6868 let builtins = get_entrypoint_builtins ( entrypoint) ;
6969
7070 check_builtin_order ( & builtins) ?;
71+ let mut builtin_runners = initialize_builtin_runners ( & layout, & builtins, true , true ) ?;
7172
72- let builtins_set: HashSet < BuiltinName > = builtins. clone ( ) . into_iter ( ) . collect ( ) ;
73- let mut builtin_runners = initialize_builtin_runners ( & layout, builtins_set, true , true ) ?;
73+ let mut segments = MemorySegmentManager :: new ( ) ;
74+ let program_base = segments. add ( ) ;
75+ let execution_base = segments. add ( ) ;
7476
75- let mut memory_segment_manager = MemorySegmentManager :: new ( ) ;
76- let program_base = memory_segment_manager. add ( ) ;
77- let execution_base = memory_segment_manager. add ( ) ;
77+ initialize_builtin_runner_segments ( & mut builtin_runners, & mut segments) ;
7878
79- for builtin_runner in & mut builtin_runners {
80- builtin_runner. initialize_segments ( & mut memory_segment_manager) ;
81- }
82-
83- for builtin_runner in & mut builtin_runners {
84- if let BuiltinRunner :: Mod ( runner) = builtin_runner {
85- runner. initialize_zero_segment ( & mut memory_segment_manager) ;
86- }
87- }
88-
89- let mut virtual_machine = VirtualMachineBuilder :: default ( )
79+ let mut vm = VirtualMachineBuilder :: default ( )
9080 . builtin_runners ( builtin_runners)
91- . segments ( memory_segment_manager )
81+ . segments ( segments )
9282 . build ( ) ;
9383
94- let builtin_runner_map: HashMap < BuiltinName , & BuiltinRunner > = virtual_machine
95- . builtin_runners
96- . iter ( )
97- . map ( |builtin_runner| ( builtin_runner. name ( ) , builtin_runner) )
98- . collect ( ) ;
9984 let mut stack = Vec :: new ( ) ;
100- for builtin in builtins {
101- if let Some ( builtin_runner) = builtin_runner_map. get ( & builtin) {
102- stack. append ( & mut builtin_runner. initial_stack ( ) ) ;
103- } else {
104- stack. push ( Felt252 :: ZERO . into ( ) )
105- }
106- }
85+ extend_stack_with_builtins ( & mut stack, & builtins, & vm. builtin_runners ) ;
10786
108- let return_fp = virtual_machine . add_memory_segment ( ) ;
109- let return_pc = virtual_machine . add_memory_segment ( ) ;
87+ let return_fp = vm . add_memory_segment ( ) ;
88+ let return_pc = vm . add_memory_segment ( ) ;
11089 stack. push ( MaybeRelocatable :: RelocatableValue ( return_fp) ) ;
11190 stack. push ( MaybeRelocatable :: RelocatableValue ( return_pc) ) ;
11291
11392 let initial_pc = ( program_base + entrypoint. offset ) ?;
11493 let initial_fp = ( execution_base + stack. len ( ) ) ?;
11594 let initial_ap = initial_fp;
116-
11795 let run_context = RunContext :: new ( initial_pc, initial_ap. offset , initial_fp. offset ) ;
118- virtual_machine . set_run_context ( run_context) ;
96+ vm . set_run_context ( run_context) ;
11997
12098 let bytecode = executable
12199 . program
@@ -124,28 +102,19 @@ impl CairoRunner2 {
124102 . map ( Felt252 :: from)
125103 . map ( MaybeRelocatable :: from)
126104 . collect :: < Vec < _ > > ( ) ;
127-
128- virtual_machine
129- . load_data ( program_base, & bytecode)
105+ vm. load_data ( program_base, & bytecode)
130106 . map_err ( RunnerError :: MemoryInitializationError ) ?;
131-
132107 for i in 0 ..bytecode. len ( ) {
133- virtual_machine
134- . segments
135- . memory
136- . mark_as_accessed ( ( program_base + i) ?) ;
108+ vm. segments . memory . mark_as_accessed ( ( program_base + i) ?) ;
137109 }
138110
139- virtual_machine
140- . load_data ( execution_base, & stack)
111+ vm. load_data ( execution_base, & stack)
141112 . map_err ( RunnerError :: MemoryInitializationError ) ?;
142113
143- for builtin_runner in & mut virtual_machine . builtin_runners {
144- builtin_runner. add_validation_rule ( & mut virtual_machine . segments . memory )
114+ for builtin_runner in & mut vm . builtin_runners {
115+ builtin_runner. add_validation_rule ( & mut vm . segments . memory )
145116 }
146-
147- virtual_machine
148- . segments
117+ vm. segments
149118 . memory
150119 . validate_existing_memory ( )
151120 . map_err ( RunnerError :: MemoryValidationError ) ?;
@@ -157,7 +126,7 @@ impl CairoRunner2 {
157126
158127 Ok ( Self {
159128 executable,
160- virtual_machine ,
129+ vm ,
161130 program_base,
162131 execution_base,
163132 final_pc,
@@ -177,6 +146,39 @@ impl CairoRunner2 {
177146 }
178147}
179148
149+ fn extend_stack_with_builtins (
150+ stack : & mut Vec < MaybeRelocatable > ,
151+ builtins : & [ BuiltinName ] ,
152+ runners : & [ BuiltinRunner ] ,
153+ ) {
154+ let runner_map: HashMap < BuiltinName , & BuiltinRunner > = runners
155+ . iter ( )
156+ . map ( |builtin_runner| ( builtin_runner. name ( ) , builtin_runner) )
157+ . collect ( ) ;
158+ for builtin in builtins {
159+ if let Some ( builtin_runner) = runner_map. get ( & builtin) {
160+ stack. append ( & mut builtin_runner. initial_stack ( ) ) ;
161+ } else {
162+ stack. push ( Felt252 :: ZERO . into ( ) )
163+ }
164+ }
165+ }
166+
167+ fn initialize_builtin_runner_segments (
168+ builtin_runners : & mut [ BuiltinRunner ] ,
169+ segments : & mut MemorySegmentManager ,
170+ ) {
171+ for builtin_runner in builtin_runners. iter_mut ( ) {
172+ builtin_runner. initialize_segments ( segments) ;
173+ }
174+
175+ for builtin_runner in builtin_runners. iter_mut ( ) {
176+ if let BuiltinRunner :: Mod ( mod_builtin_runner) = builtin_runner {
177+ mod_builtin_runner. initialize_zero_segment ( segments) ;
178+ }
179+ }
180+ }
181+
180182// TODO: Remove this once cyclic dependency is fixed.
181183// It should not be necessary, but cargo treats executable BuiltinName as a separate type
182184// which is why I had to create this adapter function.
@@ -215,12 +217,14 @@ pub fn check_builtin_order(builtins: &[BuiltinName]) -> Result<(), RunnerError>
215217
216218pub fn initialize_builtin_runners (
217219 layout : & CairoLayout ,
218- mut builtins : HashSet < BuiltinName > ,
220+ builtins : & [ BuiltinName ] ,
219221 allow_missing_builtins : bool ,
220222 create_all_builtins : bool ,
221223) -> Result < Vec < BuiltinRunner > , RunnerError > {
222224 let mut builtin_runners = Vec :: new ( ) ;
223225
226+ let mut builtins: HashSet < BuiltinName > = builtins. into_iter ( ) . map ( ToOwned :: to_owned) . collect ( ) ;
227+
224228 if layout. builtins . output {
225229 let included = builtins. remove ( & BuiltinName :: output) ;
226230 if included || create_all_builtins {
0 commit comments