AssetRipper_AssetRipper/Source/AssetRipper.AssemblyDumper/Passes/Pass103_FillDependencyMethods.DictionaryNodeHelper.cs
2025-09-17 16:40:02 -07:00

66 lines
2.3 KiB
C#

using AssetRipper.AssemblyDumper.AST;
namespace AssetRipper.AssemblyDumper.Passes;
public static partial class Pass103_FillDependencyMethods
{
private static class DictionaryNodeHelper
{
public static void Apply(DictionaryNode node, DependencyMethodContext context, ParentContext parentContext)
{
FieldDefinition stateField = context.Type.AddField(NodeHelper.GetStateFieldName(node), context.CorLibTypeFactory.Int32, visibility: Visibility.Private);
CilInstructionLabel gotoNextCaseLabel = new();
CilInstructionLabel endLabel = new();
//Store list in a local variable
CilLocalVariable local = context.Processor.AddLocalVariable(node.TypeSignature);
parentContext.EmitLoad(context);
context.Processor.Add(CilOpCodes.Stloc, local);
context.Processor.Add(CilOpCodes.Ldarg_0);
context.Processor.Add(CilOpCodes.Ldfld, stateField);
context.Processor.Add(CilOpCodes.Ldloc, local);
context.Processor.Add(CilOpCodes.Callvirt, node.GetCount);
context.Processor.Add(CilOpCodes.Bge, gotoNextCaseLabel);
NodeHelper.Apply(node.Child, context, new ParentContext()
{
EmitLoad = c =>
{
context.Processor.Add(CilOpCodes.Ldloc, local);
c.Processor.Add(CilOpCodes.Ldarg_0);
c.Processor.Add(CilOpCodes.Ldfld, stateField);
context.Processor.Add(CilOpCodes.Callvirt, node.GetPair);
},
EmitIncrementStateAndGotoNextCase = c =>
{
c.Processor.Add(CilOpCodes.Ldarg_0);
c.Processor.Add(CilOpCodes.Ldarg_0);
c.Processor.Add(CilOpCodes.Ldfld, stateField);
c.Processor.Add(CilOpCodes.Ldc_I4_1);
c.Processor.Add(CilOpCodes.Add);
c.Processor.Add(CilOpCodes.Stfld, stateField);
parentContext.EmitIncrementStateAndGotoNextCase(c);
},
EmitIncrementStateAndReturnTrue = c =>
{
c.Processor.Add(CilOpCodes.Ldarg_0);
c.Processor.Add(CilOpCodes.Ldarg_0);
c.Processor.Add(CilOpCodes.Ldfld, stateField);
c.Processor.Add(CilOpCodes.Ldc_I4_1);
c.Processor.Add(CilOpCodes.Add);
c.Processor.Add(CilOpCodes.Stfld, stateField);
c.EmitReturnTrue();
},
});
context.Processor.Add(CilOpCodes.Br, endLabel);
gotoNextCaseLabel.Instruction = context.Processor.Add(CilOpCodes.Nop);
parentContext.EmitIncrementStateAndGotoNextCase(context);
endLabel.Instruction = context.Processor.Add(CilOpCodes.Nop);
}
}
}