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));
}