@@ -28,8 +28,8 @@ use crate::{
2828 KeccakBuiltinRunner , ModBuiltinRunner , OutputBuiltinRunner , PoseidonBuiltinRunner ,
2929 RangeCheckBuiltinRunner , SignatureBuiltinRunner , RC_N_PARTS_96 , RC_N_PARTS_STANDARD ,
3030 } ,
31- vm_core:: { VirtualMachine , VirtualMachineBuilder } ,
32- vm_memory:: memory_segments:: MemorySegmentManager ,
31+ vm_core:: VirtualMachine ,
32+ vm_memory:: { memory :: Memory , memory_segments:: MemorySegmentManager } ,
3333 } ,
3434 Felt252 ,
3535} ;
@@ -71,23 +71,40 @@ impl CairoRunner2 {
7171 reference_manager : Vec < HintReference > ,
7272 hints : BTreeMap < usize , Vec < HintParams > > ,
7373 ) -> Result < Self , RunnerError > {
74+ // =============
75+ // PREPROCESSING
76+ // =============
77+
7478 let entrypoint = find_entrypoint_of_kind ( & executable. entrypoints , entrypoint_kind. clone ( ) ) ;
7579
80+ let bytecode = executable
81+ . program
82+ . bytecode
83+ . iter ( )
84+ . map ( Felt252 :: from)
85+ . map ( MaybeRelocatable :: from)
86+ . collect :: < Vec < _ > > ( ) ;
87+
88+ let hint_collection =
89+ HintsCollection :: new ( & hints, bytecode. len ( ) ) . expect ( "failed to build hint collection" ) ;
90+
7691 let builtins = get_entrypoint_builtins ( entrypoint) ;
7792
93+ // ==============
94+ // INITIALIZATION
95+ // ==============
96+
97+ let mut vm = VirtualMachine :: new ( trace_enabled, false ) ;
98+
7899 check_builtin_order ( & builtins) ?;
79- let mut builtin_runners = initialize_builtin_runners ( & layout, & builtins, true , true ) ?;
100+ vm . builtin_runners = initialize_builtin_runners ( & layout, & builtins, true , true ) ?;
80101
81- let mut segments = MemorySegmentManager :: new ( ) ;
82- let program_base = segments. add ( ) ;
83- let execution_base = segments. add ( ) ;
102+ let program_base = vm. add_memory_segment ( ) ;
103+ let execution_base = vm. add_memory_segment ( ) ;
84104
85- initialize_builtin_runner_segments ( & mut builtin_runners, & mut segments) ;
105+ initialize_builtin_runner_segments ( & mut vm . builtin_runners , & mut vm . segments ) ;
86106
87- let mut vm = VirtualMachineBuilder :: default ( )
88- . builtin_runners ( builtin_runners)
89- . segments ( segments)
90- . build ( ) ;
107+ load_program ( & mut vm, program_base, & bytecode) ?;
91108
92109 let mut stack = Vec :: new ( ) ;
93110
@@ -150,32 +167,9 @@ impl CairoRunner2 {
150167 let run_context = RunContext :: new ( initial_pc, initial_ap. offset , initial_fp. offset ) ;
151168 vm. set_run_context ( run_context) ;
152169
153- let bytecode = executable
154- . program
155- . bytecode
156- . iter ( )
157- . map ( Felt252 :: from)
158- . map ( MaybeRelocatable :: from)
159- . collect :: < Vec < _ > > ( ) ;
160- vm. load_data ( program_base, & bytecode)
161- . map_err ( RunnerError :: MemoryInitializationError ) ?;
162- for i in 0 ..bytecode. len ( ) {
163- vm. segments . memory . mark_as_accessed ( ( program_base + i) ?) ;
164- }
165-
166- vm. load_data ( execution_base, & stack)
167- . map_err ( RunnerError :: MemoryInitializationError ) ?;
168-
169- for builtin_runner in & mut vm. builtin_runners {
170- builtin_runner. add_validation_rule ( & mut vm. segments . memory )
171- }
172- vm. segments
173- . memory
174- . validate_existing_memory ( )
175- . map_err ( RunnerError :: MemoryValidationError ) ?;
170+ load_stack ( & mut vm, execution_base, stack) ?;
176171
177- let hint_collection =
178- HintsCollection :: new ( & hints, bytecode. len ( ) ) . expect ( "failed to build hint collection" ) ;
172+ add_builtin_validation_rules ( & mut vm. segments . memory , & mut vm. builtin_runners ) ?;
179173
180174 Ok ( Self {
181175 executable,
@@ -416,6 +410,42 @@ fn extend_stack_with_builtins(
416410 }
417411}
418412
413+ fn load_program (
414+ vm : & mut VirtualMachine ,
415+ program_base : Relocatable ,
416+ bytecode : & Vec < MaybeRelocatable > ,
417+ ) -> Result < ( ) , RunnerError > {
418+ vm. load_data ( program_base, bytecode)
419+ . map_err ( RunnerError :: MemoryInitializationError ) ?;
420+ for i in 0 ..bytecode. len ( ) {
421+ vm. segments . memory . mark_as_accessed ( ( program_base + i) ?) ;
422+ }
423+ Ok ( ( ) )
424+ }
425+
426+ fn load_stack (
427+ vm : & mut VirtualMachine ,
428+ execution_base : Relocatable ,
429+ stack : Vec < MaybeRelocatable > ,
430+ ) -> Result < ( ) , RunnerError > {
431+ vm. load_data ( execution_base, & stack)
432+ . map_err ( RunnerError :: MemoryInitializationError ) ?;
433+ Ok ( ( ) )
434+ }
435+
436+ fn add_builtin_validation_rules (
437+ memory : & mut Memory ,
438+ runners : & mut [ BuiltinRunner ] ,
439+ ) -> Result < ( ) , RunnerError > {
440+ for runner in runners {
441+ runner. add_validation_rule ( memory)
442+ }
443+ memory
444+ . validate_existing_memory ( )
445+ . map_err ( RunnerError :: MemoryValidationError ) ?;
446+ Ok ( ( ) )
447+ }
448+
419449fn get_hint_data (
420450 collection : & HintsCollection ,
421451 references : & [ HintReference ] ,
0 commit comments