The previous made the stop argument optional.
It is better to be explicit and just allow stop to be None.
diff --git a/Doc/lib/libitertools.tex b/Doc/lib/libitertools.tex
index d0e1269..f291fe3 100644
--- a/Doc/lib/libitertools.tex
+++ b/Doc/lib/libitertools.tex
@@ -197,9 +197,9 @@
   If \var{start} is non-zero, then elements from the iterable are skipped
   until start is reached.  Afterward, elements are returned consecutively
   unless \var{step} is set higher than one which results in items being
-  skipped.  If \var{stop} is not specified or is \code{None}, then iteration
-  continues indefinitely; otherwise, it stops at the specified position.
-  Unlike regular slicing,
+  skipped.  If \var{stop} is \code{None}, then iteration continues until
+  the iterator is exhausted, if at all; otherwise, it stops at the specified
+  position.  Unlike regular slicing,
   \function{islice()} does not support negative values for \var{start},
   \var{stop}, or \var{step}.  Can be used to extract related fields
   from data where the internal structure has been flattened (for
@@ -208,13 +208,10 @@
 
   \begin{verbatim}
      def islice(iterable, *args):
-         if args:
-             s = slice(*args)
-             next = s.start or 0
-             stop = s.stop
-             step = s.step or 1
-         else:
-             next, stop, step = 0, None, 1
+         s = slice(*args)
+         next = s.start or 0
+         stop = s.stop
+         step = s.step or 1
          for cnt, element in enumerate(iterable):
              if cnt < next:
                  continue
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index d0b1ce8..ef2ab26 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -78,12 +78,12 @@
             self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
 
         # Test stop=None
-        self.assertEqual(list(islice(xrange(10))), range(10))
         self.assertEqual(list(islice(xrange(10), None)), range(10))
         self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
         self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
 
         # Test invalid arguments
+        self.assertRaises(TypeError, islice, xrange(10))
         self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
         self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
         self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index f05ebd6..2d496b5 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -477,7 +477,7 @@
 	isliceobject *lz;
 
 	numargs = PyTuple_Size(args);
-	if (!PyArg_ParseTuple(args, "O|OOl:islice", &seq, &a1, &a2, &step))
+	if (!PyArg_ParseTuple(args, "OO|Ol:islice", &seq, &a1, &a2, &step))
 		return NULL;
 
 	if (numargs == 2) {
@@ -491,7 +491,7 @@
 				return NULL;
 			}
 		}
-	} else if (numargs == 3 || numargs == 4) {
+	} else {
 		start = PyInt_AsLong(a1);
 		if (start == -1 && PyErr_Occurred()) {
 			PyErr_Clear();