From a962debf0d5a9d459729233c02a9a3df78b0d228 Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Sun, 4 Oct 2020 10:40:44 +0800 Subject: [PATCH] Simplify target back propagation. --- src/engine.rs | 16 ++++++++++++++++ src/fn_call.rs | 8 +++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/engine.rs b/src/engine.rs index 842bea3a..327ccc8e 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -150,6 +150,7 @@ pub enum Target<'a> { #[cfg(any(not(feature = "no_index"), not(feature = "no_object")))] impl Target<'_> { /// Is the `Target` a reference pointing to other data? + #[allow(dead_code)] #[inline(always)] pub fn is_ref(&self) -> bool { match self { @@ -163,6 +164,7 @@ impl Target<'_> { } } /// Is the `Target` an owned value? + #[allow(dead_code)] #[inline(always)] pub fn is_value(&self) -> bool { match self { @@ -176,6 +178,7 @@ impl Target<'_> { } } /// Is the `Target` a shared value? + #[allow(dead_code)] #[inline(always)] pub fn is_shared(&self) -> bool { match self { @@ -228,6 +231,19 @@ impl Target<'_> { Self::StringChar(_, _, ref mut r) => r, } } + /// Propagate a changed value back to the original source. + /// This has no effect except for string indexing. + pub fn propagate_changed_value(&mut self) { + match self { + Self::Ref(_) | Self::LockGuard(_) | Self::Value(_) => (), + #[cfg(not(feature = "no_index"))] + Self::StringChar(_, _, ch) => { + let new_val = ch.clone(); + self.set_value(new_val, Position::none(), Position::none()) + .unwrap(); + } + } + } /// Update the value of the `Target`. pub fn set_value( &mut self, diff --git a/src/fn_call.rs b/src/fn_call.rs index bd850f34..b78e222f 100644 --- a/src/fn_call.rs +++ b/src/fn_call.rs @@ -670,7 +670,6 @@ impl Engine { level: usize, ) -> Result<(Dynamic, bool), Box> { let is_ref = target.is_ref(); - let is_value = target.is_value(); // Get a reference to the mutation target Dynamic let obj = target.as_mut(); @@ -793,10 +792,9 @@ impl Engine { ) }?; - // Feed the changed temp value back - if updated && !is_ref && !is_value { - let new_val = target.as_mut().clone(); - target.set_value(new_val, Position::none(), Position::none())?; + // Propagate the changed value back to the source if necessary + if updated { + target.propagate_changed_value(); } Ok((result, updated))