Skip to content

Commit 697efc0

Browse files
committed
Remove cairo-lang-runner from runtime crate
commit-id:95f3fb16
1 parent 1e0c565 commit 697efc0

File tree

7 files changed

+258
-186
lines changed

7 files changed

+258
-186
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/cairo1_execution.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ pub(crate) fn execute_entry_point_call_cairo1(
7171
extension: CheatableStarknetRuntimeExtension { cheatnet_state },
7272
extended_runtime: StarknetRuntime {
7373
hint_handler: syscall_handler,
74-
user_args: vec![],
7574
panic_traceback: None,
7675
},
7776
};

crates/forge-runner/src/running/config_run.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ pub fn run_config_pass(
106106
},
107107
extended_runtime: StarknetRuntime {
108108
hint_handler: syscall_handler,
109-
user_args: vec![],
110109
panic_traceback: None,
111110
},
112111
};

crates/runtime/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ testing = []
1010
indoc.workspace = true
1111
anyhow.workspace = true
1212
conversions.workspace = true
13-
cairo-lang-runner.workspace = true
1413
cairo-lang-casm.workspace = true
1514
cairo-lang-utils.workspace = true
1615
starknet-types-core.workspace = true

crates/runtime/src/lib.rs

Lines changed: 23 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
use crate::vm::{cell_ref_to_relocatable, extract_relocatable, get_val, vm_get_range};
12
use anyhow::Result;
23
use blockifier::execution::deprecated_syscalls::DeprecatedSyscallSelector;
34
use blockifier::execution::syscalls::hint_processor::SyscallHintProcessor;
45
use blockifier::state::errors::StateError;
56
use cairo_lang_casm::hints::{ExternalHint, Hint, StarknetHint};
67
use cairo_lang_casm::operand::{CellRef, ResOperand};
7-
use cairo_lang_runner::casm_run::{MemBuffer, extract_relocatable, get_val, vm_get_range};
8-
use cairo_lang_runner::{Arg, casm_run::cell_ref_to_relocatable, insert_value_to_cellref};
98
use cairo_lang_utils::bigint::BigIntAsHex;
109
use cairo_vm::hint_processor::hint_processor_definition::{
1110
HintProcessor, HintProcessorLogic, HintReference,
@@ -24,7 +23,6 @@ use conversions::serde::deserialize::BufferReader;
2423
use conversions::serde::serialize::raw::RawFeltVec;
2524
use conversions::serde::serialize::{CairoSerialize, SerializeToFeltVec};
2625
use indoc::indoc;
27-
use num_traits::cast::ToPrimitive;
2826
use shared::vm::VirtualMachineExt;
2927
use starknet_api::StarknetApiError;
3028
use starknet_types_core::felt::Felt;
@@ -34,6 +32,7 @@ use std::io;
3432
use thiserror::Error;
3533

3634
pub mod starknet;
35+
mod vm;
3736

3837
// from core/src/starknet/testing.cairo
3938
const CAIRO_TEST_CHEATCODES: [&str; 14] = [
@@ -58,10 +57,6 @@ pub trait SyscallPtrAccess {
5857

5958
pub struct StarknetRuntime<'a> {
6059
pub hint_handler: SyscallHintProcessor<'a>,
61-
// Required for handling `External` hints
62-
//
63-
// See https://github.com/starkware-libs/cairo/blob/dfb5d3fdcf80bff30c205c14163f99c890dbdc10/crates/cairo-lang-runner/src/casm_run/mod.rs#L94
64-
pub user_args: Vec<Vec<Arg>>,
6560
pub panic_traceback: Option<Vec<usize>>,
6661
}
6762

@@ -131,10 +126,6 @@ fn fetch_cheatcode_input(
131126
Ok(inputs)
132127
}
133128

134-
fn args_size(args: &[Arg]) -> usize {
135-
args.iter().map(Arg::size).sum()
136-
}
137-
138129
impl HintProcessorLogic for StarknetRuntime<'_> {
139130
fn execute_hint(
140131
&mut self,
@@ -169,38 +160,6 @@ impl HintProcessorLogic for StarknetRuntime<'_> {
169160

170161
return Err(CustomHint(error.into()));
171162
}
172-
// Copied from https://github.com/starkware-libs/cairo/blob/3d5631d3f6563b5f97c11c816f530be99095a843/crates/cairo-lang-runner/src/casm_run/mod.rs#L1316
173-
Hint::External(ExternalHint::AddRelocationRule { src, dst }) => {
174-
return Ok(vm.add_relocation_rule(
175-
extract_relocatable(vm, src)?,
176-
extract_relocatable(vm, dst)?,
177-
)?);
178-
}
179-
// Copied from https://github.com/starkware-libs/cairo/blob/3d5631d3f6563b5f97c11c816f530be99095a843/crates/cairo-lang-runner/src/casm_run/mod.rs#L1320
180-
Hint::External(ExternalHint::WriteRunParam { index, dst }) => {
181-
let index = get_val(vm, index)?.to_usize().expect("Got a bad index.");
182-
let mut stack =
183-
vec![(cell_ref_to_relocatable(dst, vm), &self.user_args[index])];
184-
while let Some((mut buffer, values)) = stack.pop() {
185-
for value in values {
186-
match value {
187-
Arg::Value(v) => {
188-
vm.insert_value(buffer, v)?;
189-
buffer += 1;
190-
}
191-
Arg::Array(arr) => {
192-
let arr_buffer = vm.add_memory_segment();
193-
stack.push((arr_buffer, arr));
194-
vm.insert_value(buffer, arr_buffer)?;
195-
buffer += 1;
196-
vm.insert_value(buffer, (arr_buffer + args_size(arr))?)?;
197-
buffer += 1;
198-
}
199-
}
200-
}
201-
}
202-
return Ok(());
203-
}
204163
Hint::External(ExternalHint::AddTrace { flag }) => {
205164
const PANIC_IN_BYTES: Felt = Felt::from_hex_unchecked("0x70616e6963");
206165
let flag = get_val(vm, flag)?;
@@ -332,17 +291,15 @@ impl<Extension: ExtensionLogic> ExtendedRuntime<Extension> {
332291
}
333292
.serialize_to_vec();
334293

335-
let mut buffer = MemBuffer::new_segment(vm);
336-
let result_start = buffer.ptr;
337-
buffer
338-
.write_data(res.iter())
339-
.expect("Failed to insert cheatcode result to memory");
340-
let result_end = buffer.ptr;
294+
let WrittenData {
295+
start: result_start,
296+
end: result_end,
297+
} = write_data(res, vm)?;
341298
let output_start = vm_io_ptrs.output_start;
342299
let output_end = vm_io_ptrs.output_end;
343300

344-
insert_value_to_cellref!(vm, output_start, result_start)?;
345-
insert_value_to_cellref!(vm, output_end, result_end)?;
301+
vm.insert_value(cell_ref_to_relocatable(*output_start, vm), result_start)?;
302+
vm.insert_value(cell_ref_to_relocatable(*output_end, vm), result_end)?;
346303

347304
self.propagate_cheatcode_signal(&selector, &inputs);
348305

@@ -529,3 +486,18 @@ impl From<BufferReadError> for EnhancedHintError {
529486
)
530487
}
531488
}
489+
490+
struct WrittenData {
491+
start: Relocatable,
492+
end: Relocatable,
493+
}
494+
495+
fn write_data(data: Vec<Felt>, vm: &mut VirtualMachine) -> Result<WrittenData, HintError> {
496+
let mut ptr = vm.add_memory_segment();
497+
let start = ptr;
498+
for data in data {
499+
vm.insert_value(ptr, data)?;
500+
ptr += 1;
501+
}
502+
Ok(WrittenData { start, end: ptr })
503+
}

crates/runtime/src/vm.rs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
//! Contains code copied from `cairo-lang-runner`
2+
use cairo_lang_casm::operand::{
3+
BinOpOperand, CellRef, DerefOrImmediate, Operation, Register, ResOperand,
4+
};
5+
use cairo_lang_utils::extract_matches;
6+
use cairo_vm::Felt252;
7+
use cairo_vm::types::relocatable::Relocatable;
8+
use cairo_vm::vm::errors::hint_errors::HintError;
9+
use cairo_vm::vm::errors::vm_errors::VirtualMachineError;
10+
use cairo_vm::vm::vm_core::VirtualMachine;
11+
12+
pub fn cell_ref_to_relocatable(cell_ref: CellRef, vm: &VirtualMachine) -> Relocatable {
13+
let base = match cell_ref.register {
14+
Register::AP => vm.get_ap(),
15+
Register::FP => vm.get_fp(),
16+
};
17+
(base + i32::from(cell_ref.offset)).unwrap()
18+
}
19+
20+
/// Extracts a parameter assumed to be a buffer.
21+
fn extract_buffer(buffer: &ResOperand) -> (CellRef, Felt252) {
22+
let (cell, base_offset) = match buffer {
23+
ResOperand::Deref(cell) => (cell, 0.into()),
24+
ResOperand::BinOp(BinOpOperand {
25+
op: Operation::Add,
26+
a,
27+
b,
28+
}) => (
29+
a,
30+
extract_matches!(b, DerefOrImmediate::Immediate)
31+
.clone()
32+
.value
33+
.into(),
34+
),
35+
_ => panic!("Illegal argument for a buffer."),
36+
};
37+
(*cell, base_offset)
38+
}
39+
40+
/// Fetches the value of a cell plus an offset from the vm, useful for pointers.
41+
fn get_ptr(
42+
vm: &VirtualMachine,
43+
cell: CellRef,
44+
offset: &Felt252,
45+
) -> Result<Relocatable, VirtualMachineError> {
46+
Ok((vm.get_relocatable(cell_ref_to_relocatable(cell, vm))? + offset)?)
47+
}
48+
49+
/// Extracts a parameter assumed to be a buffer, and converts it into a relocatable.
50+
pub fn extract_relocatable(
51+
vm: &VirtualMachine,
52+
buffer: &ResOperand,
53+
) -> Result<Relocatable, VirtualMachineError> {
54+
let (base, offset) = extract_buffer(buffer);
55+
get_ptr(vm, base, &offset)
56+
}
57+
58+
pub fn vm_get_range(
59+
vm: &mut VirtualMachine,
60+
mut calldata_start_ptr: Relocatable,
61+
calldata_end_ptr: Relocatable,
62+
) -> Result<Vec<Felt252>, HintError> {
63+
let mut values = vec![];
64+
while calldata_start_ptr != calldata_end_ptr {
65+
let val = *vm.get_integer(calldata_start_ptr)?;
66+
values.push(val);
67+
calldata_start_ptr.offset += 1;
68+
}
69+
Ok(values)
70+
}
71+
72+
pub(crate) fn get_cell_val(
73+
vm: &VirtualMachine,
74+
cell: CellRef,
75+
) -> Result<Felt252, VirtualMachineError> {
76+
Ok(*vm.get_integer(cell_ref_to_relocatable(cell, vm))?.as_ref())
77+
}
78+
79+
fn get_double_deref_val(
80+
vm: &VirtualMachine,
81+
cell: CellRef,
82+
offset: &Felt252,
83+
) -> Result<Felt252, VirtualMachineError> {
84+
Ok(*vm.get_integer(get_ptr(vm, cell, offset)?)?)
85+
}
86+
87+
/// Fetches the value of `res_operand` from the vm.
88+
pub fn get_val(
89+
vm: &VirtualMachine,
90+
res_operand: &ResOperand,
91+
) -> Result<Felt252, VirtualMachineError> {
92+
match res_operand {
93+
ResOperand::Deref(cell) => get_cell_val(vm, *cell),
94+
ResOperand::DoubleDeref(cell, offset) => get_double_deref_val(vm, *cell, &(*offset).into()),
95+
ResOperand::Immediate(x) => Ok(Felt252::from(x.value.clone())),
96+
ResOperand::BinOp(op) => {
97+
let a = get_cell_val(vm, op.a)?;
98+
let b = match &op.b {
99+
DerefOrImmediate::Deref(cell) => get_cell_val(vm, *cell)?,
100+
DerefOrImmediate::Immediate(x) => Felt252::from(x.value.clone()),
101+
};
102+
match op.op {
103+
Operation::Add => Ok(a + b),
104+
Operation::Mul => Ok(a * b),
105+
}
106+
}
107+
}
108+
}

0 commit comments

Comments
 (0)