[Mono-dev] Infinite recursion (mcs 1.2.3.1 vs Microsoft csc)

D M dm_mono_dev1 at yahoo.com
Mon May 7 17:40:53 EDT 2007


Hi,

If 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;                
            }
        }
    }
}

Thanks,

Dan
 
---------------------------------
Bored stiff? Loosen up...
Download and play hundreds of games for free on Yahoo! Games.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20070507/470c8d14/attachment.html 


More information about the Mono-devel-list mailing list