@@ -1240,11 +1240,9 @@ InterpCompiler::InterpCompiler(COMP_HANDLE compHnd,
12401240 m_compScopeHnd = methodInfo->scope ;
12411241 m_compHnd = compHnd;
12421242 m_methodInfo = methodInfo;
1243-
1244- #ifdef DEBUG
1245-
12461243 m_classHnd = compHnd->getMethodClass (m_methodHnd);
12471244
1245+ #ifdef DEBUG
12481246 m_methodName = ::PrintMethodName (compHnd, m_classHnd, m_methodHnd, &m_methodInfo->args ,
12491247 /* includeAssembly */ false ,
12501248 /* includeClass */ true ,
@@ -2329,7 +2327,7 @@ void InterpCompiler::EmitPushHelperCall_2(const CorInfoHelpFunc ftn, const CORIN
23292327
23302328 if (handleData.argType == HelperArgType::GenericResolution)
23312329 {
2332- AddIns (INTOP_CALL_HELPER_P_GP );
2330+ AddIns (INTOP_CALL_HELPER_P_GS );
23332331 m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (ftn);
23342332 m_pLastNewIns->data [1 ] = handleData.dataItemIndex ;
23352333
@@ -2338,7 +2336,7 @@ void InterpCompiler::EmitPushHelperCall_2(const CorInfoHelpFunc ftn, const CORIN
23382336 }
23392337 else
23402338 {
2341- AddIns (INTOP_CALL_HELPER_P_PP );
2339+ AddIns (INTOP_CALL_HELPER_P_PS );
23422340 m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (ftn);
23432341 m_pLastNewIns->data [1 ] = handleData.dataItemIndex ;
23442342
@@ -2383,7 +2381,7 @@ void InterpCompiler::EmitPushUnboxAnyNullable(const CORINFO_GENERICHANDLE_RESULT
23832381
23842382 if (handleData.argType == HelperArgType::GenericResolution)
23852383 {
2386- AddIns (INTOP_CALL_HELPER_V_AGP );
2384+ AddIns (INTOP_CALL_HELPER_V_AGS );
23872385 m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (CORINFO_HELP_UNBOX_NULLABLE);
23882386 m_pLastNewIns->data [1 ] = handleData.dataItemIndex ;
23892387
@@ -2392,7 +2390,7 @@ void InterpCompiler::EmitPushUnboxAnyNullable(const CORINFO_GENERICHANDLE_RESULT
23922390 }
23932391 else
23942392 {
2395- AddIns (INTOP_CALL_HELPER_V_APP );
2393+ AddIns (INTOP_CALL_HELPER_V_APS );
23962394 m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (CORINFO_HELP_UNBOX_NULLABLE);
23972395 m_pLastNewIns->data [1 ] = handleData.dataItemIndex ;
23982396
@@ -3079,6 +3077,13 @@ void InterpCompiler::EmitStaticFieldAddress(CORINFO_FIELD_INFO *pFieldInfo, CORI
30793077 case CORINFO_FIELD_STATIC_ADDRESS:
30803078 case CORINFO_FIELD_STATIC_RVA_ADDRESS:
30813079 {
3080+ if ((pFieldInfo->fieldFlags & CORINFO_FLG_FIELD_INITCLASS) != 0 )
3081+ {
3082+ CORINFO_GENERICHANDLE_RESULT embedInfo;
3083+ m_compHnd->embedGenericHandle (pResolvedToken, true , m_methodInfo->ftn , &embedInfo);
3084+ EmitPushHelperCall (CORINFO_HELP_INITCLASS, embedInfo, StackTypeI, NULL );
3085+ m_pStackPointer--; // The InitClass helper doesn't actually return anything, so we pop the stack
3086+ }
30823087 // const field address
30833088 assert (pFieldInfo->fieldLookup .accessType == IAT_VALUE);
30843089 AddIns (INTOP_LDPTR);
@@ -3107,6 +3112,17 @@ void InterpCompiler::EmitStaticFieldAddress(CORINFO_FIELD_INFO *pFieldInfo, CORI
31073112 case CORINFO_HELP_GETDYNAMIC_NONGCTHREADSTATIC_BASE:
31083113 helperArg = (void *)m_compHnd->getClassThreadStaticDynamicInfo (pResolvedToken->hClass );
31093114 break ;
3115+ case CORINFO_HELP_GETDYNAMIC_GCSTATIC_BASE:
3116+ case CORINFO_HELP_GETDYNAMIC_NONGCSTATIC_BASE:
3117+ case CORINFO_HELP_GETPINNED_GCSTATIC_BASE:
3118+ case CORINFO_HELP_GETPINNED_NONGCSTATIC_BASE:
3119+ case CORINFO_HELP_GETDYNAMIC_GCSTATIC_BASE_NOCTOR:
3120+ case CORINFO_HELP_GETDYNAMIC_NONGCSTATIC_BASE_NOCTOR:
3121+ case CORINFO_HELP_GETPINNED_GCSTATIC_BASE_NOCTOR:
3122+ case CORINFO_HELP_GETPINNED_NONGCSTATIC_BASE_NOCTOR:
3123+ helperArg = (void *)m_compHnd->getClassStaticDynamicInfo (pResolvedToken->hClass );
3124+ break ;
3125+
31103126 default :
31113127 // TODO
31123128 assert (0 );
@@ -3130,11 +3146,9 @@ void InterpCompiler::EmitStaticFieldAddress(CORINFO_FIELD_INFO *pFieldInfo, CORI
31303146 }
31313147 case CORINFO_FIELD_STATIC_GENERICS_STATIC_HELPER:
31323148 {
3133- AddIns (INTOP_CALL_HELPER_P_P);
3134- m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (pFieldInfo->helper );
3135- m_pLastNewIns->data [1 ] = GetDataItemIndex (pResolvedToken->tokenContext );
3136- PushInterpType (InterpTypeByRef, NULL );
3137- m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
3149+ CORINFO_GENERICHANDLE_RESULT embedInfo;
3150+ m_compHnd->embedGenericHandle (pResolvedToken, true , m_methodInfo->ftn , &embedInfo);
3151+ EmitPushHelperCall (pFieldInfo->helper , embedInfo, StackTypeByRef, NULL );
31383152
31393153 // Add field offset
31403154 m_pStackPointer--;
@@ -3299,6 +3313,73 @@ void InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
32993313 // adding an opcode.
33003314 AddIns (INTOP_SAFEPOINT);
33013315
3316+ CorInfoInitClassResult initOnFunctionStart = m_compHnd->initClass (NULL , NULL , METHOD_BEING_COMPILED_CONTEXT ());
3317+ if ((initOnFunctionStart & CORINFO_INITCLASS_USE_HELPER) == CORINFO_INITCLASS_USE_HELPER)
3318+ {
3319+ // This happens if the method is on a type which is not beforefieldinit,
3320+ // and the type is not initialized at the start of the method.
3321+
3322+ CORINFO_LOOKUP_KIND kind;
3323+ m_compHnd->getLocationOfThisType (m_methodHnd, &kind);
3324+
3325+ if (!kind.needsRuntimeLookup )
3326+ {
3327+ AddIns (INTOP_CALL_HELPER_P_P);
3328+ m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (CORINFO_HELP_INITCLASS);
3329+ m_pLastNewIns->data [1 ] = GetDataItemIndex (m_classHnd);
3330+ PushInterpType (InterpTypeI, NULL );
3331+ m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
3332+ m_pStackPointer--;
3333+ }
3334+ else
3335+ {
3336+ switch (kind.runtimeLookupKind )
3337+ {
3338+ case CORINFO_LOOKUP_CLASSPARAM:
3339+ AddIns (INTOP_CALL_HELPER_P_S);
3340+ m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (CORINFO_HELP_INITCLASS);
3341+ m_pLastNewIns->SetSVar (getParamArgIndex ());
3342+ PushInterpType (InterpTypeI, NULL );
3343+ m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
3344+ m_pStackPointer--;
3345+ break ;
3346+ case CORINFO_LOOKUP_THISOBJ:
3347+ {
3348+ AddIns (INTOP_LDIND_I);
3349+ m_pLastNewIns->data [0 ] = 0 ; // The offset is 0 for the this pointer
3350+ m_pLastNewIns->SetSVar (getParamArgIndex ());
3351+ PushInterpType (InterpTypeI, NULL );
3352+ int thisObjMethodTablePtrVar = m_pStackPointer[-1 ].var ;
3353+ m_pLastNewIns->SetDVar (thisObjMethodTablePtrVar);
3354+ m_pStackPointer--;
3355+
3356+ AddIns (INTOP_CALL_HELPER_P_SP);
3357+ m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (CORINFO_HELP_INITINSTCLASS);
3358+ m_pLastNewIns->data [1 ] = GetDataItemIndex (m_methodHnd);
3359+ m_pLastNewIns->SetSVar (thisObjMethodTablePtrVar);
3360+ PushInterpType (InterpTypeI, NULL );
3361+ m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
3362+ m_pStackPointer--;
3363+ break ;
3364+ }
3365+ case CORINFO_LOOKUP_METHODPARAM:
3366+ {
3367+ AddIns (INTOP_CALL_HELPER_P_PS);
3368+ m_pLastNewIns->data [0 ] = GetDataItemIndexForHelperFtn (CORINFO_HELP_INITINSTCLASS);
3369+ m_pLastNewIns->data [1 ] = GetDataItemIndex (0 );
3370+ m_pLastNewIns->SetSVar (getParamArgIndex ());
3371+ PushInterpType (InterpTypeI, NULL );
3372+ m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
3373+ m_pStackPointer--;
3374+ break ;
3375+ }
3376+ default :
3377+ assert (0 );
3378+ break ;
3379+ }
3380+ }
3381+ }
3382+
33023383 linkBBlocks = true ;
33033384 needsRetryEmit = false ;
33043385
@@ -5926,6 +6007,11 @@ void InterpCompiler::PrintInsData(InterpInst *ins, int32_t insOffset, const int3
59266007 PrintClassName (ch);
59276008 break ;
59286009 }
6010+ case InterpOpHelperFtnNoArgs:
6011+ {
6012+ PrintHelperFtn ((void *)GetDataItemAtIndex (pData[0 ]));
6013+ break ;
6014+ }
59296015 case InterpOpHelperFtn:
59306016 {
59316017 PrintHelperFtn ((void *)GetDataItemAtIndex (pData[0 ]));
0 commit comments