[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