Skip to content

Commit

Permalink
Invariant globalization (dotnet#10264)
Browse files Browse the repository at this point in the history
* Invariant Globalization Work

* Convert the testing Exceptions to asserts

* Remove un-needed comment

* Fix typos

* Fix unrelated typo

* Address the PR feedback

* More feedback addressing

* More feedback addressing

* Fix Linux break

* More feedback addressing

* cleanup
  • Loading branch information
tarekgh authored and jorive committed May 4, 2017
1 parent 5164ece commit 45e30e7
Show file tree
Hide file tree
Showing 37 changed files with 1,850 additions and 258 deletions.
16 changes: 9 additions & 7 deletions src/corefx/System.Globalization.Native/icushim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,11 @@ bool FindLibWithMajorMinorSubVersion(int* majorVer, int* minorVer, int* subVer)
return false;
}

// This function is ran at the end of dlopen for the current shared library
__attribute__((constructor))
void InitializeICUShim()
// GlobalizationNative_LoadICU
// This method get called from the managed side during the globalization initialization.
// This method shouldn't get called at all if we are running in globalization invariant mode
// return 0 if failed to load ICU and 1 otherwise
extern "C" int32_t GlobalizationNative_LoadICU()
{
int majorVer = -1;
int minorVer = -1;
Expand All @@ -185,8 +187,7 @@ void InitializeICUShim()
!FindLibWithMajorVersion(&majorVer))
{
// No usable ICU version found
fprintf(stderr, "No usable version of the ICU libraries was found\n");
abort();
return 0;
}

char symbolName[128];
Expand All @@ -211,8 +212,7 @@ void InitializeICUShim()
sprintf(symbolName, "u_strlen%s", symbolVersion);
if (dlsym(libicuuc, symbolName) == nullptr)
{
fprintf(stderr, "ICU libraries use unknown symbol versioning\n");
abort();
return 0;
}
}
}
Expand All @@ -227,6 +227,8 @@ void InitializeICUShim()

FOR_ALL_ICU_FUNCTIONS
#undef PER_FUNCTION_BLOCK

return 1;
}

__attribute__((destructor))
Expand Down
5 changes: 5 additions & 0 deletions src/mscorlib/System.Private.CoreLib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,7 @@
<Compile Include="$(BclSourcesRoot)\System\Globalization\CharUnicodeInfoData.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\ChineseLunisolarCalendar.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CompareInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CompareInfo.Invariant.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CultureData.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CultureInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CultureNotFoundException.cs" />
Expand All @@ -572,6 +573,7 @@
<Compile Include="$(BclSourcesRoot)\System\Globalization\DateTimeStyles.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\DigitShapes.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\EastAsianLunisolarCalendar.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\GlobalizationMode.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\GregorianCalendar.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\GregorianCalendarHelper.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\GregorianCalendarTypes.cs" />
Expand Down Expand Up @@ -613,13 +615,15 @@
<Compile Include="$(BclSourcesRoot)\System\Globalization\CompareInfo.Unix.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CultureData.Unix.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CultureInfo.Unix.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\GlobalizationMode.Unix.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\TextInfo.Unix.cs" />
</ItemGroup>
<ItemGroup Condition="'$(TargetsUnix)' != 'true'">
<Compile Include="$(BclSourcesRoot)\System\Globalization\CalendarData.Windows.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CompareInfo.Windows.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CultureData.Windows.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\CultureInfo.Windows.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\GlobalizationMode.Windows.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\HijriCalendar.Win32.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\IdnMapping.Windows.cs" />
<Compile Include="$(BclSourcesRoot)\System\Globalization\JapaneseCalendar.Win32.cs" />
Expand All @@ -635,6 +639,7 @@
<Compile Include="$(BclSourcesRoot)\Interop\Unix\System.Globalization.Native\Interop.Calendar.cs" />
<Compile Include="$(BclSourcesRoot)\Interop\Unix\System.Globalization.Native\Interop.Casing.cs" />
<Compile Include="$(BclSourcesRoot)\Interop\Unix\System.Globalization.Native\Interop.Collation.cs" />
<Compile Include="$(BclSourcesRoot)\Interop\Unix\System.Globalization.Native\Interop.ICU.cs" />
<Compile Include="$(BclSourcesRoot)\Interop\Unix\System.Globalization.Native\Interop.Idna.cs" />
<Compile Include="$(BclSourcesRoot)\Interop\Unix\System.Globalization.Native\Interop.Locale.cs" />
<Compile Include="$(BclSourcesRoot)\Interop\Unix\System.Globalization.Native\Interop.Normalization.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ public override bool IsInvalid

protected override bool ReleaseHandle()
{
Debug.Assert(!GlobalizationMode.Invariant);

CloseSortHandle(handle);
SetHandle(IntPtr.Zero);
return true;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

internal static partial class Interop
{
internal static partial class GlobalizationInterop
{
[DllImport(Libraries.GlobalizationInterop, EntryPoint = "GlobalizationNative_LoadICU")]
internal static extern int LoadICU();
}
}
15 changes: 15 additions & 0 deletions src/mscorlib/src/SR.cs
Original file line number Diff line number Diff line change
Expand Up @@ -186,16 +186,31 @@ public static string Argument_EmptyDecString
get { return Environment.GetResourceString("Argument_EmptyDecString"); }
}

public static string Argument_IdnBadBidi
{
get { return Environment.GetResourceString("Argument_IdnBadBidi"); }
}

public static string Argument_IdnBadLabelSize
{
get { return Environment.GetResourceString("Argument_IdnBadLabelSize"); }
}

public static string Argument_IdnBadNameSize
{
get { return Environment.GetResourceString("Argument_IdnBadNameSize"); }
}

public static string Argument_IdnBadPunycode
{
get { return Environment.GetResourceString("Argument_IdnBadPunycode"); }
}

public static string Argument_IdnBadStd3
{
get { return Environment.GetResourceString("Argument_IdnBadStd3"); }
}

public static string Argument_IdnIllegalName
{
get { return Environment.GetResourceString("Argument_IdnIllegalName"); }
Expand Down
2 changes: 1 addition & 1 deletion src/mscorlib/src/System/AppDomainSetup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ private String NormalizePath(String path, bool useAppBase)
#if !PLATFORM_UNIX
trim = 8;
#else
// For Unix platform, trim the first 7 charcaters only.
// For Unix platform, trim the first 7 characters only.
// Trimming the first 8 characters will cause
// the root path separator to be trimmed away,
// and the absolute local path becomes a relative local path.
Expand Down
15 changes: 15 additions & 0 deletions src/mscorlib/src/System/CLRConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,21 @@

namespace System
{
// CLRConfig is mainly reading the config switch values. this is used when we cannot use the AppContext class
// one example, is using the context switch in the globalization code which require to read the switch very
// early even before the appdomain get initialized.
// In general AppContext should be used instead of CLRConfig if there is no reason prevent that.
internal class CLRConfig
{
internal static bool GetBoolValue(string switchName)
{
return GetConfigBoolValue(switchName);
}

[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
[SuppressUnmanagedCodeSecurity]
private extern static bool GetConfigBoolValue(string configSwitchName);
}
} // namespace System

// file CLRConfig
4 changes: 4 additions & 0 deletions src/mscorlib/src/System/Globalization/CalendarData.Unix.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ internal static int GetTwoDigitYearMax(CalendarId calendarId)
// Call native side to figure out which calendars are allowed
internal static int GetCalendars(string localeName, bool useUserOverride, CalendarId[] calendars)
{
Debug.Assert(!GlobalizationMode.Invariant);

// NOTE: there are no 'user overrides' on Linux
int count = Interop.GlobalizationInterop.GetCalendars(localeName, calendars, calendars.Length);

Expand All @@ -88,6 +90,8 @@ private static bool SystemSupportsTaiwaneseCalendar()

private static bool GetCalendarInfo(string localeName, CalendarId calendarId, CalendarDataType dataType, out string calendarString)
{
Debug.Assert(!GlobalizationMode.Invariant);

return Interop.CallStringMethod(
(locale, calId, type, stringBuilder) =>
Interop.GlobalizationInterop.GetCalendarInfo(
Expand Down
13 changes: 13 additions & 0 deletions src/mscorlib/src/System/Globalization/CalendarData.Windows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ internal partial class CalendarData
{
private bool LoadCalendarDataFromSystem(String localeName, CalendarId calendarId)
{
Debug.Assert(!GlobalizationMode.Invariant);

bool ret = true;

uint useOverrides = this.bUseUserOverrides ? 0 : CAL_NOUSEROVERRIDE;
Expand Down Expand Up @@ -116,6 +118,11 @@ private bool LoadCalendarDataFromSystem(String localeName, CalendarId calendarId
// Get native two digit year max
internal static int GetTwoDigitYearMax(CalendarId calendarId)
{
if (GlobalizationMode.Invariant)
{
return Invariant.iTwoDigitYearMax;
}

int twoDigitYearMax = -1;

if (!CallGetCalendarInfoEx(null, calendarId, (uint)CAL_ITWODIGITYEARMAX, out twoDigitYearMax))
Expand All @@ -129,6 +136,8 @@ internal static int GetTwoDigitYearMax(CalendarId calendarId)
// Call native side to figure out which calendars are allowed
internal static int GetCalendars(String localeName, bool useUserOverride, CalendarId[] calendars)
{
Debug.Assert(!GlobalizationMode.Invariant);

EnumCalendarsData data = new EnumCalendarsData();
data.userOverride = 0;
data.calendars = new IntList();
Expand Down Expand Up @@ -173,6 +182,8 @@ internal static int GetCalendars(String localeName, bool useUserOverride, Calend

private static bool SystemSupportsTaiwaneseCalendar()
{
Debug.Assert(!GlobalizationMode.Invariant);

string data;
// Taiwanese calendar get listed as one of the optional zh-TW calendars only when having zh-TW UI
return CallGetCalendarInfoEx("zh-TW", CalendarId.TAIWAN, CAL_SCALNAME, out data);
Expand Down Expand Up @@ -474,6 +485,8 @@ private static Interop.BOOL EnumCalendarsCallback(IntPtr lpCalendarInfoString, u

private static unsafe String GetUserDefaultLocaleName()
{
Debug.Assert(!GlobalizationMode.Invariant);

const int LOCALE_NAME_MAX_LENGTH = 85;
const uint LOCALE_SNAME = 0x0000005c;
const string LOCALE_NAME_USER_DEFAULT = null;
Expand Down
2 changes: 2 additions & 0 deletions src/mscorlib/src/System/Globalization/CalendarData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ internal CalendarData(String localeName, CalendarId calendarId, bool bUseUserOve
{
this.bUseUserOverrides = bUseUserOverrides;

Debug.Assert(!GlobalizationMode.Invariant);

if (!LoadCalendarDataFromSystem(localeName, calendarId))
{
Debug.Assert(false, "[CalendarData] LoadCalendarDataFromSystem call isn't expected to fail for calendar " + calendarId + " locale " + localeName);
Expand Down
Loading

0 comments on commit 45e30e7

Please sign in to comment.