[Mono-dev] AOT and generics

Virgile Bello virgile.bello at gmail.com
Fri Jul 6 12:29:02 UTC 2012


During full AOT, It seems that if generics is a ref type, AOT is skipped
(which makes sense because most of the time it is not necessary, one
codegen for any ref type is usually enough).
However, if the class internally uses a struct based on the generic types,
it will fail at runtime.
Here is a simple example showcasing the issue:

public class B
{
    public void Test<T>()
    {
        System.Console.WriteLine(typeof(T));
    }
}

public class A<T>
{
    public void Test()
    {
        new B().Test<System.Collections.Generic.KeyValuePair<T, T>>();
    }
}


class P
{
    static void Main(string[] args)
    {
        new A<int>().Test();
        new A<string>().Test();
    }
}

If I run this program with full aot, it will fail.
new A<int> will work (AOT forced because value type)
However, new A<string> will generate a JIT exception (because even though
string is a ref type, A should be AOT for this specific type because
KeyValuePair inside A<T> needs to be JITed.)

But maybe I misunderstood the problem (or it is just a specific bug),
because this other case actually work (I was expecting it to have the same
issue):

public class B
{
    public void Test<T>()
    {

System.Console.WriteLine(typeof(System.Collections.Generic.KeyValuePair<T,
T>));
    }
}

public class A<T>
{
    public void Test()
    {
        new B().Test<T>();
    }
}


class P
{
    static void Main(string[] args)
    {
        new A<int>().Test();
        new A<string>().Test();
    }
}

Just wanted to check if I understood the issue right and if there would be
nothing preventing from fixing it?
I wouldn't mind taking a look at the sources by myself if necessary.

Virgile
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20120706/91c5c664/attachment.html>


More information about the Mono-devel-list mailing list