@@ -3095,7 +3095,7 @@ void InterpCompiler::EmitCall(CORINFO_RESOLVED_TOKEN* pConstrainedToken, bool re
3095
3095
break ;
3096
3096
3097
3097
case CORINFO_VIRTUALCALL_LDVIRTFTN:
3098
- if ((callInfo.sig .sigInst .methInstCount != 0 ) || (m_compHnd->getClassAttribs (resolvedCallToken. hClass ) & CORINFO_FLG_SHAREDINST))
3098
+ if ((callInfo.sig .sigInst .methInstCount != 0 ) || (m_compHnd->getMethodAttribs (callInfo. hMethod ) & CORINFO_FLG_SHAREDINST))
3099
3099
{
3100
3100
assert (extraParamArgLocation == INT_MAX);
3101
3101
// We should not have a type argument for the ldvirtftn path since we don't know
@@ -5805,17 +5805,34 @@ void InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
5805
5805
CorInfoType elemCorType = m_compHnd->asCorInfoType (elemClsHnd);
5806
5806
5807
5807
m_pStackPointer -= 2 ;
5808
- if (elemCorType == CORINFO_TYPE_CLASS)
5808
+ if (( elemCorType == CORINFO_TYPE_CLASS) && !readonly )
5809
5809
{
5810
- AddIns (INTOP_LDELEMA_REF);
5811
- m_pLastNewIns->SetSVars2 (m_pStackPointer[0 ].var , m_pStackPointer[1 ].var );
5812
- PushInterpType (InterpTypeByRef, elemClsHnd);
5813
- m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
5814
- m_pLastNewIns->data [0 ] = m_compHnd->getClassSize (elemClsHnd);
5815
- m_pLastNewIns->data [1 ] = GetDataItemIndex (elemClsHnd);
5810
+ CORINFO_GENERICHANDLE_RESULT embedInfo;
5811
+ m_compHnd->embedGenericHandle (&resolvedToken, false , m_methodInfo->ftn , &embedInfo);
5812
+ DeclarePointerIsClass ((CORINFO_CLASS_HANDLE)embedInfo.compileTimeHandle );
5813
+
5814
+ if (embedInfo.lookup .lookupKind .needsRuntimeLookup )
5815
+ {
5816
+ GenericHandleData handleData = GenericHandleToGenericHandleData (embedInfo);
5817
+
5818
+ AddIns (INTOP_LDELEMA_REF_GENERIC);
5819
+ m_pLastNewIns->SetSVars3 (m_pStackPointer[0 ].var , m_pStackPointer[1 ].var , handleData.genericVar );
5820
+ PushInterpType (InterpTypeByRef, elemClsHnd);
5821
+ m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
5822
+ m_pLastNewIns->data [0 ] = handleData.dataItemIndex ;
5823
+ }
5824
+ else
5825
+ {
5826
+ AddIns (INTOP_LDELEMA_REF);
5827
+ m_pLastNewIns->SetSVars2 (m_pStackPointer[0 ].var , m_pStackPointer[1 ].var );
5828
+ PushInterpType (InterpTypeByRef, elemClsHnd);
5829
+ m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
5830
+ m_pLastNewIns->data [0 ] = GetDataItemIndex (elemClsHnd);
5831
+ }
5816
5832
}
5817
5833
else
5818
5834
{
5835
+ readonly = false ; // If readonly was set, it is no longer needed as its been handled.
5819
5836
AddIns (INTOP_LDELEMA);
5820
5837
m_pLastNewIns->SetSVars2 (m_pStackPointer[0 ].var , m_pStackPointer[1 ].var );
5821
5838
PushInterpType (InterpTypeByRef, elemClsHnd);
0 commit comments