mirror of
https://github.com/AssetRipper/AssetRipper.git
synced 2025-12-11 20:15:29 +01:00
66 lines
2.3 KiB
C#
66 lines
2.3 KiB
C#
using AssetRipper.AssemblyDumper.AST;
|
|
|
|
namespace AssetRipper.AssemblyDumper.Passes;
|
|
|
|
public static partial class Pass103_FillDependencyMethods
|
|
{
|
|
private static class ListNodeHelper
|
|
{
|
|
public static void Apply(ListNode 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.GetItem);
|
|
},
|
|
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);
|
|
}
|
|
}
|
|
}
|