On Thu, Apr 16, 2009 at 01:14, Shri Borde <shri.bo...@microsoft.com> wrote:
> In IListOps.Fetch, instead of doing the protocol conversion manually, you > should calls Protocols. ConvertToInteger. Tomas, can you double-check this? Hmm, right, and the code looks much more cleaner too. I think I should just use Protocols.CastToFixnum then: we don't really care about bignums here, they can't be used as indexes for arrays anyway and in fact MRI throws a RangeError "bignum too big to convert into `long'". > In IListOps.First, you can get rid of the allocateStorage argument as its > not being used anymore. (You can batch this fix with your next commit) Same for IListOps.Last, it just slipped away. I removed allocateStorage on both. > Btw, could you please increase the diff context size to 15-20 so more of the > surrounding lines are included? That makes it easier to understand what the > fix is doing when using the url below, without having to map that back to > the correct line number in the actual file. I guess there is no way to increase the lines range of a diff viewed via the github web interface, but I can generate and attach custom diff patches to my mails if you think it could be useful, just like the one attached to this mail and generated with "git diff HEAD~1 -U15 > patch.diff" (PS: I have not yet pushed this commit on my remote repository). -- Daniele Alessandri http://www.clorophilla.net/blog/ http://twitter.com/JoL1hAHN
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 f6a6fd8..955836e 100644 --- a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs +++ b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs @@ -723,51 +723,45 @@ namespace IronRuby.Builtins { if (block.Yield(i, out result)) { return result; } i++; } return self; } #endregion #region fetch [RubyMethod("fetch")] public static object Fetch( - RespondToStorage/*!*/ respondToStorage, - CallSiteStorage<Func<CallSite, object, int>>/*!*/ toIntStorage, + ConversionStorage<int>/*!*/ fixnumCast, BlockParam outOfRangeValueProvider, IList/*!*/ list, object/*!*/ index, [Optional]object defaultValue) { - if (!Protocols.RespondTo(respondToStorage, index, "to_int")) { - throw RubyExceptions.CannotConvertTypeToTargetType(respondToStorage.Context, index, "Integer"); - } - - var toInt = toIntStorage.GetCallSite("to_int", 0); - int convertedIndex = toInt.Target(toInt, index); + int convertedIndex = Protocols.CastToFixnum(fixnumCast, index); if (InRangeNormalized(list, ref convertedIndex)) { return list[convertedIndex]; } if (outOfRangeValueProvider != null) { if (defaultValue != Missing.Value) { - respondToStorage.Context.ReportWarning("block supersedes default value argument"); + fixnumCast.Context.ReportWarning("block supersedes default value argument"); } object result; outOfRangeValueProvider.Yield(index, out result); return result; } if (defaultValue == Missing.Value) { throw RubyExceptions.CreateIndexError("index " + convertedIndex + " out of array"); } return defaultValue; } #endregion @@ -875,48 +869,46 @@ namespace IronRuby.Builtins { int length = Math.Max(0, end - begin + (range.ExcludeEnd ? 0 : 1)); return Fill(fixnumCast.Context, block, self, begin, length); } #endregion #region first, last [RubyMethod("first")] public static object First(IList/*!*/ self) { return self.Count == 0 ? null : self[0]; } [RubyMethod("first")] - public static IList/*!*/ First(CallSiteStorage<Func<CallSite, RubyClass, object>>/*!*/ allocateStorage, - IList/*!*/ self, [DefaultProtocol]int count) { + public static IList/*!*/ First(IList/*!*/ self, [DefaultProtocol]int count) { if (count < 0) { throw RubyExceptions.CreateArgumentError("negative array size (or size too big)"); } count = count > self.Count ? self.Count : count; return RubyArray.Create(self as IList<object>, 0, count); } [RubyMethod("last")] public static object Last(IList/*!*/ self) { return self.Count == 0 ? null : self[self.Count - 1]; } [RubyMethod("last")] - public static IList/*!*/ Last(CallSiteStorage<Func<CallSite, RubyClass, object>>/*!*/ allocateStorage, - IList/*!*/ self, [DefaultProtocol]int count) { + public static IList/*!*/ Last(IList/*!*/ self, [DefaultProtocol]int count) { if (count < 0) { throw RubyExceptions.CreateArgumentError("negative array size (or size too big)"); } count = count > self.Count ? self.Count : count; return RubyArray.Create(self as IList<object>, self.Count - count, count); } #endregion #region flatten, flatten! [MultiRuntimeAware] private static RubyUtils.RecursionTracker _infiniteFlattenTracker = new RubyUtils.RecursionTracker(); diff --git a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs index 213c2b2..0a6ad6b 100644 --- a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs +++ b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs @@ -5059,47 +5059,47 @@ namespace IronRuby.Builtins { ); module.DefineLibraryMethod("each_index", 0x51, new System.Func<IronRuby.Runtime.RubyContext, IronRuby.Runtime.BlockParam, System.Collections.IList, System.Object>(IronRuby.Builtins.IListOps.EachIndex) ); module.DefineLibraryMethod("empty?", 0x51, new System.Func<System.Collections.IList, System.Boolean>(IronRuby.Builtins.IListOps.Empty) ); module.DefineLibraryMethod("eql?", 0x51, new System.Func<System.Collections.IList, System.Object, System.Boolean>(IronRuby.Builtins.IListOps.HashEquals) ); module.DefineLibraryMethod("fetch", 0x51, - new System.Func<IronRuby.Runtime.RespondToStorage, IronRuby.Runtime.CallSiteStorage<System.Func<System.Runtime.CompilerServices.CallSite, System.Object, System.Int32>>, IronRuby.Runtime.BlockParam, System.Collections.IList, System.Object, System.Object, System.Object>(IronRuby.Builtins.IListOps.Fetch) + new System.Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.BlockParam, System.Collections.IList, System.Object, System.Object, System.Object>(IronRuby.Builtins.IListOps.Fetch) ); module.DefineLibraryMethod("fill", 0x51, new System.Func<IronRuby.Runtime.RubyContext, System.Collections.IList, System.Object, System.Int32, System.Collections.IList>(IronRuby.Builtins.IListOps.Fill), new System.Func<IronRuby.Runtime.RubyContext, System.Collections.IList, System.Object, System.Int32, System.Int32, System.Collections.IList>(IronRuby.Builtins.IListOps.Fill), new System.Func<IronRuby.Runtime.ConversionStorage<System.Int32>, System.Collections.IList, System.Object, System.Object, System.Object, System.Collections.IList>(IronRuby.Builtins.IListOps.Fill), new System.Func<IronRuby.Runtime.ConversionStorage<System.Int32>, System.Collections.IList, System.Object, IronRuby.Builtins.Range, System.Collections.IList>(IronRuby.Builtins.IListOps.Fill), new System.Func<IronRuby.Runtime.RubyContext, IronRuby.Runtime.BlockParam, System.Collections.IList, System.Int32, System.Object>(IronRuby.Builtins.IListOps.Fill), new System.Func<IronRuby.Runtime.RubyContext, IronRuby.Runtime.BlockParam, System.Collections.IList, System.Int32, System.Int32, System.Object>(IronRuby.Builtins.IListOps.Fill), new System.Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.BlockParam, System.Collections.IList, System.Object, System.Object, System.Object>(IronRuby.Builtins.IListOps.Fill), new System.Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.BlockParam, System.Collections.IList, IronRuby.Builtins.Range, System.Object>(IronRuby.Builtins.IListOps.Fill) ); module.DefineLibraryMethod("first", 0x51, new System.Func<System.Collections.IList, System.Object>(IronRuby.Builtins.IListOps.First), - new System.Func<IronRuby.Runtime.CallSiteStorage<System.Func<System.Runtime.CompilerServices.CallSite, IronRuby.Builtins.RubyClass, System.Object>>, System.Collections.IList, System.Int32, System.Collections.IList>(IronRuby.Builtins.IListOps.First) + new System.Func<System.Collections.IList, System.Int32, System.Collections.IList>(IronRuby.Builtins.IListOps.First) ); module.DefineLibraryMethod("flatten", 0x51, new System.Func<IronRuby.Runtime.CallSiteStorage<System.Func<System.Runtime.CompilerServices.CallSite, IronRuby.Builtins.RubyClass, System.Object>>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, IronRuby.Runtime.RubyContext, System.Collections.IList, System.Collections.IList>(IronRuby.Builtins.IListOps.Flatten) ); module.DefineLibraryMethod("flatten!", 0x51, new System.Func<IronRuby.Runtime.CallSiteStorage<System.Func<System.Runtime.CompilerServices.CallSite, IronRuby.Builtins.RubyClass, System.Object>>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, IronRuby.Runtime.RubyContext, System.Collections.IList, System.Collections.IList>(IronRuby.Builtins.IListOps.FlattenInPlace) ); module.DefineLibraryMethod("hash", 0x51, new System.Func<System.Collections.IList, System.Int32>(IronRuby.Builtins.IListOps.GetHashCode) ); module.DefineLibraryMethod("include?", 0x51, @@ -5125,31 +5125,31 @@ namespace IronRuby.Builtins { module.DefineLibraryMethod("insert", 0x51, new System.Func<IronRuby.Runtime.RubyContext, System.Collections.IList, System.Int32, System.Object[], System.Collections.IList>(IronRuby.Builtins.IListOps.Insert) ); module.DefineLibraryMethod("inspect", 0x51, new System.Func<IronRuby.Runtime.RubyContext, System.Collections.IList, IronRuby.Builtins.MutableString>(IronRuby.Builtins.IListOps.Inspect) ); module.DefineLibraryMethod("join", 0x51, new System.Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, System.Collections.IList, IronRuby.Builtins.MutableString>(IronRuby.Builtins.IListOps.Join), new System.Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, System.Collections.IList, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.IListOps.Join) ); module.DefineLibraryMethod("last", 0x51, new System.Func<System.Collections.IList, System.Object>(IronRuby.Builtins.IListOps.Last), - new System.Func<IronRuby.Runtime.CallSiteStorage<System.Func<System.Runtime.CompilerServices.CallSite, IronRuby.Builtins.RubyClass, System.Object>>, System.Collections.IList, System.Int32, System.Collections.IList>(IronRuby.Builtins.IListOps.Last) + new System.Func<System.Collections.IList, System.Int32, System.Collections.IList>(IronRuby.Builtins.IListOps.Last) ); module.DefineLibraryMethod("length", 0x51, new System.Func<System.Collections.IList, System.Int32>(IronRuby.Builtins.IListOps.Length) ); module.DefineLibraryMethod("map!", 0x51, new System.Func<IronRuby.Runtime.RubyContext, IronRuby.Runtime.BlockParam, System.Collections.IList, System.Object>(IronRuby.Builtins.IListOps.CollectInPlace) ); module.DefineLibraryMethod("nitems", 0x51, new System.Func<System.Collections.IList, System.Int32>(IronRuby.Builtins.IListOps.NumberOfNonNilItems) ); module.DefineLibraryMethod("pop", 0x51,
_______________________________________________ Ironruby-core mailing list Ironruby-core@rubyforge.org http://rubyforge.org/mailman/listinfo/ironruby-core