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.EmitBrfalse(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); }
internal override void EmitCall(CodeEmitter ilgen) { ilgen.Emit(OpCodes.Dup); ilgen.Emit(OpCodes.Isinst, CoreClasses.java.lang.Cloneable.Wrapper.TypeAsBaseType); CodeEmitterLabel label1 = ilgen.DefineLabel(); ilgen.EmitBrtrue(label1); CodeEmitterLabel label2 = ilgen.DefineLabel(); ilgen.EmitBrfalse(label2); ilgen.EmitThrow("java.lang.CloneNotSupportedException"); ilgen.MarkLabel(label2); ilgen.EmitThrow("java.lang.NullPointerException"); ilgen.MarkLabel(label1); ilgen.Emit(OpCodes.Call, Types.Object.GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, null)); }
internal override void Emit(CodeEmitter ilgen, CodeEmitterLabel label) { ilgen.EmitBrfalse(label); }