def getse(op, arg=None):
try:<EOL><INDENT>return _se[op]<EOL><DEDENT>except KeyError:<EOL><INDENT>pass<EOL><DEDENT>if arg is None:<EOL><INDENT>raise ValueError("<STR_LIT>")<EOL><DEDENT>def get_func_tup(arg, nextra):<EOL><INDENT>if arg > <NUM_LIT>:<EOL><INDENT>raise ValueError("<STR_LIT>")<EOL><DEDENT>return (nextra + <NUM_LIT:1> + (arg & <NUM_LIT>) + <NUM_LIT:2>*((arg >> <NUM_LIT:8>) & <NUM_LIT>),<EOL><NUM_LIT:1>)<EOL><DEDENT>if op == CALL_FUNCTION:<EOL><INDENT>return get_func_tup(arg, <NUM_LIT:0>)<EOL><DEDENT>elif op == CALL_FUNCTION_VAR:<EOL><INDENT>return get_func_tup(arg, <NUM_LIT:1>)<EOL><DEDENT>elif op == CALL_FUNCTION_KW:<EOL><INDENT>return get_func_tup(arg, <NUM_LIT:1>)<EOL><DEDENT>elif op == CALL_FUNCTION_VAR_KW:<EOL><INDENT>return get_func_tup(arg, <NUM_LIT:2>)<EOL><DEDENT>elif op == BUILD_TUPLE:<EOL><INDENT>return arg, <NUM_LIT:1><EOL><DEDENT>elif op == BUILD_LIST:<EOL><INDENT>return arg, <NUM_LIT:1><EOL><DEDENT>elif python_version == '<STR_LIT>' and op == BUILD_SET:<EOL><INDENT>return arg, <NUM_LIT:1><EOL><DEDENT>elif op == UNPACK_SEQUENCE:<EOL><INDENT>return <NUM_LIT:1>, arg<EOL><DEDENT>elif op == BUILD_SLICE:<EOL><INDENT>return arg, <NUM_LIT:1><EOL><DEDENT>elif op == DUP_TOPX:<EOL><INDENT>return arg, arg*<NUM_LIT:2><EOL><DEDENT>elif op == RAISE_VARARGS:<EOL><INDENT>return <NUM_LIT:1>+arg, <NUM_LIT:1><EOL><DEDENT>elif op == MAKE_FUNCTION:<EOL><INDENT>return <NUM_LIT:1>+arg, <NUM_LIT:1><EOL><DEDENT>elif op == MAKE_CLOSURE:<EOL><INDENT>if python_version == '<STR_LIT>':<EOL><INDENT>raise ValueError("<STR_LIT>")<EOL><DEDENT>else:<EOL><INDENT>return <NUM_LIT:2>+arg, <NUM_LIT:1><EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise ValueError("<STR_LIT>""<STR_LIT>" % op)<EOL><DEDENT>
Get the stack effect of an opcode, as a (pop, push) tuple.

    If an arg is needed and is not given, a ValueError is raised.
    If op isn't a simple opcode, that is, the flow doesn't always continue
    to the next opcode, a ValueError is raised.