diff --git a/CMakeLists.txt b/CMakeLists.txt index 476c964..30d9c62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ add_library(pycxx STATIC bytes/python_3_11.cpp bytes/python_3_12.cpp bytes/python_3_13.cpp + bytes/python_3_14.cpp ) add_executable(pycdas pycdas.cpp) diff --git a/bytecode.cpp b/bytecode.cpp index c6b7cba..4fea737 100644 --- a/bytecode.cpp +++ b/bytecode.cpp @@ -39,6 +39,7 @@ DECLARE_PYTHON(3, 10) DECLARE_PYTHON(3, 11) DECLARE_PYTHON(3, 12) DECLARE_PYTHON(3, 13) +DECLARE_PYTHON(3, 14) const char* Pyc::OpcodeName(int opcode) { @@ -109,6 +110,7 @@ int Pyc::ByteToOpcode(int maj, int min, int opcode) case 11: return python_3_11_map(opcode); case 12: return python_3_12_map(opcode); case 13: return python_3_13_map(opcode); + case 14: return python_3_14_map(opcode); } break; } diff --git a/bytecode_ops.inl b/bytecode_ops.inl index 5cc49c2..5eca64a 100644 --- a/bytecode_ops.inl +++ b/bytecode_ops.inl @@ -124,6 +124,104 @@ OPCODE(FORMAT_WITH_SPEC) // Python 3.13 -> OPCODE(MAKE_FUNCTION) // Python 3.13 -> OPCODE(TO_BOOL) // Python 3.13 -> +OPCODE(BUILD_TEMPLATE) // Python 3.14 -> +OPCODE(BINARY_OP_INPLACE_ADD_UNICODE) +OPCODE(NOT_TAKEN) +OPCODE(POP_ITER) +OPCODE(BUILD_INTERPOLATION) +OPCODE(LOAD_COMMON_CONSTANT) +OPCODE(LOAD_FAST_BORROW) +OPCODE(LOAD_FAST_BORROW_LOAD_FAST_BORROW) +OPCODE(LOAD_SPECIAL) +OPCODE(BINARY_OP_ADD_FLOAT) +OPCODE(BINARY_OP_ADD_INT) +OPCODE(BINARY_OP_ADD_UNICODE) +OPCODE(BINARY_OP_EXTEND) +OPCODE(BINARY_OP_MULTIPLY_FLOAT) +OPCODE(BINARY_OP_MULTIPLY_INT) +OPCODE(BINARY_OP_SUBSCR_DICT) +OPCODE(BINARY_OP_SUBSCR_GETITEM) +OPCODE(BINARY_OP_SUBSCR_LIST_INT) +OPCODE(BINARY_OP_SUBSCR_LIST_SLICE) +OPCODE(BINARY_OP_SUBSCR_STR_INT) +OPCODE(BINARY_OP_SUBSCR_TUPLE_INT) +OPCODE(BINARY_OP_SUBTRACT_FLOAT) +OPCODE(BINARY_OP_SUBTRACT_INT) +OPCODE(CALL_ALLOC_AND_ENTER_INIT) +OPCODE(CALL_BOUND_METHOD_EXACT_ARGS) +OPCODE(CALL_BOUND_METHOD_GENERAL) +OPCODE(CALL_BUILTIN_CLASS) +OPCODE(CALL_BUILTIN_FAST) +OPCODE(CALL_BUILTIN_FAST_WITH_KEYWORDS) +OPCODE(CALL_BUILTIN_O) +OPCODE(CALL_ISINSTANCE) +OPCODE(CALL_KW_BOUND_METHOD) +OPCODE(CALL_KW_NON_PY) +OPCODE(CALL_KW_PY) +OPCODE(CALL_LEN) +OPCODE(CALL_LIST_APPEND) +OPCODE(CALL_METHOD_DESCRIPTOR_FAST) +OPCODE(CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS) +OPCODE(CALL_METHOD_DESCRIPTOR_NOARGS) +OPCODE(CALL_METHOD_DESCRIPTOR_O) +OPCODE(CALL_NON_PY_GENERAL) +OPCODE(CALL_PY_EXACT_ARGS) +OPCODE(CALL_PY_GENERAL) +OPCODE(CALL_STR_1) +OPCODE(CALL_TUPLE_1) +OPCODE(CALL_TYPE_1) +OPCODE(COMPARE_OP_FLOAT) +OPCODE(COMPARE_OP_INT) +OPCODE(COMPARE_OP_STR) +OPCODE(CONTAINS_OP_DICT) +OPCODE(CONTAINS_OP_SET) +OPCODE(FOR_ITER_GEN) +OPCODE(FOR_ITER_LIST) +OPCODE(FOR_ITER_RANGE) +OPCODE(FOR_ITER_TUPLE) +OPCODE(JUMP_BACKWARD_JIT) +OPCODE(JUMP_BACKWARD_NO_JIT) +OPCODE(LOAD_ATTR_CLASS) +OPCODE(LOAD_ATTR_CLASS_WITH_METACLASS_CHECK) +OPCODE(LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN) +OPCODE(LOAD_ATTR_INSTANCE_VALUE) +OPCODE(LOAD_ATTR_METHOD_LAZY_DICT) +OPCODE(LOAD_ATTR_METHOD_NO_DICT) +OPCODE(LOAD_ATTR_METHOD_WITH_VALUES) +OPCODE(LOAD_ATTR_MODULE) +OPCODE(LOAD_ATTR_NONDESCRIPTOR_NO_DICT) +OPCODE(LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES) +OPCODE(LOAD_ATTR_PROPERTY) +OPCODE(LOAD_ATTR_SLOT) +OPCODE(LOAD_ATTR_WITH_HINT) +OPCODE(LOAD_CONST_IMMORTAL) +OPCODE(LOAD_CONST_MORTAL) +OPCODE(LOAD_GLOBAL_BUILTIN) +OPCODE(LOAD_GLOBAL_MODULE) +OPCODE(LOAD_SUPER_ATTR_ATTR) +OPCODE(LOAD_SUPER_ATTR_METHOD) +OPCODE(RESUME_CHECK) +OPCODE(SEND_GEN) +OPCODE(STORE_ATTR_INSTANCE_VALUE) +OPCODE(STORE_ATTR_SLOT) +OPCODE(STORE_ATTR_WITH_HINT) +OPCODE(STORE_SUBSCR_DICT) +OPCODE(STORE_SUBSCR_LIST_INT) +OPCODE(TO_BOOL_ALWAYS_TRUE) +OPCODE(TO_BOOL_BOOL) +OPCODE(TO_BOOL_INT) +OPCODE(TO_BOOL_LIST) +OPCODE(TO_BOOL_NONE) +OPCODE(TO_BOOL_STR) +OPCODE(UNPACK_SEQUENCE_LIST) +OPCODE(UNPACK_SEQUENCE_TUPLE) +OPCODE(UNPACK_SEQUENCE_TWO_TUPLE) +OPCODE(ANNOTATIONS_PLACEHOLDER) +OPCODE(JUMP) +OPCODE(JUMP_NO_INTERRUPT) +OPCODE(SETUP_CLEANUP) +OPCODE(STORE_FAST_MAYBE_NULL) + /* Has parameter word */ OPCODE_A_FIRST(STORE_NAME) // Python 1.0 -> names[A] OPCODE_A(DELETE_NAME) // Python 1.0 -> names[A] @@ -269,6 +367,7 @@ OPCODE_A(LOAD_FAST_LOAD_FAST) // Python 3.13 -> A=locals OPCODE_A(SET_FUNCTION_ATTRIBUTE) // Python 3.13 -> A=attribute_type OPCODE_A(STORE_FAST_LOAD_FAST) // Python 3.13 -> A=locals[A<<4]+locals[A&0xf] OPCODE_A(STORE_FAST_STORE_FAST) // Python 3.13 -> A=locals[A<<4]+locals[A&0xf] +OPCODE_A(LOAD_SMALL_INT) // Python 3.14 -> A=small int range(256) /* Instrumented opcodes */ OPCODE_A(INSTRUMENTED_LOAD_SUPER_ATTR) // Python 3.12 -> (see LOAD_SUPER_ATTR) @@ -290,3 +389,6 @@ OPCODE_A(INSTRUMENTED_END_SEND) // Python 3.12 -> (see END OPCODE_A(INSTRUMENTED_INSTRUCTION) // Python 3.12 -> A=(unused) OPCODE_A(INSTRUMENTED_LINE) // Python 3.12 -> ??? OPCODE_A(INSTRUMENTED_CALL_KW) // Python 3.13 -> (see CALL_KW) +OPCODE_A(INSTRUMENTED_POP_ITER) // Python 3.14 -> (see POP_ITER) +OPCODE_A(INSTRUMENTED_NOT_TAKEN) // Python 3.14 -> (see NOT_TAKEN) +OPCODE_A(INSTRUMENTED_END_ASYNC_FOR) // Python 3.14 -> (see END_ASYNC_FOR) diff --git a/pyc_module.cpp b/pyc_module.cpp index 98eecff..9ddd4c9 100644 --- a/pyc_module.cpp +++ b/pyc_module.cpp @@ -182,6 +182,12 @@ void PycModule::setVersion(unsigned int magic) m_unicode = true; break; + case MAGIC_3_14: + m_maj = 3; + m_min = 14; + m_unicode = true; + break; + /* Bad Magic detected */ default: m_maj = -1; @@ -197,7 +203,7 @@ bool PycModule::isSupportedVersion(int major, int minor) case 2: return (minor >= 0 && minor <= 7); case 3: - return (minor >= 0 && minor <= 12); + return (minor >= 0 && minor <= 14); default: return false; } diff --git a/pyc_module.h b/pyc_module.h index 695f4ba..dbdd2a5 100644 --- a/pyc_module.h +++ b/pyc_module.h @@ -36,6 +36,7 @@ enum PycMagic { MAGIC_3_11 = 0x0A0D0DA7, MAGIC_3_12 = 0x0A0D0DCB, MAGIC_3_13 = 0x0A0D0DF3, + MAGIC_3_14 = 0x0A0D0E29, INVALID = 0, };