Bug 320875 (MONO78130) - [ANONYMOUS METHODS] (FIXED) Nested anonymous methods
Summary: [ANONYMOUS METHODS] (FIXED) Nested anonymous methods
Status: RESOLVED FIXED
Alias: MONO78130
Product: Mono: Compilers
Classification: Mono
Component: C# (show other bugs)
Version: 1.0
Hardware: Other Other
: P3 - Medium : Minor
Target Milestone: ---
Assignee: Martin Baulig
QA Contact: Mono Bugs
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-04-18 04:46 UTC by Atsushi Enomoto
Modified: 2007-09-15 21:24 UTC (History)
0 users

See Also:
Found By: ---
Services Priority:
Business Priority:
Blocker: ---
Marketing QA Status: ---
IT Deployment: ---


Attachments
Partial patch for the nested anonymous method that references "this"; Patch regresses other code (6.59 KB, patch)
2006-06-13 08:36 UTC, Thomas Wiest
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Wiest 2007-09-15 19:55:22 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".