In TextIOWrapper:
  - Switch from consuming _decoded_text to advancing an offset into it.
  - Fix readline() interaction with seek/tell.
  - Fix readline() handling of 'limit' argument.

Add tests for seek/tell after readline().
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 49404e1..27814a0 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -590,7 +590,9 @@
         # I=0, O=3
         (b'i.o3.x.xyz.toolong.', False, 'x--.xyz.too.'),
         # I=6, O=3
-        (b'i.o3.i6.abcdefghijklmnop', True, 'abc.ghi.mno.')
+        (b'i.o3.i6.abcdefghijklmnop', True, 'abc.ghi.mno.'),
+        # I=5, O=8 with newlines
+        (b'i.o8.i5.abc\ndef\nghy\nz', True, 'abc\nd---.ef\ngh---.y\nz-----.')
     ]
 
     def testDecoder(self):
@@ -890,8 +892,8 @@
                 return codecs.CodecInfo(
                     name='test_decoder', encode=None, decode=None,
                     incrementalencoder=None,
-                    streamreader=None, streamwriter=None,
-                    incrementaldecoder=StatefulIncrementalDecoder)
+                    incrementaldecoder=StatefulIncrementalDecoder,
+                    streamreader=None, streamwriter=None)
 
         def testSeekAndTellWithData(data, min_pos=0):
             """Tell/seek to various points within a data stream and ensure
@@ -903,16 +905,42 @@
             decoded = f.read()
             f.close()
 
-            for i in range(min_pos, len(decoded) + 1): # seek positions
-                for j in [1, 5, len(decoded) - i]: # read lengths
+            # Use read() to move to various positions in the input;
+            # then tell, read some more data, and seek back.
+            for i in range(min_pos, len(decoded) + 1): # to read before tell
+                for j in [1, 5, len(decoded)]: # to read after tell
                     f = io.open(test_support.TESTFN, encoding='test_decoder')
                     self.assertEquals(f.read(i), decoded[:i])
                     cookie = f.tell()
                     self.assertEquals(f.read(j), decoded[i:i + j])
                     f.seek(cookie)
+                    self.assertEquals(f.tell(), cookie)
                     self.assertEquals(f.read(), decoded[i:])
                     f.close()
 
+            lines = len(decoded.split('\n'))
+
+            # Use readline() to move to various positions in the input;
+            # then tell, read some more data, and seek back.
+            for limit in [-1, 4, 128]: # 'limit' argument for readline()
+                for j in [1, 5, len(decoded)]: # to read after tell()
+                    f = io.open(test_support.TESTFN, encoding='test_decoder')
+                    text = ''
+                    for k in range(lines): # repeatedly call readline()
+                        line = f.readline(limit=limit)
+                        if limit >= 0:
+                            self.assert_(len(line) <= limit)
+                        text += line
+                        i = len(text)
+                        self.assertEquals(text, decoded[:i])
+                        cookie = f.tell()
+                        self.assertEquals(f.read(j), decoded[i:i + j])
+                        f.seek(cookie)
+                        self.assertEquals(f.tell(), cookie)
+                        self.assertEquals(f.read(), decoded[i:])
+                        f.seek(cookie)
+                    f.close()
+
         # Register a special incremental decoder for testing.
         codecs.register(lookupTestDecoder)
         self.codecEnabled = 1