Files
2026-07-24 16:23:01 -04:00

36 lines
2.1 KiB
C#

using Age.Engine.Model;
namespace Age.Engine.Diagnostics;
public enum TraceEventKind { Step, FrameEnter, FrameExit, CallScript, Stub, Halt }
public enum FrameCause { TopScene, CallScript, RootReload, SaveRestore }
/// <summary>An engine diagnostic fact. A <c>readonly struct</c> with a Kind discriminator and a shared
/// field set — no per-event heap allocation. Only the fields relevant to a Kind are populated; the
/// static factories are the only intended constructors.</summary>
public readonly struct TraceEvent
{
public TraceEventKind Kind { get; private init; }
public int Pc { get; private init; }
public int Opcode { get; private init; }
public int Depth { get; private init; }
public long Id { get; private init; } // call-script id
public long Steps { get; private init; } // total steps at Halt
public FrameCause Cause { get; private init; }
public string? Name { get; private init; } // script/scene name; resolved call-script name (null => unresolved/stub)
public string? Text { get; private init; } // halt reason; frame outcome
public Instruction? Ins { get; private init; } // Step: the instruction (args) by ref, never copied
public static TraceEvent Step(int pc, Instruction ins, int depth) => new()
{ Kind = TraceEventKind.Step, Pc = pc, Opcode = ins.Opcode, Ins = ins, Depth = depth };
public static TraceEvent FrameEnter(string name, int depth, FrameCause cause, long id = 0) => new()
{ Kind = TraceEventKind.FrameEnter, Name = name, Depth = depth, Cause = cause, Id = id };
public static TraceEvent FrameExit(string name, int depth, string outcome) => new()
{ Kind = TraceEventKind.FrameExit, Name = name, Depth = depth, Text = outcome };
public static TraceEvent CallScript(long id, string? name) => new()
{ Kind = TraceEventKind.CallScript, Id = id, Name = name };
public static TraceEvent Stub(int opcode, int pc) => new()
{ Kind = TraceEventKind.Stub, Opcode = opcode, Pc = pc };
public static TraceEvent Halt(string reason, long steps) => new()
{ Kind = TraceEventKind.Halt, Text = reason, Steps = steps };
}