X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem%2FInt64.cs;h=3c2810b5f88928d257093851b8e3b19191c4bce3;hb=cdf8caa2aec261b039309b14d5c964182a394fb9;hp=1ba78d7555ad2692829d8498716e3d0a64ac8be9;hpb=a8b22e0e864c03b8cfd2f2cb5a8075b6611c5553;p=mono.git diff --git a/mcs/class/corlib/System/Int64.cs b/mcs/class/corlib/System/Int64.cs index 1ba78d7555a..3c2810b5f88 100644 --- a/mcs/class/corlib/System/Int64.cs +++ b/mcs/class/corlib/System/Int64.cs @@ -34,6 +34,9 @@ using System.Threading; namespace System { [Serializable] +#if NET_2_0 + [System.Runtime.InteropServices.ComVisible (true)] +#endif public struct Int64 : IFormattable, IConvertible, IComparable #if NET_2_0 , IComparable, IEquatable @@ -136,24 +139,32 @@ namespace System { c = s [i]; if (c >= '0' && c <= '9'){ - val = checked (val * 10 + (c - '0') * sign); - digits_seen = true; - } else { - if (Char.IsWhiteSpace (c)){ - for (i++; i < len; i++){ - if (!Char.IsWhiteSpace (s [i])) { - if (!tryParse) - exc = Int32.GetFormatException (); - return false; - } + byte d = (byte) (c - '0'); + + if (val > (MaxValue/10)) + goto overflow; + + if (val == (MaxValue/10)){ + if ((d > (MaxValue % 10)) && (sign == 1 || (d > ((MaxValue % 10) + 1)))) + goto overflow; + if (sign == -1) + val = (val * sign * 10) - d; + else + val = (val * 10) + d; + + if (Int32.ProcessTrailingWhitespace (tryParse, s, i + 1, ref exc)){ + result = val; + return true; } - break; - } else { - if (!tryParse) - exc = Int32.GetFormatException (); - return false; - } - } + goto overflow; + } else + val = val * 10 + d; + + + digits_seen = true; + } else if (!Int32.ProcessTrailingWhitespace (tryParse, s, i, ref exc)) + return false; + } if (!digits_seen) { if (!tryParse) @@ -161,8 +172,17 @@ namespace System { return false; } - result = val; + if (sign == -1) + result = val * sign; + else + result = val; + return true; + + overflow: + if (!tryParse) + exc = new OverflowException ("Value is too large"); + return false; } public static long Parse (string s, IFormatProvider fp) @@ -317,7 +337,15 @@ namespace System { digitValue = (int) (hexDigit - 'A' + 10); ulong unumber = (ulong)number; - number = (long)checked(unumber * 16ul + (ulong)digitValue); + + // IMPROVME: We could avoid catching OverflowException + try { + number = (long)checked(unumber * 16ul + (ulong)digitValue); + } catch (OverflowException e){ + if (!tryParse) + exc = e; + return false; + } } else if (decimalPointFound) { nDigits++; @@ -408,8 +436,15 @@ namespace System { } - if (!negative && !AllowHexSpecifier) - number = checked (-number); + if (!negative && !AllowHexSpecifier){ + try { + number = checked (-number); + } catch (OverflowException e){ + if (!tryParse) + exc = e; + return false; + } + } result = number; return true; @@ -463,12 +498,12 @@ namespace System { public override string ToString () { - return NumberFormatter.FormatGeneral (new NumberFormatter.NumberStore (m_value)); + return NumberFormatter.NumberToString (m_value, null); } - public string ToString (IFormatProvider fp) + public string ToString (IFormatProvider provider) { - return NumberFormatter.FormatGeneral (new NumberFormatter.NumberStore (m_value), fp); + return NumberFormatter.NumberToString (m_value, provider); } public string ToString (string format) @@ -478,8 +513,7 @@ namespace System { public string ToString (string format, IFormatProvider fp) { - NumberFormatInfo nfi = NumberFormatInfo.GetInstance( fp ); - return NumberFormatter.NumberToString (format, m_value, nfi); + return NumberFormatter.NumberToString (format, m_value, fp); } // =========== IConvertible Methods =========== //