private void RealEmitOpCode(OpCode opcode, object arg)
{
if (arg == null)
{
ilgen_real.Emit(opcode);
}
else if (arg is int)
{
ilgen_real.Emit(opcode, (int)arg);
}
else if (arg is long)
{
ilgen_real.Emit(opcode, (long)arg);
}
else if (arg is MethodInfo)
{
ilgen_real.Emit(opcode, (MethodInfo)arg);
}
else if (arg is ConstructorInfo)
{
ilgen_real.Emit(opcode, (ConstructorInfo)arg);
}
else if (arg is FieldInfo)
{
ilgen_real.Emit(opcode, (FieldInfo)arg);
}
else if (arg is sbyte)
{
ilgen_real.Emit(opcode, (sbyte)arg);
}
else if (arg is byte)
{
ilgen_real.Emit(opcode, (byte)arg);
}
else if (arg is short)
{
ilgen_real.Emit(opcode, (short)arg);
}
else if (arg is float)
{
ilgen_real.Emit(opcode, (float)arg);
}
else if (arg is double)
{
ilgen_real.Emit(opcode, (double)arg);
}
else if (arg is string)
{
ilgen_real.Emit(opcode, (string)arg);
}
else if (arg is Type)
{
ilgen_real.Emit(opcode, (Type)arg);
}
else if (arg is CodeEmitterLocal)
{
CodeEmitterLocal local = (CodeEmitterLocal)arg;
local.Emit(ilgen_real, opcode);
}
else if (arg is CodeEmitterLabel)
{
CodeEmitterLabel label = (CodeEmitterLabel)arg;
ilgen_real.Emit(opcode, label.Label);
}
else if (arg is CodeEmitterLabel[])
{
CodeEmitterLabel[] labels = (CodeEmitterLabel[])arg;
Label[] real = new Label[labels.Length];
for (int i = 0; i < labels.Length; i++)
{
real[i] = labels[i].Label;
}
ilgen_real.Emit(opcode, real);
}
else if (arg is CalliWrapper)
{
CalliWrapper args = (CalliWrapper)arg;
ilgen_real.EmitCalli(opcode, args.unmanagedCallConv, args.returnType, args.parameterTypes);
}
else
{
throw new InvalidOperationException();
}
}