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

RealEmitOpCode() private method

private RealEmitOpCode ( OpCode opcode, object arg ) : void
opcode OpCode
arg object
return void
        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();
            }
        }

Usage Example

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