blob: 059d871c5a6eacff10036e14f2acff4c9e4f5a32 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
using System.Diagnostics;
namespace StardewModdingAPI.Framework.Deprecations
{
/// <summary>An immutable stack trace that caches its values.</summary>
internal class ImmutableStackTrace
{
/*********
** Fields
*********/
/// <summary>The underlying stack trace.</summary>
private readonly StackTrace StackTrace;
/// <summary>The individual method calls in the stack trace.</summary>
private StackFrame[]? Frames;
/// <summary>The string representation of the stack trace.</summary>
private string? StringForm;
/*********
** Public methods
*********/
/// <summary>Construct an instance.</summary>
/// <param name="stackTrace">The underlying stack trace.</param>
public ImmutableStackTrace(StackTrace stackTrace)
{
this.StackTrace = stackTrace;
}
/// <summary>Get the underlying frames.</summary>
/// <remarks>This is a reference to the underlying stack frames, so this array should not be edited.</remarks>
public StackFrame[] GetFrames()
{
return this.Frames ??= this.StackTrace.GetFrames();
}
/// <inheritdoc />
public override string ToString()
{
return this.StringForm ??= this.StackTrace.ToString();
}
/// <summary>Get the current stack trace.</summary>
/// <param name="skipFrames">The number of frames up the stack from which to start the trace.</param>
public static ImmutableStackTrace Get(int skipFrames = 0)
{
return new ImmutableStackTrace(
new StackTrace(skipFrames: skipFrames + 1) // also skip this method
);
}
}
}
|