edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C1207804
File: RubyTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C1207804  (server)    10/16/2009 12:51 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;BFX.1
@@ -463,8 +463,9 @@
                 ClrHashEqualsToString1,
                 ClrHashEqualsToString2,
                 ClrHashEqualsToString3,
+                ClrToString1,
                 ClrHashEquals4,
-                Scenario_RubyEngine1,
+                HostingDefaultOptions1,
                 Scenario_RubyInteractive1,
                 Scenario_RubyInteractive2,
                 
@@ -672,7 +673,8 @@
                 Dlr_ClrSubtype,
                 Dlr_MethodMissing,
                 Dlr_Miscellaneous,
-                Dlr_Conversions,
+                Dlr_Conversions1,
+                Dlr_Splatting1,
                 Dlr_Indexable,
                 Dlr_Number,
                 Dlr_Comparable,
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/ClrTests.cs;C1215621
File: ClrTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/ClrTests.cs;C1215621  (server)    10/16/2009 2:08 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/ClrTests.cs;BFX.1
@@ -1907,6 +1907,25 @@
             Assert(regex.ToString() == "(?mi-x:hello)");
         }
 
+        public class EmptyClass1 {
+        }
+
+        public void ClrToString1() {
+            Context.ObjectClass.SetConstant("C", Context.GetClass(typeof(EmptyClass1)));
+
+            AssertOutput(() => CompilerTest(@"
+class D; include System::Collections::Generic::IList[Fixnum]; end
+class E < C; include System::Collections::Generic::IList[Fixnum]; end
+class F; end
+
+p D.new, E.new, F.new
+"), @"
+#<D:0x*>
+#<E:0x*>
+#<F:0x*>
+", OutputFlags.Match);
+        }
+
         public void ClrHashEquals4() {
             var e = new RubyObject(Context.ObjectClass);
             int h;
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/DlrInteropTests.cs;C1107696
File: DlrInteropTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/DlrInteropTests.cs;C1107696  (server)    10/16/2009 5:28 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/DlrInteropTests.cs;BFX.1
@@ -28,6 +28,7 @@
 using Microsoft.Scripting.Runtime;
 using Microsoft.Scripting.Utils;
 using System.Collections;
+using IronRuby.Runtime;
 
 namespace IronRuby.Tests {
     #region Custom binders
@@ -681,7 +682,7 @@
             AreEqual(MyInvokeMemberBinder.Invoke(misc_class, "ToString"), "FallbackInvokeMember");
         }
 
-        public void Dlr_Conversions() {
+        public void Dlr_Conversions1() {
             Engine.Execute(@"
 class C
   def to_int
@@ -714,6 +715,55 @@
             AreEqual(MyConvertBinder.Convert<string>(c, "FallbackConvert"), "str");
         }
 
+        public class DynamicList : IDynamicMetaObjectProvider {
+            public DynamicMetaObject/*!*/ GetMetaObject(Expression/*!*/ parameter) {
+                return new Meta(parameter, BindingRestrictions.Empty, this);
+            }
+
+            public class Meta : DynamicMetaObject {
+                internal Meta(Expression/*!*/ expression, BindingRestrictions/*!*/ restrictions, object/*!*/ value)
+                    : base(expression, restrictions, value) {
+                }
+
+                public override DynamicMetaObject/*!*/ BindConvert(ConvertBinder/*!*/ binder) {
+                    if (binder.Type != typeof(IList)) {
+                        return binder.FallbackConvert(this);
+                    }
+
+                    return new DynamicMetaObject(
+                        Expression.Constant(new object[] { 1, 2, 3}),
+                        BindingRestrictions.GetTypeRestriction(Expression, Value.GetType())
+                    );
+                }
+            }
+        }
+
+        public void Dlr_Splatting1() {
+            var scope = Engine.CreateScope();
+            scope.SetVariable("x", new DynamicList());
+
+            var a = Engine.Execute<RubyArray>(@"a,b,c = *x; [a,b,c]", scope);
+            Assert((int)a[0] == 1);
+            Assert((int)a[1] == 2);
+            Assert((int)a[2] == 3);
+
+            a = Engine.Execute<RubyArray>(@"a,b,c = x; [a,b,c]", scope);
+            Assert((int)a[0] == 1);
+            Assert((int)a[1] == 2);
+            Assert((int)a[2] == 3);
+
+            var expando = new ExpandoObject();
+            scope.SetVariable("x", expando);
+            
+            a = Engine.Execute<RubyArray>(@"a,b = *x; [a,b]", scope);
+            Assert(a[0] == expando);
+            Assert(a[1] == null);
+
+            a = Engine.Execute<RubyArray>(@"a,b = x; [a,b]", scope);
+            Assert(a[0] == expando);
+            Assert(a[1] == null);
+        }
+
         public void Dlr_Indexable() {
             var scope = CreateInteropScope();
             object indexable = scope.GetVariable("indexable");
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/HostingTests.cs;C1200585
File: HostingTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/HostingTests.cs;C1200585  (server)    10/16/2009 11:36 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/HostingTests.cs;BFX.1
@@ -146,6 +146,13 @@
 
             scope.SetVariable("some_variable", "foo");
             Assert(compiled.Execute<string>(scope) == "foo");
+
+            // we throw correct exceptions:
+            scope = Engine.CreateScope();
+            scope.SetVariable("bar", 1);
+            AssertExceptionThrown<MissingMethodException>(() => Engine.Execute("foo 1,2,3"));
+            AssertExceptionThrown<MissingMethodException>(() => Engine.Execute("foo 1,2,3", scope));
+            AssertExceptionThrown<ArgumentException>(() => Engine.Execute("bar 1,2,3", scope));
         }
 
         public void RubyHosting1D() {
@@ -257,10 +264,17 @@
             Assert(Runtime.Globals.GetVariable<int>("z") == 3);
         }
 
-        public void Scenario_RubyEngine1() {
-            ScriptScope scope = Runtime.CreateScope();
-            object x = Engine.CreateScriptSourceFromString("1 + 1").Execute(scope);
-            AssertEquals(x, 2);
+        public void HostingDefaultOptions1() {
+            // this reports warnings that the default ErrorSink should ignore:
+            Engine.Execute(@"
+x = lambda { }
+1.times &x
+
+a = 'ba'.gsub /b/, '1'
+");
+
+            // errors and fatal errors should trigger an exception:
+            AssertExceptionThrown<SyntaxErrorException>(() => Engine.Execute("}"));
         }
 
         public void Scenario_RubyInteractive1() {
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;C1207804
File: KernelOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;C1207804  (server)    10/16/2009 2:01 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;BFX.1
@@ -409,7 +409,7 @@
 
         [RubyMethod("to_s")]
         public static MutableString/*!*/ ToS([NotNull]IRubyObject/*!*/ self) {
-            return RubyObject.BaseToMutableString(self);
+            return RubyUtils.ObjectBaseToMutableString(self);
         }
 
         [RubyMethod("to_s")]
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyModule.cs;C1207598
File: RubyModule.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyModule.cs;C1207598  (server)    10/16/2009 1:54 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyModule.cs;BFX.1
@@ -701,15 +701,15 @@
             set { GetInstanceData().Tainted = value; }
         }
 
-        public int BaseGetHashCode() {
+        int IRubyObject.BaseGetHashCode() {
             return base.GetHashCode();
         }
 
-        public bool BaseEquals(object other) {
+        bool IRubyObject.BaseEquals(object other) {
             return base.Equals(other);
         }
 
-        public string/*!*/ BaseToString() {
+        string/*!*/ IRubyObject.BaseToString() {
             return base.ToString();
         }
 
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyObject.cs;C1162930
File: RubyObject.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyObject.cs;C1162930  (server)    10/16/2009 1:55 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyObject.cs;BFX.1
@@ -44,16 +44,28 @@
             _immediateClass = cls;
         }
 
+        protected virtual RubyObject/*!*/ CreateInstance() {
+            return new RubyObject(_immediateClass.NominalClass);
+        }
+
+        object IDuplicable.Duplicate(RubyContext/*!*/ context, bool copySingletonMembers) {
+            var result = CreateInstance();
+            context.CopyInstanceData(this, result, copySingletonMembers);
+            return result;
+        }
+
+        #region ToString, Equals, GetHashCode
+
         public override string/*!*/ ToString() {
 #if DEBUG && !SILVERLIGHT && CLR2
             if (RubyBinder._DumpingExpression) {
-                return BaseToMutableString(this).ToString();
+                return RubyUtils.ObjectBaseToMutableString(this).ToString();
             }
 #endif
             var site = _immediateClass.ToStringSite;
             object toStringResult = site.Target(site, this);
             if (ReferenceEquals(toStringResult, RubyOps.ForwardToBase)) {
-                return BaseToString();
+                return ((IRubyObject)this).BaseToString();
             }
 
             string str = toStringResult as string;
@@ -65,22 +77,6 @@
             return mstr.ToString();
         }
 
-        public string/*!*/ BaseToString() {
-            return ToMutableString(this).ToString();
-        }
-
-        public static MutableString/*!*/ ToMutableString(IRubyObject/*!*/ self) {
-            return RubyUtils.FormatObject(self.ImmediateClass.GetNonSingletonClass().Name, self.GetInstanceData().ObjectId, self.IsTainted);
-        }
-
-        public static MutableString/*!*/ BaseToMutableString(IRubyObject/*!*/ self) {
-            if (self is RubyObject) {
-                return ToMutableString(self);
-            } else {
-                return MutableString.CreateMutable(self.BaseToString(), RubyEncoding.UTF8);
-            }
-        }
-
         public override bool Equals(object other) {
             if (ReferenceEquals(this, other)) {
                 // Handle this directly here. Otherwise it can cause infinite recurion when running
@@ -97,10 +93,6 @@
             return RubyOps.IsTrue(equalsResult);
         }
 
-        public bool BaseEquals(object other) {
-            return base.Equals(other);
-        }
-
         public override int GetHashCode() {
             var site = _immediateClass.GetHashCodeSite;
             object hashResult = site.Target(site, this);
@@ -111,23 +103,19 @@
             return Protocols.ToHashCode(hashResult);
         }
 
-        public int BaseGetHashCode() {
-            return base.GetHashCode();
+        string/*!*/ IRubyObject.BaseToString() {
+            return RubyOps.ObjectToString(this);
         }
 
-        public MutableString/*!*/ Inspect() {
-            return _immediateClass.Context.Inspect(this);
+        bool IRubyObject.BaseEquals(object other) {
+            return base.Equals(other);
         }
 
-        protected virtual RubyObject/*!*/ CreateInstance() {
-            return new RubyObject(_immediateClass.NominalClass);
+        int IRubyObject.BaseGetHashCode() {
+            return base.GetHashCode();
         }
 
-        object IDuplicable.Duplicate(RubyContext/*!*/ context, bool copySingletonMembers) {
-            var result = CreateInstance();
-            context.CopyInstanceData(this, result, copySingletonMembers);
-            return result;
-        }
+        #endregion
 
         #region IRubyObject
 
@@ -160,6 +148,8 @@
 
         #endregion
 
+        #region Serialization
+
 #if !SILVERLIGHT
         protected RubyObject(SerializationInfo/*!*/ info, StreamingContext context) {
             RubyOps.DeserializeObject(out _instanceData, out _immediateClass, info);
@@ -170,5 +160,7 @@
             RubyOps.SerializeObject(_instanceData, _immediateClass, info);
         }
 #endif
+
+        #endregion
     }
 }
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/ReflectionCache.Generated.cs;C1205334
File: ReflectionCache.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/ReflectionCache.Generated.cs;C1205334  (server)    10/16/2009 2:03 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/ReflectionCache.Generated.cs;BFX.1
@@ -48,8 +48,6 @@
         private static MethodInfo _ConvertBignumToFixnum;
         public static MethodInfo/*!*/ ConvertBignumToFloat { get { return _ConvertBignumToFloat ?? (_ConvertBignumToFloat = GetMethod(typeof(RubyOps), "ConvertBignumToFloat")); } }
         private static MethodInfo _ConvertBignumToFloat;
-        public static MethodInfo/*!*/ ConvertCharToFloat { get { return _ConvertCharToFloat ?? (_ConvertCharToFloat = GetMethod(typeof(RubyOps), "ConvertCharToFloat")); } }
-        private static MethodInfo _ConvertCharToFloat;
         public static MethodInfo/*!*/ ConvertDoubleToFixnum { get { return _ConvertDoubleToFixnum ?? (_ConvertDoubleToFixnum = GetMethod(typeof(RubyOps), "ConvertDoubleToFixnum")); } }
         private static MethodInfo _ConvertDoubleToFixnum;
         public static MethodInfo/*!*/ ConvertFixnumToSymbol { get { return _ConvertFixnumToSymbol ?? (_ConvertFixnumToSymbol = GetMethod(typeof(RubyOps), "ConvertFixnumToSymbol")); } }
@@ -410,6 +408,8 @@
         private static MethodInfo _NullIfTrue;
         public static MethodInfo/*!*/ ObjectToMutableString { get { return _ObjectToMutableString ?? (_ObjectToMutableString = GetMethod(typeof(RubyOps), "ObjectToMutableString")); } }
         private static MethodInfo _ObjectToMutableString;
+        public static MethodInfo/*!*/ ObjectToString { get { return _ObjectToString ?? (_ObjectToString = GetMethod(typeof(RubyOps), "ObjectToString")); } }
+        private static MethodInfo _ObjectToString;
         public static MethodInfo/*!*/ PrintInteractiveResult { get { return _PrintInteractiveResult ?? (_PrintInteractiveResult = GetMethod(typeof(RubyOps), "PrintInteractiveResult")); } }
         private static MethodInfo _PrintInteractiveResult;
         public static MethodInfo/*!*/ PropagateRetrySingleton { get { return _PropagateRetrySingleton ?? (_PropagateRetrySingleton = GetMethod(typeof(RubyOps), "PropagateRetrySingleton")); } }
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/ClsTypeEmitter.cs;C1215621
File: ClsTypeEmitter.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/ClsTypeEmitter.cs;C1215621  (server)    10/16/2009 3:16 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/ClsTypeEmitter.cs;BFX.1
@@ -107,7 +107,8 @@
 
         protected abstract void EmitImplicitContext(ILGen il);
         protected abstract void EmitMakeCallAction(string name, int nargs, bool isList);
-        protected abstract FieldInfo GetConversionSite(Type toType);
+        protected abstract FieldInfo GetConversionSiteField(Type toType);
+        protected abstract MethodInfo GetGenericConversionSiteFactory(Type toType);
         protected abstract void EmitClassObjectFromInstance(ILGen il);
         
         protected abstract bool TryGetName(Type clrType, MethodInfo mi, out string name);
@@ -487,20 +488,43 @@
             var callTarget = il.DeclareLocal(typeof(object));
             il.Emit(OpCodes.Stloc, callTarget);
 
-            var site = GetConversionSite(toType);
+            if (toType.IsGenericParameter && toType.DeclaringMethod != null) {
+                MethodInfo siteFactory = GetGenericConversionSiteFactory(toType);
+                Debug.Assert(siteFactory.GetParameters().Length == 0 && typeof(CallSite).IsAssignableFrom(siteFactory.ReturnType));
 
-            // Emit the site invoke
-            il.EmitFieldGet(site);
-            FieldInfo target = site.FieldType.GetField("Target");
-            il.EmitFieldGet(target);
-            il.EmitFieldGet(site);
+                // siteVar = GetConversionSite<T>()
+                var siteVar = il.DeclareLocal(siteFactory.ReturnType);
+                il.Emit(OpCodes.Call, siteFactory);
+                il.Emit(OpCodes.Stloc, siteVar);
 
-            // Emit the context
-            EmitContext(il, false);
+                // Emit the site invoke
+                il.Emit(OpCodes.Ldloc, siteVar);
+                FieldInfo target = siteVar.LocalType.GetField("Target");
+                il.EmitFieldGet(target);
+                il.Emit(OpCodes.Ldloc, siteVar);
 
-            il.Emit(OpCodes.Ldloc, callTarget);
+                // Emit the context
+                EmitContext(il, false);
 
-            il.EmitCall(target.FieldType, "Invoke");
+                il.Emit(OpCodes.Ldloc, callTarget);
+
+                il.EmitCall(target.FieldType, "Invoke");
+            } else {
+                var site = GetConversionSiteField(toType);
+
+                // Emit the site invoke
+                il.EmitFieldGet(site);
+                FieldInfo target = site.FieldType.GetField("Target");
+                il.EmitFieldGet(target);
+                il.EmitFieldGet(site);
+
+                // Emit the context
+                EmitContext(il, false);
+
+                il.Emit(OpCodes.Ldloc, callTarget);
+
+                il.EmitCall(target.FieldType, "Invoke");
+            }
         }
 
         private MethodBuilder CreateVTableSetterOverride(MethodInfo mi, string name) {
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/RubyTypeBuilder.cs;C1093989
File: RubyTypeBuilder.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/RubyTypeBuilder.cs;C1093989  (server)    10/16/2009 1:49 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/RubyTypeBuilder.cs;BFX.1
@@ -371,7 +371,12 @@
             // string IRubyObject.BaseToString() { return base.ToString(); }
             il = DefineMethodOverride(_tb, Methods.IRubyObject_BaseToString);
             il.EmitLoadArg(0);
-            il.EmitCall(_tb.BaseType.GetMethod("ToString", Type.EmptyTypes));
+            MethodInfo toString = _tb.BaseType.GetMethod("ToString", Type.EmptyTypes);
+            if (toString.DeclaringType == typeof(object)) {
+                il.EmitCall(Methods.ObjectToString);
+            } else {
+                il.EmitCall(toString);
+            }
             il.Emit(OpCodes.Ret);
         }
 
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/RubyTypeEmitter.cs;C1107696
File: RubyTypeEmitter.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/RubyTypeEmitter.cs;C1107696  (server)    10/16/2009 3:15 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/RubyTypeEmitter.cs;BFX.1
@@ -30,6 +30,8 @@
 using IronRuby.Runtime;
 using IronRuby.Runtime.Calls;
 using IronRuby.Runtime.Conversions;
+using Microsoft.Scripting.Utils;
+using System.Collections.Generic;
 
 namespace IronRuby.Compiler.Generation {
     public class RubyTypeEmitter : ClsTypeEmitter {
@@ -74,7 +76,34 @@
             cctor.EmitCall(typeof(RubyTypeEmitter), "MakeRubyCallSite");
         }
 
-        protected override FieldInfo GetConversionSite(Type toType) {
+
+        #region Dynamic Conversions
+
+        private static Dictionary<Type, CallSite> _conversionSites;
+
+        [Emitted]
+        public static CallSite<Func<CallSite, RubyContext, object, T>>/*!*/ GetConversionSite<T>() {
+            if (_conversionSites == null) {
+                _conversionSites = new Dictionary<Type, CallSite>();
+            }
+            Type toType = typeof(T);
+
+            lock (_conversionSites) {
+                CallSite site;
+                if (_conversionSites.TryGetValue(toType, out site)) {
+                    return (CallSite<Func<CallSite, RubyContext, object, T>>)site;
+                }
+                var newSite = CallSite<Func<CallSite, RubyContext, object, T>>.Create(ProtocolConversionAction.GetConversionAction(null, toType, true));
+                _conversionSites[toType] = newSite;
+                return newSite;
+            }
+        }
+
+        protected override MethodInfo GetGenericConversionSiteFactory(Type toType) {
+            return typeof(RubyTypeEmitter).GetMethod("GetConversionSite").MakeGenericMethod(toType);
+        }
+
+        protected override FieldInfo GetConversionSiteField(Type toType) {
             return AllocateDynamicSite(
                 new Type[] { typeof(CallSite), typeof(RubyContext), typeof(object), toType },
                 (site) => Expression.Assign(
@@ -88,6 +117,8 @@
             );
         }
 
+        #endregion
+
         protected override void EmitImplicitContext(ILGen il) {
             il.EmitLoadArg(0);
             EmitClassObjectFromInstance(il);
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyOps.cs;C1204880
File: RubyOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyOps.cs;C1204880  (server)    10/16/2009 1:56 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyOps.cs;BFX.1
@@ -2266,6 +2266,11 @@
 
         #region Ruby Types
 
+        [Emitted]
+        public static string/*!*/ ObjectToString(IRubyObject/*!*/ obj) {
+            return RubyUtils.ObjectToMutableString(obj).ToString();
+        }
+
         [Emitted] //RubyTypeBuilder
         public static RubyInstanceData/*!*/ GetInstanceData(ref RubyInstanceData/*!*/ instanceData) {
             if (instanceData == null) {
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyScope.cs;C1200585
File: RubyScope.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyScope.cs;C1200585  (server)    10/16/2009 11:39 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyScope.cs;BFX.1
@@ -984,16 +984,18 @@
                 RubyOps.ScopeSetMember(globalScope, str, value);
                 return value;
             } else {
-                if (args.Length != 0) {
-                    throw RubyOps.MakeWrongNumberOfArgumentsError(args.Length, 0);
+                object result;
+                if (RubyOps.TryGetGlobalScopeMethod(context, globalScope, str, out result)) {
+                    if (args.Length != 0) {
+                        throw RubyOps.MakeWrongNumberOfArgumentsError(args.Length, 0);
+                    }
+                    return result;
                 }
 
-                object value;
-                if (RubyOps.TryGetGlobalScopeMethod(context, globalScope, str, out value)) {
-                    return value;
-                }
-
                 if (self != null && str == "scope") {
+                    if (args.Length != 0) {
+                        throw RubyOps.MakeWrongNumberOfArgumentsError(args.Length, 0);
+                    }
                     return self;
                 }
             }
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;C1200585
File: RubyUtils.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;C1200585  (server)    10/16/2009 1:58 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;BFX.1
@@ -147,6 +147,18 @@
             return str.AppendFormat("0x{0:x7}", 2 * objectId);
         }
 
+        public static MutableString/*!*/ ObjectToMutableString(IRubyObject/*!*/ self) {
+            return RubyUtils.FormatObject(self.ImmediateClass.GetNonSingletonClass().Name, self.GetInstanceData().ObjectId, self.IsTainted);
+        }
+
+        public static MutableString/*!*/ ObjectBaseToMutableString(IRubyObject/*!*/ self) {
+            if (self is RubyObject) {
+                return RubyUtils.ObjectToMutableString(self);
+            } else {
+                return MutableString.CreateMutable(self.BaseToString(), RubyEncoding.UTF8);
+            }
+        }
+
         public static bool TryDuplicateObject(
             CallSiteStorage<Func<CallSite, object, object, object>>/*!*/ initializeCopyStorage,
             CallSiteStorage<Func<CallSite, RubyClass, object>>/*!*/ allocateStorage, 
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/InteropBinder.cs;C1116095
File: InteropBinder.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/InteropBinder.cs;C1116095  (server)    10/16/2009 5:49 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/InteropBinder.cs;BFX.1
@@ -20,6 +20,7 @@
 #endif
 
 using System;
+using System.Collections;
 using System.Diagnostics;
 using System.Dynamic;
 using System.Reflection;
@@ -507,6 +508,7 @@
 
         internal sealed class GetIndex : GetIndexBinder, IInteropBinder {
             private readonly RubyContext/*!*/ _context;
+            public RubyContext Context { get { return _context; } }
 
             internal GetIndex(RubyContext/*!*/ context, CallInfo/*!*/ callInfo)
                 : base(callInfo) {
@@ -514,10 +516,6 @@
                 _context = context;
             }
 
-            public RubyContext Context {
-                get { return _context; }
-            }
-
             #region Ruby -> DLR
 
             public override DynamicMetaObject/*!*/ FallbackGetIndex(DynamicMetaObject/*!*/ target, DynamicMetaObject/*!*/[]/*!*/ indexes, 
@@ -564,6 +562,7 @@
 
         internal sealed class SetIndex : SetIndexBinder, IInteropBinder {
             private readonly RubyContext/*!*/ _context;
+            public RubyContext Context { get { return _context; } }
 
             internal SetIndex(RubyContext/*!*/ context, CallInfo/*!*/ callInfo)
                 : base(callInfo) {
@@ -571,10 +570,6 @@
                 _context = context;
             }
 
-            public RubyContext Context {
-                get { return _context; }
-            }
-
             #region Ruby -> DLR
 
             public override DynamicMetaObject/*!*/ FallbackSetIndex(DynamicMetaObject/*!*/ target, DynamicMetaObject/*!*/[]/*!*/ indexes, 
@@ -625,6 +620,7 @@
         internal sealed class BinaryOperation : BinaryOperationBinder, IInteropBinder {
             private static readonly CallInfo _CallInfo = new CallInfo(1);
             private readonly RubyContext/*!*/ _context;
+            public RubyContext Context { get { return _context; } }
 
             internal BinaryOperation(RubyContext/*!*/ context, ExpressionType operation)
                 : base(operation) {
@@ -632,10 +628,6 @@
                 _context = context;
             }
 
-            public RubyContext Context {
-                get { return _context; }
-            }
-
             public override DynamicMetaObject/*!*/ FallbackBinaryOperation(DynamicMetaObject/*!*/ target, DynamicMetaObject/*!*/ arg, DynamicMetaObject errorSuggestion) {
                 return InvokeMember.FallbackInvokeMember(this, RubyUtils.MapOperator(Operation), _CallInfo, target, new[] { arg }, errorSuggestion);
             }
@@ -660,6 +652,7 @@
         internal sealed class UnaryOperation : UnaryOperationBinder, IInteropBinder {
             private static readonly CallInfo _CallInfo = new CallInfo(0);
             private readonly RubyContext/*!*/ _context;
+            public RubyContext Context { get { return _context; } }
 
             internal UnaryOperation(RubyContext/*!*/ context, ExpressionType operation)
                 : base(operation) {
@@ -667,10 +660,6 @@
                 _context = context;
             }
 
-            public RubyContext Context {
-                get { return _context; }
-            }
-
             public override DynamicMetaObject/*!*/ FallbackUnaryOperation(DynamicMetaObject/*!*/ target, DynamicMetaObject errorSuggestion) {
                 return InvokeMember.FallbackInvokeMember(this, RubyUtils.MapOperator(Operation), _CallInfo, target, DynamicMetaObject.EmptyMetaObjects, errorSuggestion);
             }
@@ -692,6 +681,7 @@
 
         internal sealed class Convert : ConvertBinder, IInteropBinder {
             private readonly RubyContext/*!*/ _context;
+            public RubyContext Context { get { return _context; } }
 
             public Convert(RubyContext/*!*/ context, Type/*!*/ type, bool isExplicit)
                 : base(type, isExplicit) {
@@ -699,14 +689,6 @@
                 _context = context;
             }
 
-            public Type/*!*/ ResultType {
-                get { return Type; }
-            }
-
-            public RubyContext Context {
-                get { return _context; }
-            }
-
             public override DynamicMetaObject/*!*/ FallbackConvert(DynamicMetaObject/*!*/ target, DynamicMetaObject errorSuggestion) {
 #if !SILVERLIGHT
                 DynamicMetaObject result;
@@ -734,7 +716,34 @@
             }
         }
 
+        /// <summary>
+        /// Tries convert to IList. If the covnersion is not implemented by the target meta-object wraps it into an object[].
+        /// </summary>
+        internal sealed class Splat : ConvertBinder, IInteropBinder {
+            private readonly RubyContext/*!*/ _context;
+            public RubyContext Context { get { return _context; } }
 
+            public Splat(RubyContext/*!*/ context)
+                : base(typeof(IList), true) {
+                Assert.NotNull(context);
+                _context = context;
+            }
+
+            public override DynamicMetaObject/*!*/ FallbackConvert(DynamicMetaObject/*!*/ target, DynamicMetaObject errorSuggestion) {
+#if !SILVERLIGHT
+                DynamicMetaObject result;
+                if (Microsoft.Scripting.ComInterop.ComBinder.TryConvert(this, target, out result)) {
+                    return result;
+                }
+#endif
+                return target.Clone(Ast.NewArrayInit(typeof(object), target.Expression));
+            }
+
+            public override string/*!*/ ToString() {
+                return "Interop.Splat" + (_context != null ? " @" + Context.RuntimeId.ToString() : null);
+            }
+        }
+
         // TODO: remove
         internal static DynamicMetaObject/*!*/ CreateErrorMetaObject(this DynamicMetaObjectBinder binder, DynamicMetaObject/*!*/ target, DynamicMetaObject/*!*/[]/*!*/ args, 
             DynamicMetaObject errorSuggestion) {
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/ProtocolConversionAction.cs;C1204880
File: ProtocolConversionAction.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/ProtocolConversionAction.cs;C1204880  (server)    10/16/2009 5:41 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/ProtocolConversionAction.cs;BFX.1
@@ -32,6 +32,7 @@
 using Microsoft.Scripting;
 using Microsoft.Scripting.Generation;
 using Microsoft.Scripting.Math;
+using Microsoft.Scripting.Runtime;
 using Microsoft.Scripting.Utils;
 using AstFactory = IronRuby.Compiler.Ast.AstFactory;
 using AstUtils = Microsoft.Scripting.Ast.Utils;
@@ -502,6 +503,11 @@
         protected override void SetError(MetaObjectBuilder/*!*/ metaBuilder, CallArguments/*!*/ args, Expression/*!*/ targetClassNameConstant, Type/*!*/ resultType) {
             metaBuilder.Result = AstFactory.Box(args.TargetExpression);
         }
+
+        protected override DynamicMetaObjectBinder/*!*/ GetInteropBinder(RubyContext/*!*/ context, IList<DynamicMetaObject>/*!*/ args, out MethodInfo postProcessor) {
+            postProcessor = null;
+            return new InteropBinder.Splat(context);
+        }
     }
 
     public sealed class SplatAction : ProtocolConversionAction<SplatAction> {
@@ -549,6 +555,11 @@
                     )
                 );
         }
+
+        protected override DynamicMetaObjectBinder/*!*/ GetInteropBinder(RubyContext/*!*/ context, IList<DynamicMetaObject>/*!*/ args, out MethodInfo postProcessor) {
+            postProcessor = null;
+            return new InteropBinder.Splat(context);
+        }
     }
 
     #endregion
===================================================================
