edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/IronPython/Tests/test_methodbinder1.py;C966724
File: test_methodbinder1.py
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/IronPython/Tests/test_methodbinder1.py;C966724  (server)    10/9/2009 3:25 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/IronPython/Tests/test_methodbinder1.py;ConversionFixes
@@ -113,8 +113,8 @@
 (        "Int64Max", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, True,  True,  OverF, OverF, OverF, True,  TypeE, True,  True,  ),
 (       "UInt64Max", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, True,  TypeE, True,  True,  ),
 (      "DecimalMax", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
-(       "SingleMax", OverF, OverF, True,  TypeE, True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
-(        "floatMax", OverF, OverF, True,  True, True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
+(       "SingleMax", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
+(        "floatMax", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
 ####                 M201   M680   M202   M203   M204   M205   M301   M302   M303   M304   M310   M311   M312   M313   M320   M321   M400
 ####                 int    int?   double bigint bool   str    sbyte  i16    i64    single byte   ui16   ui32   ui64   char   decm   obj
 (        "SByteMin", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
@@ -126,8 +126,8 @@
 (        "Int64Min", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
 (       "UInt64Min", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
 (      "DecimalMin", OverF, OverF, True , True,  True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, True , True,  ),
-(       "SingleMin", OverF, OverF, True,  TypeE, True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
-(        "floatMin", OverF, OverF, True,  True, True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
+(       "SingleMin", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
+(        "floatMin", OverF, OverF, True,  True,  True,  TypeE, OverF, OverF, OverF, True,  OverF, OverF, OverF, OverF, TypeE, OverF, True,  ),
 ####                 M201   M680   M202   M203   M204   M205   M301   M302   M303   M304   M310   M311   M312   M313   M320   M321   M400
 ####                 int    int?   double bigint bool   str    sbyte  i16    i64    single byte   ui16   ui32   ui64   char   decm   obj
 (    "SBytePlusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
@@ -140,7 +140,7 @@
 (    "Int64PlusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
 (   "UInt64PlusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
 (  "DecimalPlusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE,  True,  True,  ),
-(   "SinglePlusOne", True,  True,  True,  TypeE, True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
+(   "SinglePlusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
 (    "floatPlusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
 (          myfloat1, True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  True,  True,  True,  True,  TypeE, True,  True,  ),
 ####                 M201   M680   M202   M203   M204   M205   M301   M302   M303   M304   M310   M311   M312   M313   M320   M321   M400
@@ -151,7 +151,7 @@
 (            myint2, True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
 (   "Int64MinusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
 ( "DecimalMinusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
-(  "SingleMinusOne", True,  True,  True,  TypeE, True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
+(  "SingleMinusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
 (   "floatMinusOne", True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
 (          myfloat2, True,  True,  True,  True,  True,  TypeE, True,  True,  True,  True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ),
 ##################################################   pass in bool   #########################################################
@@ -186,10 +186,10 @@
         
         ##################################################  pass in float   #########################################################
         ####    single/double becomes Int32, but this does not apply to other primitive types
-        ####                                         int    int?  double  bigint bool   str    sbyte i16   i64   single byte   ui16   ui32   ui64   char   decm   obj
-        matrix.append((System.Single.Parse("8.01", InvariantCulture), True,  True, True,  TypeE, True,  TypeE, True, True, True, True,  True,  True,  True,  True,  TypeE, True,  True,  ))
+        ####                                                           int    int?  double  bigint bool   str    sbyte i16   i64   single byte   ui16   ui32   ui64   char   decm   obj
+        matrix.append((System.Single.Parse("8.01", InvariantCulture), True,  True, True,  True,  True,  TypeE, True, True, True, True,  True,  True,  True,  True,  TypeE, True,  True,  ))
         matrix.append((System.Double.Parse("10.2", InvariantCulture), True,  True, True,  True,  True,  TypeE, True, True, True, True,  True,  True,  True,  True,  TypeE, True,  True,  ))
-        matrix.append((System.Single.Parse("-8.1", InvariantCulture), True,  True, True,  TypeE, True,  TypeE, True, True, True, True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ))
+        matrix.append((System.Single.Parse("-8.1", InvariantCulture), True,  True, True,  True,  True,  TypeE, True, True, True, True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ))
         matrix.append((System.Double.Parse("-1.8", InvariantCulture), True,  True, True,  True,  True,  TypeE, True, True, True, True,  OverF, OverF, OverF, OverF, TypeE, True,  True,  ))
         matrix = tuple(matrix)
     
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/OverloadResolutionTests.cs;C1116347
File: OverloadResolutionTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/OverloadResolutionTests.cs;C1116347  (server)    10/9/2009 11:27 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/OverloadResolutionTests.cs;ConversionFixes
@@ -106,10 +106,18 @@
             }
         }
 
+        #endregion
+
+        #region Misc
+
         public class Overloads1 {
             public class X {
             }
 
+            public enum E {
+                A = 1, B = 2
+            }
+
             public void F1(int a) { }
             public void F2(BigInteger a) { }
             public void F3(double a) { }
@@ -138,6 +146,12 @@
             public void L1(SymbolId a, [DefaultProtocol, NotNull]string b) { }
             public void L2([NotNull]string a, [DefaultProtocol, NotNull]string b) { }
             public void L3([DefaultProtocol]MutableString a, [DefaultProtocol, NotNull]string b) { }
+
+            public void M1(int a) { }
+            public void M2(E e) { }
+
+            public void N1(string a) { }
+            public void N2(char a) { }
         }
 
         public void OverloadResolution_Numeric1() {
@@ -183,6 +197,13 @@
                 new { Args = new[] { MO(ms), MO(sym) }, Overloads = "L*", Result = "L3" },
                 new { Args = new[] { MO(null), MO(sym) }, Overloads = "L*", Result = "L3" },
                 new { Args = new[] { MO(c), MO(sym) }, Overloads = "L*", Result = "L3" },
+
+                // M
+                new { Args = new[] { MO(1) }, Overloads = "M*", Result = "M1" },
+                new { Args = new[] { MO(Overloads1.E.A) }, Overloads = "M*", Result = "M2" },
+
+                // N
+                new { Args = new[] { MO(MutableString.CreateAscii("x")) }, Overloads = "N*", Result = "N1" },
             };
 
             for (int i = 0; i < cases.Length; i++) {
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Ruby.Build.csproj;C1200585
File: Ruby.Build.csproj
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Ruby.Build.csproj;C1200585  (server)    10/9/2009 10:47 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Ruby.Build.csproj;ConversionFixes
@@ -350,7 +350,6 @@
       <Compile Include="Runtime\Calls\MethodDispatcher.cs" />
       <Compile Include="Runtime\Calls\MethodDispatcher.Generated.cs" />
       <Compile Include="Runtime\Calls\MethodResolutionResult.cs" />
-      <Compile Include="Runtime\Calls\ProtocolConversionAction.cs" />
       <Compile Include="Runtime\Calls\RubyAccessorInfo.cs" />
       <Compile Include="Runtime\Calls\RubyBinder.cs" />
       <Compile Include="Runtime\Calls\RubyCallAction.cs" />
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/ReflectionCache.Generated.cs;C1202407
File: ReflectionCache.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/ReflectionCache.Generated.cs;C1202407  (server)    10/9/2009 1:55 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Compiler/ReflectionCache.Generated.cs;ConversionFixes
@@ -48,6 +48,8 @@
         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")); } }
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyFieldInfo.cs;C1107696
File: RubyFieldInfo.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyFieldInfo.cs;C1107696  (server)    10/9/2009 11:05 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyFieldInfo.cs;ConversionFixes
@@ -68,16 +68,15 @@
         }
 
         internal override void BuildCallNoFlow(MetaObjectBuilder/*!*/ metaBuilder, CallArguments/*!*/ args, string/*!*/ name) {
-            Expression expr = null;
             Expression instance = _fieldInfo.IsStatic ? null : Ast.Convert(args.TargetExpression, _fieldInfo.DeclaringType);
 
             if (_isSetter) {
-                // parameters should be: instance/type, value
-                if (args.SimpleArgumentCount == 0 && args.Signature.HasRhsArgument) {
-                    expr = Ast.Assign(
+                var actualArgs = RubyOverloadResolver.NormalizeArguments(metaBuilder, args, 1, 1);
+                if (!metaBuilder.Error) {
+                    metaBuilder.Result = Ast.Assign(
                         Ast.Field(instance, _fieldInfo),
                         Converter.ConvertExpression(
-                            args.GetRhsArgumentExpression(), 
+                            actualArgs[0].Expression, 
                             _fieldInfo.FieldType,
                             args.RubyContext, 
                             args.MetaContext.Expression,
@@ -86,26 +85,18 @@
                     );
                 }
             } else {
-                // parameter should be: instance/type
-                if (args.SimpleArgumentCount == 0) {
+                RubyOverloadResolver.NormalizeArguments(metaBuilder, args, 0, 0);
+                if (!metaBuilder.Error) {
                     if (_fieldInfo.IsLiteral) {
                         // TODO: seems like Compiler should correctly handle the literal field case
                         // (if you emit a read to a literal field, you get a NotSupportedExpception from
                         // FieldHandle when we try to emit)
-                        expr = AstUtils.Constant(_fieldInfo.GetValue(null));
+                        metaBuilder.Result = AstUtils.Constant(_fieldInfo.GetValue(null));
                     } else {
-                        expr = Ast.Field(instance, _fieldInfo);
+                        metaBuilder.Result = Ast.Field(instance, _fieldInfo);
                     }
                 }
             }
-
-            if (expr != null) {
-                metaBuilder.Result = expr;
-            } else {
-                metaBuilder.SetError(
-                    Methods.MakeInvalidArgumentTypesError.OpCall(AstUtils.Constant(_isSetter ? name + "=" : name))
-                );
-            }
         }
     }
 }
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyOverloadResolver.cs;C1175370
File: RubyOverloadResolver.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyOverloadResolver.cs;C1175370  (server)    10/9/2009 11:42 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyOverloadResolver.cs;ConversionFixes
@@ -437,8 +437,8 @@
             Type typeTwo = candidateTwo.Type;
             Type actualType = arg.GetLimitType();
 
-            // if nil is passed as a block argument prefer BlockParam over missing block:
             if (actualType == typeof(DynamicNull)) {
+                // if nil is passed as a block argument prefers BlockParam over a missing block:
                 if (typeOne == typeof(BlockParam) && typeTwo == typeof(MissingBlockParam)) {
                     Debug.Assert(!candidateOne.ProhibitNull);
                     return Candidate.One;
@@ -448,31 +448,34 @@
                     Debug.Assert(!candidateTwo.ProhibitNull);
                     return Candidate.Two;
                 }
-            } else if (actualType == typeof(MissingBlockParam)) {
-                if (typeOne == typeof(BlockParam) && typeTwo == typeof(MissingBlockParam)) {
+            } else {
+                if (typeOne == actualType) {
+                    if (typeTwo == actualType) {
+                        // prefer non-nullable reference type over nullable:
+                        if (!actualType.IsValueType) {
+                            if (candidateOne.ProhibitNull) {
+                                return Candidate.One;
+                            } else if (candidateTwo.ProhibitNull) {
+                                return Candidate.Two;
+                            }
+                        }
+                    } else {
+                        return Candidate.One;
+                    }
+                } else if (typeTwo == actualType) {
                     return Candidate.Two;
                 }
+            }
 
-                if (typeOne == typeof(MissingBlockParam) && typeTwo == typeof(BlockParam)) {
-                    return Candidate.One;
-                }
-            } else if (actualType == typeof(BlockParam)) {
-                if (typeOne == typeof(BlockParam) && typeTwo == typeof(MissingBlockParam)) {
-                    return Candidate.One;
-                }
+            // prefer integer type over enum:
+            if (typeOne.IsEnum && Enum.GetUnderlyingType(typeOne) == typeTwo) {
+                return Candidate.Two;
+            }
 
-                if (typeOne == typeof(MissingBlockParam) && typeTwo == typeof(BlockParam)) {
-                    return Candidate.Two;
-                }
+            if (typeTwo.IsEnum && Enum.GetUnderlyingType(typeTwo) == typeOne) {
+                return Candidate.One;
+            }
 
-                if (typeOne == typeof(BlockParam) && typeTwo == typeof(BlockParam)) {
-                    if (candidateOne.ProhibitNull) {
-                        return Candidate.One;
-                    } else if (candidateTwo.ProhibitNull) {
-                        return Candidate.Two;
-                    }
-                }
-            }
             return base.SelectBestConversionFor(arg, candidateOne, candidateTwo, level);
         }
 
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.cs;C1107696
File: Converter.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.cs;C1107696  (server)    10/9/2009 12:51 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.cs;ConversionFixes
@@ -282,6 +282,12 @@
                         return Candidate.Two;
                     }
                     return Candidate.Equivalent;
+
+                case TypeCode.Char:
+                    if (t2 == typeof(string)) {
+                        return Candidate.Two;
+                    }
+                    return Candidate.Equivalent;
             }
             return Candidate.Equivalent;
         }
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.Generated.cs;C1040664
File: Converter.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.Generated.cs;C1040664  (server)    10/9/2009 1:07 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.Generated.cs;ConversionFixes
@@ -25,6 +25,7 @@
         Byte = 2,
         Int16 = 3,
         UInt16 = 4,
+        // System::Char is treated like a single-character string and not a numeric type
         Int32 = 5,
         UInt32 = 6,
         Int64 = 7,
@@ -115,7 +116,7 @@
         append_generated result
     end
 #endif
-            #region Generated by C:/M2/Merlin/Main/Languages/Ruby/Ruby/Runtime/Converter.Generator.rb
+#region Generated by Converter.Generator.rb
             result[(int)NumericTypeCode.SByte] = (1 << ((int)NumericTypeCode.Byte)) | (1 << ((int)NumericTypeCode.UInt16)) | (1 << ((int)NumericTypeCode.UInt32)) | (1 << ((int)NumericTypeCode.UInt64));
             result[(int)NumericTypeCode.Byte] = (1 << ((int)NumericTypeCode.SByte));
             result[(int)NumericTypeCode.Int16] = (1 << ((int)NumericTypeCode.SByte)) | (1 << ((int)NumericTypeCode.Byte)) | (1 << ((int)NumericTypeCode.UInt16)) | (1 << ((int)NumericTypeCode.UInt32)) | (1 << ((int)NumericTypeCode.UInt64));
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.Generator.rb;C1040664
File: Converter.Generator.rb
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.Generator.rb;C1040664  (server)    10/9/2009 1:13 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Conversions/Converter.Generator.rb;ConversionFixes
@@ -1,3 +1,3 @@
-?require '../../Scripts/CodeGenerator.rb'
+?require '../../../Scripts/CodeGenerator.rb'
 
 expand_templates(__FILE__)
\ No newline at end of file
===================================================================
