Good idea! You can now change the Python version: https://www.dis-this.com/
I have to reload the whole page to change the version, since Pyodide leaks into the window globals and it’s too messy to load a new Pyodide version after. Also, notably, Pyodide isn’t designed to stably support multiple versions (see discussion) - but hey, it works.
As suggested, I also made it so the links go out to ceval.c for the undocumented opcodes in 3.11.
If you’re curious, here’s a list of undocumented opcodes:
['BINARY_OP_ADAPTIVE', 'BINARY_OP_ADD_FLOAT', 'BINARY_OP_ADD_INT', 'BINARY_OP_ADD_UNICODE', 'BINARY_OP_INPLACE_ADD_UNICODE', 'BINARY_OP_MULTIPLY_FLOAT', 'BINARY_OP_MULTIPLY_INT', 'BINARY_OP_SUBTRACT_FLOAT', 'BINARY_OP_SUBTRACT_INT', 'BINARY_SUBSCR_ADAPTIVE', 'BINARY_SUBSCR_DICT', 'BINARY_SUBSCR_GETITEM', 'BINARY_SUBSCR_LIST_INT', 'BINARY_SUBSCR_TUPLE_INT', 'CALL_ADAPTIVE', 'CALL_PY_EXACT_ARGS', 'CALL_PY_WITH_DEFAULTS', 'COMPARE_OP_ADAPTIVE', 'COMPARE_OP_FLOAT_JUMP', 'COMPARE_OP_INT_JUMP', 'COMPARE_OP_STR_JUMP', 'EXTENDED_ARG_QUICK', 'JUMP_BACKWARD_QUICK', 'LOAD_ATTR_ADAPTIVE', 'LOAD_ATTR_INSTANCE_VALUE', 'LOAD_ATTR_MODULE', 'LOAD_ATTR_SLOT', 'LOAD_ATTR_WITH_HINT', 'LOAD_CONST__LOAD_FAST', 'LOAD_FAST__LOAD_CONST', 'LOAD_FAST__LOAD_FAST', 'LOAD_GLOBAL_ADAPTIVE', 'LOAD_GLOBAL_BUILTIN', 'LOAD_GLOBAL_MODULE', 'LOAD_METHOD_ADAPTIVE', 'LOAD_METHOD_CLASS', 'LOAD_METHOD_MODULE', 'LOAD_METHOD_NO_DICT', 'LOAD_METHOD_WITH_DICT', 'LOAD_METHOD_WITH_VALUES', 'PRECALL_ADAPTIVE', 'PRECALL_BOUND_METHOD', 'PRECALL_BUILTIN_CLASS', 'PRECALL_BUILTIN_FAST_WITH_KEYWORDS', 'PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS', 'PRECALL_NO_KW_BUILTIN_FAST', 'PRECALL_NO_KW_BUILTIN_O', 'PRECALL_NO_KW_ISINSTANCE', 'PRECALL_NO_KW_LEN', 'PRECALL_NO_KW_LIST_APPEND', 'PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST', 'PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS', 'PRECALL_NO_KW_METHOD_DESCRIPTOR_O', 'PRECALL_NO_KW_STR_1', 'PRECALL_NO_KW_TUPLE_1', 'PRECALL_NO_KW_TYPE_1', 'PRECALL_PYFUNC', 'RESUME_QUICK', 'STORE_ATTR_ADAPTIVE', 'STORE_ATTR_INSTANCE_VALUE', 'STORE_ATTR_SLOT', 'STORE_ATTR_WITH_HINT', 'STORE_FAST__LOAD_FAST', 'STORE_FAST__STORE_FAST', 'STORE_SUBSCR_ADAPTIVE', 'STORE_SUBSCR_DICT', 'STORE_SUBSCR_LIST_INT', 'UNPACK_SEQUENCE_ADAPTIVE', 'UNPACK_SEQUENCE_LIST', 'UNPACK_SEQUENCE_TUPLE', 'UNPACK_SEQUENCE_TWO_TUPLE', 'DO_TRACING', 'HAS_CONST(op)', 'NB_ADD', 'NB_AND', 'NB_FLOOR_DIVIDE', 'NB_LSHIFT', 'NB_MATRIX_MULTIPLY', 'NB_MULTIPLY', 'NB_REMAINDER', 'NB_OR', 'NB_POWER', 'NB_RSHIFT', 'NB_SUBTRACT', 'NB_TRUE_DIVIDE', 'NB_XOR', 'NB_INPLACE_ADD', 'NB_INPLACE_AND', 'NB_INPLACE_FLOOR_DIVIDE', 'NB_INPLACE_LSHIFT', 'NB_INPLACE_MATRIX_MULTIPLY', 'NB_INPLACE_MULTIPLY', 'NB_INPLACE_REMAINDER', 'NB_INPLACE_OR', 'NB_INPLACE_POWER', 'NB_INPLACE_RSHIFT', 'NB_INPLACE_SUBTRACT', 'NB_INPLACE_TRUE_DIVIDE', 'NB_INPLACE_XOR', 'HAS_ARG(op)', 'IS_ARTIFICIAL(op)']
I think at least one of those, IS_ARTIFICIAL
, will never show up in a disassembly.