using System; using UnityEngine.Profiling; namespace UnityEngine.InputSystem.Utilities { internal static class DelegateHelpers { // InvokeCallbacksSafe protects both against the callback getting removed while being called // and against exceptions being thrown by the callback. public static void InvokeCallbacksSafe(ref CallbackArray callbacks, string callbackName, object context = null) { if (callbacks.length == 0) return; Profiler.BeginSample(callbackName); callbacks.LockForChanges(); for (var i = 0; i < callbacks.length; ++i) { try { callbacks[i](); } catch (Exception exception) { Debug.LogException(exception); if (context != null) Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'"); else Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks"); } } callbacks.UnlockForChanges(); Profiler.EndSample(); } public static void InvokeCallbacksSafe(ref CallbackArray> callbacks, TValue argument, string callbackName, object context = null) { if (callbacks.length == 0) return; Profiler.BeginSample(callbackName); callbacks.LockForChanges(); for (var i = 0; i < callbacks.length; ++i) { try { callbacks[i](argument); } catch (Exception exception) { Debug.LogException(exception); if (context != null) Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'"); else Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks"); } } callbacks.UnlockForChanges(); Profiler.EndSample(); } public static void InvokeCallbacksSafe(ref CallbackArray> callbacks, TValue1 argument1, TValue2 argument2, string callbackName, object context = null) { if (callbacks.length == 0) return; Profiler.BeginSample(callbackName); callbacks.LockForChanges(); for (var i = 0; i < callbacks.length; ++i) { try { callbacks[i](argument1, argument2); } catch (Exception exception) { Debug.LogException(exception); if (context != null) Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'"); else Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks"); } } callbacks.UnlockForChanges(); Profiler.EndSample(); } public static bool InvokeCallbacksSafe_AnyCallbackReturnsTrue(ref CallbackArray> callbacks, TValue1 argument1, TValue2 argument2, string callbackName, object context = null) { if (callbacks.length == 0) return true; Profiler.BeginSample(callbackName); callbacks.LockForChanges(); for (var i = 0; i < callbacks.length; ++i) { try { if (callbacks[i](argument1, argument2)) return true; } catch (Exception exception) { Debug.LogException(exception); if (context != null) Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'"); else Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks"); } } callbacks.UnlockForChanges(); Profiler.EndSample(); return false; } } }