@@ -98,12 +98,7 @@ def __by_version(magic_versions: Dict[bytes, str]) -> dict:
9898magicint2version : Dict [int , str ] = {}
9999versions : Dict [bytes , str ] = {}
100100
101- try :
102- from importlib .util import MAGIC_NUMBER as MAGIC
103- except ImportError :
104- import imp
105-
106- MAGIC = imp .get_magic ()
101+ from importlib .util import MAGIC_NUMBER as MAGIC
107102
108103PYTHON_MAGIC_INT = magic2int (MAGIC )
109104
@@ -424,12 +419,25 @@ def __by_version(magic_versions: Dict[bytes, str]) -> dict:
424419add_magic_from_int (3531 , "3.12.0rc2" )
425420
426421# 3.13
422+ # Plugin optimizer support
427423add_magic_from_int (3550 , "3.13a1a" )
424+
425+ # Compact superinstructions
428426add_magic_from_int (3551 , "3.13a1b" )
427+
428+ # Remove LOAD_FAST__LOAD_CONST and LOAD_CONST__LOAD_FAST
429429add_magic_from_int (3552 , "3.13a1c" )
430+
431+ # Add SET_FUNCTION_ATTRIBUTE
430432add_magic_from_int (3553 , "3.13a1d" )
433+
434+ # more efficient bytecodes for f-strings
431435add_magic_from_int (3554 , "3.13a1e" )
436+
437+ # generate specialized opcodes metadata from bytecodes.c
432438add_magic_from_int (3555 , "3.13a1f" )
439+
440+ # Convert LOAD_CLOSURE to a pseudo-op
433441add_magic_from_int (3556 , "3.13a1g" )
434442add_magic_from_int (3557 , "3.13a1h" )
435443add_magic_from_int (3558 , "3.13a1i" )
@@ -447,6 +455,81 @@ def __by_version(magic_versions: Dict[bytes, str]) -> dict:
447455add_magic_from_int (3570 , "3.13a6" )
448456add_magic_from_int (3571 , "3.13.0rc3" )
449457
458+ # Add LOAD_COMMON_CONSTANT
459+ add_magic_from_int (3600 , "3.14a1a" )
460+
461+ # Fix miscompilation of private names in generic classes
462+ add_magic_from_int (3601 , "3.14a1b" )
463+
464+ # Add LOAD_SPECIAL. Remove BEFORE_WITH and BEFORE_ASYNC_WITH
465+ add_magic_from_int (3602 , "3.14a1c" )
466+
467+ # Remove BUILD_CONST_KEY_MAP
468+ add_magic_from_int (3603 , "3.14a1d" )
469+
470+ # Do not duplicate test at end of while statements
471+ add_magic_from_int (3604 , "3.14a1e" )
472+
473+ # Move ENTER_EXECUTOR to opcode 255
474+ add_magic_from_int (3605 , "3.14a1f" )
475+
476+ # Specialize CALL_KW
477+ add_magic_from_int (3606 , "3.14a1g" )
478+
479+ # Add pseudo instructions JUMP_IF_TRUE/FALSE
480+ add_magic_from_int (3607 , "3.14a1h" )
481+
482+ # Add support for slices
483+ add_magic_from_int (3608 , "3.14a1i" )
484+
485+ # Add LOAD_SMALL_INT and LOAD_CONST_IMMORTAL instructions, remove RETURN_CONST
486+ add_magic_from_int (3608 , "3.14a2" )
487+
488+ # Add VALUE_WITH_FAKE_GLOBALS format to annotationlib
489+ add_magic_from_int (3610 , "3.14a4a" )
490+
491+ # Add NOT_TAKEN instruction
492+ add_magic_from_int (3611 , "3.14a4b" )
493+
494+ #Add LOAD_CONST_MORTAL instruction
495+ add_magic_from_int (3613 , "3.14a4c" )
496+
497+ #Add BINARY_OP_EXTEND
498+ add_magic_from_int (3614 , "3.14a4d" )
499+
500+ #Add BINARY_OP_EXTEND
501+ add_magic_from_int (3615 , "3.14a5a" )
502+
503+ #Add BINARY_OP_EXTEND
504+ add_magic_from_int (3616 , "3.14a5a" )
505+
506+ #Branch monitoring for async for loops
507+ add_magic_from_int (3617 , "3.14a6a" )
508+
509+ #Add oparg to END_ASYNC_FOR
510+ add_magic_from_int (3618 , "3.14a6b" )
511+
512+ #Renumber RESUME opcode from 149 to 128
513+ add_magic_from_int (3619 , "3.14a6c" )
514+
515+ #Optimize bytecode for all/any/tuple called on a genexp
516+ add_magic_from_int (3620 , "3.14a7a" )
517+
518+ #Optimize LOAD_FAST opcodes into LOAD_FAST_BORROW
519+ add_magic_from_int (3621 , "3.14a7b" )
520+
521+ #Store annotations in different class dict keys
522+ add_magic_from_int (3622 , "3.14a7c" )
523+
524+ #Add BUILD_INTERPOLATION & BUILD_TEMPLATE opcodes
525+ add_magic_from_int (3623 , "3.14a7d" )
526+
527+ #Don't optimize LOAD_FAST when local is killed by DELETE_FAST
528+ add_magic_from_int (3624 , "3.14b1" )
529+
530+ # Fix handling of opcodes that may leave operands on the stack when optimizing LOAD_FAST
531+ add_magic_from_int (3625 , "3.14b3" )
532+
450533# Weird ones
451534# WTF? Python 3.2.5 and PyPy have weird magic numbers
452535
@@ -595,6 +678,11 @@ def add_canonic_versions(release_versions: str, canonic: str) -> None:
595678 "3.13.0rc3" ,
596679)
597680
681+ add_canonic_versions (
682+ "3.14 3.14-dev" ,
683+ "3.14b3" ,
684+ )
685+
598686# The canonic version for a canonic version is itself
599687for v in versions .values ():
600688 canonic_python_version [v ] = v
@@ -646,8 +734,8 @@ def py_str2tuple(orig_version: str) -> tuple[int, int] | tuple[int, int, int]:
646734
647735def sysinfo2magic (version_info = sys .version_info ) -> bytes :
648736 """Convert a list sys.versions_info compatible list into a 'canonic'
649- floating-point number which that can then be used to look up a
650- magic number. Note that this can raise an exception .
737+ The magic bytes value found at the beginning of a bytecode file.
738+ b'?! \r \n ' is returned if we can't find a version .
651739 """
652740
653741 vers_str = version_tuple_to_str (version_info )
@@ -671,7 +759,7 @@ def sysinfo2magic(version_info=sys.version_info) -> bytes:
671759 # just not have platform
672760 pass
673761
674- return magics [ vers_str ]
762+ return magics . get ( vers_str , b"?! \r \n " )
675763
676764
677765def test () -> None :
0 commit comments