From e427a68e461a45480d7a70eeaf1eef5258f740fb Mon Sep 17 00:00:00 2001
From: Sander de Snoo <59472150+sldesnoo-Delft@users.noreply.github.com>
Date: Mon, 21 Nov 2022 11:06:38 +0100
Subject: [PATCH] Avoid NESTED LOOPS of exception in loop

---
 .../utility/data_handling_functions.py        | 52 ++++++++++---------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/pulse_lib/segments/utility/data_handling_functions.py b/pulse_lib/segments/utility/data_handling_functions.py
index 3711581a..62c5247c 100644
--- a/pulse_lib/segments/utility/data_handling_functions.py
+++ b/pulse_lib/segments/utility/data_handling_functions.py
@@ -213,32 +213,34 @@ def loop_controller(func):
         global _in_loop
         if _in_loop:
             raise Exception('NESTED LOOPS')
-        _in_loop = True
-
-        loop_info_args = []
-        loop_info_kwargs = []
-
-        for i,arg in enumerate(args):
-            if isinstance(arg, loop_obj):
-                loop_info = _update_segment_dims(obj, arg, i)
-                loop_info_args.append(loop_info)
-
-        for key,kwarg in kwargs.items():
-            if isinstance(kwarg, loop_obj):
-                loop_info = _update_segment_dims(obj, kwarg, key)
-                loop_info_kwargs.append(loop_info)
-
-        data = obj.data
-
-        if len(loop_info_args) == 0 and len(loop_info_kwargs) == 0:
-            if data.shape != (1,):
-                loop_over_data(func, obj, data, args, kwargs)
+        try:
+            _in_loop = True
+
+            loop_info_args = []
+            loop_info_kwargs = []
+
+            for i,arg in enumerate(args):
+                if isinstance(arg, loop_obj):
+                    loop_info = _update_segment_dims(obj, arg, i)
+                    loop_info_args.append(loop_info)
+
+            for key,kwarg in kwargs.items():
+                if isinstance(kwarg, loop_obj):
+                    loop_info = _update_segment_dims(obj, kwarg, key)
+                    loop_info_kwargs.append(loop_info)
+
+            data = obj.data
+
+            if len(loop_info_args) == 0 and len(loop_info_kwargs) == 0:
+                if data.shape != (1,):
+                    loop_over_data(func, obj, data, args, kwargs)
+                else:
+                    obj.data_tmp = data[0]
+                    data[0] = func(obj, *args, **kwargs)
             else:
-                obj.data_tmp = data[0]
-                data[0] = func(obj, *args, **kwargs)
-        else:
-            loop_over_data_lp(func, obj, data, args, loop_info_args, kwargs, loop_info_kwargs)
-        _in_loop = False
+                loop_over_data_lp(func, obj, data, args, loop_info_args, kwargs, loop_info_kwargs)
+        finally:
+            _in_loop = False
 
     return wrapper
 
-- 
GitLab