Skip to content

Commit a3d6c25

Browse files
Convert JitHelper JIT_StrCns to QCall (#113674)
1 parent 316198d commit a3d6c25

12 files changed

+49
-47
lines changed

src/coreclr/System.Private.CoreLib/src/System/String.CoreCLR.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Diagnostics;
45
using System.Runtime.InteropServices;
56
using System.Runtime.CompilerServices;
67
using System.Text;
@@ -9,6 +10,20 @@ namespace System
910
{
1011
public partial class String
1112
{
13+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "String_StrCns")]
14+
private static unsafe partial string* StrCnsInternal(uint rid, IntPtr scopeHandle);
15+
16+
// implementation of CORINFO_HELP_STRCNS
17+
[StackTraceHidden]
18+
[DebuggerStepThrough]
19+
[DebuggerHidden]
20+
internal static unsafe string StrCns(uint rid, IntPtr scopeHandle)
21+
{
22+
string* ptr = StrCnsInternal(rid, scopeHandle);
23+
Debug.Assert(ptr != null);
24+
return *ptr;
25+
}
26+
1227
[MethodImpl(MethodImplOptions.InternalCall)]
1328
internal static extern string FastAllocateString(int length);
1429

src/coreclr/inc/jithelpers.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
DYNAMICJITHELPER(CORINFO_HELP_NEWARR_1_VC, JIT_NewArr1,METHOD__NIL)
9393
DYNAMICJITHELPER(CORINFO_HELP_NEWARR_1_ALIGN8, JIT_NewArr1,METHOD__NIL)
9494

95-
JITHELPER(CORINFO_HELP_STRCNS, JIT_StrCns, METHOD__NIL)
95+
DYNAMICJITHELPER(CORINFO_HELP_STRCNS, NULL, METHOD__STRING__STRCNS)
9696

9797
// Object model
9898
DYNAMICJITHELPER(CORINFO_HELP_INITCLASS, NULL, METHOD__INITHELPERS__INITCLASS)
@@ -150,7 +150,7 @@
150150
// GC support
151151
DYNAMICJITHELPER(CORINFO_HELP_STOP_FOR_GC, JIT_RareDisableHelper, METHOD__NIL)
152152
DYNAMICJITHELPER(CORINFO_HELP_POLL_GC, JIT_PollGC, METHOD__THREAD__POLLGC)
153-
153+
154154
JITHELPER(CORINFO_HELP_CHECK_OBJ, JIT_CheckObj, METHOD__NIL)
155155

156156
// GC Write barrier support

src/coreclr/vm/appdomainnative.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,22 @@ extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str)
129129
END_QCALL;
130130
}
131131

132+
extern "C" STRINGREF* QCALLTYPE String_StrCns(UINT32 rid, CORINFO_MODULE_HANDLE scopeHnd)
133+
{
134+
QCALL_CONTRACT;
135+
136+
STRINGREF* hndStr = NULL;
137+
138+
BEGIN_QCALL;
139+
140+
// Retrieve the handle to the CLR string object.
141+
hndStr = ConstructStringLiteral(scopeHnd, RidToToken(rid, mdtString));
142+
143+
END_QCALL;
144+
145+
return hndStr;
146+
}
147+
132148
extern "C" void QCALLTYPE String_Intern(QCall::StringHandleOnStack str)
133149
{
134150
QCALL_CONTRACT;

src/coreclr/vm/appdomainnative.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "qcall.h"
1818

19+
extern "C" STRINGREF* QCALLTYPE String_StrCns(UINT32 rid, CORINFO_MODULE_HANDLE scopeHnd);
1920
extern "C" void QCALLTYPE String_Intern(QCall::StringHandleOnStack str);
2021
extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str);
2122

src/coreclr/vm/ceeload.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,21 +2191,18 @@ void ModuleBase::InitializeStringData(DWORD token, EEStringData *pstrData, CQuic
21912191
}
21922192

21932193

2194-
OBJECTHANDLE ModuleBase::ResolveStringRef(DWORD token, void** ppPinnedString)
2194+
STRINGREF* ModuleBase::ResolveStringRef(DWORD token, void** ppPinnedString)
21952195
{
21962196
CONTRACTL
21972197
{
21982198
INSTANCE_CHECK;
2199-
THROWS;
2200-
GC_TRIGGERS;
2201-
MODE_ANY;
2199+
STANDARD_VM_CHECK;
22022200
INJECT_FAULT(COMPlusThrowOM());
22032201
PRECONDITION(TypeFromToken(token) == mdtString);
22042202
}
22052203
CONTRACTL_END;
22062204

22072205
EEStringData strData;
2208-
OBJECTHANDLE string = NULL;
22092206

22102207
#if !BIGENDIAN
22112208
InitializeStringData(token, &strData, NULL);
@@ -2215,14 +2212,8 @@ OBJECTHANDLE ModuleBase::ResolveStringRef(DWORD token, void** ppPinnedString)
22152212
#endif // !!BIGENDIAN
22162213

22172214
GCX_COOP();
2218-
2219-
LoaderAllocator *pLoaderAllocator;
2220-
2221-
pLoaderAllocator = this->GetLoaderAllocator();
2222-
2223-
string = (OBJECTHANDLE)pLoaderAllocator->GetStringObjRefPtrFromUnicodeString(&strData, ppPinnedString);
2224-
2225-
return string;
2215+
LoaderAllocator* pLoaderAllocator = this->GetLoaderAllocator();
2216+
return pLoaderAllocator->GetStringObjRefPtrFromUnicodeString(&strData, ppPinnedString);
22262217
}
22272218

22282219
mdToken Module::GetEntryPointToken()

src/coreclr/vm/ceeload.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ class ModuleBase
578578
}
579579

580580
// Resolving
581-
OBJECTHANDLE ResolveStringRef(DWORD Token, void** ppPinnedString = nullptr);
581+
STRINGREF* ResolveStringRef(DWORD Token, void** ppPinnedString = nullptr);
582582
private:
583583
// string helper
584584
void InitializeStringData(DWORD token, EEStringData *pstrData, CQuickBytes *pqb);

src/coreclr/vm/corelib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,7 @@ DEFINE_METHOD(STRING, CTORF_SBYTEPTR_START_LEN_ENCODING, Ctor,
835835
DEFINE_METHOD(STRING, INTERNAL_COPY, InternalCopy, SM_Str_IntPtr_Int_RetVoid)
836836
DEFINE_METHOD(STRING, WCSLEN, wcslen, SM_PtrChar_RetInt)
837837
DEFINE_METHOD(STRING, STRLEN, strlen, SM_PtrByte_RetInt)
838+
DEFINE_METHOD(STRING, STRCNS, StrCns, SM_UInt_IntPtr_RetStr)
838839
DEFINE_PROPERTY(STRING, LENGTH, Length, Int)
839840

840841
DEFINE_CLASS(STRING_BUILDER, Text, StringBuilder)

src/coreclr/vm/jithelpers.cpp

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -902,39 +902,15 @@ HCIMPL1(StringObject*, FramedAllocateString, DWORD stringLength)
902902
HCIMPLEND
903903

904904
/*********************************************************************/
905-
OBJECTHANDLE ConstructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd, mdToken metaTok, void** ppPinnedString)
905+
STRINGREF* ConstructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd, mdToken metaTok, void** ppPinnedString)
906906
{
907-
CONTRACTL {
908-
THROWS;
909-
GC_TRIGGERS;
910-
MODE_ANY;
911-
} CONTRACTL_END;
907+
STANDARD_VM_CONTRACT;
912908

913909
_ASSERTE(TypeFromToken(metaTok) == mdtString);
914-
915910
Module* module = GetModule(scopeHnd);
916911
return module->ResolveStringRef(metaTok, ppPinnedString);
917912
}
918913

919-
/*********************************************************************/
920-
HCIMPL2(Object *, JIT_StrCns, unsigned rid, CORINFO_MODULE_HANDLE scopeHnd)
921-
{
922-
FCALL_CONTRACT;
923-
924-
OBJECTHANDLE hndStr = 0;
925-
926-
HELPER_METHOD_FRAME_BEGIN_RET_0();
927-
928-
// Retrieve the handle to the CLR string object.
929-
hndStr = ConstructStringLiteral(scopeHnd, RidToToken(rid, mdtString));
930-
HELPER_METHOD_FRAME_END();
931-
932-
// Don't use ObjectFromHandle; this isn't a real handle
933-
return *(Object**)hndStr;
934-
}
935-
HCIMPLEND
936-
937-
938914
//========================================================================
939915
//
940916
// ARRAY HELPERS
@@ -3384,21 +3360,21 @@ HCIMPL3_RAW(void, JIT_ReversePInvokeEnterTrackTransitions, ReversePInvokeFrame*
33843360
frame->pMD = pMD;
33853361

33863362
Thread* thread = GetThreadNULLOk();
3387-
3363+
33883364
// If a thread instance exists and is in the
33893365
// correct GC mode attempt a quick transition.
33903366
if (thread != NULL
33913367
&& !thread->PreemptiveGCDisabled())
33923368
{
33933369
frame->currentThread = thread;
3394-
3370+
33953371
#ifdef PROFILING_SUPPORTED
33963372
if (CORProfilerTrackTransitions())
33973373
{
33983374
ProfilerUnmanagedToManagedTransitionMD(frame->pMD, COR_PRF_TRANSITION_CALL);
33993375
}
34003376
#endif
3401-
3377+
34023378
// Manually inline the fast path in Thread::DisablePreemptiveGC().
34033379
thread->m_fPreemptiveGCDisabled.StoreWithoutBarrier(1);
34043380
if (g_TrapReturningThreads != 0)

src/coreclr/vm/jitinterface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11738,7 +11738,7 @@ InfoAccessType CEEJitInfo::constructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd
1173811738
{
1173911739
// If ConstructStringLiteral returns a pinned reference we can return it by value (IAT_VALUE)
1174011740
void* ppPinnedString = nullptr;
11741-
void** ptr = (void**)ConstructStringLiteral(scopeHnd, metaTok, &ppPinnedString);
11741+
STRINGREF* ptr = ConstructStringLiteral(scopeHnd, metaTok, &ppPinnedString);
1174211742

1174311743
if (ppPinnedString != nullptr)
1174411744
{

src/coreclr/vm/jitinterface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,7 @@ void DoGcStress (PT_CONTEXT regs, NativeCodeVersion nativeCodeVersion);
10291029
// ppPinnedString: If the string is pinned (e.g. allocated in frozen heap),
10301030
// the pointer to the pinned string is returned in *ppPinnedPointer. ppPinnedPointer == nullptr
10311031
// means that the caller does not care whether the string is pinned or not.
1032-
OBJECTHANDLE ConstructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd, mdToken metaTok, void** ppPinnedString = nullptr);
1032+
STRINGREF* ConstructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd, mdToken metaTok, void** ppPinnedString = nullptr);
10331033

10341034
FCDECL2(Object*, JIT_Box_MP_FastPortable, CORINFO_CLASS_HANDLE type, void* data);
10351035
FCDECL2(Object*, JIT_Box, CORINFO_CLASS_HANDLE type, void* data);

src/coreclr/vm/metasig.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ DEFINE_METASIG(SM(RetUInt, _, K))
220220
DEFINE_METASIG(SM(RetBool, _, F))
221221
DEFINE_METASIG(SM(IntPtr_RetStr, I, s))
222222
DEFINE_METASIG(SM(IntPtr_RetBool, I, F))
223+
DEFINE_METASIG(SM(UInt_IntPtr_RetStr, K I, s))
223224
DEFINE_METASIG_T(SM(RuntimeType_RuntimeMethodHandleInternal_RetMethodBase, C(CLASS) g(METHOD_HANDLE_INTERNAL), C(METHOD_BASE) ))
224225
DEFINE_METASIG_T(SM(RuntimeType_IRuntimeFieldInfo_RetFieldInfo, C(CLASS) C(I_RT_FIELD_INFO), C(FIELD_INFO) ))
225226
DEFINE_METASIG(SM(Char_Bool_Bool_RetByte, u F F, b))

src/coreclr/vm/qcallentrypoints.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ static const Entry s_QCall[] =
271271
DllImportEntry(MultiCoreJIT_InternalStartProfile)
272272
#endif
273273
DllImportEntry(LoaderAllocator_Destroy)
274+
DllImportEntry(String_StrCns)
274275
DllImportEntry(String_Intern)
275276
DllImportEntry(String_IsInterned)
276277
DllImportEntry(AppDomain_CreateDynamicAssembly)

0 commit comments

Comments
 (0)