IKVM.Internal.CompilerClassLoader.ExceptionMapEmitter.Emit C# (CSharp) Method

Emit() private method

private Emit ( IKVM context, CodeEmitter ilgen ) : void
context IKVM
ilgen CodeEmitter
return void
            internal void Emit(IKVM.Internal.MapXml.CodeGenContext context, CodeEmitter ilgen)
            {
                MethodWrapper mwSuppressFillInStackTrace = CoreClasses.java.lang.Throwable.Wrapper.GetMethodWrapper("__<suppressFillInStackTrace>", "()V", false);
                mwSuppressFillInStackTrace.Link();
                ilgen.Emit(OpCodes.Ldarg_0);
                ilgen.Emit(OpCodes.Callvirt, Compiler.getTypeMethod);
                for(int i = 0; i < map.Length; i++)
                {
                    ilgen.Emit(OpCodes.Dup);
                    ilgen.Emit(OpCodes.Ldtoken, StaticCompiler.Universe.GetType(map[i].src, true));
                    ilgen.Emit(OpCodes.Call, Compiler.getTypeFromHandleMethod);
                    ilgen.Emit(OpCodes.Ceq);
                    CodeEmitterLabel label = ilgen.DefineLabel();
                    ilgen.Emit(OpCodes.Brfalse_S, label);
                    ilgen.Emit(OpCodes.Pop);
                    if(map[i].code != null)
                    {
                        ilgen.Emit(OpCodes.Ldarg_0);
                        if(map[i].code.invoke != null)
                        {
                            foreach(MapXml.Instruction instr in map[i].code.invoke)
                            {
                                MapXml.NewObj newobj = instr as MapXml.NewObj;
                                if(newobj != null
                                    && newobj.Class != null
                                    && context.ClassLoader.LoadClassByDottedName(newobj.Class).IsSubTypeOf(CoreClasses.java.lang.Throwable.Wrapper))
                                {
                                    mwSuppressFillInStackTrace.EmitCall(ilgen);
                                }
                                instr.Generate(context, ilgen);
                            }
                        }
                        ilgen.Emit(OpCodes.Ret);
                    }
                    else
                    {
                        TypeWrapper tw = context.ClassLoader.LoadClassByDottedName(map[i].dst);
                        MethodWrapper mw = tw.GetMethodWrapper("<init>", "()V", false);
                        mw.Link();
                        mwSuppressFillInStackTrace.EmitCall(ilgen);
                        mw.EmitNewobj(ilgen);
                        ilgen.Emit(OpCodes.Ret);
                    }
                    ilgen.MarkLabel(label);
                }
                ilgen.Emit(OpCodes.Pop);
                ilgen.Emit(OpCodes.Ldarg_0);
                ilgen.Emit(OpCodes.Ret);
            }

Usage Example

		internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
		{
			CompilerClassLoader.ExceptionMapEmitter emitter = new CompilerClassLoader.ExceptionMapEmitter(mapping);
			emitter.Emit(context, ilgen);
		}
CompilerClassLoader.ExceptionMapEmitter