[Python-checkins] gh-91719: Add pycore_opcode.h internal header file (#91906)

vstinner webhook-mailer at python.org
Mon Apr 25 18:14:34 EDT 2022


https://github.com/python/cpython/commit/64a54e511debaac6d3a6e53685824fce435c440c
commit: 64a54e511debaac6d3a6e53685824fce435c440c
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2022-04-26T00:14:30+02:00
summary:

gh-91719: Add pycore_opcode.h internal header file (#91906)

Move the following API from Include/opcode.h (public C API) to a new
Include/internal/pycore_opcode.h header file (internal C API):

* EXTRA_CASES
* _PyOpcode_Caches
* _PyOpcode_Deopt
* _PyOpcode_Jump
* _PyOpcode_OpName
* _PyOpcode_RelativeJump

files:
A Include/internal/pycore_opcode.h
M Include/opcode.h
M Makefile.pre.in
M Objects/codeobject.c
M Objects/frameobject.c
M Objects/genobject.c
M PCbuild/regen.targets
M Python/ceval.c
M Python/compile.c
M Python/specialize.c
M Tools/scripts/generate_opcode_h.py

diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h
new file mode 100644
index 0000000000000..46c9986b500c8
--- /dev/null
+++ b/Include/internal/pycore_opcode.h
@@ -0,0 +1,581 @@
+// Auto-generated by Tools/scripts/generate_opcode_h.py from Lib/opcode.py
+
+#ifndef Py_INTERNAL_OPCODE_H
+#define Py_INTERNAL_OPCODE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+#  error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "opcode.h"
+
+extern const uint8_t _PyOpcode_Caches[256];
+
+extern const uint8_t _PyOpcode_Deopt[256];
+
+#ifdef NEED_OPCODE_TABLES
+static const uint32_t _PyOpcode_RelativeJump[8] = {
+    0U,
+    0U,
+    536870912U,
+    135118848U,
+    4163U,
+    122880U,
+    0U,
+    0U,
+};
+static const uint32_t _PyOpcode_Jump[8] = {
+    0U,
+    0U,
+    536870912U,
+    135118848U,
+    4163U,
+    122880U,
+    0U,
+    0U,
+};
+
+const uint8_t _PyOpcode_Caches[256] = {
+    [BINARY_SUBSCR] = 4,
+    [STORE_SUBSCR] = 1,
+    [UNPACK_SEQUENCE] = 1,
+    [STORE_ATTR] = 4,
+    [LOAD_ATTR] = 4,
+    [COMPARE_OP] = 2,
+    [LOAD_GLOBAL] = 5,
+    [BINARY_OP] = 1,
+    [LOAD_METHOD] = 10,
+    [PRECALL] = 1,
+    [CALL] = 4,
+};
+
+const uint8_t _PyOpcode_Deopt[256] = {
+    [ASYNC_GEN_WRAP] = ASYNC_GEN_WRAP,
+    [BEFORE_ASYNC_WITH] = BEFORE_ASYNC_WITH,
+    [BEFORE_WITH] = BEFORE_WITH,
+    [BINARY_OP] = BINARY_OP,
+    [BINARY_OP_ADAPTIVE] = BINARY_OP,
+    [BINARY_OP_ADD_FLOAT] = BINARY_OP,
+    [BINARY_OP_ADD_INT] = BINARY_OP,
+    [BINARY_OP_ADD_UNICODE] = BINARY_OP,
+    [BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP,
+    [BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP,
+    [BINARY_OP_MULTIPLY_INT] = BINARY_OP,
+    [BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP,
+    [BINARY_OP_SUBTRACT_INT] = BINARY_OP,
+    [BINARY_SUBSCR] = BINARY_SUBSCR,
+    [BINARY_SUBSCR_ADAPTIVE] = BINARY_SUBSCR,
+    [BINARY_SUBSCR_DICT] = BINARY_SUBSCR,
+    [BINARY_SUBSCR_GETITEM] = BINARY_SUBSCR,
+    [BINARY_SUBSCR_LIST_INT] = BINARY_SUBSCR,
+    [BINARY_SUBSCR_TUPLE_INT] = BINARY_SUBSCR,
+    [BUILD_CONST_KEY_MAP] = BUILD_CONST_KEY_MAP,
+    [BUILD_LIST] = BUILD_LIST,
+    [BUILD_MAP] = BUILD_MAP,
+    [BUILD_SET] = BUILD_SET,
+    [BUILD_SLICE] = BUILD_SLICE,
+    [BUILD_STRING] = BUILD_STRING,
+    [BUILD_TUPLE] = BUILD_TUPLE,
+    [CACHE] = CACHE,
+    [CALL] = CALL,
+    [CALL_ADAPTIVE] = CALL,
+    [CALL_FUNCTION_EX] = CALL_FUNCTION_EX,
+    [CALL_PY_EXACT_ARGS] = CALL,
+    [CALL_PY_WITH_DEFAULTS] = CALL,
+    [CHECK_EG_MATCH] = CHECK_EG_MATCH,
+    [CHECK_EXC_MATCH] = CHECK_EXC_MATCH,
+    [COMPARE_OP] = COMPARE_OP,
+    [COMPARE_OP_ADAPTIVE] = COMPARE_OP,
+    [COMPARE_OP_FLOAT_JUMP] = COMPARE_OP,
+    [COMPARE_OP_INT_JUMP] = COMPARE_OP,
+    [COMPARE_OP_STR_JUMP] = COMPARE_OP,
+    [CONTAINS_OP] = CONTAINS_OP,
+    [COPY] = COPY,
+    [COPY_FREE_VARS] = COPY_FREE_VARS,
+    [DELETE_ATTR] = DELETE_ATTR,
+    [DELETE_DEREF] = DELETE_DEREF,
+    [DELETE_FAST] = DELETE_FAST,
+    [DELETE_GLOBAL] = DELETE_GLOBAL,
+    [DELETE_NAME] = DELETE_NAME,
+    [DELETE_SUBSCR] = DELETE_SUBSCR,
+    [DICT_MERGE] = DICT_MERGE,
+    [DICT_UPDATE] = DICT_UPDATE,
+    [END_ASYNC_FOR] = END_ASYNC_FOR,
+    [EXTENDED_ARG] = EXTENDED_ARG,
+    [FORMAT_VALUE] = FORMAT_VALUE,
+    [FOR_ITER] = FOR_ITER,
+    [GET_AITER] = GET_AITER,
+    [GET_ANEXT] = GET_ANEXT,
+    [GET_AWAITABLE] = GET_AWAITABLE,
+    [GET_ITER] = GET_ITER,
+    [GET_LEN] = GET_LEN,
+    [GET_YIELD_FROM_ITER] = GET_YIELD_FROM_ITER,
+    [IMPORT_FROM] = IMPORT_FROM,
+    [IMPORT_NAME] = IMPORT_NAME,
+    [IMPORT_STAR] = IMPORT_STAR,
+    [IS_OP] = IS_OP,
+    [JUMP_BACKWARD] = JUMP_BACKWARD,
+    [JUMP_BACKWARD_NO_INTERRUPT] = JUMP_BACKWARD_NO_INTERRUPT,
+    [JUMP_BACKWARD_QUICK] = JUMP_BACKWARD,
+    [JUMP_FORWARD] = JUMP_FORWARD,
+    [JUMP_IF_FALSE_OR_POP] = JUMP_IF_FALSE_OR_POP,
+    [JUMP_IF_TRUE_OR_POP] = JUMP_IF_TRUE_OR_POP,
+    [KW_NAMES] = KW_NAMES,
+    [LIST_APPEND] = LIST_APPEND,
+    [LIST_EXTEND] = LIST_EXTEND,
+    [LIST_TO_TUPLE] = LIST_TO_TUPLE,
+    [LOAD_ASSERTION_ERROR] = LOAD_ASSERTION_ERROR,
+    [LOAD_ATTR] = LOAD_ATTR,
+    [LOAD_ATTR_ADAPTIVE] = LOAD_ATTR,
+    [LOAD_ATTR_INSTANCE_VALUE] = LOAD_ATTR,
+    [LOAD_ATTR_MODULE] = LOAD_ATTR,
+    [LOAD_ATTR_SLOT] = LOAD_ATTR,
+    [LOAD_ATTR_WITH_HINT] = LOAD_ATTR,
+    [LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS,
+    [LOAD_CLASSDEREF] = LOAD_CLASSDEREF,
+    [LOAD_CLOSURE] = LOAD_CLOSURE,
+    [LOAD_CONST] = LOAD_CONST,
+    [LOAD_CONST__LOAD_FAST] = LOAD_CONST,
+    [LOAD_DEREF] = LOAD_DEREF,
+    [LOAD_FAST] = LOAD_FAST,
+    [LOAD_FAST__LOAD_CONST] = LOAD_FAST,
+    [LOAD_FAST__LOAD_FAST] = LOAD_FAST,
+    [LOAD_GLOBAL] = LOAD_GLOBAL,
+    [LOAD_GLOBAL_ADAPTIVE] = LOAD_GLOBAL,
+    [LOAD_GLOBAL_BUILTIN] = LOAD_GLOBAL,
+    [LOAD_GLOBAL_MODULE] = LOAD_GLOBAL,
+    [LOAD_METHOD] = LOAD_METHOD,
+    [LOAD_METHOD_ADAPTIVE] = LOAD_METHOD,
+    [LOAD_METHOD_CLASS] = LOAD_METHOD,
+    [LOAD_METHOD_MODULE] = LOAD_METHOD,
+    [LOAD_METHOD_NO_DICT] = LOAD_METHOD,
+    [LOAD_METHOD_WITH_DICT] = LOAD_METHOD,
+    [LOAD_METHOD_WITH_VALUES] = LOAD_METHOD,
+    [LOAD_NAME] = LOAD_NAME,
+    [MAKE_CELL] = MAKE_CELL,
+    [MAKE_FUNCTION] = MAKE_FUNCTION,
+    [MAP_ADD] = MAP_ADD,
+    [MATCH_CLASS] = MATCH_CLASS,
+    [MATCH_KEYS] = MATCH_KEYS,
+    [MATCH_MAPPING] = MATCH_MAPPING,
+    [MATCH_SEQUENCE] = MATCH_SEQUENCE,
+    [NOP] = NOP,
+    [POP_EXCEPT] = POP_EXCEPT,
+    [POP_JUMP_BACKWARD_IF_FALSE] = POP_JUMP_BACKWARD_IF_FALSE,
+    [POP_JUMP_BACKWARD_IF_NONE] = POP_JUMP_BACKWARD_IF_NONE,
+    [POP_JUMP_BACKWARD_IF_NOT_NONE] = POP_JUMP_BACKWARD_IF_NOT_NONE,
+    [POP_JUMP_BACKWARD_IF_TRUE] = POP_JUMP_BACKWARD_IF_TRUE,
+    [POP_JUMP_FORWARD_IF_FALSE] = POP_JUMP_FORWARD_IF_FALSE,
+    [POP_JUMP_FORWARD_IF_NONE] = POP_JUMP_FORWARD_IF_NONE,
+    [POP_JUMP_FORWARD_IF_NOT_NONE] = POP_JUMP_FORWARD_IF_NOT_NONE,
+    [POP_JUMP_FORWARD_IF_TRUE] = POP_JUMP_FORWARD_IF_TRUE,
+    [POP_TOP] = POP_TOP,
+    [PRECALL] = PRECALL,
+    [PRECALL_ADAPTIVE] = PRECALL,
+    [PRECALL_BOUND_METHOD] = PRECALL,
+    [PRECALL_BUILTIN_CLASS] = PRECALL,
+    [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = PRECALL,
+    [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = PRECALL,
+    [PRECALL_NO_KW_BUILTIN_FAST] = PRECALL,
+    [PRECALL_NO_KW_BUILTIN_O] = PRECALL,
+    [PRECALL_NO_KW_ISINSTANCE] = PRECALL,
+    [PRECALL_NO_KW_LEN] = PRECALL,
+    [PRECALL_NO_KW_LIST_APPEND] = PRECALL,
+    [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = PRECALL,
+    [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = PRECALL,
+    [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = PRECALL,
+    [PRECALL_NO_KW_STR_1] = PRECALL,
+    [PRECALL_NO_KW_TUPLE_1] = PRECALL,
+    [PRECALL_NO_KW_TYPE_1] = PRECALL,
+    [PRECALL_PYFUNC] = PRECALL,
+    [PREP_RERAISE_STAR] = PREP_RERAISE_STAR,
+    [PRINT_EXPR] = PRINT_EXPR,
+    [PUSH_EXC_INFO] = PUSH_EXC_INFO,
+    [PUSH_NULL] = PUSH_NULL,
+    [RAISE_VARARGS] = RAISE_VARARGS,
+    [RERAISE] = RERAISE,
+    [RESUME] = RESUME,
+    [RESUME_QUICK] = RESUME,
+    [RETURN_GENERATOR] = RETURN_GENERATOR,
+    [RETURN_VALUE] = RETURN_VALUE,
+    [SEND] = SEND,
+    [SETUP_ANNOTATIONS] = SETUP_ANNOTATIONS,
+    [SET_ADD] = SET_ADD,
+    [SET_UPDATE] = SET_UPDATE,
+    [STORE_ATTR] = STORE_ATTR,
+    [STORE_ATTR_ADAPTIVE] = STORE_ATTR,
+    [STORE_ATTR_INSTANCE_VALUE] = STORE_ATTR,
+    [STORE_ATTR_SLOT] = STORE_ATTR,
+    [STORE_ATTR_WITH_HINT] = STORE_ATTR,
+    [STORE_DEREF] = STORE_DEREF,
+    [STORE_FAST] = STORE_FAST,
+    [STORE_FAST__LOAD_FAST] = STORE_FAST,
+    [STORE_FAST__STORE_FAST] = STORE_FAST,
+    [STORE_GLOBAL] = STORE_GLOBAL,
+    [STORE_NAME] = STORE_NAME,
+    [STORE_SUBSCR] = STORE_SUBSCR,
+    [STORE_SUBSCR_ADAPTIVE] = STORE_SUBSCR,
+    [STORE_SUBSCR_DICT] = STORE_SUBSCR,
+    [STORE_SUBSCR_LIST_INT] = STORE_SUBSCR,
+    [SWAP] = SWAP,
+    [UNARY_INVERT] = UNARY_INVERT,
+    [UNARY_NEGATIVE] = UNARY_NEGATIVE,
+    [UNARY_NOT] = UNARY_NOT,
+    [UNARY_POSITIVE] = UNARY_POSITIVE,
+    [UNPACK_EX] = UNPACK_EX,
+    [UNPACK_SEQUENCE] = UNPACK_SEQUENCE,
+    [UNPACK_SEQUENCE_ADAPTIVE] = UNPACK_SEQUENCE,
+    [UNPACK_SEQUENCE_LIST] = UNPACK_SEQUENCE,
+    [UNPACK_SEQUENCE_TUPLE] = UNPACK_SEQUENCE,
+    [UNPACK_SEQUENCE_TWO_TUPLE] = UNPACK_SEQUENCE,
+    [WITH_EXCEPT_START] = WITH_EXCEPT_START,
+    [YIELD_VALUE] = YIELD_VALUE,
+};
+#endif   // NEED_OPCODE_TABLES
+
+#ifdef Py_DEBUG
+static const char *const _PyOpcode_OpName[256] = {
+    [CACHE] = "CACHE",
+    [POP_TOP] = "POP_TOP",
+    [PUSH_NULL] = "PUSH_NULL",
+    [BINARY_OP_ADAPTIVE] = "BINARY_OP_ADAPTIVE",
+    [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT",
+    [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT",
+    [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE",
+    [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE",
+    [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT",
+    [NOP] = "NOP",
+    [UNARY_POSITIVE] = "UNARY_POSITIVE",
+    [UNARY_NEGATIVE] = "UNARY_NEGATIVE",
+    [UNARY_NOT] = "UNARY_NOT",
+    [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT",
+    [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT",
+    [UNARY_INVERT] = "UNARY_INVERT",
+    [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT",
+    [BINARY_SUBSCR_ADAPTIVE] = "BINARY_SUBSCR_ADAPTIVE",
+    [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT",
+    [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM",
+    [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT",
+    [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT",
+    [CALL_ADAPTIVE] = "CALL_ADAPTIVE",
+    [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS",
+    [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS",
+    [BINARY_SUBSCR] = "BINARY_SUBSCR",
+    [COMPARE_OP_ADAPTIVE] = "COMPARE_OP_ADAPTIVE",
+    [COMPARE_OP_FLOAT_JUMP] = "COMPARE_OP_FLOAT_JUMP",
+    [COMPARE_OP_INT_JUMP] = "COMPARE_OP_INT_JUMP",
+    [COMPARE_OP_STR_JUMP] = "COMPARE_OP_STR_JUMP",
+    [GET_LEN] = "GET_LEN",
+    [MATCH_MAPPING] = "MATCH_MAPPING",
+    [MATCH_SEQUENCE] = "MATCH_SEQUENCE",
+    [MATCH_KEYS] = "MATCH_KEYS",
+    [JUMP_BACKWARD_QUICK] = "JUMP_BACKWARD_QUICK",
+    [PUSH_EXC_INFO] = "PUSH_EXC_INFO",
+    [CHECK_EXC_MATCH] = "CHECK_EXC_MATCH",
+    [CHECK_EG_MATCH] = "CHECK_EG_MATCH",
+    [LOAD_ATTR_ADAPTIVE] = "LOAD_ATTR_ADAPTIVE",
+    [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE",
+    [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE",
+    [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT",
+    [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
+    [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
+    [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
+    [LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
+    [LOAD_GLOBAL_ADAPTIVE] = "LOAD_GLOBAL_ADAPTIVE",
+    [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
+    [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
+    [WITH_EXCEPT_START] = "WITH_EXCEPT_START",
+    [GET_AITER] = "GET_AITER",
+    [GET_ANEXT] = "GET_ANEXT",
+    [BEFORE_ASYNC_WITH] = "BEFORE_ASYNC_WITH",
+    [BEFORE_WITH] = "BEFORE_WITH",
+    [END_ASYNC_FOR] = "END_ASYNC_FOR",
+    [LOAD_METHOD_ADAPTIVE] = "LOAD_METHOD_ADAPTIVE",
+    [LOAD_METHOD_CLASS] = "LOAD_METHOD_CLASS",
+    [LOAD_METHOD_MODULE] = "LOAD_METHOD_MODULE",
+    [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT",
+    [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT",
+    [STORE_SUBSCR] = "STORE_SUBSCR",
+    [DELETE_SUBSCR] = "DELETE_SUBSCR",
+    [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES",
+    [PRECALL_ADAPTIVE] = "PRECALL_ADAPTIVE",
+    [PRECALL_BOUND_METHOD] = "PRECALL_BOUND_METHOD",
+    [PRECALL_BUILTIN_CLASS] = "PRECALL_BUILTIN_CLASS",
+    [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = "PRECALL_BUILTIN_FAST_WITH_KEYWORDS",
+    [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
+    [GET_ITER] = "GET_ITER",
+    [GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER",
+    [PRINT_EXPR] = "PRINT_EXPR",
+    [LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS",
+    [PRECALL_NO_KW_BUILTIN_FAST] = "PRECALL_NO_KW_BUILTIN_FAST",
+    [PRECALL_NO_KW_BUILTIN_O] = "PRECALL_NO_KW_BUILTIN_O",
+    [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR",
+    [RETURN_GENERATOR] = "RETURN_GENERATOR",
+    [PRECALL_NO_KW_ISINSTANCE] = "PRECALL_NO_KW_ISINSTANCE",
+    [PRECALL_NO_KW_LEN] = "PRECALL_NO_KW_LEN",
+    [PRECALL_NO_KW_LIST_APPEND] = "PRECALL_NO_KW_LIST_APPEND",
+    [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST",
+    [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS",
+    [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_O",
+    [LIST_TO_TUPLE] = "LIST_TO_TUPLE",
+    [RETURN_VALUE] = "RETURN_VALUE",
+    [IMPORT_STAR] = "IMPORT_STAR",
+    [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS",
+    [YIELD_VALUE] = "YIELD_VALUE",
+    [ASYNC_GEN_WRAP] = "ASYNC_GEN_WRAP",
+    [PREP_RERAISE_STAR] = "PREP_RERAISE_STAR",
+    [POP_EXCEPT] = "POP_EXCEPT",
+    [STORE_NAME] = "STORE_NAME",
+    [DELETE_NAME] = "DELETE_NAME",
+    [UNPACK_SEQUENCE] = "UNPACK_SEQUENCE",
+    [FOR_ITER] = "FOR_ITER",
+    [UNPACK_EX] = "UNPACK_EX",
+    [STORE_ATTR] = "STORE_ATTR",
+    [DELETE_ATTR] = "DELETE_ATTR",
+    [STORE_GLOBAL] = "STORE_GLOBAL",
+    [DELETE_GLOBAL] = "DELETE_GLOBAL",
+    [SWAP] = "SWAP",
+    [LOAD_CONST] = "LOAD_CONST",
+    [LOAD_NAME] = "LOAD_NAME",
+    [BUILD_TUPLE] = "BUILD_TUPLE",
+    [BUILD_LIST] = "BUILD_LIST",
+    [BUILD_SET] = "BUILD_SET",
+    [BUILD_MAP] = "BUILD_MAP",
+    [LOAD_ATTR] = "LOAD_ATTR",
+    [COMPARE_OP] = "COMPARE_OP",
+    [IMPORT_NAME] = "IMPORT_NAME",
+    [IMPORT_FROM] = "IMPORT_FROM",
+    [JUMP_FORWARD] = "JUMP_FORWARD",
+    [JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP",
+    [JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP",
+    [PRECALL_NO_KW_STR_1] = "PRECALL_NO_KW_STR_1",
+    [POP_JUMP_FORWARD_IF_FALSE] = "POP_JUMP_FORWARD_IF_FALSE",
+    [POP_JUMP_FORWARD_IF_TRUE] = "POP_JUMP_FORWARD_IF_TRUE",
+    [LOAD_GLOBAL] = "LOAD_GLOBAL",
+    [IS_OP] = "IS_OP",
+    [CONTAINS_OP] = "CONTAINS_OP",
+    [RERAISE] = "RERAISE",
+    [COPY] = "COPY",
+    [PRECALL_NO_KW_TUPLE_1] = "PRECALL_NO_KW_TUPLE_1",
+    [BINARY_OP] = "BINARY_OP",
+    [SEND] = "SEND",
+    [LOAD_FAST] = "LOAD_FAST",
+    [STORE_FAST] = "STORE_FAST",
+    [DELETE_FAST] = "DELETE_FAST",
+    [PRECALL_NO_KW_TYPE_1] = "PRECALL_NO_KW_TYPE_1",
+    [POP_JUMP_FORWARD_IF_NOT_NONE] = "POP_JUMP_FORWARD_IF_NOT_NONE",
+    [POP_JUMP_FORWARD_IF_NONE] = "POP_JUMP_FORWARD_IF_NONE",
+    [RAISE_VARARGS] = "RAISE_VARARGS",
+    [GET_AWAITABLE] = "GET_AWAITABLE",
+    [MAKE_FUNCTION] = "MAKE_FUNCTION",
+    [BUILD_SLICE] = "BUILD_SLICE",
+    [JUMP_BACKWARD_NO_INTERRUPT] = "JUMP_BACKWARD_NO_INTERRUPT",
+    [MAKE_CELL] = "MAKE_CELL",
+    [LOAD_CLOSURE] = "LOAD_CLOSURE",
+    [LOAD_DEREF] = "LOAD_DEREF",
+    [STORE_DEREF] = "STORE_DEREF",
+    [DELETE_DEREF] = "DELETE_DEREF",
+    [JUMP_BACKWARD] = "JUMP_BACKWARD",
+    [PRECALL_PYFUNC] = "PRECALL_PYFUNC",
+    [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX",
+    [RESUME_QUICK] = "RESUME_QUICK",
+    [EXTENDED_ARG] = "EXTENDED_ARG",
+    [LIST_APPEND] = "LIST_APPEND",
+    [SET_ADD] = "SET_ADD",
+    [MAP_ADD] = "MAP_ADD",
+    [LOAD_CLASSDEREF] = "LOAD_CLASSDEREF",
+    [COPY_FREE_VARS] = "COPY_FREE_VARS",
+    [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE",
+    [RESUME] = "RESUME",
+    [MATCH_CLASS] = "MATCH_CLASS",
+    [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
+    [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
+    [FORMAT_VALUE] = "FORMAT_VALUE",
+    [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
+    [BUILD_STRING] = "BUILD_STRING",
+    [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
+    [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
+    [LOAD_METHOD] = "LOAD_METHOD",
+    [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
+    [LIST_EXTEND] = "LIST_EXTEND",
+    [SET_UPDATE] = "SET_UPDATE",
+    [DICT_MERGE] = "DICT_MERGE",
+    [DICT_UPDATE] = "DICT_UPDATE",
+    [PRECALL] = "PRECALL",
+    [STORE_SUBSCR_ADAPTIVE] = "STORE_SUBSCR_ADAPTIVE",
+    [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
+    [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
+    [UNPACK_SEQUENCE_ADAPTIVE] = "UNPACK_SEQUENCE_ADAPTIVE",
+    [CALL] = "CALL",
+    [KW_NAMES] = "KW_NAMES",
+    [POP_JUMP_BACKWARD_IF_NOT_NONE] = "POP_JUMP_BACKWARD_IF_NOT_NONE",
+    [POP_JUMP_BACKWARD_IF_NONE] = "POP_JUMP_BACKWARD_IF_NONE",
+    [POP_JUMP_BACKWARD_IF_FALSE] = "POP_JUMP_BACKWARD_IF_FALSE",
+    [POP_JUMP_BACKWARD_IF_TRUE] = "POP_JUMP_BACKWARD_IF_TRUE",
+    [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
+    [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
+    [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
+    [180] = "<180>",
+    [181] = "<181>",
+    [182] = "<182>",
+    [183] = "<183>",
+    [184] = "<184>",
+    [185] = "<185>",
+    [186] = "<186>",
+    [187] = "<187>",
+    [188] = "<188>",
+    [189] = "<189>",
+    [190] = "<190>",
+    [191] = "<191>",
+    [192] = "<192>",
+    [193] = "<193>",
+    [194] = "<194>",
+    [195] = "<195>",
+    [196] = "<196>",
+    [197] = "<197>",
+    [198] = "<198>",
+    [199] = "<199>",
+    [200] = "<200>",
+    [201] = "<201>",
+    [202] = "<202>",
+    [203] = "<203>",
+    [204] = "<204>",
+    [205] = "<205>",
+    [206] = "<206>",
+    [207] = "<207>",
+    [208] = "<208>",
+    [209] = "<209>",
+    [210] = "<210>",
+    [211] = "<211>",
+    [212] = "<212>",
+    [213] = "<213>",
+    [214] = "<214>",
+    [215] = "<215>",
+    [216] = "<216>",
+    [217] = "<217>",
+    [218] = "<218>",
+    [219] = "<219>",
+    [220] = "<220>",
+    [221] = "<221>",
+    [222] = "<222>",
+    [223] = "<223>",
+    [224] = "<224>",
+    [225] = "<225>",
+    [226] = "<226>",
+    [227] = "<227>",
+    [228] = "<228>",
+    [229] = "<229>",
+    [230] = "<230>",
+    [231] = "<231>",
+    [232] = "<232>",
+    [233] = "<233>",
+    [234] = "<234>",
+    [235] = "<235>",
+    [236] = "<236>",
+    [237] = "<237>",
+    [238] = "<238>",
+    [239] = "<239>",
+    [240] = "<240>",
+    [241] = "<241>",
+    [242] = "<242>",
+    [243] = "<243>",
+    [244] = "<244>",
+    [245] = "<245>",
+    [246] = "<246>",
+    [247] = "<247>",
+    [248] = "<248>",
+    [249] = "<249>",
+    [250] = "<250>",
+    [251] = "<251>",
+    [252] = "<252>",
+    [253] = "<253>",
+    [254] = "<254>",
+    [DO_TRACING] = "DO_TRACING",
+};
+#endif
+
+#define EXTRA_CASES \
+    case 180: \
+    case 181: \
+    case 182: \
+    case 183: \
+    case 184: \
+    case 185: \
+    case 186: \
+    case 187: \
+    case 188: \
+    case 189: \
+    case 190: \
+    case 191: \
+    case 192: \
+    case 193: \
+    case 194: \
+    case 195: \
+    case 196: \
+    case 197: \
+    case 198: \
+    case 199: \
+    case 200: \
+    case 201: \
+    case 202: \
+    case 203: \
+    case 204: \
+    case 205: \
+    case 206: \
+    case 207: \
+    case 208: \
+    case 209: \
+    case 210: \
+    case 211: \
+    case 212: \
+    case 213: \
+    case 214: \
+    case 215: \
+    case 216: \
+    case 217: \
+    case 218: \
+    case 219: \
+    case 220: \
+    case 221: \
+    case 222: \
+    case 223: \
+    case 224: \
+    case 225: \
+    case 226: \
+    case 227: \
+    case 228: \
+    case 229: \
+    case 230: \
+    case 231: \
+    case 232: \
+    case 233: \
+    case 234: \
+    case 235: \
+    case 236: \
+    case 237: \
+    case 238: \
+    case 239: \
+    case 240: \
+    case 241: \
+    case 242: \
+    case 243: \
+    case 244: \
+    case 245: \
+    case 246: \
+    case 247: \
+    case 248: \
+    case 249: \
+    case 250: \
+    case 251: \
+    case 252: \
+    case 253: \
+    case 254: \
+        ;
+
+#ifdef __cplusplus
+}
+#endif
+#endif  // !Py_INTERNAL_OPCODE_H
diff --git a/Include/opcode.h b/Include/opcode.h
index 89f56e27ed437..399847d4ba050 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -1,4 +1,5 @@
-/* Auto-generated by Tools/scripts/generate_opcode_h.py from Lib/opcode.py */
+// Auto-generated by Tools/scripts/generate_opcode_h.py from Lib/opcode.py
+
 #ifndef Py_OPCODE_H
 #define Py_OPCODE_H
 #ifdef __cplusplus
@@ -190,230 +191,6 @@ extern "C" {
 #define UNPACK_SEQUENCE_TWO_TUPLE              179
 #define DO_TRACING                             255
 
-extern const uint8_t _PyOpcode_Caches[256];
-
-extern const uint8_t _PyOpcode_Deopt[256];
-
-#ifdef NEED_OPCODE_TABLES
-static const uint32_t _PyOpcode_RelativeJump[8] = {
-    0U,
-    0U,
-    536870912U,
-    135118848U,
-    4163U,
-    122880U,
-    0U,
-    0U,
-};
-static const uint32_t _PyOpcode_Jump[8] = {
-    0U,
-    0U,
-    536870912U,
-    135118848U,
-    4163U,
-    122880U,
-    0U,
-    0U,
-};
-
-const uint8_t _PyOpcode_Caches[256] = {
-    [BINARY_SUBSCR] = 4,
-    [STORE_SUBSCR] = 1,
-    [UNPACK_SEQUENCE] = 1,
-    [STORE_ATTR] = 4,
-    [LOAD_ATTR] = 4,
-    [COMPARE_OP] = 2,
-    [LOAD_GLOBAL] = 5,
-    [BINARY_OP] = 1,
-    [LOAD_METHOD] = 10,
-    [PRECALL] = 1,
-    [CALL] = 4,
-};
-
-const uint8_t _PyOpcode_Deopt[256] = {
-    [ASYNC_GEN_WRAP] = ASYNC_GEN_WRAP,
-    [BEFORE_ASYNC_WITH] = BEFORE_ASYNC_WITH,
-    [BEFORE_WITH] = BEFORE_WITH,
-    [BINARY_OP] = BINARY_OP,
-    [BINARY_OP_ADAPTIVE] = BINARY_OP,
-    [BINARY_OP_ADD_FLOAT] = BINARY_OP,
-    [BINARY_OP_ADD_INT] = BINARY_OP,
-    [BINARY_OP_ADD_UNICODE] = BINARY_OP,
-    [BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP,
-    [BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP,
-    [BINARY_OP_MULTIPLY_INT] = BINARY_OP,
-    [BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP,
-    [BINARY_OP_SUBTRACT_INT] = BINARY_OP,
-    [BINARY_SUBSCR] = BINARY_SUBSCR,
-    [BINARY_SUBSCR_ADAPTIVE] = BINARY_SUBSCR,
-    [BINARY_SUBSCR_DICT] = BINARY_SUBSCR,
-    [BINARY_SUBSCR_GETITEM] = BINARY_SUBSCR,
-    [BINARY_SUBSCR_LIST_INT] = BINARY_SUBSCR,
-    [BINARY_SUBSCR_TUPLE_INT] = BINARY_SUBSCR,
-    [BUILD_CONST_KEY_MAP] = BUILD_CONST_KEY_MAP,
-    [BUILD_LIST] = BUILD_LIST,
-    [BUILD_MAP] = BUILD_MAP,
-    [BUILD_SET] = BUILD_SET,
-    [BUILD_SLICE] = BUILD_SLICE,
-    [BUILD_STRING] = BUILD_STRING,
-    [BUILD_TUPLE] = BUILD_TUPLE,
-    [CACHE] = CACHE,
-    [CALL] = CALL,
-    [CALL_ADAPTIVE] = CALL,
-    [CALL_FUNCTION_EX] = CALL_FUNCTION_EX,
-    [CALL_PY_EXACT_ARGS] = CALL,
-    [CALL_PY_WITH_DEFAULTS] = CALL,
-    [CHECK_EG_MATCH] = CHECK_EG_MATCH,
-    [CHECK_EXC_MATCH] = CHECK_EXC_MATCH,
-    [COMPARE_OP] = COMPARE_OP,
-    [COMPARE_OP_ADAPTIVE] = COMPARE_OP,
-    [COMPARE_OP_FLOAT_JUMP] = COMPARE_OP,
-    [COMPARE_OP_INT_JUMP] = COMPARE_OP,
-    [COMPARE_OP_STR_JUMP] = COMPARE_OP,
-    [CONTAINS_OP] = CONTAINS_OP,
-    [COPY] = COPY,
-    [COPY_FREE_VARS] = COPY_FREE_VARS,
-    [DELETE_ATTR] = DELETE_ATTR,
-    [DELETE_DEREF] = DELETE_DEREF,
-    [DELETE_FAST] = DELETE_FAST,
-    [DELETE_GLOBAL] = DELETE_GLOBAL,
-    [DELETE_NAME] = DELETE_NAME,
-    [DELETE_SUBSCR] = DELETE_SUBSCR,
-    [DICT_MERGE] = DICT_MERGE,
-    [DICT_UPDATE] = DICT_UPDATE,
-    [END_ASYNC_FOR] = END_ASYNC_FOR,
-    [EXTENDED_ARG] = EXTENDED_ARG,
-    [FORMAT_VALUE] = FORMAT_VALUE,
-    [FOR_ITER] = FOR_ITER,
-    [GET_AITER] = GET_AITER,
-    [GET_ANEXT] = GET_ANEXT,
-    [GET_AWAITABLE] = GET_AWAITABLE,
-    [GET_ITER] = GET_ITER,
-    [GET_LEN] = GET_LEN,
-    [GET_YIELD_FROM_ITER] = GET_YIELD_FROM_ITER,
-    [IMPORT_FROM] = IMPORT_FROM,
-    [IMPORT_NAME] = IMPORT_NAME,
-    [IMPORT_STAR] = IMPORT_STAR,
-    [IS_OP] = IS_OP,
-    [JUMP_BACKWARD] = JUMP_BACKWARD,
-    [JUMP_BACKWARD_NO_INTERRUPT] = JUMP_BACKWARD_NO_INTERRUPT,
-    [JUMP_BACKWARD_QUICK] = JUMP_BACKWARD,
-    [JUMP_FORWARD] = JUMP_FORWARD,
-    [JUMP_IF_FALSE_OR_POP] = JUMP_IF_FALSE_OR_POP,
-    [JUMP_IF_TRUE_OR_POP] = JUMP_IF_TRUE_OR_POP,
-    [KW_NAMES] = KW_NAMES,
-    [LIST_APPEND] = LIST_APPEND,
-    [LIST_EXTEND] = LIST_EXTEND,
-    [LIST_TO_TUPLE] = LIST_TO_TUPLE,
-    [LOAD_ASSERTION_ERROR] = LOAD_ASSERTION_ERROR,
-    [LOAD_ATTR] = LOAD_ATTR,
-    [LOAD_ATTR_ADAPTIVE] = LOAD_ATTR,
-    [LOAD_ATTR_INSTANCE_VALUE] = LOAD_ATTR,
-    [LOAD_ATTR_MODULE] = LOAD_ATTR,
-    [LOAD_ATTR_SLOT] = LOAD_ATTR,
-    [LOAD_ATTR_WITH_HINT] = LOAD_ATTR,
-    [LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS,
-    [LOAD_CLASSDEREF] = LOAD_CLASSDEREF,
-    [LOAD_CLOSURE] = LOAD_CLOSURE,
-    [LOAD_CONST] = LOAD_CONST,
-    [LOAD_CONST__LOAD_FAST] = LOAD_CONST,
-    [LOAD_DEREF] = LOAD_DEREF,
-    [LOAD_FAST] = LOAD_FAST,
-    [LOAD_FAST__LOAD_CONST] = LOAD_FAST,
-    [LOAD_FAST__LOAD_FAST] = LOAD_FAST,
-    [LOAD_GLOBAL] = LOAD_GLOBAL,
-    [LOAD_GLOBAL_ADAPTIVE] = LOAD_GLOBAL,
-    [LOAD_GLOBAL_BUILTIN] = LOAD_GLOBAL,
-    [LOAD_GLOBAL_MODULE] = LOAD_GLOBAL,
-    [LOAD_METHOD] = LOAD_METHOD,
-    [LOAD_METHOD_ADAPTIVE] = LOAD_METHOD,
-    [LOAD_METHOD_CLASS] = LOAD_METHOD,
-    [LOAD_METHOD_MODULE] = LOAD_METHOD,
-    [LOAD_METHOD_NO_DICT] = LOAD_METHOD,
-    [LOAD_METHOD_WITH_DICT] = LOAD_METHOD,
-    [LOAD_METHOD_WITH_VALUES] = LOAD_METHOD,
-    [LOAD_NAME] = LOAD_NAME,
-    [MAKE_CELL] = MAKE_CELL,
-    [MAKE_FUNCTION] = MAKE_FUNCTION,
-    [MAP_ADD] = MAP_ADD,
-    [MATCH_CLASS] = MATCH_CLASS,
-    [MATCH_KEYS] = MATCH_KEYS,
-    [MATCH_MAPPING] = MATCH_MAPPING,
-    [MATCH_SEQUENCE] = MATCH_SEQUENCE,
-    [NOP] = NOP,
-    [POP_EXCEPT] = POP_EXCEPT,
-    [POP_JUMP_BACKWARD_IF_FALSE] = POP_JUMP_BACKWARD_IF_FALSE,
-    [POP_JUMP_BACKWARD_IF_NONE] = POP_JUMP_BACKWARD_IF_NONE,
-    [POP_JUMP_BACKWARD_IF_NOT_NONE] = POP_JUMP_BACKWARD_IF_NOT_NONE,
-    [POP_JUMP_BACKWARD_IF_TRUE] = POP_JUMP_BACKWARD_IF_TRUE,
-    [POP_JUMP_FORWARD_IF_FALSE] = POP_JUMP_FORWARD_IF_FALSE,
-    [POP_JUMP_FORWARD_IF_NONE] = POP_JUMP_FORWARD_IF_NONE,
-    [POP_JUMP_FORWARD_IF_NOT_NONE] = POP_JUMP_FORWARD_IF_NOT_NONE,
-    [POP_JUMP_FORWARD_IF_TRUE] = POP_JUMP_FORWARD_IF_TRUE,
-    [POP_TOP] = POP_TOP,
-    [PRECALL] = PRECALL,
-    [PRECALL_ADAPTIVE] = PRECALL,
-    [PRECALL_BOUND_METHOD] = PRECALL,
-    [PRECALL_BUILTIN_CLASS] = PRECALL,
-    [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = PRECALL,
-    [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = PRECALL,
-    [PRECALL_NO_KW_BUILTIN_FAST] = PRECALL,
-    [PRECALL_NO_KW_BUILTIN_O] = PRECALL,
-    [PRECALL_NO_KW_ISINSTANCE] = PRECALL,
-    [PRECALL_NO_KW_LEN] = PRECALL,
-    [PRECALL_NO_KW_LIST_APPEND] = PRECALL,
-    [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = PRECALL,
-    [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = PRECALL,
-    [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = PRECALL,
-    [PRECALL_NO_KW_STR_1] = PRECALL,
-    [PRECALL_NO_KW_TUPLE_1] = PRECALL,
-    [PRECALL_NO_KW_TYPE_1] = PRECALL,
-    [PRECALL_PYFUNC] = PRECALL,
-    [PREP_RERAISE_STAR] = PREP_RERAISE_STAR,
-    [PRINT_EXPR] = PRINT_EXPR,
-    [PUSH_EXC_INFO] = PUSH_EXC_INFO,
-    [PUSH_NULL] = PUSH_NULL,
-    [RAISE_VARARGS] = RAISE_VARARGS,
-    [RERAISE] = RERAISE,
-    [RESUME] = RESUME,
-    [RESUME_QUICK] = RESUME,
-    [RETURN_GENERATOR] = RETURN_GENERATOR,
-    [RETURN_VALUE] = RETURN_VALUE,
-    [SEND] = SEND,
-    [SETUP_ANNOTATIONS] = SETUP_ANNOTATIONS,
-    [SET_ADD] = SET_ADD,
-    [SET_UPDATE] = SET_UPDATE,
-    [STORE_ATTR] = STORE_ATTR,
-    [STORE_ATTR_ADAPTIVE] = STORE_ATTR,
-    [STORE_ATTR_INSTANCE_VALUE] = STORE_ATTR,
-    [STORE_ATTR_SLOT] = STORE_ATTR,
-    [STORE_ATTR_WITH_HINT] = STORE_ATTR,
-    [STORE_DEREF] = STORE_DEREF,
-    [STORE_FAST] = STORE_FAST,
-    [STORE_FAST__LOAD_FAST] = STORE_FAST,
-    [STORE_FAST__STORE_FAST] = STORE_FAST,
-    [STORE_GLOBAL] = STORE_GLOBAL,
-    [STORE_NAME] = STORE_NAME,
-    [STORE_SUBSCR] = STORE_SUBSCR,
-    [STORE_SUBSCR_ADAPTIVE] = STORE_SUBSCR,
-    [STORE_SUBSCR_DICT] = STORE_SUBSCR,
-    [STORE_SUBSCR_LIST_INT] = STORE_SUBSCR,
-    [SWAP] = SWAP,
-    [UNARY_INVERT] = UNARY_INVERT,
-    [UNARY_NEGATIVE] = UNARY_NEGATIVE,
-    [UNARY_NOT] = UNARY_NOT,
-    [UNARY_POSITIVE] = UNARY_POSITIVE,
-    [UNPACK_EX] = UNPACK_EX,
-    [UNPACK_SEQUENCE] = UNPACK_SEQUENCE,
-    [UNPACK_SEQUENCE_ADAPTIVE] = UNPACK_SEQUENCE,
-    [UNPACK_SEQUENCE_LIST] = UNPACK_SEQUENCE,
-    [UNPACK_SEQUENCE_TUPLE] = UNPACK_SEQUENCE,
-    [UNPACK_SEQUENCE_TWO_TUPLE] = UNPACK_SEQUENCE,
-    [WITH_EXCEPT_START] = WITH_EXCEPT_START,
-    [YIELD_VALUE] = YIELD_VALUE,
-};
-#endif /* OPCODE_TABLES */
-
 #define HAS_CONST(op) (false\
     || ((op) == 100) \
     || ((op) == 172) \
@@ -446,345 +223,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
 #define NB_INPLACE_TRUE_DIVIDE                  24
 #define NB_INPLACE_XOR                          25
 
-#ifdef Py_DEBUG
-static const char *const _PyOpcode_OpName[256] = {
-    [CACHE] = "CACHE",
-    [POP_TOP] = "POP_TOP",
-    [PUSH_NULL] = "PUSH_NULL",
-    [BINARY_OP_ADAPTIVE] = "BINARY_OP_ADAPTIVE",
-    [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT",
-    [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT",
-    [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE",
-    [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE",
-    [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT",
-    [NOP] = "NOP",
-    [UNARY_POSITIVE] = "UNARY_POSITIVE",
-    [UNARY_NEGATIVE] = "UNARY_NEGATIVE",
-    [UNARY_NOT] = "UNARY_NOT",
-    [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT",
-    [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT",
-    [UNARY_INVERT] = "UNARY_INVERT",
-    [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT",
-    [BINARY_SUBSCR_ADAPTIVE] = "BINARY_SUBSCR_ADAPTIVE",
-    [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT",
-    [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM",
-    [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT",
-    [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT",
-    [CALL_ADAPTIVE] = "CALL_ADAPTIVE",
-    [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS",
-    [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS",
-    [BINARY_SUBSCR] = "BINARY_SUBSCR",
-    [COMPARE_OP_ADAPTIVE] = "COMPARE_OP_ADAPTIVE",
-    [COMPARE_OP_FLOAT_JUMP] = "COMPARE_OP_FLOAT_JUMP",
-    [COMPARE_OP_INT_JUMP] = "COMPARE_OP_INT_JUMP",
-    [COMPARE_OP_STR_JUMP] = "COMPARE_OP_STR_JUMP",
-    [GET_LEN] = "GET_LEN",
-    [MATCH_MAPPING] = "MATCH_MAPPING",
-    [MATCH_SEQUENCE] = "MATCH_SEQUENCE",
-    [MATCH_KEYS] = "MATCH_KEYS",
-    [JUMP_BACKWARD_QUICK] = "JUMP_BACKWARD_QUICK",
-    [PUSH_EXC_INFO] = "PUSH_EXC_INFO",
-    [CHECK_EXC_MATCH] = "CHECK_EXC_MATCH",
-    [CHECK_EG_MATCH] = "CHECK_EG_MATCH",
-    [LOAD_ATTR_ADAPTIVE] = "LOAD_ATTR_ADAPTIVE",
-    [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE",
-    [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE",
-    [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT",
-    [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
-    [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
-    [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
-    [LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
-    [LOAD_GLOBAL_ADAPTIVE] = "LOAD_GLOBAL_ADAPTIVE",
-    [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
-    [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
-    [WITH_EXCEPT_START] = "WITH_EXCEPT_START",
-    [GET_AITER] = "GET_AITER",
-    [GET_ANEXT] = "GET_ANEXT",
-    [BEFORE_ASYNC_WITH] = "BEFORE_ASYNC_WITH",
-    [BEFORE_WITH] = "BEFORE_WITH",
-    [END_ASYNC_FOR] = "END_ASYNC_FOR",
-    [LOAD_METHOD_ADAPTIVE] = "LOAD_METHOD_ADAPTIVE",
-    [LOAD_METHOD_CLASS] = "LOAD_METHOD_CLASS",
-    [LOAD_METHOD_MODULE] = "LOAD_METHOD_MODULE",
-    [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT",
-    [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT",
-    [STORE_SUBSCR] = "STORE_SUBSCR",
-    [DELETE_SUBSCR] = "DELETE_SUBSCR",
-    [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES",
-    [PRECALL_ADAPTIVE] = "PRECALL_ADAPTIVE",
-    [PRECALL_BOUND_METHOD] = "PRECALL_BOUND_METHOD",
-    [PRECALL_BUILTIN_CLASS] = "PRECALL_BUILTIN_CLASS",
-    [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = "PRECALL_BUILTIN_FAST_WITH_KEYWORDS",
-    [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
-    [GET_ITER] = "GET_ITER",
-    [GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER",
-    [PRINT_EXPR] = "PRINT_EXPR",
-    [LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS",
-    [PRECALL_NO_KW_BUILTIN_FAST] = "PRECALL_NO_KW_BUILTIN_FAST",
-    [PRECALL_NO_KW_BUILTIN_O] = "PRECALL_NO_KW_BUILTIN_O",
-    [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR",
-    [RETURN_GENERATOR] = "RETURN_GENERATOR",
-    [PRECALL_NO_KW_ISINSTANCE] = "PRECALL_NO_KW_ISINSTANCE",
-    [PRECALL_NO_KW_LEN] = "PRECALL_NO_KW_LEN",
-    [PRECALL_NO_KW_LIST_APPEND] = "PRECALL_NO_KW_LIST_APPEND",
-    [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST",
-    [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS",
-    [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_O",
-    [LIST_TO_TUPLE] = "LIST_TO_TUPLE",
-    [RETURN_VALUE] = "RETURN_VALUE",
-    [IMPORT_STAR] = "IMPORT_STAR",
-    [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS",
-    [YIELD_VALUE] = "YIELD_VALUE",
-    [ASYNC_GEN_WRAP] = "ASYNC_GEN_WRAP",
-    [PREP_RERAISE_STAR] = "PREP_RERAISE_STAR",
-    [POP_EXCEPT] = "POP_EXCEPT",
-    [STORE_NAME] = "STORE_NAME",
-    [DELETE_NAME] = "DELETE_NAME",
-    [UNPACK_SEQUENCE] = "UNPACK_SEQUENCE",
-    [FOR_ITER] = "FOR_ITER",
-    [UNPACK_EX] = "UNPACK_EX",
-    [STORE_ATTR] = "STORE_ATTR",
-    [DELETE_ATTR] = "DELETE_ATTR",
-    [STORE_GLOBAL] = "STORE_GLOBAL",
-    [DELETE_GLOBAL] = "DELETE_GLOBAL",
-    [SWAP] = "SWAP",
-    [LOAD_CONST] = "LOAD_CONST",
-    [LOAD_NAME] = "LOAD_NAME",
-    [BUILD_TUPLE] = "BUILD_TUPLE",
-    [BUILD_LIST] = "BUILD_LIST",
-    [BUILD_SET] = "BUILD_SET",
-    [BUILD_MAP] = "BUILD_MAP",
-    [LOAD_ATTR] = "LOAD_ATTR",
-    [COMPARE_OP] = "COMPARE_OP",
-    [IMPORT_NAME] = "IMPORT_NAME",
-    [IMPORT_FROM] = "IMPORT_FROM",
-    [JUMP_FORWARD] = "JUMP_FORWARD",
-    [JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP",
-    [JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP",
-    [PRECALL_NO_KW_STR_1] = "PRECALL_NO_KW_STR_1",
-    [POP_JUMP_FORWARD_IF_FALSE] = "POP_JUMP_FORWARD_IF_FALSE",
-    [POP_JUMP_FORWARD_IF_TRUE] = "POP_JUMP_FORWARD_IF_TRUE",
-    [LOAD_GLOBAL] = "LOAD_GLOBAL",
-    [IS_OP] = "IS_OP",
-    [CONTAINS_OP] = "CONTAINS_OP",
-    [RERAISE] = "RERAISE",
-    [COPY] = "COPY",
-    [PRECALL_NO_KW_TUPLE_1] = "PRECALL_NO_KW_TUPLE_1",
-    [BINARY_OP] = "BINARY_OP",
-    [SEND] = "SEND",
-    [LOAD_FAST] = "LOAD_FAST",
-    [STORE_FAST] = "STORE_FAST",
-    [DELETE_FAST] = "DELETE_FAST",
-    [PRECALL_NO_KW_TYPE_1] = "PRECALL_NO_KW_TYPE_1",
-    [POP_JUMP_FORWARD_IF_NOT_NONE] = "POP_JUMP_FORWARD_IF_NOT_NONE",
-    [POP_JUMP_FORWARD_IF_NONE] = "POP_JUMP_FORWARD_IF_NONE",
-    [RAISE_VARARGS] = "RAISE_VARARGS",
-    [GET_AWAITABLE] = "GET_AWAITABLE",
-    [MAKE_FUNCTION] = "MAKE_FUNCTION",
-    [BUILD_SLICE] = "BUILD_SLICE",
-    [JUMP_BACKWARD_NO_INTERRUPT] = "JUMP_BACKWARD_NO_INTERRUPT",
-    [MAKE_CELL] = "MAKE_CELL",
-    [LOAD_CLOSURE] = "LOAD_CLOSURE",
-    [LOAD_DEREF] = "LOAD_DEREF",
-    [STORE_DEREF] = "STORE_DEREF",
-    [DELETE_DEREF] = "DELETE_DEREF",
-    [JUMP_BACKWARD] = "JUMP_BACKWARD",
-    [PRECALL_PYFUNC] = "PRECALL_PYFUNC",
-    [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX",
-    [RESUME_QUICK] = "RESUME_QUICK",
-    [EXTENDED_ARG] = "EXTENDED_ARG",
-    [LIST_APPEND] = "LIST_APPEND",
-    [SET_ADD] = "SET_ADD",
-    [MAP_ADD] = "MAP_ADD",
-    [LOAD_CLASSDEREF] = "LOAD_CLASSDEREF",
-    [COPY_FREE_VARS] = "COPY_FREE_VARS",
-    [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE",
-    [RESUME] = "RESUME",
-    [MATCH_CLASS] = "MATCH_CLASS",
-    [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
-    [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
-    [FORMAT_VALUE] = "FORMAT_VALUE",
-    [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
-    [BUILD_STRING] = "BUILD_STRING",
-    [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
-    [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
-    [LOAD_METHOD] = "LOAD_METHOD",
-    [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
-    [LIST_EXTEND] = "LIST_EXTEND",
-    [SET_UPDATE] = "SET_UPDATE",
-    [DICT_MERGE] = "DICT_MERGE",
-    [DICT_UPDATE] = "DICT_UPDATE",
-    [PRECALL] = "PRECALL",
-    [STORE_SUBSCR_ADAPTIVE] = "STORE_SUBSCR_ADAPTIVE",
-    [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
-    [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
-    [UNPACK_SEQUENCE_ADAPTIVE] = "UNPACK_SEQUENCE_ADAPTIVE",
-    [CALL] = "CALL",
-    [KW_NAMES] = "KW_NAMES",
-    [POP_JUMP_BACKWARD_IF_NOT_NONE] = "POP_JUMP_BACKWARD_IF_NOT_NONE",
-    [POP_JUMP_BACKWARD_IF_NONE] = "POP_JUMP_BACKWARD_IF_NONE",
-    [POP_JUMP_BACKWARD_IF_FALSE] = "POP_JUMP_BACKWARD_IF_FALSE",
-    [POP_JUMP_BACKWARD_IF_TRUE] = "POP_JUMP_BACKWARD_IF_TRUE",
-    [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
-    [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
-    [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
-    [180] = "<180>",
-    [181] = "<181>",
-    [182] = "<182>",
-    [183] = "<183>",
-    [184] = "<184>",
-    [185] = "<185>",
-    [186] = "<186>",
-    [187] = "<187>",
-    [188] = "<188>",
-    [189] = "<189>",
-    [190] = "<190>",
-    [191] = "<191>",
-    [192] = "<192>",
-    [193] = "<193>",
-    [194] = "<194>",
-    [195] = "<195>",
-    [196] = "<196>",
-    [197] = "<197>",
-    [198] = "<198>",
-    [199] = "<199>",
-    [200] = "<200>",
-    [201] = "<201>",
-    [202] = "<202>",
-    [203] = "<203>",
-    [204] = "<204>",
-    [205] = "<205>",
-    [206] = "<206>",
-    [207] = "<207>",
-    [208] = "<208>",
-    [209] = "<209>",
-    [210] = "<210>",
-    [211] = "<211>",
-    [212] = "<212>",
-    [213] = "<213>",
-    [214] = "<214>",
-    [215] = "<215>",
-    [216] = "<216>",
-    [217] = "<217>",
-    [218] = "<218>",
-    [219] = "<219>",
-    [220] = "<220>",
-    [221] = "<221>",
-    [222] = "<222>",
-    [223] = "<223>",
-    [224] = "<224>",
-    [225] = "<225>",
-    [226] = "<226>",
-    [227] = "<227>",
-    [228] = "<228>",
-    [229] = "<229>",
-    [230] = "<230>",
-    [231] = "<231>",
-    [232] = "<232>",
-    [233] = "<233>",
-    [234] = "<234>",
-    [235] = "<235>",
-    [236] = "<236>",
-    [237] = "<237>",
-    [238] = "<238>",
-    [239] = "<239>",
-    [240] = "<240>",
-    [241] = "<241>",
-    [242] = "<242>",
-    [243] = "<243>",
-    [244] = "<244>",
-    [245] = "<245>",
-    [246] = "<246>",
-    [247] = "<247>",
-    [248] = "<248>",
-    [249] = "<249>",
-    [250] = "<250>",
-    [251] = "<251>",
-    [252] = "<252>",
-    [253] = "<253>",
-    [254] = "<254>",
-    [DO_TRACING] = "DO_TRACING",
-};
-#endif
-
-#define EXTRA_CASES \
-    case 180: \
-    case 181: \
-    case 182: \
-    case 183: \
-    case 184: \
-    case 185: \
-    case 186: \
-    case 187: \
-    case 188: \
-    case 189: \
-    case 190: \
-    case 191: \
-    case 192: \
-    case 193: \
-    case 194: \
-    case 195: \
-    case 196: \
-    case 197: \
-    case 198: \
-    case 199: \
-    case 200: \
-    case 201: \
-    case 202: \
-    case 203: \
-    case 204: \
-    case 205: \
-    case 206: \
-    case 207: \
-    case 208: \
-    case 209: \
-    case 210: \
-    case 211: \
-    case 212: \
-    case 213: \
-    case 214: \
-    case 215: \
-    case 216: \
-    case 217: \
-    case 218: \
-    case 219: \
-    case 220: \
-    case 221: \
-    case 222: \
-    case 223: \
-    case 224: \
-    case 225: \
-    case 226: \
-    case 227: \
-    case 228: \
-    case 229: \
-    case 230: \
-    case 231: \
-    case 232: \
-    case 233: \
-    case 234: \
-    case 235: \
-    case 236: \
-    case 237: \
-    case 238: \
-    case 239: \
-    case 240: \
-    case 241: \
-    case 242: \
-    case 243: \
-    case 244: \
-    case 245: \
-    case 246: \
-    case 247: \
-    case 248: \
-    case 249: \
-    case 250: \
-    case 251: \
-    case 252: \
-    case 253: \
-    case 254: \
-        ;
-
 #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
 
 /* Reserve some bytecodes for internal use in the compiler.
diff --git a/Makefile.pre.in b/Makefile.pre.in
index 3952f5b542b43..f3bccf4fec7ec 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -1311,8 +1311,10 @@ regen-opcode:
 	# using Tools/scripts/generate_opcode_h.py
 	$(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/generate_opcode_h.py \
 		$(srcdir)/Lib/opcode.py \
-		$(srcdir)/Include/opcode.h.new
+		$(srcdir)/Include/opcode.h.new \
+		$(srcdir)/Include/internal/pycore_opcode.h.new
 	$(UPDATE_FILE) $(srcdir)/Include/opcode.h $(srcdir)/Include/opcode.h.new
+	$(UPDATE_FILE) $(srcdir)/Include/internal/pycore_opcode.h $(srcdir)/Include/internal/pycore_opcode.h.new
 
 .PHONY: regen-token
 regen-token:
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 4fc4b8fec68a2..e3e4ca159a632 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -5,6 +5,7 @@
 #include "structmember.h"         // PyMemberDef
 #include "pycore_code.h"          // _PyCodeConstructor
 #include "pycore_interp.h"        // PyInterpreterState.co_extra_freefuncs
+#include "pycore_opcode.h"        // _PyOpcode_Deopt
 #include "pycore_pystate.h"       // _PyInterpreterState_GET()
 #include "pycore_tuple.h"         // _PyTuple_ITEMS()
 #include "clinic/codeobject.c.h"
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 7278ca147490f..56c4fceb6b893 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -2,10 +2,11 @@
 
 #include "Python.h"
 #include "pycore_ceval.h"         // _PyEval_BuiltinsFromGlobals()
-#include "pycore_moduleobject.h"  // _PyModule_GetDict()
-#include "pycore_object.h"        // _PyObject_GC_UNTRACK()
 #include "pycore_code.h"          // CO_FAST_LOCAL, etc.
 #include "pycore_function.h"      // _PyFunction_FromConstructor()
+#include "pycore_moduleobject.h"  // _PyModule_GetDict()
+#include "pycore_object.h"        // _PyObject_GC_UNTRACK()
+#include "pycore_opcode.h"        // _PyOpcode_Caches
 
 #include "frameobject.h"          // PyFrameObject
 #include "pycore_frame.h"
diff --git a/Objects/genobject.c b/Objects/genobject.c
index e58118b2694ff..7920a10c7fb78 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -3,12 +3,12 @@
 #include "Python.h"
 #include "pycore_call.h"          // _PyObject_CallNoArgs()
 #include "pycore_ceval.h"         // _PyEval_EvalFrame()
+#include "pycore_frame.h"         // _PyInterpreterFrame
 #include "pycore_genobject.h"     // struct _Py_async_gen_state
 #include "pycore_object.h"        // _PyObject_GC_UNTRACK()
+#include "pycore_opcode.h"        // _PyOpcode_Deopt
 #include "pycore_pyerrors.h"      // _PyErr_ClearExcState()
 #include "pycore_pystate.h"       // _PyThreadState_GET()
-#include "pycore_frame.h"         // _PyInterpreterFrame
-#include "frameobject.h"          // PyFrameObject
 #include "structmember.h"         // PyMemberDef
 #include "opcode.h"               // SEND
 
diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets
index a49d97190ce20..24b5ced1de0e0 100644
--- a/PCbuild/regen.targets
+++ b/PCbuild/regen.targets
@@ -14,7 +14,7 @@
       <Argument>-C</Argument>
     </_ASTOutputs>
     <_OpcodeSources Include="$(PySourcePath)Tools\scripts\generate_opcode_h.py;$(PySourcePath)Lib\opcode.py" />
-    <_OpcodeOutputs Include="$(PySourcePath)Include\opcode.h;$(PySourcePath)Python\opcode_targets.h" />
+    <_OpcodeOutputs Include="$(PySourcePath)Include\opcode.h;$(PySourcePath)Include\internal\pycore_opcode.h;$(PySourcePath)Python\opcode_targets.h" />
     <_TokenSources Include="$(PySourcePath)Grammar\Tokens" />
     <_TokenOutputs Include="$(PySourcePath)Doc\library\token-list.inc">
       <Format>rst</Format>
@@ -59,7 +59,7 @@
           Inputs="@(_OpcodeSources)" Outputs="@(_OpcodeOutputs)"
           DependsOnTargets="FindPythonForBuild">
     <Message Text="Regenerate @(_OpcodeOutputs->'%(Filename)%(Extension)',' ')" Importance="high" />
-    <Exec Command="$(PythonForBuild) Tools\scripts\generate_opcode_h.py Lib\opcode.py Include\opcode.h"
+    <Exec Command="$(PythonForBuild) Tools\scripts\generate_opcode_h.py Lib\opcode.py Include\opcode.h Include\internal\pycore_opcode.h"
           WorkingDirectory="$(PySourcePath)" />
     <Exec Command="$(PythonForBuild) Python\makeopcodetargets.py Python\opcode_targets.h"
           WorkingDirectory="$(PySourcePath)" />
diff --git a/Python/ceval.c b/Python/ceval.c
index 90068bc51a7f6..6e7a2483112d7 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -15,6 +15,7 @@
 #include "pycore_long.h"          // _PyLong_GetZero()
 #include "pycore_object.h"        // _PyObject_GC_TRACK()
 #include "pycore_moduleobject.h"  // PyModuleObject
+#include "pycore_opcode.h"        // EXTRA_CASES
 #include "pycore_pyerrors.h"      // _PyErr_Fetch()
 #include "pycore_pylifecycle.h"   // _PyErr_Print()
 #include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
diff --git a/Python/compile.c b/Python/compile.c
index d66ee17293ac6..42b011ce93ef7 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -23,17 +23,18 @@
 
 #include <stdbool.h>
 
+// Need _PyOpcode_RelativeJump of pycore_opcode.h
+#define NEED_OPCODE_TABLES
+
 #include "Python.h"
 #include "pycore_ast.h"           // _PyAST_GetDocString()
-#include "pycore_compile.h"       // _PyFuture_FromAST()
 #include "pycore_code.h"          // _PyCode_New()
-#include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
+#include "pycore_compile.h"       // _PyFuture_FromAST()
 #include "pycore_long.h"          // _PyLong_GetZero()
+#include "pycore_opcode.h"        // _PyOpcode_Caches
+#include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
 #include "pycore_symtable.h"      // PySTEntryObject
 
-#define NEED_OPCODE_TABLES
-#include "opcode.h"               // EXTENDED_ARG
-
 
 #define DEFAULT_BLOCK_SIZE 16
 #define DEFAULT_CODE_SIZE 128
diff --git a/Python/specialize.c b/Python/specialize.c
index 3a8b768549c63..9449ac117979d 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -6,7 +6,7 @@
 #include "pycore_long.h"
 #include "pycore_moduleobject.h"
 #include "pycore_object.h"
-#include "opcode.h"
+#include "pycore_opcode.h"        // _PyOpcode_Caches
 #include "structmember.h"         // struct PyMemberDef, T_OFFSET_EX
 
 #include <stdlib.h> // rand()
diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py
index 1b45020835dd4..6a04297879f2c 100644
--- a/Tools/scripts/generate_opcode_h.py
+++ b/Tools/scripts/generate_opcode_h.py
@@ -3,12 +3,16 @@
 import sys
 import tokenize
 
-header = """
-/* Auto-generated by Tools/scripts/generate_opcode_h.py from Lib/opcode.py */
+SCRIPT_NAME = "Tools/scripts/generate_opcode_h.py"
+PYTHON_OPCODE = "Lib/opcode.py"
+
+header = f"""
+// Auto-generated by {SCRIPT_NAME} from {PYTHON_OPCODE}
+
 #ifndef Py_OPCODE_H
 #define Py_OPCODE_H
 #ifdef __cplusplus
-extern "C" {
+extern "C" {{
 #endif
 
 
@@ -28,6 +32,29 @@
 #endif /* !Py_OPCODE_H */
 """
 
+internal_header = f"""
+// Auto-generated by {SCRIPT_NAME} from {PYTHON_OPCODE}
+
+#ifndef Py_INTERNAL_OPCODE_H
+#define Py_INTERNAL_OPCODE_H
+#ifdef __cplusplus
+extern "C" {{
+#endif
+
+#ifndef Py_BUILD_CORE
+#  error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "opcode.h"
+""".lstrip()
+
+internal_footer = """
+#ifdef __cplusplus
+}
+#endif
+#endif  // !Py_INTERNAL_OPCODE_H
+"""
+
 DEFINE = "#define {:<38} {:>3}\n"
 
 UINT32_MASK = (1<<32)-1
@@ -43,7 +70,7 @@ def write_int_array_from_ops(name, ops, out):
     assert bits == 0
     out.write(f"}};\n")
 
-def main(opcode_py, outfile='Include/opcode.h'):
+def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/internal/pycore_opcode.h'):
     opcode = {}
     if hasattr(tokenize, 'open'):
         fp = tokenize.open(opcode_py)   # Python 3.2+
@@ -75,8 +102,10 @@ def main(opcode_py, outfile='Include/opcode.h'):
     opname_including_specialized[255] = 'DO_TRACING'
     used[255] = True
 
-    with open(outfile, 'w') as fobj:
+    with (open(outfile, 'w') as fobj, open(internaloutfile, 'w') as iobj):
         fobj.write(header)
+        iobj.write(internal_header)
+
         for name in opname:
             if name in opmap:
                 fobj.write(DEFINE.format(name, opmap[name]))
@@ -86,28 +115,29 @@ def main(opcode_py, outfile='Include/opcode.h'):
         for name, op in specialized_opmap.items():
             fobj.write(DEFINE.format(name, op))
 
-        fobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n")
-        fobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n")
-        fobj.write("\n#ifdef NEED_OPCODE_TABLES\n")
-        write_int_array_from_ops("_PyOpcode_RelativeJump", opcode['hasjrel'], fobj)
-        write_int_array_from_ops("_PyOpcode_Jump", opcode['hasjrel'] + opcode['hasjabs'], fobj)
+        iobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n")
+        iobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n")
+        iobj.write("\n#ifdef NEED_OPCODE_TABLES\n")
+        write_int_array_from_ops("_PyOpcode_RelativeJump", opcode['hasjrel'], iobj)
+        write_int_array_from_ops("_PyOpcode_Jump", opcode['hasjrel'] + opcode['hasjabs'], iobj)
 
-        fobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n")
+        iobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n")
         for i, entries in enumerate(opcode["_inline_cache_entries"]):
             if entries:
-                fobj.write(f"    [{opname[i]}] = {entries},\n")
-        fobj.write("};\n")
+                iobj.write(f"    [{opname[i]}] = {entries},\n")
+        iobj.write("};\n")
+
         deoptcodes = {}
         for basic in opmap:
             deoptcodes[basic] = basic
         for basic, family in opcode["_specializations"].items():
             for specialized in family:
                 deoptcodes[specialized] = basic
-        fobj.write("\nconst uint8_t _PyOpcode_Deopt[256] = {\n")
+        iobj.write("\nconst uint8_t _PyOpcode_Deopt[256] = {\n")
         for opt, deopt in sorted(deoptcodes.items()):
-            fobj.write(f"    [{opt}] = {deopt},\n")
-        fobj.write("};\n")
-        fobj.write("#endif /* OPCODE_TABLES */\n")
+            iobj.write(f"    [{opt}] = {deopt},\n")
+        iobj.write("};\n")
+        iobj.write("#endif   // NEED_OPCODE_TABLES\n")
 
         fobj.write("\n")
         fobj.write("#define HAS_CONST(op) (false\\")
@@ -119,28 +149,29 @@ def main(opcode_py, outfile='Include/opcode.h'):
         for i, (op, _) in enumerate(opcode["_nb_ops"]):
             fobj.write(DEFINE.format(op, i))
 
-        fobj.write("\n")
-        fobj.write("#ifdef Py_DEBUG\n")
-        fobj.write("static const char *const _PyOpcode_OpName[256] = {\n")
+        iobj.write("\n")
+        iobj.write("#ifdef Py_DEBUG\n")
+        iobj.write("static const char *const _PyOpcode_OpName[256] = {\n")
         for op, name in enumerate(opname_including_specialized):
             if name[0] != "<":
                 op = name
-            fobj.write(f'''    [{op}] = "{name}",\n''')
-        fobj.write("};\n")
-        fobj.write("#endif\n")
+            iobj.write(f'''    [{op}] = "{name}",\n''')
+        iobj.write("};\n")
+        iobj.write("#endif\n")
 
-        fobj.write("\n")
-        fobj.write("#define EXTRA_CASES \\\n")
+        iobj.write("\n")
+        iobj.write("#define EXTRA_CASES \\\n")
         for i, flag in enumerate(used):
             if not flag:
-                fobj.write(f"    case {i}: \\\n")
-        fobj.write("        ;\n")
+                iobj.write(f"    case {i}: \\\n")
+        iobj.write("        ;\n")
 
         fobj.write(footer)
+        iobj.write(internal_footer)
 
 
     print(f"{outfile} regenerated from {opcode_py}")
 
 
 if __name__ == '__main__':
-    main(sys.argv[1], sys.argv[2])
+    main(sys.argv[1], sys.argv[2], sys.argv[3])



More information about the Python-checkins mailing list