From 57e16d19d127cbd6d351deeb38db44eb0706f549 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Tue, 14 Nov 2023 12:09:01 -0800 Subject: [PATCH] Refactor bc_next to more clearly split pre- and post-3.6 behavior --- bytecode.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/bytecode.cpp b/bytecode.cpp index d7de78c..059a9d8 100644 --- a/bytecode.cpp +++ b/bytecode.cpp @@ -156,7 +156,7 @@ bool Pyc::IsJumpOffsetArg(int opcode) (opcode == Pyc::JUMP_IF_TRUE_A) || (opcode == Pyc::SETUP_LOOP_A) || (opcode == Pyc::SETUP_FINALLY_A) || (opcode == Pyc::SETUP_EXCEPT_A) || (opcode == Pyc::FOR_LOOP_A) || (opcode == Pyc::FOR_ITER_A) || - (opcode == Pyc::POP_JUMP_FORWARD_IF_FALSE_A) || (opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A); + (opcode == Pyc::POP_JUMP_FORWARD_IF_FALSE_A) || (opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A); } bool Pyc::IsCompareArg(int opcode) @@ -328,30 +328,26 @@ void print_const(std::ostream& pyc_output, PycRef obj, PycModule* mod void bc_next(PycBuffer& source, PycModule* mod, int& opcode, int& operand, int& pos) { opcode = Pyc::ByteToOpcode(mod->majorVer(), mod->minorVer(), source.getByte()); - bool py36_opcode = (mod->verCompare(3, 6) >= 0); - if (py36_opcode) { + if (mod->verCompare(3, 6) >= 0) { operand = source.getByte(); pos += 2; + if (opcode == Pyc::EXTENDED_ARG_A) { + opcode = Pyc::ByteToOpcode(mod->majorVer(), mod->minorVer(), source.getByte()); + operand = (operand << 8) | source.getByte(); + pos += 2; + } } else { operand = 0; pos += 1; - } - - if (opcode == Pyc::EXTENDED_ARG_A) { - if (py36_opcode) { - opcode = Pyc::ByteToOpcode(mod->majorVer(), mod->minorVer(), source.getByte()); - operand <<= 8; - operand |= source.getByte(); - pos += 2; - } else { + if (opcode == Pyc::EXTENDED_ARG_A) { operand = source.get16() << 16; opcode = Pyc::ByteToOpcode(mod->majorVer(), mod->minorVer(), source.getByte()); pos += 3; } - } - if (!py36_opcode && (opcode >= Pyc::PYC_HAVE_ARG)) { - operand |= source.get16(); - pos += 2; + if (opcode >= Pyc::PYC_HAVE_ARG) { + operand |= source.get16(); + pos += 2; + } } }