Decompiled source of HarmonyXTranspilerFix v1.1.0

BepInEx/patchers/HarmonyXTranspilerFix/HarmonyXTranspilerFix.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using HarmonyLib;
using HarmonyLib.Internal.Patching;
using HarmonyLib.Internal.Util;
using HarmonyLib.Public.Patching;
using Microsoft.CodeAnalysis;
using Mono.Cecil;
using Mono.Cecil.Cil;
using MonoMod.RuntimeDetour;
using MonoMod.Utils.Cil;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("0Harmony")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HarmonyXTranspilerFix")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.0.0.0")]
[assembly: AssemblyInformationalVersion("0.0.0+c508436e5cb5ef89f1d9b7edb199df824ff29cb0")]
[assembly: AssemblyProduct("HarmonyXTranspilerFix")]
[assembly: AssemblyTitle("HarmonyXTranspilerFix")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace HarmonyXTranspilerFix
{
	public class HarmonyXTranspilerFixPatcher
	{
		public static IEnumerable<string> TargetDLLs { get; } = Array.Empty<string>();


		public static void Finish()
		{
			Harmony.CreateAndPatchAll(typeof(HarmonyXTranspilerFixPatcher).Assembly, "HarmonyXTranspilerFixPatcher");
		}

		public static void Patch(AssemblyDefinition _)
		{
		}
	}
}
namespace HarmonyXTranspilerFix.Patches
{
	[HarmonyPatch(typeof(ILManipulator))]
	internal static class Patch_ILManipulator
	{
		[HarmonyPatch("WriteTo")]
		[HarmonyPrefix]
		public unsafe static bool FixILManipulatorBreaksMethod(ILManipulator __instance, MethodBody body, MethodBase original)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			body.Instructions.Clear();
			body.ExceptionHandlers.Clear();
			CecilILGenerator val = new CecilILGenerator(body.GetILProcessor());
			ILGenerator proxy = ((ILGeneratorShim)val).GetProxy();
			((ILGeneratorShim)val).DefineLabel();
			IEnumerable<CodeInstruction> enumerable = __instance.ApplyTranspilers(proxy, original, new Func<VariableDefinition, LocalBuilder>(val, (nint)(delegate*<CecilILGenerator, VariableDefinition, LocalBuilder>)(&EmitterExtensions.GetLocal)), (Func<Label>)((ILGeneratorShim)val).DefineLabel);
			foreach (CodeInstruction item in enumerable)
			{
				foreach (Label label in item.labels)
				{
					((ILGeneratorShim)val).MarkLabel(label);
				}
				foreach (ExceptionBlock block in item.blocks)
				{
					EmitterExtensions.MarkBlockBefore(val, block);
				}
				if ((!(item.opcode == OpCodes.Endfilter) && !(item.opcode == OpCodes.Endfinally)) || item.blocks.Count <= 0)
				{
					switch (item.opcode.OperandType)
					{
					case OperandType.InlineNone:
						((ILGeneratorShim)val).Emit(item.opcode);
						break;
					case OperandType.InlineSig:
						throw new NotSupportedException("Emitting opcodes with CallSites is currently not fully implemented");
					default:
						if (item.operand == null)
						{
							throw new ArgumentNullException("operand", $"Invalid argument for {item}");
						}
						EmitterExtensions.Emit(val, item.opcode, item.operand);
						break;
					}
				}
				foreach (ExceptionBlock block2 in item.blocks)
				{
					EmitterExtensions.MarkBlockAfter(val, block2);
				}
			}
			if (body.Instructions.Count == 0)
			{
				((ILGeneratorShim)val).Emit(OpCodes.Ret);
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(ManagedMethodPatcher))]
	internal static class Patch_ManagedMethodPatcher
	{
		[HarmonyPatch("DetourTo")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> UndoPatchCorrectly(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null);
			FieldInfo setIsApplied = AccessTools.Field(typeof(ILHookExtensions), "SetIsApplied");
			List<ExceptionBlock> blocks = val.SearchForward((Func<CodeInstruction, bool>)((CodeInstruction c) => CodeInstructionExtensions.LoadsField(c, setIsApplied, false))).Set(OpCodes.Nop, (object)null).Advance(1)
				.RemoveInstructions(4)
				.Blocks;
			val.Blocks = new List<ExceptionBlock>();
			val.Insert((CodeInstruction[])(object)new CodeInstruction[3]
			{
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				CodeInstruction.LoadField(typeof(ManagedMethodPatcher), "ilHook", false),
				CodeInstruction.Call<ILHook>((Expression<Action<ILHook>>)((ILHook _) => _.Undo()))
			}).Blocks = blocks;
			return val.InstructionEnumeration();
		}
	}
	[HarmonyPatch(typeof(PatchClassProcessor))]
	internal static class Patch_PatchClassProcessor
	{
		[HarmonyPatch("GetBulkMethods")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> FixTargetMethodsCalledTwice(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Expected O, but got Unknown
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Expected O, but got Unknown
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Expected O, but got Unknown
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null);
			MethodInfo method = typeof(PatchClassProcessor).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).First((MethodInfo m) => m.Name == "RunMethod" && m.GetGenericArguments().Length == 2).MakeGenericMethod(typeof(HarmonyTargetMethods), typeof(IEnumerable<MethodBase>));
			val.SearchForward((Func<CodeInstruction, bool>)((CodeInstruction c) => CodeInstructionExtensions.Calls(c, method))).Advance(-4).RemoveInstructions(4)
				.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
				{
					new CodeInstruction(OpCodes.Ldnull, (object)null)
				});
			val.SearchForward((Func<CodeInstruction, bool>)((CodeInstruction c) => c.operand is MethodInfo methodInfo && methodInfo.Name == "ToList")).Advance(1).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[5]
			{
				new CodeInstruction(OpCodes.Stloc_1, (object)null),
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Ldloc_1, (object)null),
				CodeInstruction.Call((Expression<Action>)(() => ValidateTargetMethods(null, null))),
				new CodeInstruction(OpCodes.Ldloc_1, (object)null)
			});
			return val.InstructionEnumeration();
		}

		private static void ValidateTargetMethods(PatchClassProcessor classProcessor, List<MethodBase>? targetMethods)
		{
			string text = null;
			if (targetMethods == null)
			{
				text = "null";
			}
			else if (targetMethods.Any((MethodBase m) => (object)m == null))
			{
				text = "some element was null";
			}
			if (text != null)
			{
				if (classProcessor.auxilaryMethods.TryGetValue(typeof(HarmonyTargetMethods), out var value))
				{
					throw new Exception("Method " + GeneralExtensions.FullDescription((MethodBase)value) + " returned an unexpected result: " + text);
				}
				throw new Exception("Some method returned an unexpected result: " + text);
			}
		}
	}
	[HarmonyPatch(typeof(SymbolExtensions))]
	internal static class Patch_SymbolExtensions
	{
		[HarmonyPatch("GetMethodInfo", new Type[] { typeof(LambdaExpression) })]
		[HarmonyPrefix]
		public static bool MadeAbleToGetMethodWithoutParameters(LambdaExpression expression, out MethodInfo? __result)
		{
			if (expression.Body is UnaryExpression unaryExpression && unaryExpression.Operand is MethodCallExpression methodCallExpression && methodCallExpression.Object is ConstantExpression constantExpression && constantExpression.Value is MethodInfo methodInfo)
			{
				__result = methodInfo;
				return false;
			}
			__result = null;
			return true;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}