From 7b819d65bd26c0642f88ab30e8ccc17d9e625fcf Mon Sep 17 00:00:00 2001 From: Daniele Alessandri Date: Tue, 14 Apr 2009 16:21:12 +0200 Subject: [PATCH] Fix the behaviour of Array#[]= with [start, length] --- .../Extensions/IListOps.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs index e5b3c2f429..2dac7c5800 100644 --- a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs +++ b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs @@ -408,8 +408,17 @@ public static class IListOps { DeleteItems(self, index, length); } else { if (valueAsList == null) { - SetElement(context, self, index, value); + Insert(context, self, index, value); + + if (length > 0) { + RemoveRange(self, index + 1, Math.Min(length, self.Count - index - 1)); + } } else { + if (value == self) { + valueAsList = new object[self.Count]; + self.CopyTo(valueAsList as object[], 0); + } + ExpandList(self, index); int limit = length > valueAsList.Count ? valueAsList.Count : length; @@ -420,7 +429,8 @@ public static class IListOps { if (length < valueAsList.Count) { InsertRange(self, index + limit, EnumerateRange(valueAsList, limit, valueAsList.Count - limit)); - } else { + } + else { RemoveRange(self, index + limit, Math.Min(length - valueAsList.Count, self.Count - (index + limit))); } }