Bugfix State::set transition condition infinite loop (#4890)
# Objective - Fixes #4271 ## Solution - Check for a pending transition in addition to a scheduled operation. - I don't see a valid reason for updating the state unless both `scheduled` and `transition` are empty.
This commit is contained in:
parent
5a09694dec
commit
b7d784de6e
@ -262,14 +262,14 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Schedule a state change that replaces the active state with the given state.
|
/// Schedule a state change that replaces the active state with the given state.
|
||||||
/// This will fail if there is a scheduled operation, or if the given `state` matches the
|
/// This will fail if there is a scheduled operation, pending transition, or if the given
|
||||||
/// current state
|
/// `state` matches the current state
|
||||||
pub fn set(&mut self, state: T) -> Result<(), StateError> {
|
pub fn set(&mut self, state: T) -> Result<(), StateError> {
|
||||||
if self.stack.last().unwrap() == &state {
|
if self.stack.last().unwrap() == &state {
|
||||||
return Err(StateError::AlreadyInState);
|
return Err(StateError::AlreadyInState);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.scheduled.is_some() {
|
if self.scheduled.is_some() || self.transition.is_some() {
|
||||||
return Err(StateError::StateAlreadyQueued);
|
return Err(StateError::StateAlreadyQueued);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,14 +289,14 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Schedule a state change that replaces the full stack with the given state.
|
/// Schedule a state change that replaces the full stack with the given state.
|
||||||
/// This will fail if there is a scheduled operation, or if the given `state` matches the
|
/// This will fail if there is a scheduled operation, pending transition, or if the given
|
||||||
/// current state
|
/// `state` matches the current state
|
||||||
pub fn replace(&mut self, state: T) -> Result<(), StateError> {
|
pub fn replace(&mut self, state: T) -> Result<(), StateError> {
|
||||||
if self.stack.last().unwrap() == &state {
|
if self.stack.last().unwrap() == &state {
|
||||||
return Err(StateError::AlreadyInState);
|
return Err(StateError::AlreadyInState);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.scheduled.is_some() {
|
if self.scheduled.is_some() || self.transition.is_some() {
|
||||||
return Err(StateError::StateAlreadyQueued);
|
return Err(StateError::StateAlreadyQueued);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,7 +321,7 @@ where
|
|||||||
return Err(StateError::AlreadyInState);
|
return Err(StateError::AlreadyInState);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.scheduled.is_some() {
|
if self.scheduled.is_some() || self.transition.is_some() {
|
||||||
return Err(StateError::StateAlreadyQueued);
|
return Err(StateError::StateAlreadyQueued);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,7 +342,7 @@ where
|
|||||||
|
|
||||||
/// Same as [`Self::set`], but does a pop operation instead of a set operation
|
/// Same as [`Self::set`], but does a pop operation instead of a set operation
|
||||||
pub fn pop(&mut self) -> Result<(), StateError> {
|
pub fn pop(&mut self) -> Result<(), StateError> {
|
||||||
if self.scheduled.is_some() {
|
if self.scheduled.is_some() || self.transition.is_some() {
|
||||||
return Err(StateError::StateAlreadyQueued);
|
return Err(StateError::StateAlreadyQueued);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,9 +365,9 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Schedule a state change that restarts the active state.
|
/// Schedule a state change that restarts the active state.
|
||||||
/// This will fail if there is a scheduled operation
|
/// This will fail if there is a scheduled operation or a pending transition
|
||||||
pub fn restart(&mut self) -> Result<(), StateError> {
|
pub fn restart(&mut self) -> Result<(), StateError> {
|
||||||
if self.scheduled.is_some() {
|
if self.scheduled.is_some() || self.transition.is_some() {
|
||||||
return Err(StateError::StateAlreadyQueued);
|
return Err(StateError::StateAlreadyQueued);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user