IKVM.Internal.CodeEmitter.RealEmitPseudoOpCode C# (CSharp) Method

RealEmitPseudoOpCode() private method

private RealEmitPseudoOpCode ( int ilOffset, CodeType type, object data ) : void
ilOffset int
type CodeType
data object
return void
        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();
            }
        }

Usage Example

示例#1
0
			internal void RealEmit(int ilOffset, CodeEmitter codeEmitter, ref int lineNumber)
			{
				if (pseudo == CodeType.OpCode)
				{
					if (lineNumber != -1)
					{
						if (codeEmitter.linenums == null)
						{
							codeEmitter.linenums = new IKVM.Attributes.LineNumberTableAttribute.LineNumberWriter(32);
						}
						codeEmitter.linenums.AddMapping(ilOffset, lineNumber);
						lineNumber = -1;
					}
					codeEmitter.RealEmitOpCode(opcode, data);
				}
				else if (pseudo == CodeType.LineNumber)
				{
					lineNumber = (int)data;
				}
				else
				{
					codeEmitter.RealEmitPseudoOpCode(ilOffset, pseudo, data);
				}
			}