diff --git a/src/mscorlib/src/System/Environment.cs b/src/mscorlib/src/System/Environment.cs index 5ee30bb9bad6..199ce0716787 100644 --- a/src/mscorlib/src/System/Environment.cs +++ b/src/mscorlib/src/System/Environment.cs @@ -1289,6 +1289,8 @@ private static void InitResourceHelper() { #if FEATURE_CORECLR [System.Security.SecurityCritical] // auto-generated #endif + // NoInlining causes the caller and callee to not be inlined in mscorlib as it is an assumption of StackCrawlMark use + [MethodImpl(MethodImplOptions.NoInlining)] internal static String GetResourceStringLocal(String key) { if (m_resHelper == null) InitResourceHelper(); @@ -1305,21 +1307,70 @@ internal static String GetResourceString(String key) { #endif //FEATURE_CORECLR } - [System.Security.SecuritySafeCritical] // auto-generated - internal static String GetResourceString(String key, params Object[] values) { - String s = GetResourceString(key); - return String.Format(CultureInfo.CurrentCulture, s, values); + // The reason the following overloads exist are to reduce code bloat. + // Since GetResourceString is basically only called when exceptions are + // thrown, we want the code size to be as small as possible. + // Using the params object[] overload works against this since the + // initialization of the array is done inline in the caller at the IL + // level. So we have overloads that simply wrap the params one, and + // the methods they call through to are tagged as NoInlining. + // In mscorlib NoInlining causes the caller and callee to not be inlined + // as it is an assumption of StackCrawlMark use so it is not added + // directly to these methods, but to the ones they call. + // That way they do not bloat either the IL or the generated asm. + + internal static string GetResourceString(string key, object val0) + { + return GetResourceStringFormatted(key, new object[] { val0 }); + } + + internal static string GetResourceString(string key, object val0, object val1) + { + return GetResourceStringFormatted(key, new object[] { val0, val1 }); + } + + internal static string GetResourceString(string key, object val0, object val1, object val2) + { + return GetResourceStringFormatted(key, new object[] { val0, val1, val2 }); + } + + internal static string GetResourceString(string key, object val0, object val1, object val2, object val3) + { + return GetResourceStringFormatted(key, new object[] { val0, val1, val2, val3 }); + } + + internal static string GetResourceString(string key, object val0, object val1, object val2, object val3, object val4) + { + return GetResourceStringFormatted(key, new object[] { val0, val1, val2, val3, val4 }); + } + + internal static string GetResourceString(string key, object val0, object val1, object val2, object val3, object val4, object val5) + { + return GetResourceStringFormatted(key, new object[] { val0, val1, val2, val3, val4, val5 }); + } + + internal static String GetResourceString(string key, params object[] values) + { + return GetResourceStringFormatted(key, values); + } + + // NoInlining causes the caller and callee to not be inlined in mscorlib as it is an assumption of StackCrawlMark use + [MethodImpl(MethodImplOptions.NoInlining)] + private static String GetResourceStringFormatted(string key, params object[] values) + { + string rs = GetResourceString(key); + return String.Format(CultureInfo.CurrentCulture, rs, values); } - //The following two internal methods are not used anywhere within the framework, + // The following two internal methods are not used anywhere within the framework, // but are being kept around as external platforms built on top of us have taken // dependency by using private reflection on them for getting system resource strings - internal static String GetRuntimeResourceString(String key) { + private static String GetRuntimeResourceString(String key) { return GetResourceString(key); } - internal static String GetRuntimeResourceString(String key, params Object[] values) { - return GetResourceString(key,values); + private static String GetRuntimeResourceString(String key, params Object[] values) { + return GetResourceStringFormatted(key,values); } public static bool Is64BitProcess {