dis():  Simplified stack emulation a bit.
diff --git a/Lib/pickletools.py b/Lib/pickletools.py
index 31c62b6..7eaa1a5 100644
--- a/Lib/pickletools.py
+++ b/Lib/pickletools.py
@@ -1898,15 +1898,19 @@
                               opcode.name)
 
         maxproto = max(maxproto, opcode.proto)
-
-        # See whether a MARK should be popped.
         before = opcode.stack_before    # don't mutate
         after = opcode.stack_after      # don't mutate
+        numtopop = len(before)
+
+        # See whether a MARK should be popped.
         markmsg = None
         if markobject in before or (opcode.name == "POP" and
                                     stack and
                                     stack[-1] is markobject):
             assert markobject not in after
+            if __debug__:
+                if markobject in before:
+                    assert before[-1] is stackslice
             if markstack:
                 markpos = markstack.pop()
                 if markpos is None:
@@ -1917,19 +1921,18 @@
                 while stack[-1] is not markobject:
                     stack.pop()
                 stack.pop()
-                # Remove markobject stuff from stack_before.
+                # Stop later code from popping too much.
                 try:
-                    i = before.index(markobject)
-                    before = before[:i]
+                    numtopop = before.index(markobject)
                 except ValueError:
                     assert opcode.name == "POP"
-                    assert len(before) == 1
-                    before = []     # stop code later from popping again
+                    numtopop = 0
             else:
                 errormsg = markmsg = "no MARK exists on stack"
 
         # Check for correct memo usage.
         if opcode.name in ("PUT", "BINPUT", "LONG_BINPUT"):
+            assert arg is not None
             if arg in memo:
                 errormsg = "memo key %r already defined" % arg
             elif not stack:
@@ -1961,14 +1964,13 @@
             raise ValueError(errormsg)
 
         # Emulate the stack effects.
-        n = len(before)
-        if len(stack) < n:
-            raise ValueError("tried to pop %d items from stack with "
-                             "only %d items" % (n, len(stack)))
-        if n:
-            del stack[-n:]
+        if len(stack) < numtopop:
+            raise ValueError("tries to pop %d items from stack with "
+                             "only %d items" % (numtopop, len(stack)))
+        if numtopop:
+            del stack[-numtopop:]
         if markobject in after:
-            assert markobject not in opcode.stack_before
+            assert markobject not in before
             markstack.append(pos)
 
         stack.extend(after)