[Mono-dev] Methods implementing interfaces are emitted twice

Gert Driesen gert.driesen at telenet.be
Mon May 29 11:05:08 EDT 2006


Hi,

I noticed that methods that implement an interface member are emitted twice
by mcs: once as a normal method and once as an explicit inteface
implementation. 

For example, take a look at the IL for System.String in mscorlib. It
contains the following methods:

    // method line 741
    .method private final  virtual  hidebysig  newslot 
           instance default string System.IConvertible.ToString (class
System.IFormatProvider format)  cil managed 
    {
        // Method begins at RVA 0xa740
	.override class System.IConvertible::ToString
	// Code size 2 (0x2)
	.maxstack 8
	IL_0000:  ldarg.0 
	IL_0001:  ret 
    } // end of method String::instance default string
System.IConvertible.ToString (class System.IFormatProvider format) 

    .method public hidebysig 
           instance default string ToString (class System.IFormatProvider
provider)  cil managed 
    {
        // Method begins at RVA 0xb7ec
	// Code size 2 (0x2)
	.maxstack 8
	IL_0000:  ldarg.0 
	IL_0001:  ret 
    } // end of method String::instance default string ToString (class
System.IFormatProvider provider) 

while there should have only been this method:

	.method public hidebysig newslot virtual final 
        	instance string  ToString(class System.IFormatProvider
provider) cil managed
	{
	  .maxstack  8
	  IL_0000:  ldarg.0
	  IL_0001:  ret
	}

Problem is that I can only see evidence of this in mscorlib, and I cannot
reproduce it using another custom-built assembly.

Can someone look into this ?

As a result of this issue, we get quite some bogus warnings in the class
status pages for the NET_1_1 profile
(http://mono.ximian.com/class-status/mono-HEAD-vs-fx-1-1/class-status-mscorl
ib.html), as corcompare is complaining that the Mono methods are not virtual
final.

As for the class status page warnings: there's an easy workaround to get rid
of the warnings, but it would need a rebuild of the masterinfos for MS.NET.

Let me know if you want me to submit a patch for that workaround (but I'd
prefer a real fix for the issue instead).

Gert




More information about the Mono-devel-list mailing list