dis(): Simplified stack emulation a bit.

This commit is contained in:
Tim Peters 2003-01-30 15:02:12 +00:00
parent 0e986a312f
commit 43277d64eb

View File

@ -1898,15 +1898,19 @@ def dis(pickle, out=None, indentlevel=4):
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 @@ def dis(pickle, out=None, indentlevel=4):
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 @@ def dis(pickle, out=None, indentlevel=4):
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)