Skip to content

Commit 69237f8

Browse files
Reorder code
1 parent 3d32add commit 69237f8

File tree

1 file changed

+55
-51
lines changed

1 file changed

+55
-51
lines changed

vm/src/vm/runners/cairo_runner_2.rs

+55-51
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::{
2727

2828
#[allow(dead_code)]
2929
pub 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

216218
pub 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

Comments
 (0)