private void RealEmitPseudoOpCode(int ilOffset, CodeType type, object data)
{
switch (type)
{
case CodeType.Unreachable:
break;
case CodeType.BeginScope:
ilgen_real.BeginScope();
break;
case CodeType.EndScope:
ilgen_real.EndScope();
break;
case CodeType.DeclareLocal:
((CodeEmitterLocal)data).Declare(ilgen_real);
break;
case CodeType.ReleaseTempLocal:
break;
case CodeType.SequencePoint:
ilgen_real.MarkSequencePoint(symbols, (int)data, 0, (int)data + 1, 0);
// we emit a nop to make sure we always have an instruction associated with the sequence point
ilgen_real.Emit(OpCodes.Nop);
break;
case CodeType.Label:
ilgen_real.MarkLabel(((CodeEmitterLabel)data).Label);
break;
case CodeType.BeginExceptionBlock:
ilgen_real.BeginExceptionBlock();
break;
case CodeType.BeginCatchBlock:
ilgen_real.BeginCatchBlock((Type)data);
break;
case CodeType.BeginFaultBlock:
ilgen_real.BeginFaultBlock();
break;
case CodeType.BeginFinallyBlock:
ilgen_real.BeginFinallyBlock();
break;
case CodeType.EndExceptionBlock:
ilgen_real.EndExceptionBlock();
#if !STATIC_COMPILER
// HACK to keep the verifier happy we need this bogus jump
// (because of the bogus Leave that Ref.Emit ends the try block with)
ilgen_real.Emit(OpCodes.Br_S, (sbyte)-2);
#endif
break;
case CodeType.MemoryBarrier:
if (memoryBarrier == null)
{
memoryBarrier = JVM.Import(typeof(System.Threading.Thread)).GetMethod("MemoryBarrier", Type.EmptyTypes);
}
ilgen_real.Emit(OpCodes.Call, memoryBarrier);
break;
default:
throw new InvalidOperationException();
}
}