Skip to content

Commit

Permalink
Go over 3.12 stack effects
Browse files Browse the repository at this point in the history
Not sure this is 100% correct but it matches dis.stack_effect
  • Loading branch information
rocky committed Feb 14, 2024
1 parent 612609c commit 704d8c8
Show file tree
Hide file tree
Showing 4 changed files with 232 additions and 203 deletions.
5 changes: 4 additions & 1 deletion pytest/test_stack_effect.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,10 @@ def test_stack_effect_vs_dis():

def test_one(xdis_args, dis_args, has_arg):
effect = xstack_effect(*xdis_args)
check_effect = dis.stack_effect(*dis_args[:2])
try:
check_effect = dis.stack_effect(*dis_args[:2])
except ValueError:
return
assert (
effect != -100
), "%d (%s) needs adjusting; should be: should have effect %d" % (
Expand Down
54 changes: 34 additions & 20 deletions xdis/cross_dis.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,45 +412,59 @@ def xstack_effect(opcode, opc, oparg: int = 0, jump=None):
return the stack effect of not jumping. And if jump is None
(default), it will return the maximal stack effect of both cases.
"""
version_tuple = opc.version_tuple
pop, push = opc.oppop[opcode], opc.oppush[opcode]
opname = opc.opname[opcode]
if opname in ("BUILD_MAP",):
if opc.version_tuple >= (3, 5):
return 1 - (2 * oparg)
elif opname in ("UNPACK_SEQUENCE", "UNPACK_EX") and opc.version_tuple >= (3, 0):
if opname in "BUILD_CONST_KEY_MAP" and version_tuple >= (3, 12):
return -oparg
if opname == "BUILD_MAP" and version_tuple >= (3, 5):
return 1 - (2 * oparg)
elif opname in ("UNPACK_SEQUENCE", "UNPACK_EX") and version_tuple >= (3, 0):
return push + oparg
elif opname in ("BUILD_SLICE") and opc.version_tuple <= (2, 7):
if oparg == 3:
return -2
else:
return -1
pass
elif opname in (
"BUILD_LIST",
"BUILD_SET",
"BUILD_STRING",
"BUILD_TUPLE",
) and version_tuple >= (3, 12):
return 1 - oparg
elif opname in ("BUILD_SLICE") and version_tuple <= (2, 7):
return -2 if oparg == 3 else -1
elif opname == "LOAD_ATTR" and version_tuple >= (3, 12):
return 1 if oparg & 1 else 0
elif opname == "MAKE_FUNCTION":
if opc.version_tuple >= (3, 5):
if version_tuple >= (3, 5):
if 0 <= oparg <= 10:
if opc.version_tuple == (3, 5):
if version_tuple == (3, 5):
return [-1, -2, -3, -3, -2, -3, -3, -4, -2, -3, -3, -4][oparg]
elif (3, 6) <= opc.version_tuple < (3, 11):
elif (3, 6) <= version_tuple < (3, 11):
return [-1, -2, -2, -3, -2, -3, -3, -4, -2, -3, -3, -4][oparg]
elif 0 <= oparg <= 2:
return [0, -1, -1][oparg]
else:
return None
else:
return None
elif opname == "CALL" and version_tuple >= (3, 12):
return -oparg - 1
elif opname == "CALL_FUNCTION_EX":
if (3, 5) <= opc.version_tuple < (3, 11):
if (3, 5) <= version_tuple < (3, 11):
return -2 if oparg & 1 else -1
elif 0 <= oparg <= 3:
return -3 if oparg & 1 else -2
else:
return None
elif opname == "LOAD_GLOBAL":
if opc.version_tuple >= (3, 11):
return 2 if oparg & 1 else 1
elif opname == "PRECALL":
if opc.version_tuple >= (3, 11):
return -oparg
elif opname in (
"INSTRUMENTED_LOAD_SUPER_ATTR",
"LOAD_SUPER_ATTR",
) and version_tuple >= (3, 12):
return -1 if oparg & 1 else -2
elif opname == "LOAD_GLOBAL" and version_tuple >= (3, 11):
return 2 if oparg & 1 else 1
elif opname == "PRECALL" and version_tuple >= (3, 11):
return -oparg
elif opname == "RAISE_VARARGS" and version_tuple >= (3, 12):
return -oparg
if push >= 0 and pop >= 0:
return push - pop
elif pop < 0:
Expand Down
122 changes: 62 additions & 60 deletions xdis/opcodes/opcode_312.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,66 +58,68 @@
rm_op(loc, "POP_JUMP_BACKWARD_IF_TRUE" , 176)

## These are new since 3.11...
# OP NAME OPCODE POP PUSH
#---------------------------------------------------------
def_op(loc , "INTERPRETER_EXIT" , 3 , 1, 0)
def_op(loc , "END_FOR" , 4 , 0, 1)
def_op(loc , "END_SEND" , 5 , 1, 0)
def_op(loc , "RESERVED" , 17 , 0, 1)

binary_op(loc , "BINARY_SLICE" , 26 , 2, 0)
binary_op(loc , "STORE_SLICE" , 27 , 0, 1)

def_op(loc , "CLEANUP_THROW" , 55 , 0, 1)
def_op(loc , "LOAD_LOCALS" , 87 , 0, 1)
def_op(loc , "RETURN_CONST" , 121, 0, 1)
def_op(loc , "LOAD_FAST_CHECK" , 127, 0, 1)

jrel_op(loc , "POP_JUMP_IF_FALSE" , 114, 1, 0)
jrel_op(loc , "POP_JUMP_IF_TRUE" , 115, 1, 0)
jrel_op(loc , "POP_JUMP_IF_NOT_NONE" , 128, 0, 1)
jrel_op(loc , "POP_JUMP_IF_NONE" , 129, 1, 0)

def_op(loc , "LOAD_SUPER_ATTR" , 141, 0, 1)
def_op(loc , "LOAD_FAST_AND_CLEAR" , 143, 0, 1)
def_op(loc , "YIELD_VALUE" , 150, 0, 1)
def_op(loc , "CALL_INTRINSIC_1" , 173, 0, 1)
def_op(loc , "CALL_INTRINSIC_2" , 174, 0, 1)
def_op(loc , "LOAD_FROM_DICT_OR_GLOBALS" , 175, 0, 1)
def_op(loc , "LOAD_FROM_DICT_OR_DEREF" , 176, 0, 1)

def_op(loc , "INSTRUMENTED_LOAD_SUPER_ATTR" , 237, 0, 1)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_NONE" , 238, 0, 1)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_NOT_NONE", 239, 0, 1)
def_op(loc , "INSTRUMENTED_RESUME" , 240, 0, 1)
def_op(loc , "INSTRUMENTED_CALL" , 241, 0, 1)
def_op(loc , "INSTRUMENTED_RETURN_VALUE" , 242, 0, 1)
def_op(loc , "INSTRUMENTED_YIELD_VALUE" , 243, 0, 1)
def_op(loc , "INSTRUMENTED_CALL_FUNCTION_EX" , 244, 0, 1)
def_op(loc , "INSTRUMENTED_JUMP_FORWARD" , 245, 0, 1)
def_op(loc , "INSTRUMENTED_JUMP_BACKWARD" , 246, 0, 1)
def_op(loc , "INSTRUMENTED_RETURN_CONST" , 247, 0, 1)
def_op(loc , "INSTRUMENTED_FOR_ITER" , 248, 0, 1)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_FALSE" , 249, 0, 1)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_TRUE" , 250, 0, 1)
def_op(loc , "INSTRUMENTED_END_FOR" , 251, 0, 1)
def_op(loc , "INSTRUMENTED_END_SEND" , 252, 0, 1)
def_op(loc , "INSTRUMENTED_INSTRUCTION" , 253, 0, 1)
def_op(loc , "INSTRUMENTED_LINE" , 254, 0, 1)

def_op(loc , "SETUP_FINALLY" , 256, 0, 1)
def_op(loc , "SETUP_CLEANUP" , 257, 0, 1)
def_op(loc , "SETUP_WITH" , 258, 0, 1)
def_op(loc , "POP_BLOCK" , 259, 0, 1)

jrel_op(loc , "JUMP" , 260, 0, 0)
jrel_op(loc , "JUMP_NO_INTERRUPT" , 261, 0, 0)

def_op(loc , "LOAD_METHOD" , 262, 0, 1)
def_op(loc , "LOAD_SUPER_METHOD" , 263, 0, 1)
def_op(loc , "LOAD_ZERO_SUPER_METHOD" , 264, 0, 1)
def_op(loc , "LOAD_ZERO_SUPER_ATTR" , 265, 0, 1)
def_op(loc , "STORE_FAST_MAYBE_NULL" , 266, 0, 1)
# OP NAME OPCODE POP PUSH
#---------------------------------------------------------------
def_op(loc , "INTERPRETER_EXIT" , 3 , 1, 0)
def_op(loc , "END_FOR" , 4 , 2, 0)
def_op(loc , "END_SEND" , 5 , 1, 0)
def_op(loc , "RESERVED" , 17 , 0, 0)

binary_op(loc , "BINARY_SLICE" , 26 , 2, 0)
binary_op(loc , "STORE_SLICE" , 27 , 4, 0)

def_op(loc , "CLEANUP_THROW" , 55 , 2, 1)
def_op(loc , "LOAD_LOCALS" , 87 , 0, 1)
def_op(loc , "RETURN_CONST" , 121, 0, 0)
def_op(loc , "LOAD_FAST_CHECK" , 127, 0, 1)

jrel_op(loc , "POP_JUMP_IF_FALSE" , 114, 1, 0)
jrel_op(loc , "POP_JUMP_IF_TRUE" , 115, 1, 0)
jrel_op(loc , "POP_JUMP_IF_NOT_NONE" , 128, 1, 0)
jrel_op(loc , "POP_JUMP_IF_NONE" , 129, 1, 0)

def_op(loc , "LOAD_SUPER_ATTR" , 141, 3, 1)
def_op(loc , "LOAD_FAST_AND_CLEAR" , 143, 0, 1)
def_op(loc , "YIELD_VALUE" , 150, 1, 1)
def_op(loc , "CALL_INTRINSIC_1" , 173, 1, 1)
def_op(loc , "CALL_INTRINSIC_2" , 174, 2, 1)
def_op(loc , "LOAD_FROM_DICT_OR_GLOBALS" , 175, 1, 1)
def_op(loc , "LOAD_FROM_DICT_OR_DEREF" , 176, 1, 1)

# OP NAME OPCODE POP PUSH
def_op(loc , "INSTRUMENTED_LOAD_SUPER_ATTR" , 237, 2, 0)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_NONE" , 238, 1, 1)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_NOT_NONE", 239, 1, 1)
def_op(loc , "INSTRUMENTED_RESUME" , 240, 1, 1)
def_op(loc , "INSTRUMENTED_CALL" , 241, 1, 1)
def_op(loc , "INSTRUMENTED_RETURN_VALUE" , 242, 1, 0)
def_op(loc , "INSTRUMENTED_YIELD_VALUE" , 243, 1, 1)
def_op(loc , "INSTRUMENTED_CALL_FUNCTION_EX" , 244, 1, 1)
def_op(loc , "INSTRUMENTED_JUMP_FORWARD" , 245, 1, 1)
def_op(loc , "INSTRUMENTED_JUMP_BACKWARD" , 246, 1, 1)
def_op(loc , "INSTRUMENTED_RETURN_CONST" , 247, 1, 1)
def_op(loc , "INSTRUMENTED_FOR_ITER" , 248, 1, 1)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_FALSE" , 249, 1, 1)
def_op(loc , "INSTRUMENTED_POP_JUMP_IF_TRUE" , 250, 1, 1)
def_op(loc , "INSTRUMENTED_END_FOR" , 251, 2, 0)
def_op(loc , "INSTRUMENTED_END_SEND" , 252, 1, 0)
def_op(loc , "INSTRUMENTED_INSTRUCTION" , 253, 1, 1)
def_op(loc , "INSTRUMENTED_LINE" , 254, 1, 1)

# OP NAME OPCODE POP PUSH
def_op(loc , "SETUP_FINALLY" , 256, 0, 1)
def_op(loc , "SETUP_CLEANUP" , 257, 0, 1)
def_op(loc , "SETUP_WITH" , 258, 0, 1)
def_op(loc , "POP_BLOCK" , 259, 0, 1)

jrel_op(loc , "JUMP" , 260, 0, 0)
jrel_op(loc , "JUMP_NO_INTERRUPT" , 261, 0, 0)

def_op(loc , "LOAD_METHOD" , 262, 0, 1)
def_op(loc , "LOAD_SUPER_METHOD" , 263, 1, 0)
def_op(loc , "LOAD_ZERO_SUPER_METHOD" , 264, 1, 0)
def_op(loc , "LOAD_ZERO_SUPER_ATTR" , 265, 1, 0)
def_op(loc , "STORE_FAST_MAYBE_NULL" , 266, 1, 0)

### update opinfo tables
loc["hasnargs"] = []
Expand Down
Loading

0 comments on commit 704d8c8

Please sign in to comment.