From dc98890c90733a73a5c74d152c96dcefefe2607e Mon Sep 17 00:00:00 2001 From: Loy van Beek Date: Tue, 7 Feb 2023 10:34:12 +0100 Subject: [PATCH 1/2] Fix nested userdata bug: only create new empty userdata if given userdata is None See https://github.com/team-vigir/flexbe_behavior_engine/issues/158 --- flexbe_core/src/flexbe_core/core/state_machine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexbe_core/src/flexbe_core/core/state_machine.py b/flexbe_core/src/flexbe_core/core/state_machine.py index 7e60b16e..393a3ac0 100644 --- a/flexbe_core/src/flexbe_core/core/state_machine.py +++ b/flexbe_core/src/flexbe_core/core/state_machine.py @@ -75,7 +75,7 @@ def execute(self, userdata): if self._current_state is None: self.assert_consistent_transitions() self._current_state = self.initial_state - self._userdata = userdata or UserData() + self._userdata = userdata if userdata is not None else UserData() self._userdata(add_from=self._own_userdata) outcome = self._execute_current_state() return outcome From 653dc7e5d568f84d2b0b90e17480205e11b981d2 Mon Sep 17 00:00:00 2001 From: Loy van Beek Date: Mon, 13 Feb 2023 10:04:57 +0100 Subject: [PATCH 2/2] Fix another potential bug concerning UserData object with no data in them There are no calls to UserData.__call__ that also pass a value for that I can find. But if someone were to do this, it would suffer from the same bug: a UserData instance with no data in it would evaluate to False and thus the would be used, which I thik is not what is intended when there is a reference UserData passed explicitly --- flexbe_core/src/flexbe_core/core/user_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexbe_core/src/flexbe_core/core/user_data.py b/flexbe_core/src/flexbe_core/core/user_data.py index 3bc99c44..01f45f92 100644 --- a/flexbe_core/src/flexbe_core/core/user_data.py +++ b/flexbe_core/src/flexbe_core/core/user_data.py @@ -65,7 +65,7 @@ def __setattr__(self, key, value): self[key] = value def __call__(self, reference=None, add_from=None, update_from=None, remove_key=None): - self._reference = reference or self._reference + self._reference = reference if reference is not None else self._reference if isinstance(add_from, UserData): for key, value in add_from._data.items(): if key not in self._data: