@@ -372,7 +372,6 @@ MethodDesc* TailCallHelp::CreateStoreArgsStub(TailCallInfo& info)
372
372
for (COUNT_T i = 0 ; i < info.ArgBufLayout .Values .GetCount (); i++)
373
373
{
374
374
const ArgBufferValue& arg = info.ArgBufLayout .Values [i];
375
- CorElementType ty = arg.TyHnd .GetSignatureCorElementType ();
376
375
377
376
emitOffs (arg.Offset );
378
377
pCode->EmitLDARG (i);
@@ -629,35 +628,63 @@ void TailCallHelp::CreateCallTargetStubSig(const TailCallInfo& info, SigBuilder*
629
628
#endif // _DEBUG
630
629
}
631
630
631
+ // Get TypeHandle for ByReference<System.Byte>
632
+ static TypeHandle GetByReferenceOfByteType ()
633
+ {
634
+ TypeHandle byteTH (CoreLibBinder::GetElementType (ELEMENT_TYPE_U1));
635
+ Instantiation byteInst (&byteTH, 1 );
636
+ TypeHandle th = TypeHandle (CoreLibBinder::GetClass (CLASS__BYREFERENCE)).Instantiate (byteInst);
637
+ return th;
638
+ }
639
+
640
+ // Get MethodDesc* for ByReference<System.Byte>::get_Value
641
+ static MethodDesc* GetByReferenceOfByteValueGetter ()
642
+ {
643
+ MethodDesc* getter = CoreLibBinder::GetMethod (METHOD__BYREFERENCE__GET_VALUE);
644
+ getter =
645
+ MethodDesc::FindOrCreateAssociatedMethodDesc (
646
+ getter,
647
+ GetByReferenceOfByteType ().GetMethodTable (),
648
+ false ,
649
+ Instantiation (),
650
+ TRUE );
651
+
652
+ return getter;
653
+ }
654
+
655
+ // Get MethodDesc* for ByReference<System.Byte>::.ctor
656
+ static MethodDesc* GetByReferenceOfByteCtor ()
657
+ {
658
+ MethodDesc* ctor = CoreLibBinder::GetMethod (METHOD__BYREFERENCE__CTOR);
659
+ ctor =
660
+ MethodDesc::FindOrCreateAssociatedMethodDesc (
661
+ ctor,
662
+ GetByReferenceOfByteType ().GetMethodTable (),
663
+ false ,
664
+ Instantiation (),
665
+ TRUE );
666
+
667
+ return ctor;
668
+ }
669
+
632
670
void TailCallHelp::EmitLoadTyHnd (ILCodeStream* stream, TypeHandle tyHnd)
633
671
{
634
- CorElementType ty = tyHnd.GetSignatureCorElementType ();
635
672
if (tyHnd.IsByRef ())
636
- {
637
- // Note: we can use an "untracked" ldind.i here even with byrefs because
638
- // we are loading between two tracked positions.
639
- stream->EmitLDIND_I ();
640
- }
673
+ stream->EmitCALL (stream->GetToken (GetByReferenceOfByteValueGetter ()), 1 , 1 );
641
674
else
642
- {
643
- int token = stream->GetToken (tyHnd);
644
- stream->EmitLDOBJ (token);
645
- }
675
+ stream->EmitLDOBJ (stream->GetToken (tyHnd));
646
676
}
647
677
648
678
void TailCallHelp::EmitStoreTyHnd (ILCodeStream* stream, TypeHandle tyHnd)
649
679
{
650
- CorElementType ty = tyHnd.GetSignatureCorElementType ();
651
680
if (tyHnd.IsByRef ())
652
681
{
653
- // Note: we can use an "untracked" stind.i here even with byrefs because
654
- // we are storing between two tracked positions.
655
- stream->EmitSTIND_I ();
682
+ stream->EmitNEWOBJ (stream->GetToken (GetByReferenceOfByteCtor ()), 1 );
683
+ stream->EmitSTOBJ (stream->GetToken (GetByReferenceOfByteType ()));
656
684
}
657
685
else
658
686
{
659
- int token = stream->GetToken (tyHnd);
660
- stream->EmitSTOBJ (token);
687
+ stream->EmitSTOBJ (stream->GetToken (tyHnd));
661
688
}
662
689
}
663
690
0 commit comments