@@ -27,7 +27,7 @@ use crate::{
27
27
28
28
#[ allow( dead_code) ]
29
29
pub struct CairoRunner2 {
30
- virtual_machine : VirtualMachine ,
30
+ vm : VirtualMachine ,
31
31
program_base : Relocatable ,
32
32
execution_base : Relocatable ,
33
33
final_pc : Relocatable ,
@@ -68,54 +68,32 @@ impl CairoRunner2 {
68
68
let builtins = get_entrypoint_builtins ( entrypoint) ;
69
69
70
70
check_builtin_order ( & builtins) ?;
71
+ let mut builtin_runners = initialize_builtin_runners ( & layout, & builtins, true , true ) ?;
71
72
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 ( ) ;
74
76
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) ;
78
78
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 ( )
90
80
. builtin_runners ( builtin_runners)
91
- . segments ( memory_segment_manager )
81
+ . segments ( segments )
92
82
. build ( ) ;
93
83
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 ( ) ;
99
84
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 ) ;
107
86
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 ( ) ;
110
89
stack. push ( MaybeRelocatable :: RelocatableValue ( return_fp) ) ;
111
90
stack. push ( MaybeRelocatable :: RelocatableValue ( return_pc) ) ;
112
91
113
92
let initial_pc = ( program_base + entrypoint. offset ) ?;
114
93
let initial_fp = ( execution_base + stack. len ( ) ) ?;
115
94
let initial_ap = initial_fp;
116
-
117
95
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) ;
119
97
120
98
let bytecode = executable
121
99
. program
@@ -124,28 +102,19 @@ impl CairoRunner2 {
124
102
. map ( Felt252 :: from)
125
103
. map ( MaybeRelocatable :: from)
126
104
. collect :: < Vec < _ > > ( ) ;
127
-
128
- virtual_machine
129
- . load_data ( program_base, & bytecode)
105
+ vm. load_data ( program_base, & bytecode)
130
106
. map_err ( RunnerError :: MemoryInitializationError ) ?;
131
-
132
107
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) ?) ;
137
109
}
138
110
139
- virtual_machine
140
- . load_data ( execution_base, & stack)
111
+ vm. load_data ( execution_base, & stack)
141
112
. map_err ( RunnerError :: MemoryInitializationError ) ?;
142
113
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 )
145
116
}
146
-
147
- virtual_machine
148
- . segments
117
+ vm. segments
149
118
. memory
150
119
. validate_existing_memory ( )
151
120
. map_err ( RunnerError :: MemoryValidationError ) ?;
@@ -157,7 +126,7 @@ impl CairoRunner2 {
157
126
158
127
Ok ( Self {
159
128
executable,
160
- virtual_machine ,
129
+ vm ,
161
130
program_base,
162
131
execution_base,
163
132
final_pc,
@@ -177,6 +146,39 @@ impl CairoRunner2 {
177
146
}
178
147
}
179
148
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
+
180
182
// TODO: Remove this once cyclic dependency is fixed.
181
183
// It should not be necessary, but cargo treats executable BuiltinName as a separate type
182
184
// which is why I had to create this adapter function.
@@ -215,12 +217,14 @@ pub fn check_builtin_order(builtins: &[BuiltinName]) -> Result<(), RunnerError>
215
217
216
218
pub fn initialize_builtin_runners (
217
219
layout : & CairoLayout ,
218
- mut builtins : HashSet < BuiltinName > ,
220
+ builtins : & [ BuiltinName ] ,
219
221
allow_missing_builtins : bool ,
220
222
create_all_builtins : bool ,
221
223
) -> Result < Vec < BuiltinRunner > , RunnerError > {
222
224
let mut builtin_runners = Vec :: new ( ) ;
223
225
226
+ let mut builtins: HashSet < BuiltinName > = builtins. into_iter ( ) . map ( ToOwned :: to_owned) . collect ( ) ;
227
+
224
228
if layout. builtins . output {
225
229
let included = builtins. remove ( & BuiltinName :: output) ;
226
230
if included || create_all_builtins {
0 commit comments