X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem%2FArray.cs;h=91424bc6f8f6dfbf4d2c5457e453f4db01add388;hb=410bb8a57e23a901ea47d8a74f88a20972de423d;hp=a72d68e4738621fe272907f70d56b47ce864a686;hpb=8b7a2ebc537e8468adeabce81b386a8c08f61ce1;p=mono.git diff --git a/mcs/class/corlib/System/Array.cs b/mcs/class/corlib/System/Array.cs index a72d68e4738..91424bc6f8f 100644 --- a/mcs/class/corlib/System/Array.cs +++ b/mcs/class/corlib/System/Array.cs @@ -68,7 +68,10 @@ namespace System internal IEnumerator InternalArray__IEnumerable_GetEnumerator () { - return new InternalEnumerator (this); + if (Length == 0) + return EmptyInternalEnumerator.Value; + else + return new InternalEnumerator (this); } internal void InternalArray__ICollection_Clear () @@ -207,7 +210,7 @@ namespace System // we just decr the size, so, 0 - 1 == FINISHED const int FINISHED = -1; - Array array; + readonly Array array; int idx; internal InternalEnumerator (Array array) @@ -218,7 +221,6 @@ namespace System public void Dispose () { - idx = NOT_STARTED; } public bool MoveNext () @@ -272,6 +274,38 @@ namespace System } } + internal class EmptyInternalEnumerator : IEnumerator + { + public static readonly EmptyInternalEnumerator Value = new EmptyInternalEnumerator (); + + public void Dispose () + { + return; + } + + public bool MoveNext () + { + return false; + } + + public T Current { + get { + throw new InvalidOperationException ("Enumeration has not started. Call MoveNext"); + } + } + + object IEnumerator.Current { + get { + return Current; + } + } + + void IEnumerator.Reset () + { + return; + } + } + // InternalCall Methods [MethodImplAttribute (MethodImplOptions.InternalCall)] extern int GetRank (); @@ -312,12 +346,17 @@ namespace System public object GetValue (int index) { if (Rank != 1) - throw new ArgumentException (Locale.GetText ("Array was not a one-dimensional array.")); - if (index < GetLowerBound (0) || index > GetUpperBound (0)) + throw new ArgumentException (SR.Arg_RankMultiDimNotSupported); + + var lb = GetLowerBound (0); + if (index < lb || index > GetUpperBound (0)) throw new IndexOutOfRangeException (Locale.GetText ( "Index has to be between upper and lower bound of the array.")); - return GetValueImpl (index - GetLowerBound (0)); + if (GetType ().GetElementType ().IsPointer) + throw new NotSupportedException ("Type is not supported"); + + return GetValueImpl (index - lb); } public object GetValue (int index1, int index2) @@ -335,12 +374,17 @@ namespace System public void SetValue (object value, int index) { if (Rank != 1) - throw new ArgumentException (Locale.GetText ("Array was not a one-dimensional array.")); - if (index < GetLowerBound (0) || index > GetUpperBound (0)) + throw new ArgumentException (SR.Arg_RankMultiDimNotSupported); + + var lb = GetLowerBound (0); + if (index < lb || index > GetUpperBound (0)) throw new IndexOutOfRangeException (Locale.GetText ( "Index has to be >= lower bound and <= upper bound of the array.")); - SetValueImpl (value, index - GetLowerBound (0)); + if (GetType ().GetElementType ().IsPointer) + throw new NotSupportedException ("Type is not supported"); + + SetValueImpl (value, index - lb); } public void SetValue (object value, int index1, int index2) @@ -689,8 +733,9 @@ namespace System { public Object Current { get { - if (_index < 0) throw new InvalidOperationException(SR.InvalidOperation_EnumNotStarted); - if (_index >= _endIndex) throw new InvalidOperationException(SR.InvalidOperation_EnumEnded); + if (_index < 0) throw new InvalidOperationException (SR.InvalidOperation_EnumNotStarted); + if (_index >= _endIndex) throw new InvalidOperationException (SR.InvalidOperation_EnumEnded); + if (_index == 0 && _array.GetType ().GetElementType ().IsPointer) throw new NotSupportedException ("Type is not supported"); return _array.GetValueImpl(_index); } }