Skip to content

Commit f54443c

Browse files
Implement entrypoint initalization
1 parent 68435b2 commit f54443c

File tree

1 file changed

+52
-8
lines changed

1 file changed

+52
-8
lines changed

vm/src/vm/runners/cairo_runner_2.rs

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ use cairo_lang_executable::executable::{EntryPointKind, Executable, ExecutableEn
55
use 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

Comments
 (0)