diff --git a/CHANGELOG.md b/CHANGELOG.md index e776dfd3c5..a5a14b28a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ #### Upcoming Changes +* opt(breaking): Avoid cloning constants when compiling hints [#2208](https://github.com/lambdaclass/cairo-vm/pull/2208) + * fix: Added `cairo_1_test_contracts` and `cairo_2_test_contracts` as dependencies for `test-extensive_hints` target [#2201](https://github.com/lambdaclass/cairo-vm/pull/2201) * breaking: Store constants in Hint Data [#2191](https://github.com/lambdaclass/cairo-vm/pull/2191) diff --git a/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs b/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs index 029b9dfa3e..e738b6e631 100644 --- a/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs +++ b/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs @@ -115,7 +115,7 @@ use crate::{ hint_processor_definition::HintReference, }, serde::deserialize_program::ApTracking, - stdlib::{any::Any, collections::HashMap, prelude::*, rc::Rc}, + stdlib::{any::Any, collections::HashMap, prelude::*, rc::Rc, sync::Arc}, types::exec_scope::ExecutionScopes, vm::{errors::hint_errors::HintError, vm_core::VirtualMachine}, }; @@ -133,7 +133,7 @@ pub struct HintProcessorData { pub ap_tracking: ApTracking, pub ids_data: HashMap, pub accessible_scopes: Vec, - pub constants: Rc>, + pub constants: Arc>, } impl HintProcessorData { diff --git a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs index 4f5c99faec..271407a853 100644 --- a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs +++ b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs @@ -9,7 +9,7 @@ use super::hint_processor_utils::*; use crate::any_box; use crate::hint_processor::cairo_1_hint_processor::dict_manager::DictSquashExecScope; use crate::hint_processor::hint_processor_definition::HintReference; -use crate::stdlib::rc::Rc; +use crate::stdlib::sync::Arc; use crate::stdlib::{boxed::Box, collections::HashMap, prelude::*}; use crate::types::relocatable::{MaybeRelocatable, Relocatable}; use crate::vm::runners::cairo_runner::ResourceTracker; @@ -1267,7 +1267,7 @@ impl HintProcessorLogic for Cairo1HintProcessor { // List of accessible scopes in the hint _accessible_scopes: &[String], // Identifiers stored in the hint's program. - _constants: Rc>, + _constants: Arc>, ) -> Result, VirtualMachineError> { let data = hint_code.parse().ok().and_then(|x: usize| self.hints.get(&x).cloned()) .ok_or_else(|| VirtualMachineError::CompileHintFail( diff --git a/vm/src/hint_processor/hint_processor_definition.rs b/vm/src/hint_processor/hint_processor_definition.rs index 293642b0b0..b4c510c504 100644 --- a/vm/src/hint_processor/hint_processor_definition.rs +++ b/vm/src/hint_processor/hint_processor_definition.rs @@ -1,4 +1,4 @@ -use crate::stdlib::{any::Any, boxed::Box, collections::HashMap, prelude::*, rc::Rc}; +use crate::stdlib::{any::Any, boxed::Box, collections::HashMap, prelude::*, sync::Arc}; use crate::any_box; use crate::serde::deserialize_program::ApTracking; @@ -44,7 +44,7 @@ pub trait HintProcessorLogic { // List of accessible scopes in the hint accessible_scopes: &[String], // Identifiers stored in the hint's program. - constants: Rc>, + constants: Arc>, ) -> Result, VirtualMachineError> { Ok(any_box!(HintProcessorData { code: hint_code.to_string(), diff --git a/vm/src/serde/deserialize_program.rs b/vm/src/serde/deserialize_program.rs index 0789e5f0c9..2c483da77d 100644 --- a/vm/src/serde/deserialize_program.rs +++ b/vm/src/serde/deserialize_program.rs @@ -493,7 +493,7 @@ pub fn parse_program_json( }; Ok(Program { shared_program_data: Arc::new(shared_program_data), - constants, + constants: Arc::new(constants), builtins: program_json.builtins, }) } diff --git a/vm/src/types/program.rs b/vm/src/types/program.rs index da5d8c69ed..f9c5a26f4c 100644 --- a/vm/src/types/program.rs +++ b/vm/src/types/program.rs @@ -201,7 +201,7 @@ pub type HintRange = (usize, NonZeroUsize); #[derive(Clone, Debug, PartialEq, Eq)] pub struct Program { pub shared_program_data: Arc, - pub constants: HashMap, + pub constants: Arc>, pub(crate) builtins: Vec, } @@ -235,7 +235,7 @@ impl Program { }; Ok(Self { shared_program_data: Arc::new(shared_program_data), - constants, + constants: Arc::new(constants), builtins, }) } @@ -269,7 +269,7 @@ impl Program { }; Ok(Self { shared_program_data: Arc::new(shared_program_data), - constants, + constants: Arc::new(constants), builtins, }) } @@ -420,7 +420,7 @@ impl Default for Program { fn default() -> Self { Self { shared_program_data: Arc::new(SharedProgramData::default()), - constants: HashMap::new(), + constants: Arc::new(HashMap::new()), builtins: Vec::new(), } } @@ -760,7 +760,8 @@ mod tests { [("__main__.main.SIZEOF_LOCALS", Felt252::ZERO)] .into_iter() .map(|(key, value)| (key.to_string(), value)) - .collect::>(), + .collect::>() + .into(), ); } @@ -1413,7 +1414,7 @@ mod tests { .map(|(key, value)| (key.to_string(), value)) .collect::>(); - assert_eq!(program.constants, constants); + assert_eq!(program.constants, constants.into()); } #[test] @@ -1439,7 +1440,7 @@ mod tests { }; let program = Program { shared_program_data: Arc::new(shared_program_data), - constants: HashMap::new(), + constants: Arc::new(HashMap::new()), builtins: Vec::new(), }; diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 6824252fe2..2fca1e3a2b 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -316,7 +316,7 @@ pub mod test_utils { }; Program { shared_program_data: Arc::new(shared_program_data), - constants: crate::stdlib::collections::HashMap::new(), + constants: crate::stdlib::collections::HashMap::new().into(), builtins: vec![$( $builtin_name ),*], } }}; @@ -400,7 +400,7 @@ pub mod test_utils { identifiers: val.identifiers, reference_manager: Program::get_reference_list(&val.reference_manager), }), - constants: val.constants, + constants: val.constants.into(), builtins: val.builtins, } } @@ -476,7 +476,7 @@ pub mod test_utils { ($vm:expr, $ids_data:expr, $hint_code:expr, $exec_scopes:expr, $constants:expr) => {{ let mut hint_data = HintProcessorData::new_default($hint_code.to_string(), $ids_data); let constants: &HashMap = $constants; - hint_data.constants = crate::stdlib::rc::Rc::new(constants.clone()); + hint_data.constants = constants.clone().into(); let mut hint_processor = BuiltinHintProcessor::new_empty(); hint_processor.execute_hint(&mut $vm, $exec_scopes, &any_box!(hint_data)) }}; @@ -978,7 +978,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new(), + constants: HashMap::new().into(), builtins: Vec::new(), }; assert_eq!(program, program!()) @@ -1002,7 +1002,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new(), + constants: HashMap::new().into(), builtins: vec![BuiltinName::range_check], }; @@ -1027,7 +1027,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new(), + constants: HashMap::new().into(), builtins: vec![BuiltinName::range_check], }; diff --git a/vm/src/vm/runners/cairo_runner.rs b/vm/src/vm/runners/cairo_runner.rs index 439e3596f5..9e75e4caa2 100644 --- a/vm/src/vm/runners/cairo_runner.rs +++ b/vm/src/vm/runners/cairo_runner.rs @@ -9,7 +9,6 @@ use crate::{ collections::{BTreeMap, HashMap, HashSet}, ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign}, prelude::*, - rc::Rc, }, types::{builtin_name::BuiltinName, layout::CairoLayoutParams, layout_name::LayoutName}, vm::{ @@ -648,8 +647,6 @@ impl CairoRunner { references: &[HintReference], hint_executor: &mut dyn HintProcessor, ) -> Result>, VirtualMachineError> { - let constants = Rc::new(self.program.constants.clone()); - self.program .shared_program_data .hints_collection @@ -662,7 +659,7 @@ impl CairoRunner { &hint.flow_tracking_data.reference_ids, references, &hint.accessible_scopes, - constants.clone(), + self.program.constants.clone(), ) .map_err(|_| VirtualMachineError::CompileHintFail(hint.code.clone().into())) })