From f8e8029669a36676cd01a51dd95e14838b8eef2b Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 17 Apr 2024 18:17:55 -0300 Subject: [PATCH] Impl generic serialization for suffixed ver --- vm/src/types/builtin_name.rs | 88 +++++++++++++++++++++++++++++++ vm/src/vm/runners/cairo_pie.rs | 2 +- vm/src/vm/runners/cairo_runner.rs | 1 + 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 vm/src/types/builtin_name.rs diff --git a/vm/src/types/builtin_name.rs b/vm/src/types/builtin_name.rs new file mode 100644 index 0000000000..7370c48177 --- /dev/null +++ b/vm/src/types/builtin_name.rs @@ -0,0 +1,88 @@ +use serde::{Deserialize, Serialize}; + +#[cfg(all(feature = "arbitrary", feature = "std"))] +use arbitrary::{self, Arbitrary}; + +// This enum is used to deserialize program builtins into &str and catch non-valid names +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] +#[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone, Eq, Hash)] +#[allow(non_camel_case_types)] +pub enum BuiltinName { + output, + range_check, + pedersen, + ecdsa, + keccak, + bitwise, + ec_op, + poseidon, + segment_arena, + range_check96, + add_mod, + mul_mod, +} + +impl BuiltinName { + pub fn to_str_with_suffix(&self) -> &'static str { + match self { + BuiltinName::output => "output_builtin", + BuiltinName::range_check => "range_check_builtin", + BuiltinName::pedersen => "pedersen_builtin", + BuiltinName::ecdsa => "ecdsa_builtin", + BuiltinName::keccak => "keccak_builtin", + BuiltinName::bitwise => "bitwise_builtin", + BuiltinName::ec_op => "ec_op_builtin", + BuiltinName::poseidon => "poseidon_builtin", + BuiltinName::segment_arena => "segment_arena_builtin", + BuiltinName::range_check96 => "range_check96_builtin", + BuiltinName::add_mod => "add_mod_builtin", + BuiltinName::mul_mod => "mul_mod_builtin", + } + } +} + +impl BuiltinName { + pub fn to_str(&self) -> &'static str { + match self { + BuiltinName::output => "output", + BuiltinName::range_check => "range_check", + BuiltinName::pedersen => "pedersen", + BuiltinName::ecdsa => "ecdsa", + BuiltinName::keccak => "keccak", + BuiltinName::bitwise => "bitwise", + BuiltinName::ec_op => "ec_op", + BuiltinName::poseidon => "poseidon", + BuiltinName::segment_arena => "segment_arena", + BuiltinName::range_check96 => "range_check96", + BuiltinName::add_mod => "add_mod", + BuiltinName::mul_mod => "mul_mod", + } + } +} + +impl core::fmt::Display for BuiltinName { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + self.to_str_with_suffix().fmt(f) + } +} + +pub(crate) mod serde_impl { + use super::BuiltinName; + use serde::{Serializer, Serialize, ser::SerializeMap}; + use crate::stdlib::collections::HashMap; + + pub fn serialize_builtin_name_map_with_suffix( + values: &HashMap, + serializer: S, + ) -> Result + where + S: Serializer, + V: Serialize, + { + let mut map_serializer = serializer.serialize_map(Some(values.len()))?; + for (key, val) in values { + map_serializer.serialize_entry(key.to_str_with_suffix(), val)? + } + map_serializer.end() + } +} diff --git a/vm/src/vm/runners/cairo_pie.rs b/vm/src/vm/runners/cairo_pie.rs index 5bf9a981db..f09d624376 100644 --- a/vm/src/vm/runners/cairo_pie.rs +++ b/vm/src/vm/runners/cairo_pie.rs @@ -73,7 +73,7 @@ pub struct CairoPie { pub metadata: CairoPieMetadata, pub memory: CairoPieMemory, pub execution_resources: ExecutionResources, - //#[serde(serialize_with = "serde_impl::serialize_additional_data")] + #[serde(serialize_with = "crate::types::builtin_name::serde_impl::serialize_builtin_name_map_with_suffix")] pub additional_data: HashMap, pub version: CairoPieVersion, } diff --git a/vm/src/vm/runners/cairo_runner.rs b/vm/src/vm/runners/cairo_runner.rs index 510c6dd931..9104db3fa6 100644 --- a/vm/src/vm/runners/cairo_runner.rs +++ b/vm/src/vm/runners/cairo_runner.rs @@ -1529,6 +1529,7 @@ pub struct SegmentInfo { pub struct ExecutionResources { pub n_steps: usize, pub n_memory_holes: usize, + #[serde(serialize_with = "crate::types::builtin_name::serde_impl::serialize_builtin_name_map_with_suffix")] pub builtin_instance_counter: HashMap, }