@@ -5,7 +5,11 @@ use cairo_lang_executable::executable::{EntryPointKind, Executable, ExecutableEn
55use crate :: {
66 hint_processor:: hint_processor_definition:: HintReference ,
77 serde:: deserialize_program:: { Attribute , Identifier , InstructionLocation } ,
8- types:: { builtin_name:: BuiltinName , layout:: CairoLayout , relocatable:: Relocatable } ,
8+ types:: {
9+ builtin_name:: BuiltinName ,
10+ layout:: CairoLayout ,
11+ relocatable:: { MaybeRelocatable , Relocatable } ,
12+ } ,
913 utils:: is_subsequence,
1014 vm:: {
1115 context:: run_context:: RunContext ,
@@ -86,19 +90,59 @@ impl CairoRunner2 {
8690 . segments ( memory_segment_manager)
8791 . build ( ) ;
8892
89- // TODO: implement main entrypoint initialization
90- let pc = ( || todo ! ( ) ) ( ) ;
91- let ap = ( || todo ! ( ) ) ( ) ;
92- let fp = ( || todo ! ( ) ) ( ) ;
93+ let builtin_runner_map: HashMap < BuiltinName , & BuiltinRunner > = virtual_machine
94+ . builtin_runners
95+ . iter ( )
96+ . map ( |builtin_runner| ( builtin_runner. name ( ) , builtin_runner) )
97+ . collect ( ) ;
98+ let mut stack = Vec :: new ( ) ;
99+ for builtin in builtins {
100+ if let Some ( builtin_runner) = builtin_runner_map. get ( & builtin) {
101+ stack. append ( & mut builtin_runner. initial_stack ( ) ) ;
102+ } else {
103+ stack. push ( Felt252 :: ZERO . into ( ) )
104+ }
105+ }
106+
107+ let return_fp = virtual_machine. add_memory_segment ( ) ;
108+ let return_pc = virtual_machine. add_memory_segment ( ) ;
109+ stack. push ( MaybeRelocatable :: RelocatableValue ( return_fp) ) ;
110+ stack. push ( MaybeRelocatable :: RelocatableValue ( return_pc) ) ;
111+
112+ let initial_pc = ( program_base + entrypoint. offset ) ?;
113+ let initial_fp = ( execution_base + stack. len ( ) ) ?;
114+ let initial_ap = initial_fp;
115+
116+ let run_context = RunContext :: new ( initial_pc, initial_ap. offset , initial_fp. offset ) ;
117+ virtual_machine. set_run_context ( run_context) ;
118+
119+ let bytecode = executable
120+ . program
121+ . bytecode
122+ . iter ( )
123+ . map ( Felt252 :: from)
124+ . map ( MaybeRelocatable :: from)
125+ . collect :: < Vec < _ > > ( ) ;
126+
127+ virtual_machine
128+ . load_data ( program_base, & bytecode)
129+ . map_err ( RunnerError :: MemoryInitializationError ) ?;
130+
131+ for i in 0 ..bytecode. len ( ) {
132+ virtual_machine
133+ . segments
134+ . memory
135+ . mark_as_accessed ( ( program_base + i) ?) ;
136+ }
93137
94- let run_context = RunContext :: new ( pc, ap, fp) ;
138+ virtual_machine
139+ . load_data ( execution_base, & stack)
140+ . map_err ( RunnerError :: MemoryInitializationError ) ?;
95141
96142 for builtin_runner in & mut virtual_machine. builtin_runners {
97143 builtin_runner. add_validation_rule ( & mut virtual_machine. segments . memory )
98144 }
99145
100- virtual_machine. set_run_context ( run_context) ;
101-
102146 virtual_machine
103147 . segments
104148 . memory
0 commit comments