edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C533798
File: Initializers.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C533798  (server)    8/20/2008 8:41 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;gets-1
@@ -74,7 +74,7 @@
             ExtendModule(typeof(System.Collections.Generic.IDictionary<System.Object, System.Object>), new System.Action<IronRuby.Builtins.RubyModule>(LoadSystem__Collections__Generic__IDictionary_Instance), null, new IronRuby.Builtins.RubyModule[] {def19, });
             ExtendModule(typeof(System.Collections.IEnumerable), new System.Action<IronRuby.Builtins.RubyModule>(LoadSystem__Collections__IEnumerable_Instance), null, new IronRuby.Builtins.RubyModule[] {def19, });
             ExtendModule(typeof(System.Collections.IList), new System.Action<IronRuby.Builtins.RubyModule>(LoadSystem__Collections__IList_Instance), null, new IronRuby.Builtins.RubyModule[] {def19, });
-            ExtendModule(typeof(System.IComparable), new System.Action<IronRuby.Builtins.RubyModule>(LoadSystem__IComparable_Instance), null, new IronRuby.Builtins.RubyModule[] {def28, });
+            IronRuby.Builtins.RubyModule def33 = ExtendModule(typeof(System.IComparable), new System.Action<IronRuby.Builtins.RubyModule>(LoadSystem__IComparable_Instance), null, new IronRuby.Builtins.RubyModule[] {def28, });
             DefineGlobalClass("Array", typeof(IronRuby.Builtins.RubyArray), Context.ObjectClass, new System.Action<IronRuby.Builtins.RubyModule>(LoadArray_Instance), new System.Action<IronRuby.Builtins.RubyModule>(LoadArray_Class), new IronRuby.Builtins.RubyModule[] {def19, }, new System.Delegate[] {
                 new System.Func<IronRuby.Builtins.RubyArray>(IronRuby.Builtins.ArrayOps.CreateArray),
                 new System.Func<System.Collections.IList, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.ArrayOps.CreateArray),
@@ -85,7 +85,7 @@
                 new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Runtime.BlockParam, System.Object, System.Object>(IronRuby.Builtins.ArrayOps.CreateArray),
             });
             DefineGlobalClass("Binding", typeof(IronRuby.Builtins.Binding), Context.ObjectClass, null, null, IronRuby.Builtins.RubyModule.EmptyArray, null);
-            DefineGlobalClass("ClrString", typeof(System.String), Context.ObjectClass, new System.Action<IronRuby.Builtins.RubyModule>(LoadClrString_Instance), null, IronRuby.Builtins.RubyModule.EmptyArray, null);
+            DefineGlobalClass("ClrString", typeof(System.String), Context.ObjectClass, new System.Action<IronRuby.Builtins.RubyModule>(LoadClrString_Instance), null, new IronRuby.Builtins.RubyModule[] {def33, }, null);
             DefineGlobalClass("Dir", typeof(IronRuby.Builtins.RubyDir), Context.ObjectClass, new System.Action<IronRuby.Builtins.RubyModule>(LoadDir_Instance), new System.Action<IronRuby.Builtins.RubyModule>(LoadDir_Class), new IronRuby.Builtins.RubyModule[] {def19, }, null);
             #if !SILVERLIGHT
             DefineGlobalClass("Encoding", typeof(IronRuby.Builtins.RubyEncoding), Context.ObjectClass, new System.Action<IronRuby.Builtins.RubyModule>(LoadEncoding_Instance), new System.Action<IronRuby.Builtins.RubyModule>(LoadEncoding_Class), IronRuby.Builtins.RubyModule.EmptyArray, new System.Delegate[] {
@@ -2135,7 +2135,7 @@
             });
             
             module.DefineLibraryMethod("getc", 0x29, new System.Delegate[] {
-                new System.Func<IronRuby.Builtins.RubyIO, System.Object>(IronRuby.Builtins.RubyIOOps.Getc),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.RubyIO, System.Object>(IronRuby.Builtins.RubyIOOps.Getc),
             });
             
             module.DefineLibraryMethod("gets", 0x29, new System.Delegate[] {
@@ -2148,11 +2148,12 @@
             });
             
             module.DefineLibraryMethod("lineno", 0x29, new System.Delegate[] {
-                new System.Func<IronRuby.Builtins.RubyIO, System.Int32>(IronRuby.Builtins.RubyIOOps.LineNo),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.RubyIO, System.Int32>(IronRuby.Builtins.RubyIOOps.GetLineNo),
             });
             
             module.DefineLibraryMethod("lineno=", 0x29, new System.Delegate[] {
-                new System.Action<IronRuby.Builtins.RubyIO, System.Int32>(IronRuby.Builtins.RubyIOOps.LineNo),
+                new System.Action<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.RubyIO, System.Int32>(IronRuby.Builtins.RubyIOOps.SetLineNo),
+                new System.Action<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.RubyIO, System.Object>(IronRuby.Builtins.RubyIOOps.SetLineNo),
             });
             
             module.DefineLibraryMethod("pid", 0x29, new System.Delegate[] {
@@ -2195,7 +2196,7 @@
             });
             
             module.DefineLibraryMethod("readchar", 0x29, new System.Delegate[] {
-                new System.Func<IronRuby.Builtins.RubyIO, System.Int32>(IronRuby.Builtins.RubyIOOps.ReadChar),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.RubyIO, System.Int32>(IronRuby.Builtins.RubyIOOps.ReadChar),
             });
             
             module.DefineLibraryMethod("readline", 0x29, new System.Delegate[] {
@@ -2209,7 +2210,7 @@
             });
             
             module.DefineLibraryMethod("rewind", 0x29, new System.Delegate[] {
-                new System.Action<IronRuby.Builtins.RubyIO>(IronRuby.Builtins.RubyIOOps.Rewind),
+                new System.Action<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.RubyIO>(IronRuby.Builtins.RubyIOOps.Rewind),
             });
             
             module.DefineLibraryMethod("seek", 0x29, new System.Delegate[] {
@@ -2419,8 +2420,8 @@
             });
             
             module.DefineLibraryMethod("gets", 0x2a, new System.Delegate[] {
-                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
-                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, System.Object, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, System.Object, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
             });
             
             module.DefineLibraryMethod("global_variables", 0x2a, new System.Delegate[] {
@@ -2758,8 +2759,8 @@
             });
             
             module.DefineLibraryMethod("gets", 0x31, new System.Delegate[] {
-                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
-                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, System.Object, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, System.Object, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.ReadInputLine),
             });
             
             module.DefineLibraryMethod("global_variables", 0x31, new System.Delegate[] {
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/IoOps.cs;C533798
File: IoOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/IoOps.cs;C533798  (server)    8/20/2008 10:07 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/IoOps.cs;gets-1
@@ -400,7 +400,7 @@
         public static object EachByte(CodeContext/*!*/ context, RubyIO/*!*/ self, BlockParam block) {
             self.AssertOpenedForReading();
             object aByte;
-            while ((aByte = Getc(self)) != null) {
+            while ((aByte = Getc(context, self)) != null) {
                 if (block == null) {
                     throw RubyExceptions.NoBlockGiven();
                 }
@@ -443,9 +443,9 @@
         }
 
         [RubyMethod("getc")]
-        public static object Getc(RubyIO/*!*/ self) {
+        public static object Getc(CodeContext/*!*/ context, RubyIO/*!*/ self) {
             self.AssertOpenedForReading();
-            return self.GetChar();
+            return Protocols.CastToFixnum(context, (int)self.GetChar());
         }
 
         public static MutableString EatTrailingCarriageReturns(RubyIO/*!*/ self, MutableString/*!*/ result) {
@@ -479,6 +479,7 @@
 
             int separatorOffset = 0;
             MutableString result = MutableString.CreateMutable();
+            KernelOps.Taint(context, result);
 
             char? c;
             while ((c = self.GetChar()) != null) {
@@ -493,7 +494,9 @@
                 }
             }
 
-            self.LineCount++;
+            RubyUtils.GetScope(context).LastInputLine = result;
+            RubyUtils.GetExecutionContext(context).InputProvider.IncrementLastInputLineNumber();
+ 
             return (!paragraphMode || c == null) ? result : EatTrailingCarriageReturns(self, result);
         }
 
@@ -505,16 +508,20 @@
         }
 
         [RubyMethod("lineno")]
-        public static int LineNo(RubyIO/*!*/ self) {
-            return self.LineCount;
+        public static int GetLineNo(CodeContext/*!*/ context, RubyIO/*!*/ self) {
+            return RubyUtils.GetExecutionContext(context).InputProvider.LastInputLineNumber;
         }
 
         [RubyMethod("lineno=")]
-        public static void LineNo(RubyIO/*!*/ self, int val) {
-            // TODO: update $. when we add support for the variable
-            self.LineCount = val;
+        public static void SetLineNo(CodeContext/*!*/ context, RubyIO/*!*/ self, int value) {
+            RubyUtils.GetExecutionContext(context).InputProvider.LastInputLineNumber = value;
         }
 
+        [RubyMethod("lineno=")]
+        public static void SetLineNo(CodeContext/*!*/ context, RubyIO/*!*/ self, object value) {
+            SetLineNo(context, self, Protocols.CastToFixnum(context, value));
+        }
+
         [RubyMethod("pid")]
         public static object Pid(RubyIO/*!*/ self) {
             return null;  // OK to return null on Windows
@@ -694,9 +701,9 @@
         //read_nonblock
 
         [RubyMethod("readchar")]
-        public static int ReadChar(RubyIO/*!*/ self) {
+        public static int ReadChar(CodeContext/*!*/ context, RubyIO/*!*/ self) {
             // Experiments show that Ruby doesn't call getc from readchar, so it's ok to call without using a site
-            object result = Getc(self);
+            object result = Getc(context, self);
             if (result == null)
                 throw new EOFError("end of file reached");
             return (int)result;
@@ -740,9 +747,9 @@
         //reopen
 
         [RubyMethod("rewind")]
-        public static void Rewind(RubyIO/*!*/ self) {
+        public static void Rewind(CodeContext/*!*/ context, RubyIO/*!*/ self) {
             Seek(self, 0, 0);
-            self.LineCount = 0;
+            SetLineNo(context, self, 0);
         }
 
         [RubyMethod("seek")]
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;C533798
File: KernelOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;C533798  (server)    8/20/2008 9:28 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;gets-1
@@ -330,26 +330,14 @@
         
         [RubyMethod("gets", RubyMethodAttributes.PrivateInstance)]
         [RubyMethod("gets", RubyMethodAttributes.PublicSingleton)]
-        public static MutableString/*!*/ ReadInputLine(CodeContext/*!*/ context) {
-            return ReadInputLine(context, RubyUtils.GetExecutionContext(context).InputSeparator);
+        public static MutableString/*!*/ ReadInputLine(CodeContext/*!*/ context, object self) {
+            return ReadInputLine(context, self, RubyUtils.GetExecutionContext(context).InputSeparator);
         }
 
         [RubyMethod("gets", RubyMethodAttributes.PrivateInstance)]
         [RubyMethod("gets", RubyMethodAttributes.PublicSingleton)]
-        public static MutableString/*!*/ ReadInputLine(CodeContext/*!*/ context, [NotNull]MutableString/*!*/ separator) {
-            RubyScope scope = RubyUtils.GetScope(context);
-            RubyExecutionContext ec = RubyUtils.GetExecutionContext(context);
-
-            RubyArray arguments = ec.InputProvider.CommandLineArguments;
-
-            // TODO: 
-            MutableString result = MutableString.Create("<TODO>");
-
-            scope.LastInputLine = result;
-
-            ec.InputProvider.IncrementLastInputLineNumber();
-
-            return result;
+        public static MutableString/*!*/ ReadInputLine(CodeContext/*!*/ context, object self, [NotNull]MutableString/*!*/ separator) {
+            return Protocols.CastToString(context, LibrarySites.InvokeGets(context, RubyUtils.GetExecutionContext(context).StandardInput, separator));
         }
 
         [RubyMethod("global_variables", RubyMethodAttributes.PrivateInstance)]
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/LibrarySites.cs;C533798
File: LibrarySites.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/LibrarySites.cs;C533798  (server)    8/20/2008 9:55 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/LibrarySites.cs;gets-1
@@ -182,6 +182,12 @@
             return _PutsSite.Target(_PutsSite, context, self, val);
         }
 
+        private static CallSite<DynamicSiteTarget<CodeContext, RubyIO, MutableString, object>> _GetsSite = CallSite<DynamicSiteTarget<CodeContext, RubyIO, MutableString, object>>.Create(
+            InstanceCallAction("gets", 1));
+        public static object InvokeGets(CodeContext/*!*/ context, RubyIO self, MutableString separator) {
+            return _GetsSite.Target(_GetsSite, context, self, separator);
+        }
+
         private static CallSite<DynamicSiteTarget<CodeContext, RubyIO, object, object>> _PutcSite = CallSite<DynamicSiteTarget<CodeContext, RubyIO, object, object>>.Create(
             InstanceCallAction("putc", 1));
         public static object InvokePutc(CodeContext/*!*/ context, RubyIO self, object val) {
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/IO.cs;C533798
File: IO.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/IO.cs;C533798  (server)    8/20/2008 10:26 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/IO.cs;gets-1
@@ -101,7 +101,6 @@
         private int _fileDescriptor;
         private bool _disposed;
         private bool _closed;
-        private int _lineCount;
         protected bool _sync;
         private int _peekAhead;
 
@@ -120,11 +119,6 @@
             set { _closed = value; } 
         }
 
-        public int LineCount { 
-            get { return _lineCount; } 
-            set { _lineCount = value; } 
-        }
-
         public bool PreserveEndOfLines { 
             get { return _preserveEndOfLines; } 
             set { _preserveEndOfLines = value; } 
@@ -198,7 +192,6 @@
         protected RubyIO() {
             _disposed = false;
             _closed = false;
-            _lineCount = 0;
             _peekAhead = -1;
         }
 
@@ -206,11 +199,15 @@
             ContractUtils.RequiresNotNull(context, "context");
             _disposed = false;
             _closed = false;
-            _lineCount = 0;
             _fileDescriptor = context.AddDescriptor(this);
             _peekAhead = -1;
         }
 
+        private void ResetLineNumbersForReadOnlyFiles(RubyExecutionContext ec) {
+            if (_mode == IOMode.ReadOnlyFromStart || _mode == IOMode.ReadWriteAppend || _mode == IOMode.ReadWriteFromStart || _mode == IOMode.ReadWriteTruncate)
+                ec.InputProvider.LastInputLineNumber = 0;
+        }
+
         public RubyIO(RubyExecutionContext/*!*/ context, Stream/*!*/ stream, string/*!*/ modeString)
             : this(context) {
             ContractUtils.RequiresNotNull(stream, "stream");
@@ -218,6 +215,8 @@
 
             _mode = ParseIOMode(modeString, out _preserveEndOfLines);
             _stream = stream;
+
+            ResetLineNumbersForReadOnlyFiles(context);
         }
 
         public RubyIO(RubyExecutionContext/*!*/ context, Stream/*!*/ stream, RubyFileMode mode)
@@ -226,6 +225,8 @@
 
             _mode = ParseIOMode(mode, out _preserveEndOfLines);
             _stream = stream;
+
+            ResetLineNumbersForReadOnlyFiles(context);
         }
 
         #region IDisposable Members
@@ -298,12 +299,19 @@
             set { _sync = value; }
         }
 
+        public void AssertNotClosed() {
+            if (_closed)
+                throw RubyExceptions.CreateIOError("closed stream");
+        }
+
         public void AssertOpenedForWriting() {
+            AssertNotClosed();
             if (_mode == IOMode.ReadOnlyFromStart)
                 throw RubyExceptions.CreateIOError("not opened for writing");
         }
 
         public void AssertOpenedForReading() {
+            AssertNotClosed();
             if (_mode == IOMode.WriteOnlyAppend || _mode == IOMode.WriteOnlyTruncate)
                 throw RubyExceptions.CreateIOError("not opened for reading");
         }
===================================================================
