https://bugzilla.novell.com/show_bug.cgi?id=659771
https://bugzilla.novell.com/show_bug.cgi?id=659771#c0 Summary: gmcs: anon method that captures local var in finalizer crashes compiler Classification: Mono Product: Mono: Compilers Version: 2.8.x Platform: Macintosh OS/Version: Mac OS X 10.6 Status: NEW Severity: Normal Priority: P5 - None Component: C# AssignedTo: [email protected] ReportedBy: [email protected] QAContact: [email protected] Found By: --- Blocker: --- User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.19 Safari/534.13 If I try to compile an anonymous method inside of a finalizer and it captures a variable in the local scope of the finalizer, gmcs crashes. Yes, I am aware of how weird it is to do this and how obscure a case it really is :) br...@brianmbp ~ $ cat t.cs using System; using System.Threading; class Foo { ~Foo() { int x = 1; new Thread(() => Console.WriteLine("{0}", x)); } public static void Main(string[] args) { } } br...@brianmbp ~ $ gmcs t.cs Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object at Mono.CSharp.HoistedVariable.GetFieldExpression (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.HoistedVariable.EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) [0x00000] in <filename unknown>:0 at Mono.CSharp.VariableReference.EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) [0x00000] in <filename unknown>:0 at Mono.CSharp.Assign.Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) [0x00000] in <filename unknown>:0 at Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.StatementExpression.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.TryFinally.EmitTryBody (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.ExceptionStatement.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.MethodData.Emit (Mono.CSharp.DeclSpace parent) [0x00000] in <filename unknown>:0 at Mono.CSharp.MethodOrOperator.Emit () [0x00000] in <filename unknown>:0 at Mono.CSharp.Destructor.Emit () [0x00000] in <filename unknown>:0 at Mono.CSharp.TypeContainer.EmitType () [0x00000] in <filename unknown>:0 at Mono.CSharp.RootContext.EmitCode () [0x00000] in <filename unknown>:0 at Mono.CSharp.Driver.Compile () [0x00000] in <filename unknown>:0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in <filename unknown>:0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in <filename unknown>:0 Reproducible: Always This is easily worked around by moving the the code containing the anon method to a separate method or static method on the class. -- Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the QA contact for the bug. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
