Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 59 additions & 8 deletions src/mscorlib/src/System/Environment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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 {
Expand Down