Bugzilla – Bug 320875
[ANONYMOUS METHODS] (FIXED) Nested anonymous methods
Last modified: 2007-09-15 21:24:23 UTC
---- Reported by atsushi@ximian.com 2006-04-17 21:46:43 MST ---- The following code causes compiler crash. The method invocation (Whoa()) is needed to reproduce the problem. public delegate void FooHandler (); public class Test { public Test () { FooHandler h = delegate () { FooHandler f = new FooHandler (delegate () { Whoa (); }); }; } void Whoa () { } } Actual Results: atsushi@linux-ymaf:~/tests/gmcs> mcs require-sync.cs require-sync.cs(8,15): warning CS0219: The variable `f' is assigned but its value is never used require-sync.cs(7,14): warning CS0219: The variable `h' is assigned but its value is never used Unhandled Exception: System.Exception: Trying to emit a local from a different ILGenerator. in <0x005e4> System.Reflection.Emit.ILGenerator:Emit (OpCode opcode, System.Reflection.Emit.LocalBuilder lbuilder) in <0x0006f> Mono.CSharp.ScopeInfo:EmitScopeInstance (System.Reflection.Emit.ILGenerator ig) in <0x0008a> Mono.CSharp.CaptureContext:EmitMethodHostInstance (Mono.CSharp.EmitContext target, Mono.CSharp.AnonymousContainer am) in <0x0001f> Mono.CSharp.EmitContext:EmitMethodHostInstance (Mono.CSharp.EmitContext target, Mono.CSharp.AnonymousMethod am) in <0x0001c> Mono.CSharp.AnonymousDelegate+AnonymousInstance:Emit (Mono.CSharp.EmitContext ec) in <0x0005c> Mono.CSharp.DelegateCreation:Emit (Mono.CSharp.EmitContext ec) in <0x000c9> Mono.CSharp.AnonymousDelegate:Emit (Mono.CSharp.EmitContext ec) in <0x0003e> Mono.CSharp.LocalVariableReference:EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) in <0x00179> Mono.CSharp.Assign:Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) in <0x0000f> Mono.CSharp.Assign:EmitStatement (Mono.CSharp.EmitContext ec) in <0x00011> Mono.CSharp.StatementExpression:DoEmit (Mono.CSharp.EmitContext ec)in <0x00024> Mono.CSharp.Statement:Emit (Mono.CSharp.EmitContext ec) in <0x000a7> Mono.CSharp.Block:DoEmit (Mono.CSharp.EmitContext ec) in <0x0024f> Mono.CSharp.Block:Emit (Mono.CSharp.EmitContext ec) in <0x0001b> Mono.CSharp.EmitContext:EmitResolvedTopBlock (Mono.CSharp.ToplevelBlock block, Boolean unreachable) in <0x0009d> Mono.CSharp.AnonymousMethod:EmitMethod (Mono.CSharp.EmitContext ec)in <0x0001a> Mono.CSharp.AnonymousDelegate:Emit (Mono.CSharp.EmitContext ec) in <0x0003e> Mono.CSharp.LocalVariableReference:EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) in <0x00179> Mono.CSharp.Assign:Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) in <0x0000f> Mono.CSharp.Assign:EmitStatement (Mono.CSharp.EmitContext ec) in <0x00011> Mono.CSharp.StatementExpression:DoEmit (Mono.CSharp.EmitContext ec)in <0x00024> Mono.CSharp.Statement:Emit (Mono.CSharp.EmitContext ec) in <0x000a7> Mono.CSharp.Block:DoEmit (Mono.CSharp.EmitContext ec) in <0x0024f> Mono.CSharp.Block:Emit (Mono.CSharp.EmitContext ec) in <0x0001b> Mono.CSharp.EmitContext:EmitResolvedTopBlock (Mono.CSharp.ToplevelBlock block, Boolean unreachable) in <0x0007b> Mono.CSharp.EmitContext:EmitTopBlock (IMethodData md, Mono.CSharp.ToplevelBlock block) in <0x0024f> Mono.CSharp.Constructor:Emit () in <0x00238> Mono.CSharp.TypeContainer:EmitConstructors () in <0x0019c> Mono.CSharp.TypeContainer:EmitType () in <0x0021b> Mono.CSharp.RootContext:EmitCode () in <0x00a58> Mono.CSharp.Driver:MainDriver (System.String[] args) in <0x00042> Mono.CSharp.Driver:Main (System.String[] args) Expected Results: no crash. How often does this happen? consistently. Additional information: It's quite easy to workaround this problem. ---- Additional Comments From miguel@ximian.com 2006-06-13 01:36:17 MST ---- This patch makes this code work, but the problem is that it introduces a regression (test-364), am uploading the patch just to keep a backup. ---- Additional Comments From miguel@ximian.com 2006-06-13 01:36:58 MST ---- Created an attachment (id=169603) Partial patch for the nested anonymous method that references "this"; Patch regresses other code ---- Additional Comments From martin@ximian.com 2006-10-04 18:14:50 MST ---- Fixed in SVN. ---- Additional Comments From martin@ximian.com 2006-10-04 18:18:35 MST ---- Fixed in SVN. Imported an attachment (id=169603) Unknown operating system unknown. Setting to default OS "Other".