Imported Upstream version 4.0.0~alpha1

Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
This commit is contained in:
Jo Shields
2015-04-07 09:35:12 +01:00
parent 283343f570
commit 3c1f479b9d
22469 changed files with 2931443 additions and 869343 deletions

View File

@@ -34,6 +34,7 @@ using System.Collections.Generic;
using System.Threading;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Diagnostics.Contracts;
namespace System.Globalization
{
@@ -60,7 +61,7 @@ namespace System.Globalization
bool m_useUserOverride;
[NonSerialized]
volatile NumberFormatInfo numInfo;
volatile DateTimeFormatInfo dateTimeInfo;
internal volatile DateTimeFormatInfo dateTimeInfo;
volatile TextInfo textInfo;
private string m_name;
@@ -98,6 +99,9 @@ namespace System.Globalization
[NonSerialized]
// Used by Thread.set_CurrentCulture
internal byte[] cached_serialized_form;
[NonSerialized]internal CultureData m_cultureData;
[NonSerialized]internal bool m_isInherited;
internal const int InvariantCultureId = 0x7F;
const int CalendarTypeBits = 8;
@@ -299,7 +303,8 @@ namespace System.Globalization
//
if (parent_lcid == 0x7C04 && EnglishName [EnglishName.Length - 1] == 'y')
return parent_culture = new CultureInfo ("zh-Hant");
else if (parent_lcid == 0x0004 && EnglishName [EnglishName.Length -1] == 'y')
return parent_culture = new CultureInfo ("zh-Hans");
return null;
}
@@ -377,9 +382,7 @@ namespace System.Globalization
RegionInfo.ClearCachedData ();
TimeZone.ClearCachedData ();
#if NET_4_5
TimeZoneInfo.ClearCachedData ();
#endif
}
public virtual object Clone()
@@ -418,6 +421,11 @@ namespace System.Globalization
infos [0] = (CultureInfo) InvariantCulture.Clone ();
}
for (int i = 1; i < infos.Length; ++i) {
var ci = infos [i];
infos [i].m_cultureData = CultureData.GetCultureData (ci.m_name, false, ci.datetime_index, ci.CalendarType, ci.iso2lang);
}
return infos;
}
@@ -482,14 +490,6 @@ namespace System.Globalization
internal void CheckNeutral ()
{
#if !NET_4_0
if (IsNeutralCulture) {
throw new NotSupportedException ("Culture \"" + m_name + "\" is " +
"a neutral culture. It can not be used in formatting " +
"and parsing and therefore cannot be set as the thread's " +
"current culture.");
}
#endif
}
public virtual NumberFormatInfo NumberFormat {
@@ -527,17 +527,10 @@ namespace System.Globalization
if (!constructed) Construct ();
CheckNeutral ();
// TODO: Have to lock because construct_datetime_format is not atomic
lock (this) {
if (cultureID == InvariantCultureId && m_isReadOnly)
dateTimeInfo = DateTimeFormatInfo.InvariantInfo;
else if (dateTimeInfo == null) {
dateTimeInfo = new DateTimeFormatInfo (this, m_isReadOnly);
if (cultureID != InvariantCultureId)
construct_datetime_format ();
}
}
var temp = new DateTimeFormatInfo (m_cultureData, Calendar);
temp.m_isReadOnly = m_isReadOnly;
System.Threading.Thread.MemoryBarrier();
dateTimeInfo = temp;
return dateTimeInfo;
}
@@ -612,9 +605,6 @@ namespace System.Globalization
[MethodImplAttribute (MethodImplOptions.InternalCall)]
private extern static CultureInfo [] internal_get_cultures (bool neutral, bool specific, bool installed);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
private extern void construct_datetime_format ();
[MethodImplAttribute (MethodImplOptions.InternalCall)]
private extern void construct_number_format ();
@@ -637,7 +627,7 @@ namespace System.Globalization
iso3lang="IVL";
iso2lang="iv";
win3lang="IVL";
default_calendar_type = 1 << CalendarTypeBits;
default_calendar_type = 1 << CalendarTypeBits | (int) GregorianCalendarTypes.Localized;
}
private unsafe TextInfo CreateTextInfo (bool readOnly)
@@ -663,6 +653,7 @@ namespace System.Globalization
if (culture == InvariantCultureId) {
/* Short circuit the invariant culture */
ConstructInvariant (read_only);
m_cultureData = CultureData.Invariant;
return;
}
@@ -670,13 +661,11 @@ namespace System.Globalization
//
// Be careful not to cause recursive CultureInfo initialization
//
var msg = string.Format (InvariantCulture, "Culture ID {0} (0x{0:X4}) is not a supported culture.", culture.ToString (InvariantCulture));
#if NET_4_0
var msg = string.Format (InvariantCulture, "Culture ID {0} (0x{1}) is not a supported culture.", culture.ToString (InvariantCulture), culture.ToString ("X4", InvariantCulture));
throw new CultureNotFoundException ("culture", msg);
#else
throw new ArgumentException (msg, "culture");
#endif
}
m_cultureData = CultureData.GetCultureData (m_name, m_useUserOverride, datetime_index, CalendarType, iso2lang);
}
public CultureInfo (string name) : this (name, true) {}
@@ -692,16 +681,20 @@ namespace System.Globalization
constructed = true;
m_isReadOnly = read_only;
m_useUserOverride = useUserOverride;
m_isInherited = GetType() != typeof(System.Globalization.CultureInfo);
if (name.Length == 0) {
/* Short circuit the invariant culture */
ConstructInvariant (read_only);
m_cultureData = CultureData.Invariant;
return;
}
if (!construct_internal_locale_from_name (name.ToLowerInvariant ())) {
throw CreateNotFoundException (name);
}
m_cultureData = CultureData.GetCultureData (m_name, useUserOverride, datetime_index, CalendarType, iso2lang);
}
// This is used when creating by specific name and creating by
@@ -818,6 +811,7 @@ namespace System.Globalization
if (ci.IsNeutralCulture)
ci = CreateSpecificCultureFromNeutral (ci.Name);
ci.m_cultureData = CultureData.GetCultureData (ci.m_name, false, ci.datetime_index, ci.CalendarType, ci.iso2lang);
return ci;
}
@@ -991,6 +985,23 @@ namespace System.Globalization
return new CultureInfo (id);
}
internal int CalendarType {
get {
switch (default_calendar_type >> CalendarTypeBits) {
case 1:
return Calendar.CAL_GREGORIAN;
case 2:
return Calendar.CAL_THAI;
case 3:
return Calendar.CAL_UMALQURA;
case 4:
return Calendar.CAL_HIJRI;
default:
throw new NotImplementedException ("CalendarType");
}
}
}
static Calendar CreateCalendar (int calendarType)
{
string name = null;
@@ -1014,20 +1025,15 @@ namespace System.Globalization
Type type = Type.GetType (name, false);
if (type == null)
return CreateCalendar (1 << CalendarTypeBits); // return invariant calandar if not found
return new GregorianCalendar (GregorianCalendarTypes.Localized); // return invariant calendar if not found
return (Calendar) Activator.CreateInstance (type);
}
static Exception CreateNotFoundException (string name)
{
#if NET_4_0
return new CultureNotFoundException ("name", "Culture name " + name + " is not supported.");
#else
return new ArgumentException ("Culture name " + name + " is not supported.", "name");
#endif
}
#if NET_4_5
public static CultureInfo DefaultThreadCurrentCulture {
get {
return Thread.default_culture;
@@ -1045,6 +1051,30 @@ namespace System.Globalization
Thread.default_ui_culture = value;
}
}
#endif
#region reference sources
// TODO:
internal static readonly bool IsTaiwanSku;
//
// CheckDomainSafetyObject throw if the object is customized object which cannot be attached to
// other object (like CultureInfo or DateTimeFormatInfo).
//
internal static void CheckDomainSafetyObject(Object obj, Object container)
{
if (obj.GetType().Assembly != typeof(System.Globalization.CultureInfo).Assembly) {
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
Environment.GetResourceString("InvalidOperation_SubclassedObject"),
obj.GetType(),
container.GetType()));
}
Contract.EndContractBlock();
}
#endregion
}
}