diff options
author | Brett Cannon <brett@python.org> | 2012-07-09 18:22:12 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2012-07-09 18:22:12 (GMT) |
commit | 3adc7b75a5f35003b3b91de113b5212748dc1a1d (patch) | |
tree | 72266f59b330e725759c32ff03e7269e68b8c712 | |
parent | 903c27c177f54099e0c07e2244b0cce41e7aec54 (diff) | |
download | cpython-3adc7b75a5f35003b3b91de113b5212748dc1a1d.zip cpython-3adc7b75a5f35003b3b91de113b5212748dc1a1d.tar.gz cpython-3adc7b75a5f35003b3b91de113b5212748dc1a1d.tar.bz2 |
Issue #15242: Have PyImport_GetMagicTag() return a const char *
defined in sysmodule.c instead of straight out of a Unicode object.
Thanks to Amaury Forgeot d'Arc for noticing the bug and Eric Snow for
writing the patch.
-rw-r--r-- | Doc/c-api/import.rst | 3 | ||||
-rw-r--r-- | Python/import.c | 18 | ||||
-rw-r--r-- | Python/sysmodule.c | 32 |
3 files changed, 24 insertions, 29 deletions
diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 6de3fb0..1f6b1e8 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -178,7 +178,8 @@ Importing Modules .. c:function:: const char * PyImport_GetMagicTag() Return the magic tag string for :pep:`3147` format Python bytecode file - names. + names. Keep in mind that the value at ``sys.implementation.cache_tag`` is + authoritative and should be used instead of this function. .. versionadded:: 3.2 diff --git a/Python/import.c b/Python/import.c index c31819d..1592045 100644 --- a/Python/import.c +++ b/Python/import.c @@ -116,7 +116,7 @@ typedef unsigned short mode_t; */ #define MAGIC (3230 | ((long)'\r'<<16) | ((long)'\n'<<24)) #define CACHEDIR "__pycache__" -/* Current magic word and string tag as globals. */ +/* Current magic word as global. */ static long pyc_magic = MAGIC; /* See _PyImport_FixupExtensionObject() below */ @@ -520,22 +520,12 @@ PyImport_GetMagicNumber(void) } +extern const char * _PySys_ImplCacheTag; + const char * PyImport_GetMagicTag(void) { - PyObject *impl, *tag; - const char *raw_tag; - - /* We could also pull it from imp or importlib. */ - impl = PySys_GetObject("implementation"); - if (impl == NULL) - return NULL; - tag = PyObject_GetAttrString(impl, "cache_tag"); - if (tag == NULL) - return NULL; - raw_tag = PyUnicode_DATA(tag); - Py_DECREF(tag); - return raw_tag; + return _PySys_ImplCacheTag; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index ce5e825..20bfa55 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1478,6 +1478,22 @@ make_version_info(void) return version_info; } +/* sys.implementation values */ +#define NAME "cpython" +const char *_PySys_ImplName = NAME; +#define QUOTE(arg) #arg +#define STRIFY(name) QUOTE(name) +#define MAJOR STRIFY(PY_MAJOR_VERSION) +#define MINOR STRIFY(PY_MINOR_VERSION) +#define TAG NAME "-" MAJOR MINOR; +const char *_PySys_ImplCacheTag = TAG; +#undef NAME +#undef QUOTE +#undef STRIFY +#undef MAJOR +#undef MINOR +#undef TAG + static PyObject * make_impl_info(PyObject *version_info) { @@ -1490,13 +1506,7 @@ make_impl_info(PyObject *version_info) /* populate the dict */ -#define NAME "cpython" -#define QUOTE(arg) #arg -#define STRIFY(name) QUOTE(name) -#define MAJOR STRIFY(PY_MAJOR_VERSION) -#define MINOR STRIFY(PY_MINOR_VERSION) -#define TAG NAME "-" MAJOR MINOR - value = PyUnicode_FromString(NAME); + value = PyUnicode_FromString(_PySys_ImplName); if (value == NULL) goto error; res = PyDict_SetItemString(impl_info, "name", value); @@ -1504,19 +1514,13 @@ make_impl_info(PyObject *version_info) if (res < 0) goto error; - value = PyUnicode_FromString(TAG); + value = PyUnicode_FromString(_PySys_ImplCacheTag); if (value == NULL) goto error; res = PyDict_SetItemString(impl_info, "cache_tag", value); Py_DECREF(value); if (res < 0) goto error; -#undef NAME -#undef QUOTE -#undef STRIFY -#undef MAJOR -#undef MINOR -#undef TAG res = PyDict_SetItemString(impl_info, "version", version_info); if (res < 0) |