diff options
author | Jan Kotas <jkotas@microsoft.com> | 2019-01-03 03:52:30 -1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-03 03:52:30 -1000 |
commit | eff427c02a89e135c38a96032feb3c9a6a13cf5b (patch) | |
tree | 1e190aef3a871e6bffb56edb67668c1cc31dfd3a /src/vm/dllimport.cpp | |
parent | faf2acefa7d88a446f561b38740a72d8838440a5 (diff) | |
download | coreclr-eff427c02a89e135c38a96032feb3c9a6a13cf5b.tar.gz coreclr-eff427c02a89e135c38a96032feb3c9a6a13cf5b.tar.bz2 coreclr-eff427c02a89e135c38a96032feb3c9a6a13cf5b.zip |
Cleanup current culture handling in the unmanaged runtime (#21706)
Large portion of the current culture handling in the unmanaged runtime inherited from desktop has been no-op. The nativeInitCultureAccessors QCall that it used to depend on desktop got (almost) never called in CoreCLR.
- Delete resetting of current culture on threadpool threads. It was needed in desktop because of a very tricky flow of current culture between appdomains. It is superseded by the flowing the current culture via AsyncLocal in CoreCLR.
- Comment out fetch of managed current culture for unmanaged resource lookup. It has number of problems that are not easy to fix. We are not localizing the unmanaged runtime currently anyway, so it is ok to just comment it out.
- Fix the rest to call CultureInfo directly without going through Thread.CurrentThread
Diffstat (limited to 'src/vm/dllimport.cpp')
-rw-r--r-- | src/vm/dllimport.cpp | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/src/vm/dllimport.cpp b/src/vm/dllimport.cpp index 9dda48f3ee..2ce100b4b9 100644 --- a/src/vm/dllimport.cpp +++ b/src/vm/dllimport.cpp @@ -468,16 +468,8 @@ public: argIdx--; } - LocalDesc locDescThread(MscorlibBinder::GetClass(CLASS__THREAD)); - DWORD dwThreadLocalNum = pcs->NewLocal(locDescThread); - - // call Thread.get_CurrentThread() - pcs->EmitCALL(METHOD__THREAD__GET_CURRENT_THREAD, 0, 1); - pcs->EmitDUP(); - pcs->EmitSTLOC(dwThreadLocalNum); - - // call current_thread.get_CurrentCulture() - pcs->EmitCALL(METHOD__THREAD__GET_CULTURE, 1, 1); + // call CultureInfo.get_CurrentCulture() + pcs->EmitCALL(METHOD__CULTURE_INFO__GET_CURRENT_CULTURE, 0, 1); // save the current culture LocalDesc locDescCulture(MscorlibBinder::GetClass(CLASS__CULTURE_INFO)); @@ -486,23 +478,20 @@ public: pcs->EmitSTLOC(dwCultureLocalNum); // set a new one based on the LCID passed from unmanaged - pcs->EmitLDLOC(dwThreadLocalNum); pcs->EmitLDARG(argIdx); // call CultureInfo..ctor(lcid) - // call current_thread.set_CurrentCulture(culture) + // call CultureInfo.set_CurrentCulture(culture) pcs->EmitNEWOBJ(METHOD__CULTURE_INFO__INT_CTOR, 1); - pcs->EmitCALL(METHOD__THREAD__SET_CULTURE, 2, 0); + pcs->EmitCALL(METHOD__CULTURE_INFO__SET_CURRENT_CULTURE, 1, 0); // and restore the current one after the call m_slIL.SetCleanupNeeded(); ILCodeStream *pcsCleanup = m_slIL.GetCleanupCodeStream(); - // call current_thread.set_CurrentCulture(original_culture) - pcsCleanup->EmitLDLOC(dwThreadLocalNum); + // call CultureInfo.set_CurrentCulture(original_culture) pcsCleanup->EmitLDLOC(dwCultureLocalNum); - pcsCleanup->EmitCALL(METHOD__THREAD__SET_CULTURE, 1, 1); - + pcsCleanup->EmitCALL(METHOD__CULTURE_INFO__SET_CURRENT_CULTURE, 1, 0); } else { @@ -514,10 +503,8 @@ public: } else { - // call Thread.get_CurrentThread() - // call current_thread.get_CurrentCulture() - pcs->EmitCALL(METHOD__THREAD__GET_CURRENT_THREAD, 0, 1); - pcs->EmitCALL(METHOD__THREAD__GET_CULTURE, 1, 1); + // call CultureInfo.get_CurrentCulture() + pcs->EmitCALL(METHOD__CULTURE_INFO__GET_CURRENT_CULTURE, 0, 1); //call CultureInfo.get_LCID(this) pcs->EmitCALL(METHOD__CULTURE_INFO__GET_ID, 1, 1); |