@@ -581,11 +581,8 @@ bool InterpCompiler::CheckStackHelper(int n)
581
581
void InterpCompiler::PushTypeExplicit (StackType stackType, CORINFO_CLASS_HANDLE clsHnd, int size)
582
582
{
583
583
EnsureStack (1 );
584
- m_pStackPointer->type = stackType;
585
- m_pStackPointer->clsHnd = clsHnd;
586
- m_pStackPointer->size = ALIGN_UP_TO (size, INTERP_STACK_SLOT_SIZE);
587
- int var = CreateVarExplicit (g_interpTypeFromStackType[stackType], clsHnd, size);
588
- m_pStackPointer->var = var;
584
+ int32_t var = CreateVarExplicit (g_interpTypeFromStackType[stackType], clsHnd, size);
585
+ new (m_pStackPointer) StackInfo (stackType, clsHnd, var);
589
586
m_pStackPointer++;
590
587
}
591
588
@@ -1288,9 +1285,8 @@ void InterpCompiler::EmitConv(StackInfo *sp, StackType type, InterpOpcode convOp
1288
1285
InterpInst *newInst = AddIns (convOp);
1289
1286
1290
1287
newInst->SetSVar (sp->var );
1291
- new (sp) StackInfo (type);
1292
1288
int32_t var = CreateVarExplicit (g_interpTypeFromStackType[type], NULL , INTERP_STACK_SLOT_SIZE);
1293
- sp-> var = var;
1289
+ new (sp) StackInfo (type, NULL , var) ;
1294
1290
newInst->SetDVar (var);
1295
1291
1296
1292
// NOTE: We rely on m_pLastNewIns == newInst upon return from this function. Make sure you preserve that if you change anything.
@@ -1708,10 +1704,7 @@ bool InterpCompiler::InitializeClauseBuildingBlocks(CORINFO_METHOD_INFO* methodI
1708
1704
// Initialize the filter stack state. It initially contains the exception object.
1709
1705
pFilterBB->stackHeight = 1 ;
1710
1706
pFilterBB->pStackState = (StackInfo*)AllocMemPool (sizeof (StackInfo));
1711
- pFilterBB->pStackState [0 ].type = StackTypeO;
1712
- pFilterBB->pStackState [0 ].size = INTERP_STACK_SLOT_SIZE;
1713
- pFilterBB->pStackState [0 ].clsHnd = NULL ;
1714
- pFilterBB->pStackState [0 ].var = pFilterBB->clauseVarIndex ;
1707
+ new (pFilterBB->pStackState ) StackInfo (StackTypeO, NULL , pFilterBB->clauseVarIndex );
1715
1708
1716
1709
// Find and mark all basic blocks that are part of the filter region.
1717
1710
for (uint32_t j = clause.FilterOffset ; j < clause.HandlerOffset ; j++)
@@ -1740,10 +1733,7 @@ bool InterpCompiler::InitializeClauseBuildingBlocks(CORINFO_METHOD_INFO* methodI
1740
1733
// Initialize the catch / filtered handler stack state. It initially contains the exception object.
1741
1734
pCatchBB->stackHeight = 1 ;
1742
1735
pCatchBB->pStackState = (StackInfo*)AllocMemPool (sizeof (StackInfo));
1743
- pCatchBB->pStackState [0 ].type = StackTypeO;
1744
- pCatchBB->pStackState [0 ].size = INTERP_STACK_SLOT_SIZE;
1745
- pCatchBB->pStackState [0 ].var = pCatchBB->clauseVarIndex ;
1746
- pCatchBB->pStackState [0 ].clsHnd = NULL ;
1736
+ new (pCatchBB->pStackState ) StackInfo (StackTypeO, NULL , pCatchBB->clauseVarIndex );
1747
1737
}
1748
1738
}
1749
1739
@@ -2315,7 +2305,7 @@ int InterpCompiler::EmitGenericHandleAsVar(const CORINFO_GENERICHANDLE_RESULT &e
2315
2305
return resultVar;
2316
2306
}
2317
2307
2318
- void InterpCompiler::EmitCall (CORINFO_RESOLVED_TOKEN* constrainedClass , bool readonly, bool tailcall, bool newObj, bool isCalli)
2308
+ void InterpCompiler::EmitCall (CORINFO_RESOLVED_TOKEN* pConstrainedToken , bool readonly, bool tailcall, bool newObj, bool isCalli)
2319
2309
{
2320
2310
uint32_t token = getU4LittleEndian (m_ip + 1 );
2321
2311
bool isVirtual = (*m_ip == CEE_CALLVIRT);
@@ -2345,19 +2335,38 @@ void InterpCompiler::EmitCall(CORINFO_RESOLVED_TOKEN* constrainedClass, bool rea
2345
2335
}
2346
2336
else
2347
2337
{
2348
-
2349
2338
ResolveToken (token, newObj ? CORINFO_TOKENKIND_NewObj : CORINFO_TOKENKIND_Method, &resolvedCallToken);
2350
-
2339
+
2351
2340
CORINFO_CALLINFO_FLAGS flags = (CORINFO_CALLINFO_FLAGS)(CORINFO_CALLINFO_ALLOWINSTPARAM | CORINFO_CALLINFO_SECURITYCHECKS | CORINFO_CALLINFO_DISALLOW_STUB);
2352
2341
if (isVirtual)
2353
2342
flags = (CORINFO_CALLINFO_FLAGS)(flags | CORINFO_CALLINFO_CALLVIRT);
2354
2343
2355
- m_compHnd->getCallInfo (&resolvedCallToken, constrainedClass , m_methodInfo->ftn , flags, &callInfo);
2344
+ m_compHnd->getCallInfo (&resolvedCallToken, pConstrainedToken , m_methodInfo->ftn , flags, &callInfo);
2356
2345
if (EmitCallIntrinsics (callInfo.hMethod , callInfo.sig ))
2357
2346
{
2358
2347
m_ip += 5 ;
2359
2348
return ;
2360
2349
}
2350
+
2351
+ if (callInfo.thisTransform != CORINFO_NO_THIS_TRANSFORM)
2352
+ {
2353
+ assert (pConstrainedToken != NULL );
2354
+ StackInfo *pThisStackInfo = m_pStackPointer - callInfo.sig .numArgs - 1 ;
2355
+ if (callInfo.thisTransform == CORINFO_BOX_THIS)
2356
+ {
2357
+ EmitBox (pThisStackInfo, pConstrainedToken->hClass , true );
2358
+ }
2359
+ else
2360
+ {
2361
+ assert (callInfo.thisTransform == CORINFO_DEREF_THIS);
2362
+ AddIns (INTOP_LDIND_I);
2363
+ m_pLastNewIns->SetSVar (pThisStackInfo->var );
2364
+ m_pLastNewIns->data [0 ] = 0 ;
2365
+ int32_t var = CreateVarExplicit (InterpTypeO, pConstrainedToken->hClass , INTERP_STACK_SLOT_SIZE);
2366
+ new (pThisStackInfo) StackInfo (StackTypeO, pConstrainedToken->hClass , var);
2367
+ m_pLastNewIns->SetDVar (pThisStackInfo->var );
2368
+ }
2369
+ }
2361
2370
}
2362
2371
2363
2372
if (newObj && (callInfo.classFlags & CORINFO_FLG_VAROBJSIZE))
@@ -2889,12 +2898,27 @@ void InterpCompiler::EmitLdLocA(int32_t var)
2889
2898
m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
2890
2899
}
2891
2900
2901
+ void InterpCompiler::EmitBox (StackInfo* pStackInfo, CORINFO_CLASS_HANDLE clsHnd, bool argByRef)
2902
+ {
2903
+ CORINFO_CLASS_HANDLE boxedClsHnd = m_compHnd->getTypeForBox (clsHnd);
2904
+ CorInfoHelpFunc helpFunc = m_compHnd->getBoxHelper (clsHnd);
2905
+ AddIns (argByRef ? INTOP_BOX_PTR : INTOP_BOX);
2906
+ m_pLastNewIns->SetSVar (pStackInfo->var );
2907
+
2908
+ int32_t var = CreateVarExplicit (InterpTypeO, boxedClsHnd, INTERP_STACK_SLOT_SIZE);
2909
+ new (pStackInfo) StackInfo (StackTypeO, boxedClsHnd, var);
2910
+
2911
+ m_pLastNewIns->SetDVar (pStackInfo->var );
2912
+ m_pLastNewIns->data [0 ] = GetDataItemIndex (clsHnd);
2913
+ m_pLastNewIns->data [1 ] = GetDataItemIndexForHelperFtn (helpFunc);
2914
+ }
2915
+
2892
2916
int InterpCompiler::GenerateCode (CORINFO_METHOD_INFO* methodInfo)
2893
2917
{
2894
2918
bool readonly = false ;
2895
2919
bool tailcall = false ;
2896
2920
bool volatile_ = false ;
2897
- CORINFO_RESOLVED_TOKEN* constrainedClass = NULL ;
2921
+ CORINFO_RESOLVED_TOKEN* pConstrainedToken = NULL ;
2898
2922
CORINFO_RESOLVED_TOKEN constrainedToken;
2899
2923
uint8_t *codeEnd;
2900
2924
int numArgs = m_methodInfo->args .hasThis () + m_methodInfo->args .numArgs ;
@@ -4057,21 +4081,21 @@ int InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
4057
4081
break ;
4058
4082
case CEE_CALLVIRT:
4059
4083
case CEE_CALL:
4060
- EmitCall (constrainedClass , readonly, tailcall, false /* newObj*/ , false /* isCalli*/ );
4061
- constrainedClass = NULL ;
4084
+ EmitCall (pConstrainedToken , readonly, tailcall, false /* newObj*/ , false /* isCalli*/ );
4085
+ pConstrainedToken = NULL ;
4062
4086
readonly = false ;
4063
4087
tailcall = false ;
4064
4088
break ;
4065
4089
case CEE_CALLI:
4066
- EmitCall (NULL /* constrainedClass */ , false /* readonly*/ , false /* tailcall*/ , false /* newObj*/ , true /* isCalli*/ );
4067
- constrainedClass = NULL ;
4090
+ EmitCall (NULL /* pConstrainedToken */ , false /* readonly*/ , false /* tailcall*/ , false /* newObj*/ , true /* isCalli*/ );
4091
+ pConstrainedToken = NULL ;
4068
4092
readonly = false ;
4069
4093
tailcall = false ;
4070
4094
break ;
4071
4095
case CEE_NEWOBJ:
4072
4096
{
4073
- EmitCall (NULL /* constrainedClass */ , false /* readonly*/ , false /* tailcall*/ , true /* newObj*/ , false /* isCalli*/ );
4074
- constrainedClass = NULL ;
4097
+ EmitCall (NULL /* pConstrainedToken */ , false /* readonly*/ , false /* tailcall*/ , true /* newObj*/ , false /* isCalli*/ );
4098
+ pConstrainedToken = NULL ;
4075
4099
readonly = false ;
4076
4100
tailcall = false ;
4077
4101
break ;
@@ -4448,12 +4472,9 @@ int InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
4448
4472
{
4449
4473
uint32_t token = getU4LittleEndian (m_ip + 1 );
4450
4474
4451
- constrainedToken.tokenScope = m_compScopeHnd;
4452
- constrainedToken.tokenContext = METHOD_BEING_COMPILED_CONTEXT ();
4453
- constrainedToken.token = token;
4454
- constrainedToken.tokenType = CORINFO_TOKENKIND_Constrained;
4455
- m_compHnd->resolveToken (&constrainedToken);
4456
- constrainedClass = &constrainedToken;
4475
+ ResolveToken (token, CORINFO_TOKENKIND_Constrained, &constrainedToken);
4476
+
4477
+ pConstrainedToken = &constrainedToken;
4457
4478
m_ip += 5 ;
4458
4479
break ;
4459
4480
}
@@ -4546,8 +4567,8 @@ int InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
4546
4567
ResolveToken (token, CORINFO_TOKENKIND_Method, &resolvedToken);
4547
4568
4548
4569
CORINFO_CALL_INFO callInfo;
4549
- m_compHnd->getCallInfo (&resolvedToken, constrainedClass , m_methodInfo->ftn , (CORINFO_CALLINFO_FLAGS)(CORINFO_CALLINFO_SECURITYCHECKS| CORINFO_CALLINFO_LDFTN), &callInfo);
4550
- constrainedClass = NULL ;
4570
+ m_compHnd->getCallInfo (&resolvedToken, pConstrainedToken , m_methodInfo->ftn , (CORINFO_CALLINFO_FLAGS)(CORINFO_CALLINFO_SECURITYCHECKS| CORINFO_CALLINFO_LDFTN), &callInfo);
4571
+ pConstrainedToken = NULL ;
4551
4572
4552
4573
if (callInfo.kind == CORINFO_CALL)
4553
4574
{
@@ -4650,17 +4671,11 @@ int InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
4650
4671
4651
4672
case CEE_BOX:
4652
4673
{
4674
+ CORINFO_CLASS_HANDLE clsHnd = ResolveClassToken (getU4LittleEndian (m_ip + 1 ));
4653
4675
CHECK_STACK (1 );
4654
4676
m_pStackPointer -= 1 ;
4655
- CORINFO_CLASS_HANDLE clsHnd = ResolveClassToken (getU4LittleEndian (m_ip + 1 ));
4656
- CORINFO_CLASS_HANDLE boxedClsHnd = m_compHnd->getTypeForBox (clsHnd);
4657
- CorInfoHelpFunc helpFunc = m_compHnd->getBoxHelper (clsHnd);
4658
- AddIns (INTOP_BOX);
4659
- m_pLastNewIns->SetSVar (m_pStackPointer[0 ].var );
4660
- PushStackType (StackTypeO, boxedClsHnd);
4661
- m_pLastNewIns->SetDVar (m_pStackPointer[-1 ].var );
4662
- m_pLastNewIns->data [0 ] = GetDataItemIndex (clsHnd);
4663
- m_pLastNewIns->data [1 ] = GetDataItemIndexForHelperFtn (helpFunc);
4677
+ EmitBox (m_pStackPointer, clsHnd, false );
4678
+ m_pStackPointer++;
4664
4679
m_ip += 5 ;
4665
4680
break ;
4666
4681
}
0 commit comments