CSPspEmu.Core.Gpu.GpuDisplayList.GenerateSwitch C# (CSharp) Method

GenerateSwitch() private static method

private static GenerateSwitch ( ) : GpuDisplayListRunnerDelegate
return GpuDisplayListRunnerDelegate
        private static GpuDisplayListRunnerDelegate GenerateSwitch()
        {
            //GpuDisplayListRunnerDelegate.
            var DynamicMethod = new DynamicMethod("GpuDisplayList.GenerateSwitch", typeof(void), new Type[] { typeof(GpuDisplayListRunner), typeof(GpuOpCodes), typeof(uint) });
            ILGenerator ILGenerator = DynamicMethod.GetILGenerator();
            var SwitchLabels = new Label[typeof(GpuOpCodes).GetEnumValues().Length];
            var Names = typeof(GpuOpCodes).GetEnumNames();
            for (int n = 0; n < SwitchLabels.Length; n++)
            {
                SwitchLabels[n] = ILGenerator.DefineLabel();
            }
            ILGenerator.Emit(OpCodes.Ldarg_1);
            ILGenerator.Emit(OpCodes.Switch, SwitchLabels);
            ILGenerator.Emit(OpCodes.Ret);

            for (int n = 0; n < SwitchLabels.Length; n++)
            {
                ILGenerator.MarkLabel(SwitchLabels[n]);
                var MethodInfo_Operation = typeof(GpuDisplayListRunner).GetMethod("OP_" + Names[n]);
                if (MethodInfo_Operation == null)
                {
                    Console.Error.WriteLine("Warning! Can't find Gpu.OpCode '" + Names[n] + "'");
                    MethodInfo_Operation = ((Action)GpuDisplayListRunner.Methods.OP_UNKNOWN).Method;
                }
                if (MethodInfo_Operation.GetCustomAttributes(typeof(GpuOpCodesNotImplementedAttribute), true).Length > 0)
                {
                    var MethodInfo_Unimplemented = ((Action)GpuDisplayListRunner.Methods.UNIMPLEMENTED_NOTICE).Method;
                    ILGenerator.Emit(OpCodes.Ldarg_0);
                    //ILGenerator.Emit(OpCodes.Ldarg_1);
                    //ILGenerator.Emit(OpCodes.Ldarg_2);
                    ILGenerator.Emit(OpCodes.Call, MethodInfo_Unimplemented);
                }
                {
                    ILGenerator.Emit(OpCodes.Ldarg_0);
                    //ILGenerator.Emit(OpCodes.Ldarg_1);
                    //ILGenerator.Emit(OpCodes.Ldarg_2);
                    ILGenerator.Emit(OpCodes.Call, MethodInfo_Operation);
                }
                ILGenerator.Emit(OpCodes.Ret);
            }

            return (GpuDisplayListRunnerDelegate)DynamicMethod.CreateDelegate(typeof(GpuDisplayListRunnerDelegate));
        }

Usage Example

Example #1
0
 public void ProcessInit()
 {
     GpuDisplayList.InstructionSwitch = GpuDisplayList.GenerateSwitch();
 }