edit: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/string/modulo_tags.txt;C1086571
File: modulo_tags.txt
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/string/modulo_tags.txt;C1086571  (server)    1/18/2010 12:40 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/string/modulo_tags.txt;rails2
@@ -2,7 +2,6 @@
 fails:String#% replaces trailing absolute argument specifier without type with percent sign
 fails:String#% raises an ArgumentError when given invalid argument specifiers
 fails:String#% tries to convert the argument to Array by calling #to_ary
-fails:String#% supports binary formats using %b for positive numbers
 fails:String#% supports float formats using %e
 fails:String#% supports float formats using %e, and downcases -Inf, Inf, and NaN
 fails:String#% supports float formats using %E
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/string/modulo_spec.rb;C1086571
File: modulo_spec.rb
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/string/modulo_spec.rb;C1086571  (server)    1/18/2010 12:31 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/string/modulo_spec.rb;rails2
@@ -239,6 +239,7 @@
     ("% b" % 10).should == " 1010"
     ("%1$b" % [10, 20]).should == "1010"
     ("%#b" % 10).should == "0b1010"
+    ("%+b" % 0).should == "+0"
     ("%+b" % 10).should == "+1010"
     ("%-9b" % 10).should == "1010     "
     ("%05b" % 10).should == "01010"
@@ -349,6 +350,7 @@
       ("%#{f}" % 10).should == "10"
       ("% #{f}" % 10).should == " 10"
       ("%1$#{f}" % [10, 20]).should == "10"
+      ("%+#{f}" % 0).should == "+0"
       ("%+#{f}" % 10).should == "+10"
       ("%-7#{f}" % 10).should == "10     "
       ("%04#{f}" % 10).should == "0010"
@@ -361,6 +363,7 @@
     ("% e" % 10).should == " 1.000000e+01"
     ("%1$e" % 10).should == "1.000000e+01"
     ("%#e" % 10).should == "1.000000e+01"
+    ("%+e" % 0).should == "+0.000000e+000"
     ("%+e" % 10).should == "+1.000000e+01"
     ("%-7e" % 10).should == "1.000000e+01"
     ("%05e" % 10).should == "1.000000e+01"
@@ -414,6 +417,7 @@
     ("% E" % 10).should == " 1.000000E+01"
     ("%1$E" % 10).should == "1.000000E+01"
     ("%#E" % 10).should == "1.000000E+01"
+    ("%+E" % 0).should == "+0.000000E+01"
     ("%+E" % 10).should == "+1.000000E+01"
     ("%-7E" % 10).should == "1.000000E+01"
     ("%05E" % 10).should == "1.000000E+01"
@@ -481,6 +485,7 @@
     ("% f" % 10).should == " 10.000000"
     ("%1$f" % 10).should == "10.000000"
     ("%#f" % 10).should == "10.000000"
+    ("%+f" % 0).should == "+0.000000"
     ("%+f" % 10).should == "+10.000000"
     ("%-7f" % 10).should == "10.000000"
     ("%05f" % 10).should == "10.000000"
@@ -492,6 +497,7 @@
     ("% g" % 10).should == " 10"
     ("%1$g" % 10).should == "10"
     ("%#g" % 10).should == "10.0000"
+    ("%+g" % 0).should == "+0"
     ("%+g" % 10).should == "+10"
     ("%-7g" % 10).should == "10     "
     ("%05g" % 10).should == "00010"
@@ -503,6 +509,7 @@
     ("% G" % 10).should == " 10"
     ("%1$G" % 10).should == "10"
     ("%#G" % 10).should == "10.0000"
+    ("%+G" % 0).should == "+0"
     ("%+G" % 10).should == "+10"
     ("%-7G" % 10).should == "10     "
     ("%05G" % 10).should == "00010"
@@ -514,6 +521,7 @@
     ("% o" % 10).should == " 12"
     ("%1$o" % [10, 20]).should == "12"
     ("%#o" % 10).should == "012"
+    ("%+o" % 0).should == "+0"
     ("%+o" % 10).should == "+12"
     ("%-9o" % 10).should == "12       "
     ("%05o" % 10).should == "00012"
@@ -624,6 +632,7 @@
     ("%u" % 10).should == "10"
     ("% u" % 10).should == " 10"
     ("%1$u" % [10, 20]).should == "10"
+    ("%+u" % 0).should == "+0"
     ("%+u" % 10).should == "+10"
     ("%-7u" % 10).should == "10     "
     ("%04u" % 10).should == "0010"
@@ -687,6 +696,7 @@
     ("% x" % 10).should == " a"
     ("%1$x" % [10, 20]).should == "a"
     ("%#x" % 10).should == "0xa"
+    ("%+x" % 0).should == "+0"
     ("%+x" % 10).should == "+a"
     ("%-9x" % 10).should == "a        "
     ("%05x" % 10).should == "0000a"
@@ -728,6 +738,7 @@
     ("% X" % 10).should == " A"
     ("%1$X" % [10, 20]).should == "A"
     ("%#X" % 10).should == "0XA"
+    ("%+X" % 0).should == "+0"
     ("%+X" % 10).should == "+A"
     ("%-9X" % 10).should == "A        "
     ("%05X" % 10).should == "0000A"
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/StringFormatter.cs;C1438355
File: StringFormatter.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/StringFormatter.cs;C1438355  (server)    1/18/2010 12:39 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/StringFormatter.cs;rails2
@@ -254,8 +254,10 @@
                 if (end < _format.Length && _format[end] == '$') {
                     int argIndex = int.Parse(_format.Substring(_index - 1, end - _index + 1), CultureInfo.InvariantCulture);
                     _index = end + 1; // Point past the '$'
-                    _curCh = _format[_index++];
-                    return argIndex;
+                    if (_index < _format.Length) {
+                        _curCh = _format[_index++];
+                        return argIndex;
+                    }
                 }
             }
             return null;
@@ -268,6 +270,10 @@
                 int? argindex = TryReadArgumentIndex();
 
                 res = _siteStorage.CastToFixnum(GetData(argindex));
+                if (res < 0) {
+                    _opts.LeftAdj = true;
+                    res = -res;
+                }
             } else {
                 if (Char.IsDigit(_curCh)) {
                     res = 0;
@@ -380,10 +386,10 @@
             object val;
             bool isPositive;
             if (integer.IsFixnum) {
-                isPositive = integer.Fixnum > 0;
+                isPositive = integer.Fixnum >= 0;
                 val = integer.Fixnum;
             } else {
-                isPositive = integer.Bignum.IsPositive();
+                isPositive = integer.Bignum.IsZero() || integer.Bignum.IsPositive();
                 val = integer.Bignum;
             }
 
@@ -698,6 +704,11 @@
             uint mask = _Mask[bitsToShift];
             char[] digits = lowerCase ? _LowerDigits : _UpperDigits;
 
+            if (IsZero(value)) {
+                result.Append(digits[0]);
+                return result;
+            }
+
             while (val != limit) {
                 result.Append(digits[val & mask]);
                 val = val >> bitsToShift;
@@ -816,6 +827,13 @@
                 return -((int)value);
         }
 
+        private bool IsZero(object/*!*/ value) {
+            if (value is BigInteger)
+                return ((BigInteger)value).IsZero();
+            else
+                return (int)value == 0;
+        }
+
         private bool IsNegative(object/*!*/ value) {
             if (value is BigInteger)
                 return ((BigInteger)value).Sign == -1;
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyLambdaMethodInfo.cs;C1299354
File: RubyLambdaMethodInfo.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyLambdaMethodInfo.cs;C1299354  (server)    1/14/2010 11:53 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyLambdaMethodInfo.cs;rails2
@@ -48,6 +48,10 @@
             _id = Interlocked.Increment(ref _Id);
         }
 
+        public override int GetArity() {
+            return _lambda.Dispatcher.Arity;
+        }
+
         public Proc/*!*/ Lambda {
             get { return _lambda; }
         }
===================================================================
