Skip to content

Commit e1bc427

Browse files
Revert "feat: implement Cairo Function Runner and related updates (#2352)" (#2357)
This reverts commit 4fda146.
1 parent 4fda146 commit e1bc427

9 files changed

Lines changed: 245 additions & 717 deletions

File tree

CHANGELOG.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@ Both branches support Stwo prover opcodes (Blake2s, QM31) since v2.0.0.
1818

1919
* fix: Fix off-by-one comparisons in `split_int`, `assert_250_bit`, and `sqrt` hints [#2348](https://github.com/lambdaclass/cairo-vm/pull/2348)
2020

21-
* chore: Add `CairoFunctionRunner` for running Cairo entrypoints by name or PC, and broaden `CairoArg`/`MaybeRelocatable` conversions to support primitive signed/unsigned integers and big integers [#2352](https://github.com/lambdaclass/cairo-vm/pull/2352)
22-
23-
* chore: Add unit tests for `CairoFunctionRunner`, `CairoArg` conversions/macros, and `MaybeRelocatable` conversion macro coverage [#2354](https://github.com/lambdaclass/cairo-vm/pull/2354)
24-
2521
#### [3.2.0] - 2026-3-3
2622

2723
* fix: Change extended_resource_counter entry from u32 to usize [#2349](https://github.com/lambdaclass/cairo-vm/pull/2349)

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,19 @@ When running a Cairo program directly using the Cairo-vm repository you would fi
246246
cairo_runner.initialize_segments(None);
247247
```
248248

249+
When using cairo-vm with the Starknet devnet there are additional parameters that are part of the OS context passed on to the `run_from_entrypoint` method that we do not have here when using it directly. These parameters are, for example, initial stacks of the builtins, which are the base of each of them and are needed as they are the implicit arguments of the function.
250+
251+
```rust
252+
let _var = cairo_runner.run_from_entrypoint(
253+
entrypoint,
254+
vec![
255+
&MaybeRelocatable::from(2).into(), //this is the entry point selector
256+
&MaybeRelocatable::from((2,0)).into() //this would be the output_ptr for example if our cairo function uses it
257+
],
258+
false,
259+
&mut hint_processor,
260+
);
261+
```
249262
### Running cairo 1 programs
250263

251264
To run a cairo 1 program enter in the folder `cd cairo1-run` and follow the [`cairo1-run documentation`](cairo1-run/README.md)

vm/src/math_utils/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ fn legendre_symbol(a: &BigUint, p: &BigUint) -> i8 {
397397
// Ported from sympy implementation
398398
// Simplified as a & p are nonnegative
399399
// Asumes p is a prime number
400-
pub fn is_quad_residue(a: &BigUint, p: &BigUint) -> Result<bool, MathError> {
400+
pub(crate) fn is_quad_residue(a: &BigUint, p: &BigUint) -> Result<bool, MathError> {
401401
if p.is_zero() {
402402
return Err(MathError::IsQuadResidueZeroPrime);
403403
}

vm/src/tests/mod.rs

Lines changed: 46 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@ use crate::Felt252;
1010
use crate::{
1111
hint_processor::cairo_1_hint_processor::hint_processor::Cairo1HintProcessor,
1212
types::{builtin_name::BuiltinName, relocatable::MaybeRelocatable},
13-
vm::runners::{
14-
cairo_function_runner::{CairoFunctionRunner, EntryPoint},
15-
cairo_runner::CairoArg,
16-
},
13+
vm::runners::cairo_runner::{CairoArg, CairoRunner},
1714
};
1815
#[cfg(feature = "cairo-1-hints")]
1916
use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass;
@@ -107,7 +104,7 @@ fn run_cairo_1_entrypoint(
107104
let mut hint_processor =
108105
Cairo1HintProcessor::new(&contract_class.hints, RunResources::default(), false);
109106

110-
let mut function_runner = CairoFunctionRunner::new_custom(
107+
let mut runner = CairoRunner::new(
111108
&(contract_class.clone().try_into().unwrap()),
112109
LayoutName::all_cairo,
113110
None,
@@ -118,16 +115,16 @@ fn run_cairo_1_entrypoint(
118115
.unwrap();
119116

120117
let program_builtins = get_casm_contract_builtins(&contract_class, entrypoint_offset);
121-
function_runner
118+
runner
122119
.initialize_function_runner_cairo_1(&program_builtins)
123120
.unwrap();
124121

125122
// Implicit Args
126-
let syscall_segment = MaybeRelocatable::from(function_runner.vm.add_memory_segment());
123+
let syscall_segment = MaybeRelocatable::from(runner.vm.add_memory_segment());
127124

128-
let builtins = function_runner.get_program_builtins();
125+
let builtins = runner.get_program_builtins();
129126

130-
let builtin_segment: Vec<MaybeRelocatable> = function_runner
127+
let builtin_segment: Vec<MaybeRelocatable> = runner
131128
.vm
132129
.get_builtin_runners()
133130
.iter()
@@ -144,33 +141,27 @@ fn run_cairo_1_entrypoint(
144141
// Other args
145142

146143
// Load builtin costs
147-
let builtin_costs: Vec<MaybeRelocatable> = vec![
148-
0_i64.into(),
149-
0_i64.into(),
150-
0_i64.into(),
151-
0_i64.into(),
152-
0_i64.into(),
153-
];
154-
let builtin_costs_ptr = function_runner.vm.add_memory_segment();
155-
function_runner
144+
let builtin_costs: Vec<MaybeRelocatable> =
145+
vec![0.into(), 0.into(), 0.into(), 0.into(), 0.into()];
146+
let builtin_costs_ptr = runner.vm.add_memory_segment();
147+
runner
156148
.vm
157149
.load_data(builtin_costs_ptr, &builtin_costs)
158150
.unwrap();
159151

160152
// Load extra data
161-
let core_program_end_ptr = (function_runner.program_base.unwrap()
162-
+ function_runner.program.shared_program_data.data.len())
163-
.unwrap();
153+
let core_program_end_ptr =
154+
(runner.program_base.unwrap() + runner.program.shared_program_data.data.len()).unwrap();
164155
let program_extra_data: Vec<MaybeRelocatable> =
165-
vec![0x208B7FFF7FFF7FFE_u64.into(), builtin_costs_ptr.into()];
166-
function_runner
156+
vec![0x208B7FFF7FFF7FFE.into(), builtin_costs_ptr.into()];
157+
runner
167158
.vm
168159
.load_data(core_program_end_ptr, &program_extra_data)
169160
.unwrap();
170161

171162
// Load calldata
172-
let calldata_start = function_runner.vm.add_memory_segment();
173-
let calldata_end = function_runner.vm.load_data(calldata_start, args).unwrap();
163+
let calldata_start = runner.vm.add_memory_segment();
164+
let calldata_end = runner.vm.load_data(calldata_start, args).unwrap();
174165

175166
// Create entrypoint_args
176167

@@ -182,26 +173,25 @@ fn run_cairo_1_entrypoint(
182173
MaybeRelocatable::from(calldata_start).into(),
183174
MaybeRelocatable::from(calldata_end).into(),
184175
]);
176+
let entrypoint_args: Vec<&CairoArg> = entrypoint_args.iter().collect();
185177

186178
// Run contract entrypoint
187179

188-
let program_segment_size =
189-
function_runner.program.shared_program_data.data.len() + program_extra_data.len();
190-
function_runner
191-
.run(
192-
EntryPoint::Pc(entrypoint_offset),
180+
runner
181+
.run_from_entrypoint(
182+
entrypoint_offset,
183+
&entrypoint_args,
193184
true,
194-
Some(program_segment_size),
185+
Some(runner.program.shared_program_data.data.len() + program_extra_data.len()),
195186
&mut hint_processor,
196-
&entrypoint_args,
197187
)
198188
.unwrap();
199189

200190
// Check return values
201-
let return_values = function_runner.vm.get_return_values(5).unwrap();
191+
let return_values = runner.vm.get_return_values(5).unwrap();
202192
let retdata_start = return_values[3].get_relocatable().unwrap();
203193
let retdata_end = return_values[4].get_relocatable().unwrap();
204-
let retdata: Vec<Felt252> = function_runner
194+
let retdata: Vec<Felt252> = runner
205195
.vm
206196
.get_integer_range(retdata_start, (retdata_end - retdata_start).unwrap())
207197
.unwrap()
@@ -221,7 +211,7 @@ fn run_cairo_1_entrypoint_with_run_resources(
221211
hint_processor: &mut Cairo1HintProcessor,
222212
args: &[MaybeRelocatable],
223213
) -> Result<Vec<Felt252>, CairoRunError> {
224-
let mut function_runner = CairoFunctionRunner::new_custom(
214+
let mut runner = CairoRunner::new(
225215
&(contract_class.clone().try_into().unwrap()),
226216
LayoutName::all_cairo,
227217
None,
@@ -232,16 +222,16 @@ fn run_cairo_1_entrypoint_with_run_resources(
232222
.unwrap();
233223

234224
let program_builtins = get_casm_contract_builtins(&contract_class, entrypoint_offset);
235-
function_runner
225+
runner
236226
.initialize_function_runner_cairo_1(&program_builtins)
237227
.unwrap();
238228

239229
// Implicit Args
240-
let syscall_segment = MaybeRelocatable::from(function_runner.vm.add_memory_segment());
230+
let syscall_segment = MaybeRelocatable::from(runner.vm.add_memory_segment());
241231

242-
let builtins = function_runner.get_program_builtins();
232+
let builtins = runner.get_program_builtins();
243233

244-
let builtin_segment: Vec<MaybeRelocatable> = function_runner
234+
let builtin_segment: Vec<MaybeRelocatable> = runner
245235
.vm
246236
.get_builtin_runners()
247237
.iter()
@@ -258,33 +248,27 @@ fn run_cairo_1_entrypoint_with_run_resources(
258248
// Other args
259249

260250
// Load builtin costs
261-
let builtin_costs: Vec<MaybeRelocatable> = vec![
262-
0_i64.into(),
263-
0_i64.into(),
264-
0_i64.into(),
265-
0_i64.into(),
266-
0_i64.into(),
267-
];
268-
let builtin_costs_ptr = function_runner.vm.add_memory_segment();
269-
function_runner
251+
let builtin_costs: Vec<MaybeRelocatable> =
252+
vec![0.into(), 0.into(), 0.into(), 0.into(), 0.into()];
253+
let builtin_costs_ptr = runner.vm.add_memory_segment();
254+
runner
270255
.vm
271256
.load_data(builtin_costs_ptr, &builtin_costs)
272257
.unwrap();
273258

274259
// Load extra data
275-
let core_program_end_ptr = (function_runner.program_base.unwrap()
276-
+ function_runner.program.shared_program_data.data.len())
277-
.unwrap();
260+
let core_program_end_ptr =
261+
(runner.program_base.unwrap() + runner.program.shared_program_data.data.len()).unwrap();
278262
let program_extra_data: Vec<MaybeRelocatable> =
279-
vec![0x208B7FFF7FFF7FFE_u64.into(), builtin_costs_ptr.into()];
280-
function_runner
263+
vec![0x208B7FFF7FFF7FFE.into(), builtin_costs_ptr.into()];
264+
runner
281265
.vm
282266
.load_data(core_program_end_ptr, &program_extra_data)
283267
.unwrap();
284268

285269
// Load calldata
286-
let calldata_start = function_runner.vm.add_memory_segment();
287-
let calldata_end = function_runner.vm.load_data(calldata_start, args).unwrap();
270+
let calldata_start = runner.vm.add_memory_segment();
271+
let calldata_end = runner.vm.load_data(calldata_start, args).unwrap();
288272

289273
// Create entrypoint_args
290274

@@ -296,24 +280,23 @@ fn run_cairo_1_entrypoint_with_run_resources(
296280
MaybeRelocatable::from(calldata_start).into(),
297281
MaybeRelocatable::from(calldata_end).into(),
298282
]);
283+
let entrypoint_args: Vec<&CairoArg> = entrypoint_args.iter().collect();
299284

300285
// Run contract entrypoint
301286

302-
let program_segment_size =
303-
function_runner.program.shared_program_data.data.len() + program_extra_data.len();
304-
function_runner.run(
305-
EntryPoint::Pc(entrypoint_offset),
287+
runner.run_from_entrypoint(
288+
entrypoint_offset,
289+
&entrypoint_args,
306290
true,
307-
Some(program_segment_size),
291+
Some(runner.program.shared_program_data.data.len() + program_extra_data.len()),
308292
hint_processor,
309-
&entrypoint_args,
310293
)?;
311294

312295
// Check return values
313-
let return_values = function_runner.vm.get_return_values(5).unwrap();
296+
let return_values = runner.vm.get_return_values(5).unwrap();
314297
let retdata_start = return_values[3].get_relocatable().unwrap();
315298
let retdata_end = return_values[4].get_relocatable().unwrap();
316-
let retdata: Vec<Felt252> = function_runner
299+
let retdata: Vec<Felt252> = runner
317300
.vm
318301
.get_integer_range(retdata_start, (retdata_end - retdata_start).unwrap())
319302
.unwrap()

vm/src/types/relocatable.rs

Lines changed: 6 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use crate::Felt252;
77
use crate::{
88
relocatable, types::errors::math_errors::MathError, vm::errors::memory_errors::MemoryError,
99
};
10-
use num_bigint::{BigInt, BigUint};
1110
use num_traits::ToPrimitive;
1211
use serde::{Deserialize, Serialize};
1312

@@ -59,6 +58,12 @@ impl From<(isize, usize)> for MaybeRelocatable {
5958
}
6059
}
6160

61+
impl From<usize> for MaybeRelocatable {
62+
fn from(num: usize) -> Self {
63+
MaybeRelocatable::Int(Felt252::from(num))
64+
}
65+
}
66+
6267
impl From<Felt252> for MaybeRelocatable {
6368
fn from(num: Felt252) -> Self {
6469
MaybeRelocatable::Int(num)
@@ -89,25 +94,6 @@ impl From<Relocatable> for MaybeRelocatable {
8994
}
9095
}
9196

92-
// Implement primitive and big-int (owned + reference) conversions by first converting to Felt252,
93-
// then wrapping as MaybeRelocatable::Int.
94-
macro_rules! impl_from_for_maybe_relocatable {
95-
($($t:ty),* $(,)?) => {
96-
$(
97-
impl From<$t> for MaybeRelocatable {
98-
fn from(num: $t) -> Self {
99-
MaybeRelocatable::Int(Felt252::from(num))
100-
}
101-
}
102-
)*
103-
};
104-
}
105-
106-
impl_from_for_maybe_relocatable!(
107-
u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, BigUint, BigInt, &BigUint,
108-
&BigInt
109-
);
110-
11197
impl Display for MaybeRelocatable {
11298
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11399
match self {
@@ -410,7 +396,6 @@ mod tests {
410396
use super::*;
411397
use crate::{felt_hex, felt_str};
412398
use crate::{relocatable, utils::test_utils::mayberelocatable};
413-
use num_bigint::{BigInt, BigUint};
414399

415400
use proptest::prelude::*;
416401

@@ -444,45 +429,6 @@ mod tests {
444429
}
445430
}
446431

447-
#[test]
448-
// Verifies primitive integers convert into `MaybeRelocatable::Int` via the macro-generated impls.
449-
fn maybe_relocatable_from_primitive_via_macro() {
450-
let value = MaybeRelocatable::from(42_u8);
451-
assert_eq!(value, MaybeRelocatable::Int(Felt252::from(42_u8)));
452-
}
453-
454-
#[test]
455-
// Verifies owned `BigUint`/`BigInt` values convert into `MaybeRelocatable::Int`.
456-
fn maybe_relocatable_from_owned_bigints_via_macro() {
457-
let big_uint = BigUint::from(123_u32);
458-
let big_int = BigInt::from(456_i32);
459-
460-
assert_eq!(
461-
MaybeRelocatable::from(big_uint),
462-
MaybeRelocatable::Int(Felt252::from(123_u32))
463-
);
464-
assert_eq!(
465-
MaybeRelocatable::from(big_int),
466-
MaybeRelocatable::Int(Felt252::from(456_i32))
467-
);
468-
}
469-
470-
#[test]
471-
// Verifies referenced `&BigUint`/`&BigInt` values convert into `MaybeRelocatable::Int`.
472-
fn maybe_relocatable_from_referenced_bigints_via_macro() {
473-
let big_uint = BigUint::from(789_u32);
474-
let big_int = BigInt::from(321_i32);
475-
476-
assert_eq!(
477-
MaybeRelocatable::from(&big_uint),
478-
MaybeRelocatable::Int(Felt252::from(789_u32))
479-
);
480-
assert_eq!(
481-
MaybeRelocatable::from(&big_int),
482-
MaybeRelocatable::Int(Felt252::from(321_i32))
483-
);
484-
}
485-
486432
#[test]
487433
fn add_bigint_to_int() {
488434
let addr = MaybeRelocatable::from(Felt252::from(7i32));

0 commit comments

Comments
 (0)