From 586d0700605d84eee8f0476b2accde75f47f9bb3 Mon Sep 17 00:00:00 2001 From: David Cole Date: Sun, 18 Apr 2021 22:31:25 +1200 Subject: [PATCH 1/2] Updated traits for building Zval --- src/php/types/zval.rs | 73 +++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 40 deletions(-) diff --git a/src/php/types/zval.rs b/src/php/types/zval.rs index 726a53b7bb..e413cfc8ff 100644 --- a/src/php/types/zval.rs +++ b/src/php/types/zval.rs @@ -288,8 +288,8 @@ impl<'a> Zval { /// # Parameters /// /// * `val` - The value to set the zval as. - pub fn set_long(&mut self, val: ZendLong) { - self.value.lval = val; + pub fn set_long>(&mut self, val: T) { + self.value.lval = val.into(); self.u1.type_info = DataType::Long as u32; } @@ -298,8 +298,8 @@ impl<'a> Zval { /// # Parameters /// /// * `val` - The value to set the zval as. - pub fn set_double(&mut self, val: f64) { - self.value.dval = val; + pub fn set_double>(&mut self, val: T) { + self.value.dval = val.into(); self.u1.type_info = DataType::Double as u32; } @@ -308,8 +308,8 @@ impl<'a> Zval { /// # Parameters /// /// * `val` - The value to set the zval as. - pub fn set_bool(&mut self, val: bool) { - self.u1.type_info = if val { + pub fn set_bool>(&mut self, val: T) { + self.u1.type_info = if val.into() { DataType::True as u32 } else { DataType::False as u32 @@ -407,41 +407,34 @@ impl<'a, 'b> TryFrom<&'b Zval> for ZendHashTable { } } -impl From for Zval { - fn from(val: ZendLong) -> Self { - let mut zv = Self::new(); - zv.set_long(val); - zv - } +/// Implements the trait `Into` on Zval for a given type. +#[macro_use] +macro_rules! into_zval { + ($type: ty, $fn: ident) => { + impl From<$type> for Zval { + fn from(val: $type) -> Self { + let mut zv = Self::new(); + zv.$fn(val); + zv + } + } + }; } -impl From for Zval { - fn from(val: bool) -> Self { - let mut zv = Self::new(); - zv.set_bool(val); - zv - } -} -impl From for Zval { - fn from(val: f64) -> Self { - let mut zv = Self::new(); - zv.set_double(val); - zv - } -} +into_zval!(i8, set_long); +into_zval!(i16, set_long); +into_zval!(i32, set_long); +into_zval!(i64, set_long); -impl From for Zval { - fn from(val: String) -> Self { - let mut zv = Self::new(); - zv.set_string(val); - zv - } -} +into_zval!(u8, set_long); +into_zval!(u16, set_long); +into_zval!(u32, set_long); -impl From<&str> for Zval { - fn from(val: &str) -> Self { - let mut zv = Self::new(); - zv.set_string(val); - zv - } -} +into_zval!(f32, set_double); +into_zval!(f64, set_double); + +into_zval!(bool, set_bool); + +into_zval!(String, set_string); +into_zval!(&String, set_string); +into_zval!(&str, set_string); From c6a670573b0c243b50161c568558cf309778889f Mon Sep 17 00:00:00 2001 From: David Cole Date: Sun, 18 Apr 2021 22:56:43 +1200 Subject: [PATCH 2/2] Replaced manual implementations with macro impl --- src/php/types/zval.rs | 70 +++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 43 deletions(-) diff --git a/src/php/types/zval.rs b/src/php/types/zval.rs index e413cfc8ff..e942565010 100644 --- a/src/php/types/zval.rs +++ b/src/php/types/zval.rs @@ -357,55 +357,39 @@ impl<'a> Zval { } } -impl TryFrom<&Zval> for ZendLong { - type Error = (); - fn try_from(value: &Zval) -> Result { - match value.long() { - Some(val) => Ok(val), - _ => Err(()), +#[macro_use] +macro_rules! try_from_zval { + ($type: ty, $fn: ident) => { + impl TryFrom<&Zval> for $type { + type Error = (); + fn try_from(value: &Zval) -> Result { + match value.$fn() { + Some(v) => <$type>::try_from(v).map_err(|_| ()), + _ => Err(()), + } + } } - } + }; } -impl TryFrom<&Zval> for bool { - type Error = (); - fn try_from(value: &Zval) -> Result { - match value.bool() { - Some(val) => Ok(val), - _ => Err(()), - } - } -} +try_from_zval!(i8, long); +try_from_zval!(i16, long); +try_from_zval!(i32, long); +try_from_zval!(i64, long); -impl TryFrom<&Zval> for f64 { - type Error = (); - fn try_from(value: &Zval) -> Result { - match value.double() { - Some(val) => Ok(val), - _ => Err(()), - } - } -} +try_from_zval!(u8, long); +try_from_zval!(u16, long); +try_from_zval!(u32, long); +try_from_zval!(u64, long); -impl TryFrom<&Zval> for String { - type Error = (); - fn try_from(value: &Zval) -> Result { - match value.string() { - Some(val) => Ok(val), - _ => Err(()), - } - } -} +try_from_zval!(usize, long); +try_from_zval!(isize, long); -impl<'a, 'b> TryFrom<&'b Zval> for ZendHashTable { - type Error = (); - fn try_from(value: &'b Zval) -> Result { - match value.array() { - Some(val) => Ok(val), - _ => Err(()), - } - } -} +try_from_zval!(f64, double); + +try_from_zval!(bool, bool); + +try_from_zval!(String, string); /// Implements the trait `Into` on Zval for a given type. #[macro_use]