Fix generic non-virtual method call in Ready-to-Run images
authorJohnChen0 <jochen@microsoft.com>
Thu, 26 May 2016 22:07:00 +0000 (15:07 -0700)
committerJohn Chen <jochen@microsoft.com>
Fri, 27 May 2016 05:28:27 +0000 (22:28 -0700)
commit4fd217d564b743f995426de7bd642166e0a84849
tree4fbd1d4b3022b4795c5eabb0d454d3cc8448c72f
parent02eada1015063befd713e1bd60685f3a8bb38184
Fix generic non-virtual method call in Ready-to-Run images

Issue #5201 revealed a bug in the Ready-to-Run implementation.
This bug can cause the runtime to dispatch a method call to the
wrong target when all the following conditions are met:
* A shared generic method in a Ready-to-Run module calls a method
  in a shared generic class.
* The target is a non-virtual instance method, but is called through
  callvirt instruction (as C# compiler normally does).
* The target is in a different module.
* The target method is defined in a base class, while the actual
  object instance is of a derived class.

This commit fixes this bug by changing a virtual call to a regular
call when the target is non-virtual.
src/vm/genericdict.cpp
src/vm/jitinterface.cpp
tests/src/readytorun/main.cs
tests/src/readytorun/test.cs