From d1427e87450e49ad45ac9c2c22ea1af5b018f5c7 Mon Sep 17 00:00:00 2001 From: Dori Medini Date: Mon, 24 Mar 2025 20:58:32 +0200 Subject: [PATCH 1/4] feat: implement VirtualMachine::is_accessed Signed-off-by: Dori Medini --- vm/src/vm/vm_core.rs | 4 ++++ vm/src/vm/vm_memory/memory.rs | 15 +++++++++++++++ vm/src/vm/vm_memory/memory_segments.rs | 4 ++++ 3 files changed, 23 insertions(+) diff --git a/vm/src/vm/vm_core.rs b/vm/src/vm/vm_core.rs index 1c0a59682e..a38440f1dd 100644 --- a/vm/src/vm/vm_core.rs +++ b/vm/src/vm/vm_core.rs @@ -971,6 +971,10 @@ impl VirtualMachine { self.segments.memory.mem_eq(lhs, rhs, len) } + pub fn is_accessed(&self, addr: &Relocatable) -> Result { + self.segments.is_accessed(addr) + } + ///Gets `n_ret` return values from memory pub fn get_return_values(&self, n_ret: usize) -> Result, MemoryError> { let addr = (self.run_context.get_ap() - n_ret) diff --git a/vm/src/vm/vm_memory/memory.rs b/vm/src/vm/vm_memory/memory.rs index c92e132043..2bfaa8c13b 100644 --- a/vm/src/vm/vm_memory/memory.rs +++ b/vm/src/vm/vm_memory/memory.rs @@ -648,6 +648,21 @@ impl Memory { Ok(values) } + pub fn is_accessed(&self, addr: &Relocatable) -> Result { + let (i, j) = from_relocatable_to_indexes(*addr); + let data = if addr.segment_index < 0 { + &self.temp_data + } else { + &self.data + }; + Ok(data + .get(i) + .ok_or(MemoryError::UnknownMemoryCell(Box::new(*addr)))? + .get(j) + .ok_or(MemoryError::UnknownMemoryCell(Box::new(*addr)))? + .is_accessed()) + } + pub fn mark_as_accessed(&mut self, addr: Relocatable) { let (i, j) = from_relocatable_to_indexes(addr); let data = if addr.segment_index < 0 { diff --git a/vm/src/vm/vm_memory/memory_segments.rs b/vm/src/vm/vm_memory/memory_segments.rs index 82bc51cbc2..e18e739346 100644 --- a/vm/src/vm/vm_memory/memory_segments.rs +++ b/vm/src/vm/vm_memory/memory_segments.rs @@ -200,6 +200,10 @@ impl MemorySegmentManager { } } + pub fn is_accessed(&self, addr: &Relocatable) -> Result { + self.memory.is_accessed(addr) + } + /// Counts the memory holes (aka unaccessed memory cells) in memory /// # Parameters /// - `builtin_segment_indexes`: Set representing the segments indexes of the builtins initialized in the VM, except for the output builtin. From f818ab34e7f683a96d776cb96b503b91ef97dca6 Mon Sep 17 00:00:00 2001 From: Dori Medini Date: Mon, 24 Mar 2025 21:27:27 +0200 Subject: [PATCH 2/4] refactor: implement get_cell to share code Signed-off-by: Dori Medini --- vm/src/vm/vm_memory/memory.rs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/vm/src/vm/vm_memory/memory.rs b/vm/src/vm/vm_memory/memory.rs index 2bfaa8c13b..9808ab3f1b 100644 --- a/vm/src/vm/vm_memory/memory.rs +++ b/vm/src/vm/vm_memory/memory.rs @@ -244,13 +244,7 @@ impl Memory { { let relocatable: Relocatable = key.try_into().ok()?; - let data = if relocatable.segment_index.is_negative() { - &self.temp_data - } else { - &self.data - }; - let (i, j) = from_relocatable_to_indexes(relocatable); - let value = data.get(i)?.get(j)?.get_value()?; + let value = self.get_cell(relocatable)?.get_value()?; Some(Cow::Owned(self.relocate_value(&value).ok()?.into_owned())) } @@ -648,17 +642,19 @@ impl Memory { Ok(values) } - pub fn is_accessed(&self, addr: &Relocatable) -> Result { - let (i, j) = from_relocatable_to_indexes(*addr); + fn get_cell(&self, addr: Relocatable) -> Option<&MemoryCell> { + let (i, j) = from_relocatable_to_indexes(addr); let data = if addr.segment_index < 0 { &self.temp_data } else { &self.data }; - Ok(data - .get(i) - .ok_or(MemoryError::UnknownMemoryCell(Box::new(*addr)))? - .get(j) + data.get(i)?.get(j) + } + + pub fn is_accessed(&self, addr: &Relocatable) -> Result { + Ok(self + .get_cell(*addr) .ok_or(MemoryError::UnknownMemoryCell(Box::new(*addr)))? .is_accessed()) } From 8e8af44010e3e9ed3fc36bc9d547cff4c12b3d0f Mon Sep 17 00:00:00 2001 From: Dori Medini Date: Mon, 24 Mar 2025 23:11:02 +0200 Subject: [PATCH 3/4] chore: changelog entry Signed-off-by: Dori Medini --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 150a3a23fb..c78fece3fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ #### Upcoming Changes +* feat: implement VirtualMachine::is_accessed [#2024](https://github.com/lambdaclass/cairo-vm/pull/2024) + * refactor: Clap attribute macros from #[clap(...)] to #[arg(...)] and #[command(...)] in v4.x [#2003] (https://github.com/lambdaclass/cairo-vm/pull/2003) * fix: Fix `WriteReturnFp` error due to a bad loading of initial gas [#2015](https://github.com/lambdaclass/cairo-vm/pull/2015) From 3060b6a5fc9d692dec348514c0103da418ea682f Mon Sep 17 00:00:00 2001 From: Dori Medini Date: Wed, 26 Mar 2025 18:02:44 +0200 Subject: [PATCH 4/4] test: unit tests Signed-off-by: Dori Medini --- vm/src/vm/vm_core.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/vm/src/vm/vm_core.rs b/vm/src/vm/vm_core.rs index a38440f1dd..1e06a48c27 100644 --- a/vm/src/vm/vm_core.rs +++ b/vm/src/vm/vm_core.rs @@ -4733,7 +4733,9 @@ mod tests { ((0, 1), 0), ((0, 2), 1), ((0, 10), 10), - ((1, 1), 1) + ((1, 1), 1), + ((1, 2), 0), + ((2, 0), 0) ]; vm.mark_address_range_as_accessed((0, 0).into(), 3).unwrap(); vm.mark_address_range_as_accessed((0, 10).into(), 2) @@ -4759,6 +4761,12 @@ mod tests { .get_amount_of_accessed_addresses_for_segment(1), Some(1) ); + assert!(vm.is_accessed(&Relocatable::from((0, 0))).unwrap()); + assert!(vm.is_accessed(&Relocatable::from((0, 2))).unwrap()); + assert!(vm.is_accessed(&Relocatable::from((0, 10))).unwrap()); + assert!(vm.is_accessed(&Relocatable::from((1, 1))).unwrap()); + assert!(!vm.is_accessed(&Relocatable::from((1, 2))).unwrap()); + assert!(!vm.is_accessed(&Relocatable::from((2, 0))).unwrap()); } #[test]