Skip to content

Commit 7cc076a

Browse files
add get_u32_range to impl VirtualMachine add get_u32 and get_u32_range to impl Memory
1 parent e15c6e6 commit 7cc076a

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#### Upcoming Changes
44

5+
* feat: add `get_u32_range` to `impl VirtualMachine` add `get_u32` and `get_u32_range` to `impl Memory` [#1936](https://github.com/lambdaclass/cairo-vm/pull/1936)
6+
57
* feat: add the field `opcode_extension` to the structure of `Instruction` [#1933](https://github.com/lambdaclass/cairo-vm/pull/1933)
68

79
* fix(BREAKING): Fix no trace padding flow in proof mode [#1909](https://github.com/lambdaclass/cairo-vm/pull/1909)

vm/src/vm/errors/memory_errors.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ pub enum MemoryError {
101101
UnrelocatedMemory,
102102
#[error("Malformed public memory")]
103103
MalformedPublicMemory,
104+
#[error("Expected u32 valued at address {0} to be u32")]
105+
ExpectedU32(Box<Relocatable>),
104106
}
105107

106108
#[derive(Debug, PartialEq, Eq, Error)]

vm/src/vm/vm_core.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,11 @@ impl VirtualMachine {
929929
self.segments.memory.get_integer_range(addr, size)
930930
}
931931

932+
/// Gets n u32 values from memory starting from addr (n being size),
933+
pub fn get_u32_range(&self, addr: Relocatable, size: usize) -> Result<Vec<u32>, MemoryError> {
934+
self.segments.memory.get_u32_range(addr, size)
935+
}
936+
932937
pub fn get_range_check_builtin(
933938
&self,
934939
) -> Result<&RangeCheckBuiltinRunner<RC_N_PARTS_STANDARD>, VirtualMachineError> {
@@ -4373,6 +4378,15 @@ mod tests {
43734378
);
43744379
}
43754380

4381+
#[test]
4382+
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
4383+
fn get_u32_range_ok() {
4384+
let mut vm = vm!();
4385+
vm.segments.memory = memory![((0, 0), 0), ((0, 1), 1), ((0, 2), 4294967295), ((0, 3), 3)];
4386+
let expected_vector = vec![1, 4294967295];
4387+
assert_eq!(vm.get_u32_range((0, 1).into(), 2), Ok(expected_vector));
4388+
}
4389+
43764390
#[test]
43774391
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
43784392
fn get_traceback_entries_bad_usort() {

vm/src/vm/vm_memory/memory.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,21 @@ impl Memory {
414414
}
415415
}
416416

417+
/// Gets a u32 value from memory address.
418+
/// Returns an Error if the value at the memory address is missing or not a u32.
419+
pub fn get_u32(&self, key: Relocatable) -> Result<u32, MemoryError> {
420+
let value = Cow::into_owned(self.get_integer(key)?);
421+
let le_digits = value.to_le_digits();
422+
if le_digits[0] >= (1_u64 << 32)
423+
|| le_digits[1] != 0
424+
|| le_digits[2] != 0
425+
|| le_digits[3] != 0
426+
{
427+
return Err(MemoryError::ExpectedU32(Box::new(key)));
428+
}
429+
Ok(le_digits[0] as u32)
430+
}
431+
417432
/// Gets the value from memory address as a usize.
418433
/// Returns an Error if the value at the memory address is missing not a Felt252, or can't be converted to usize.
419434
pub fn get_usize(&self, key: Relocatable) -> Result<usize, MemoryError> {
@@ -623,6 +638,18 @@ impl Memory {
623638
Ok(values)
624639
}
625640

641+
/// Gets a range of u32 memory values from addr to addr + size
642+
/// Fails if there if any of the values inside the range is missing (memory gap) or is not a u32
643+
pub fn get_u32_range(&self, addr: Relocatable, size: usize) -> Result<Vec<u32>, MemoryError> {
644+
let mut values = Vec::new();
645+
646+
for i in 0..size {
647+
values.push(self.get_u32((addr + i)?)?);
648+
}
649+
650+
Ok(values)
651+
}
652+
626653
pub fn mark_as_accessed(&mut self, addr: Relocatable) {
627654
let (i, j) = from_relocatable_to_indexes(addr);
628655
let data = if addr.segment_index < 0 {

0 commit comments

Comments
 (0)