Bug 321859 (MONO79147) - [ANONYMOUS METHODS] (FIXED) Compiling nested anonymous delegate accessing 'this' fails
Summary: [ANONYMOUS METHODS] (FIXED) Compiling nested anonymous delegate accessing 'th...
Status: RESOLVED FIXED
Alias: MONO79147
Product: Mono: Compilers
Classification: Mono
Component: C# (show other bugs)
Version: 1.1
Hardware: Other Other
: P3 - Medium : Major
Target Milestone: ---
Assignee: Martin Baulig
QA Contact: Mono Bugs
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-08-23 04:36 UTC by horst.reiterer
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

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Wiest 2007-09-15 20:07:10 UTC


---- Reported by horst.reiterer@mind-breeze.com 2006-08-22 21:36:30 MST ----

Compiling the following testcase succeeds with csc but fails with gmcs
(1.1.13.6):

  public delegate void A();

  class B
  {
    void C()
    {
      A a = delegate {
        A b = delegate {
         B c = this;
        };
      };
    }

    static void Main()
    {
      B b = new B();
      b.C();
    }
  }

Steps to reproduce the problem:
1. gmcs testcase.cs

Actual Results:

Unhandled Exception: System.Exception: Trying to emit a local from a
different ILGenerator.
in <0x005e7> System.Reflection.Emit.ILGenerator:Emit (OpCode opcode,
System.Reflection.Emit.LocalBuilder lbuilder)
in <0x00072> 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 <0x000c6> 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 <0x0017f> 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 <0x000a8> Mono.CSharp.Block:DoEmit (Mono.CSharp.EmitContext ec)
in <0x00268> Mono.CSharp.Block:Emit (Mono.CSharp.EmitContext ec)
in <0x0001b> Mono.CSharp.EmitContext:EmitResolvedTopBlock
(Mono.CSharp.ToplevelBlock block, Boolean unreachable)
in <0x000a8> 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 <0x0017f> 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 <0x000a8> Mono.CSharp.Block:DoEmit (Mono.CSharp.EmitContext ec)
in <0x00268> Mono.CSharp.Block:Emit (Mono.CSharp.EmitContext ec)
in <0x0001b> Mono.CSharp.EmitContext:EmitResolvedTopBlock
(Mono.CSharp.ToplevelBlock block, Boolean unreachable)
in <0x0007e> Mono.CSharp.EmitContext:EmitTopBlock (IMethodData md,
Mono.CSharp.ToplevelBlock block)
in <0x001c0> Mono.CSharp.MethodData:Emit (Mono.CSharp.TypeContainer
container, Mono.CSharp.Attributable kind)
in <0x00030> Mono.CSharp.Method:Emit ()
in <0x0072d> Mono.CSharp.TypeContainer:EmitType ()
in <0x00226> Mono.CSharp.RootContext:EmitCode ()
in <0x00a9f> Mono.CSharp.Driver:MainDriver (System.String[] args)
in <0x00051> Mono.CSharp.Driver:Main (System.String[] args)

Expected Results:

Successful compilation.

How often does this happen? 

100 out of 100 times



---- Additional Comments From martin@ximian.com 2006-10-04 18:14:51 MST ----

Fixed in SVN.



---- Additional Comments From martin@ximian.com 2006-10-04 18:18:36 MST ----

Fixed in SVN.


Unknown bug field "cf_op_sys_details" encountered while moving bug
   <cf_op_sys_details>Red Hat Enterprise Linux 4 Update 2</cf_op_sys_details>
Unknown bug field "cf_version_details" encountered while moving bug
   <cf_version_details>1.1.13.6</cf_version_details>
Unknown operating system other. Setting to default OS "Other".