[Python-checkins] cpython: Issue #15242: Have PyImport_GetMagicTag() return a const char *

brett.cannon python-checkins at python.org
Mon Jul 9 20:22:20 CEST 2012


http://hg.python.org/cpython/rev/ee01fd98b5b0
changeset:   78029:ee01fd98b5b0
user:        Brett Cannon <brett at python.org>
date:        Mon Jul 09 14:22:12 2012 -0400
summary:
  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.

files:
  Doc/c-api/import.rst |   3 ++-
  Python/import.c      |  18 ++++--------------
  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
--- a/Doc/c-api/import.rst
+++ b/Doc/c-api/import.rst
@@ -178,7 +178,8 @@
 .. 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
--- a/Python/import.c
+++ b/Python/import.c
@@ -116,7 +116,7 @@
 */
 #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 @@
 }
 
 
+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
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -1478,6 +1478,22 @@
     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 @@
 
     /* 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 @@
     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)

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list