diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 6de3fb0794d..1f6b1e8843b 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 c31819dc81a..15920458962 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 ce5e8258d12..20bfa555b3d 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)