Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
0b312feb
Commit
0b312feb
authored
Jul 09, 2012
by
Brett Cannon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Lib/imp.py.
parent
772202bb
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
3908 additions
and
3906 deletions
+3908
-3906
Doc/c-api/import.rst
Doc/c-api/import.rst
+4
-1
Doc/whatsnew/3.3.rst
Doc/whatsnew/3.3.rst
+3
-0
Lib/imp.py
Lib/imp.py
+7
-2
Lib/importlib/_bootstrap.py
Lib/importlib/_bootstrap.py
+92
-5
Python/import.c
Python/import.c
+6
-120
Python/importlib.h
Python/importlib.h
+3796
-3778
No files found.
Doc/c-api/import.rst
View file @
0b312feb
...
...
@@ -172,7 +172,10 @@ Importing Modules
Return the magic number for Python bytecode files (a.k.a. :file:`.pyc` and
:file:`.pyo` files). The magic number should be present in the first four bytes
of the bytecode file, in little-endian byte order.
of the bytecode file, in little-endian byte order. Returns -1 on error.
.. versionchanged:: 3.3
Return value of -1 upon failure.
.. c:function:: const char * PyImport_GetMagicTag()
...
...
Doc/whatsnew/3.3.rst
View file @
0b312feb
...
...
@@ -1761,6 +1761,9 @@ Porting C code
:
c
:
func
:`
PyUnicode_FromFormat
()`,
your
code
will
automatically
take
advantage
of
the
new
unicode
representations
.
*
:
c
:
func
:`
PyImport_GetMagicNumber
`
now
returns
-
1
upon
failure
.
Building
C
extensions
---------------------
...
...
Lib/imp.py
View file @
0b312feb
...
...
@@ -10,12 +10,12 @@ from _imp import (lock_held, acquire_lock, release_lock,
load_dynamic
,
get_frozen_object
,
is_frozen_package
,
init_builtin
,
init_frozen
,
is_builtin
,
is_frozen
,
_fix_co_filename
,
extension_suffixes
)
# Could move out of _imp, but not worth the code
from
_imp
import
get_magic
# Directly exposed by this module
from
importlib._bootstrap
import
new_module
from
importlib._bootstrap
import
cache_from_source
from
importlib
import
_bootstrap
from
importlib
import
machinery
import
os
...
...
@@ -37,6 +37,11 @@ PY_CODERESOURCE = 8
IMP_HOOK
=
9
def
get_magic
():
"""Return the magic number for .pyc or .pyo files."""
return
_bootstrap
.
_MAGIC_BYTES
def
get_tag
():
"""Return the magic tag for .pyc or .pyo files."""
return
sys
.
implementation
.
cache_tag
...
...
Lib/importlib/_bootstrap.py
View file @
0b312feb
...
...
@@ -300,6 +300,96 @@ def _lock_unlock_module(name):
# Finder/loader utility code ##################################################
"""Magic word to reject .pyc files generated by other Python versions.
It should change for each incompatible change to the bytecode.
The value of CR and LF is incorporated so if you ever read or write
a .pyc file in text mode the magic number will be wrong; also, the
Apple MPW compiler swaps their values, botching string constants.
The magic numbers must be spaced apart at least 2 values, as the
-U interpeter flag will cause MAGIC+1 being used. They have been
odd numbers for some time now.
There were a variety of old schemes for setting the magic number.
The current working scheme is to increment the previous value by
10.
Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
number also includes a new "magic tag", i.e. a human readable string used
to represent the magic number in __pycache__ directories. When you change
the magic number, you must also set a new unique magic tag. Generally this
can be named after the Python major version of the magic number bump, but
it can really be anything, as long as it's different than anything else
that's come before. The tags are included in the following table, starting
with Python 3.2a0.
Known values:
Python 1.5: 20121
Python 1.5.1: 20121
Python 1.5.2: 20121
Python 1.6: 50428
Python 2.0: 50823
Python 2.0.1: 50823
Python 2.1: 60202
Python 2.1.1: 60202
Python 2.1.2: 60202
Python 2.2: 60717
Python 2.3a0: 62011
Python 2.3a0: 62021
Python 2.3a0: 62011 (!)
Python 2.4a0: 62041
Python 2.4a3: 62051
Python 2.4b1: 62061
Python 2.5a0: 62071
Python 2.5a0: 62081 (ast-branch)
Python 2.5a0: 62091 (with)
Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Python 2.5b3: 62101 (fix wrong code: for x, in ...)
Python 2.5b3: 62111 (fix wrong code: x += yield)
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
storing constants that should have been removed)
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Python 2.6a1: 62161 (WITH_CLEANUP optimization)
Python 3000: 3000
3010 (removed UNARY_CONVERT)
3020 (added BUILD_SET)
3030 (added keyword-only parameters)
3040 (added signature annotations)
3050 (print becomes a function)
3060 (PEP 3115 metaclass syntax)
3061 (string literals become unicode)
3071 (PEP 3109 raise changes)
3081 (PEP 3137 make __file__ and __name__ unicode)
3091 (kill str8 interning)
3101 (merge from 2.6a0, see 62151)
3103 (__file__ points to source file)
Python 3.0a4: 3111 (WITH_CLEANUP optimization).
Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
change LIST_APPEND and SET_ADD, add MAP_ADD)
Python 3.1a0: 3151 (optimize conditional branches:
introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Python 3.2a0: 3160 (add SETUP_WITH)
tag: cpython-32
Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
tag: cpython-32
Python 3.2a2 3180 (add DELETE_DEREF)
Python 3.3a0 3190 __class__ super closure changed
Python 3.3a0 3200 (__qualname__ added)
3210 (added size modulo 2**32 to the pyc header)
Python 3.3a1 3220 (changed PEP 380 implementation)
Python 3.3a4 3230 (revert changes to implicit __class__ closure)
MAGIC must change whenever the bytecode emitted by the compiler may no
longer be understood by older implementations of the eval loop (usually
due to the addition of new opcodes).
"""
_RAW_MAGIC_NUMBER
=
3230
|
ord
(
'
\
r
'
)
<<
16
|
ord
(
'
\
n
'
)
<<
24
_MAGIC_BYTES
=
bytes
(
_RAW_MAGIC_NUMBER
>>
n
&
0xff
for
n
in
range
(
0
,
25
,
8
))
_PYCACHE
=
'__pycache__'
SOURCE_SUFFIXES
=
[
'.py'
]
# _setup() adds .pyw as needed.
...
...
@@ -611,7 +701,7 @@ class _LoaderBasics:
magic
=
data
[:
4
]
raw_timestamp
=
data
[
4
:
8
]
raw_size
=
data
[
8
:
12
]
if
magic
!=
_MAGIC_
NUMBER
:
if
magic
!=
_MAGIC_
BYTES
:
msg
=
'bad magic number in {!r}: {!r}'
.
format
(
fullname
,
magic
)
raise
ImportError
(
msg
,
name
=
fullname
,
path
=
bytecode_path
)
elif
len
(
raw_timestamp
)
!=
4
:
...
...
@@ -768,7 +858,7 @@ class SourceLoader(_LoaderBasics):
_verbose_message
(
'code object from {}'
,
source_path
)
if
(
not
sys
.
dont_write_bytecode
and
bytecode_path
is
not
None
and
source_mtime
is
not
None
):
data
=
bytearray
(
_MAGIC_
NUMBER
)
data
=
bytearray
(
_MAGIC_
BYTES
)
data
.
extend
(
_w_long
(
source_mtime
))
data
.
extend
(
_w_long
(
len
(
source_bytes
)))
data
.
extend
(
marshal
.
dumps
(
code_object
))
...
...
@@ -1427,8 +1517,6 @@ def __import__(name, globals={}, locals={}, fromlist=[], level=0):
return
_handle_fromlist
(
module
,
fromlist
,
_gcd_import
)
_MAGIC_NUMBER
=
None
# Set in _setup()
def
_setup
(
sys_module
,
_imp_module
):
"""Setup importlib by importing needed built-in modules and injecting them
...
...
@@ -1488,7 +1576,6 @@ def _setup(sys_module, _imp_module):
setattr
(
self_module
,
'path_separators'
,
set
(
path_separators
))
# Constants
setattr
(
self_module
,
'_relax_case'
,
_make_relax_case
())
setattr
(
self_module
,
'_MAGIC_NUMBER'
,
_imp_module
.
get_magic
())
if
builtin_os
==
'nt'
:
SOURCE_SUFFIXES
.
append
(
'.pyw'
)
...
...
Python/import.c
View file @
0b312feb
...
...
@@ -27,97 +27,7 @@ typedef unsigned short mode_t;
#endif
/* Magic word to reject .pyc files generated by other Python versions.
It should change for each incompatible change to the bytecode.
The value of CR and LF is incorporated so if you ever read or write
a .pyc file in text mode the magic number will be wrong; also, the
Apple MPW compiler swaps their values, botching string constants.
The magic numbers must be spaced apart at least 2 values, as the
-U interpeter flag will cause MAGIC+1 being used. They have been
odd numbers for some time now.
There were a variety of old schemes for setting the magic number.
The current working scheme is to increment the previous value by
10.
Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
number also includes a new "magic tag", i.e. a human readable string used
to represent the magic number in __pycache__ directories. When you change
the magic number, you must also set a new unique magic tag. Generally this
can be named after the Python major version of the magic number bump, but
it can really be anything, as long as it's different than anything else
that's come before. The tags are included in the following table, starting
with Python 3.2a0.
Known values:
Python 1.5: 20121
Python 1.5.1: 20121
Python 1.5.2: 20121
Python 1.6: 50428
Python 2.0: 50823
Python 2.0.1: 50823
Python 2.1: 60202
Python 2.1.1: 60202
Python 2.1.2: 60202
Python 2.2: 60717
Python 2.3a0: 62011
Python 2.3a0: 62021
Python 2.3a0: 62011 (!)
Python 2.4a0: 62041
Python 2.4a3: 62051
Python 2.4b1: 62061
Python 2.5a0: 62071
Python 2.5a0: 62081 (ast-branch)
Python 2.5a0: 62091 (with)
Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Python 2.5b3: 62101 (fix wrong code: for x, in ...)
Python 2.5b3: 62111 (fix wrong code: x += yield)
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
storing constants that should have been removed)
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Python 2.6a1: 62161 (WITH_CLEANUP optimization)
Python 3000: 3000
3010 (removed UNARY_CONVERT)
3020 (added BUILD_SET)
3030 (added keyword-only parameters)
3040 (added signature annotations)
3050 (print becomes a function)
3060 (PEP 3115 metaclass syntax)
3061 (string literals become unicode)
3071 (PEP 3109 raise changes)
3081 (PEP 3137 make __file__ and __name__ unicode)
3091 (kill str8 interning)
3101 (merge from 2.6a0, see 62151)
3103 (__file__ points to source file)
Python 3.0a4: 3111 (WITH_CLEANUP optimization).
Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
change LIST_APPEND and SET_ADD, add MAP_ADD)
Python 3.1a0: 3151 (optimize conditional branches:
introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Python 3.2a0: 3160 (add SETUP_WITH)
tag: cpython-32
Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
tag: cpython-32
Python 3.2a2 3180 (add DELETE_DEREF)
Python 3.3a0 3190 __class__ super closure changed
Python 3.3a0 3200 (__qualname__ added)
3210 (added size modulo 2**32 to the pyc header)
Python 3.3a1 3220 (changed PEP 380 implementation)
Python 3.3a4 3230 (revert changes to implicit __class__ closure)
*/
/* MAGIC must change whenever the bytecode emitted by the compiler may no
longer be understood by older implementations of the eval loop (usually
due to the addition of new opcodes)
*/
#define MAGIC (3230 | ((long)'\r'<<16) | ((long)'\n'<<24))
#define CACHEDIR "__pycache__"
/* Current magic word as global. */
static
long
pyc_magic
=
MAGIC
;
/* See _PyImport_FixupExtensionObject() below */
static
PyObject
*
extensions
=
NULL
;
...
...
@@ -516,7 +426,12 @@ PyImport_Cleanup(void)
long
PyImport_GetMagicNumber
(
void
)
{
return
pyc_magic
;
PyInterpreterState
*
interp
=
PyThreadState_Get
()
->
interp
;
PyObject
*
pyc_magic
=
PyObject_GetAttrString
(
interp
->
importlib
,
"_RAW_MAGIC_NUMBER"
);
if
(
pyc_magic
==
NULL
)
return
-
1
;
return
PyLong_AsLong
(
pyc_magic
);
}
...
...
@@ -1879,30 +1794,6 @@ PyImport_Import(PyObject *module_name)
return
r
;
}
/* Module 'imp' provides Python access to the primitives used for
importing modules.
*/
static
PyObject
*
imp_make_magic
(
long
magic
)
{
char
buf
[
4
];
buf
[
0
]
=
(
char
)
((
magic
>>
0
)
&
0xff
);
buf
[
1
]
=
(
char
)
((
magic
>>
8
)
&
0xff
);
buf
[
2
]
=
(
char
)
((
magic
>>
16
)
&
0xff
);
buf
[
3
]
=
(
char
)
((
magic
>>
24
)
&
0xff
);
return
PyBytes_FromStringAndSize
(
buf
,
4
);
}
static
PyObject
*
imp_get_magic
(
PyObject
*
self
,
PyObject
*
noargs
)
{
return
imp_make_magic
(
pyc_magic
);
}
static
PyObject
*
imp_extension_suffixes
(
PyObject
*
self
,
PyObject
*
noargs
)
{
...
...
@@ -2049,10 +1940,6 @@ imp_load_dynamic(PyObject *self, PyObject *args)
PyDoc_STRVAR
(
doc_imp
,
"(Extremely) low-level import machinery bits as used by importlib and imp."
);
PyDoc_STRVAR
(
doc_get_magic
,
"get_magic() -> string
\n
\
Return the magic number for .pyc or .pyo files."
);
PyDoc_STRVAR
(
doc_extension_suffixes
,
"extension_suffixes() -> list of strings
\n
\
Returns the list of file suffixes used to identify extension modules."
);
...
...
@@ -2075,7 +1962,6 @@ Release the interpreter's import lock.\n\
On platforms without threads, this function does nothing."
);
static
PyMethodDef
imp_methods
[]
=
{
{
"get_magic"
,
imp_get_magic
,
METH_NOARGS
,
doc_get_magic
},
{
"extension_suffixes"
,
imp_extension_suffixes
,
METH_NOARGS
,
doc_extension_suffixes
},
{
"lock_held"
,
imp_lock_held
,
METH_NOARGS
,
doc_lock_held
},
...
...
Python/importlib.h
View file @
0b312feb
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment