def jump(self, op, arg=None):
def jump_target(offset):
target = offset
if op not in hasjabs:
target = target - (posn + 3)
if target < 0:
raise AssertionError("Relative jumps can't go backwards")
if target > 0xFFFF:
target = offset - (posn + 6)
return target
def backpatch(offset):
target = jump_target(offset)
if target > 0xFFFF:
raise AssertionError("Forward jump span must be <64K bytes")
self.patch_arg(posn, 0, target)
self.branch_stack(offset, old_level)
if op == FOR_ITER:
old_level = self.stack_size = self.stack_size - 1
self.stack_size += 2
else:
old_level = self.stack_size
self.stack_size -= (op in (JUMP_IF_TRUE_OR_POP, JUMP_IF_FALSE_OR_POP))
posn = self.here()
if arg is not None:
self.emit_arg(op, jump_target(arg))
self.branch_stack(arg, old_level)
lbl = None
else:
self.emit_arg(op, 0)
def lbl(code=None):
backpatch(self.here())
if op in (JUMP_FORWARD, JUMP_ABSOLUTE, CONTINUE_LOOP):
self.stack_unknown()
return lbl
评论列表
文章目录