Please do not reply to this email- if you want to comment on the bug, go to the URL shown below and enter your comments there.
Changed by [EMAIL PROTECTED] http://bugzilla.ximian.com/show_bug.cgi?id=81564 --- shadow/81564 2007-05-08 13:50:40.000000000 -0400 +++ shadow/81564.tmp.5306 2007-05-08 13:50:40.000000000 -0400 @@ -0,0 +1,127 @@ +Bug#: 81564 +Product: Mono: Compilers +Version: 1.2 +OS: All +OS Details: Win XP +Status: NEW +Resolution: +Severity: +Priority: Blocker +Component: C# +AssignedTo: [EMAIL PROTECTED] +ReportedBy: [EMAIL PROTECTED] +QAContact: [EMAIL PROTECTED] +TargetMilestone: --- +URL: +Cc: +Summary: Mcs causes inifinite recursion + +f I compile the OnUpdate method with mcs, I get an infinite recursion due +to the compiler generating a callvirt instead of call. +The Microsoft compiler doesn't have the same issue. +Note that if I just have a virtual method Print1, both mcs and csc generate +the same code (call instance void Test1.TestItem1::Print()). + +Here's the ildasm output for the TestItem2::add_OnUpdate (mcs vs csc): + +mcs: +.method public hidebysig specialname virtual + instance void add_OnUpdate(class Test1.TestDelegate1 'value') cil +managed +{ + // Code size 18 (0x12) + .maxstack 8 + IL_0000: ldstr "OnUpdate add 2" + IL_0005: call void [mscorlib]System.Console::WriteLine(string) + IL_000a: ldarg.0 + IL_000b: ldarg.1 + IL_000c: callvirt instance void Test1.TestItem1::add_OnUpdate(class +Test1.TestDelegate1) + IL_0011: ret +} // end of method TestItem2::add_OnUpdate + +csc: +.method public hidebysig specialname virtual + instance void add_OnUpdate(class Test1.TestDelegate1 'value') cil +managed +{ + // Code size 18 (0x12) + .maxstack 2 + IL_0000: ldstr "OnUpdate add 2" + IL_0005: call void [mscorlib]System.Console::WriteLine(string) + IL_000a: ldarg.0 + IL_000b: ldarg.1 + IL_000c: call instance void Test1.TestItem1::add_OnUpdate(class +Test1.TestDelegate1) + IL_0011: ret +} // end of method TestItem2::add_OnUpdate + +and the test code: + +namespace Test1 +{ + public delegate void TestDelegate1(TestItem item); + + public interface TestItem + { + event TestDelegate1 OnUpdate; + } + + public class TestItem1 : TestItem + { + private TestDelegate1 delegates1; + + public TestItem1() + { + } + + public virtual void Print() + { + System.Console.WriteLine("Print 1"); + } + + public virtual event TestDelegate1 OnUpdate + { + add + { + System.Console.WriteLine("OnUpdate add 1"); + + delegates1 += value; + } + remove + { + System.Console.WriteLine("OnUpdate remove 2"); + delegates1 -= value; + } + } + + } + + public class TestItem2 : TestItem1 + { + public TestItem2() + : base() + { + } + + public override void Print() + { + System.Console.WriteLine("Print 2"); + base.Print(); + } + + public override event TestDelegate1 OnUpdate + { + add + { + System.Console.WriteLine("OnUpdate add 2"); + base.OnUpdate += value; + } + remove + { + System.Console.WriteLine("OnUpdate remove 2"); + base.OnUpdate -= value; + } + } + } +} _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
