Initial support for Python 3.14

This commit is contained in:
Alex
2025-07-27 14:28:57 +03:00
parent a267bfb47f
commit 97e49d644f
5 changed files with 113 additions and 1 deletions

View File

@@ -62,6 +62,7 @@ add_library(pycxx STATIC
bytes/python_3_11.cpp bytes/python_3_11.cpp
bytes/python_3_12.cpp bytes/python_3_12.cpp
bytes/python_3_13.cpp bytes/python_3_13.cpp
bytes/python_3_14.cpp
) )
add_executable(pycdas pycdas.cpp) add_executable(pycdas pycdas.cpp)

View File

@@ -39,6 +39,7 @@ DECLARE_PYTHON(3, 10)
DECLARE_PYTHON(3, 11) DECLARE_PYTHON(3, 11)
DECLARE_PYTHON(3, 12) DECLARE_PYTHON(3, 12)
DECLARE_PYTHON(3, 13) DECLARE_PYTHON(3, 13)
DECLARE_PYTHON(3, 14)
const char* Pyc::OpcodeName(int opcode) 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 11: return python_3_11_map(opcode);
case 12: return python_3_12_map(opcode); case 12: return python_3_12_map(opcode);
case 13: return python_3_13_map(opcode); case 13: return python_3_13_map(opcode);
case 14: return python_3_14_map(opcode);
} }
break; break;
} }

View File

@@ -124,6 +124,104 @@ OPCODE(FORMAT_WITH_SPEC) // Python 3.13 ->
OPCODE(MAKE_FUNCTION) // Python 3.13 -> OPCODE(MAKE_FUNCTION) // Python 3.13 ->
OPCODE(TO_BOOL) // 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 */ /* Has parameter word */
OPCODE_A_FIRST(STORE_NAME) // Python 1.0 -> names[A] OPCODE_A_FIRST(STORE_NAME) // Python 1.0 -> names[A]
OPCODE_A(DELETE_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(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_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(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 */ /* Instrumented opcodes */
OPCODE_A(INSTRUMENTED_LOAD_SUPER_ATTR) // Python 3.12 -> (see LOAD_SUPER_ATTR) 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_INSTRUCTION) // Python 3.12 -> A=(unused)
OPCODE_A(INSTRUMENTED_LINE) // Python 3.12 -> ??? OPCODE_A(INSTRUMENTED_LINE) // Python 3.12 -> ???
OPCODE_A(INSTRUMENTED_CALL_KW) // Python 3.13 -> (see CALL_KW) 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)

View File

@@ -182,6 +182,12 @@ void PycModule::setVersion(unsigned int magic)
m_unicode = true; m_unicode = true;
break; break;
case MAGIC_3_14:
m_maj = 3;
m_min = 14;
m_unicode = true;
break;
/* Bad Magic detected */ /* Bad Magic detected */
default: default:
m_maj = -1; m_maj = -1;
@@ -197,7 +203,7 @@ bool PycModule::isSupportedVersion(int major, int minor)
case 2: case 2:
return (minor >= 0 && minor <= 7); return (minor >= 0 && minor <= 7);
case 3: case 3:
return (minor >= 0 && minor <= 12); return (minor >= 0 && minor <= 14);
default: default:
return false; return false;
} }

View File

@@ -36,6 +36,7 @@ enum PycMagic {
MAGIC_3_11 = 0x0A0D0DA7, MAGIC_3_11 = 0x0A0D0DA7,
MAGIC_3_12 = 0x0A0D0DCB, MAGIC_3_12 = 0x0A0D0DCB,
MAGIC_3_13 = 0x0A0D0DF3, MAGIC_3_13 = 0x0A0D0DF3,
MAGIC_3_14 = 0x0A0D0E29,
INVALID = 0, INVALID = 0,
}; };