using System; using System.Diagnostics; using UnityEngine; namespace UnityAtoms { public class StackTraceEntry : IEquatable { private readonly Guid _id; private readonly int _frameCount; private readonly string _stackTrace; private readonly object _value; private readonly bool _constructedWithValue = false; private StackTraceEntry(string stackTrace) { _id = Guid.NewGuid(); _stackTrace = stackTrace; if (Application.isPlaying) { _frameCount = Time.frameCount; } } private StackTraceEntry(string stackTrace, object value) { _value = value; _constructedWithValue = true; _id = Guid.NewGuid(); _stackTrace = stackTrace; if (Application.isPlaying) { _frameCount = Time.frameCount; } } public static StackTraceEntry Create(object obj, int skipFrames = 0) => new StackTraceEntry(new StackTrace(skipFrames).ToString(), obj); public static StackTraceEntry Create(int skipFrames = 0) => new StackTraceEntry(new StackTrace(skipFrames).ToString()); public override bool Equals(object obj) => Equals(obj as StackTraceEntry); public bool Equals(StackTraceEntry other) => other?._id == _id; public override int GetHashCode() => _id.GetHashCode(); public override string ToString() { string stringifiedValue = ""; if (_constructedWithValue) { try { stringifiedValue = $"[{(_value == null ? "null" : _value.ToString())}]"; } catch { /* Ignore error */ } } return $"{_frameCount} {stringifiedValue}{_stackTrace}"; } } }