+ if (res->klass->generic_class)
+ context.class_inst = res->klass->generic_class->context.class_inst;
+ else if (res->klass->generic_container)
+ context.class_inst = res->klass->generic_container->context.class_inst;
+ context.method_inst = mono_method_get_context (method)->method_inst;
+
+ res = mono_class_inflate_generic_method (res, &context);
+ }
+
+ /* FIXME: only do this for methods which can be shared! */
+ if (res->is_inflated && mono_method_get_context (res)->method_inst &&
+ mono_class_generic_sharing_enabled (res->klass)) {
+ res = mono_marshal_get_static_rgctx_invoke (res);
+ }
+
+ return mono_ldftn (res);
+}
+
+void*
+mono_ldvirtfn (MonoObject *obj, MonoMethod *method)
+{
+ return ldvirtfn_internal (obj, method, FALSE);
+}
+
+void*
+mono_ldvirtfn_gshared (MonoObject *obj, MonoMethod *method)
+{
+ return ldvirtfn_internal (obj, method, TRUE);