| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- using ChocolArm64.Memory;
- using ChocolArm64.State;
- using System;
- using System.Reflection;
- using System.Reflection.Emit;
- namespace ChocolArm64.Translation
- {
- delegate long ArmSubroutine(CpuThreadState state, MemoryManager memory);
- class TranslatedSub
- {
- public ArmSubroutine Delegate { get; private set; }
- public static int StateArgIdx { get; private set; }
- public static int MemoryArgIdx { get; private set; }
- public static Type[] FixedArgTypes { get; private set; }
- public DynamicMethod Method { get; private set; }
- public TranslationTier Tier { get; private set; }
- public TranslatedSub(DynamicMethod method, TranslationTier tier)
- {
- Method = method ?? throw new ArgumentNullException(nameof(method));;
- Tier = tier;
- }
- static TranslatedSub()
- {
- MethodInfo mthdInfo = typeof(ArmSubroutine).GetMethod("Invoke");
- ParameterInfo[] Params = mthdInfo.GetParameters();
- FixedArgTypes = new Type[Params.Length];
- for (int index = 0; index < Params.Length; index++)
- {
- Type argType = Params[index].ParameterType;
- FixedArgTypes[index] = argType;
- if (argType == typeof(CpuThreadState))
- {
- StateArgIdx = index;
- }
- else if (argType == typeof(MemoryManager))
- {
- MemoryArgIdx = index;
- }
- }
- }
- public void PrepareMethod()
- {
- Delegate = (ArmSubroutine)Method.CreateDelegate(typeof(ArmSubroutine));
- }
- public long Execute(CpuThreadState threadState, MemoryManager memory)
- {
- return Delegate(threadState, memory);
- }
- }
- }
|