summaryrefslogtreecommitdiffstats
path: root/Python/marshal.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/marshal.c')
-rw-r--r--Python/marshal.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/Python/marshal.c b/Python/marshal.c
index ca22d6d..a46fc0c 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -14,6 +14,7 @@
#include "pycore_long.h" // _PyLong_DigitCount
#include "pycore_setobject.h" // _PySet_NextEntry()
#include "marshal.h" // Py_MARSHAL_VERSION
+#include "pycore_pystate.h" // _PyInterpreterState_GET()
#ifdef __APPLE__
# include "TargetConditionals.h"
@@ -1184,8 +1185,12 @@ r_object(RFILE *p)
v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
if (v == NULL)
break;
- if (is_interned)
- PyUnicode_InternInPlace(&v);
+ if (is_interned) {
+ // marshal is meant to serialize .pyc files with code
+ // objects, and code-related strings are currently immortal.
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ _PyUnicode_InternImmortal(interp, &v);
+ }
retval = v;
R_REF(retval);
break;
@@ -1217,8 +1222,12 @@ r_object(RFILE *p)
}
if (v == NULL)
break;
- if (is_interned)
- PyUnicode_InternInPlace(&v);
+ if (is_interned) {
+ // marshal is meant to serialize .pyc files with code
+ // objects, and code-related strings are currently immortal.
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ _PyUnicode_InternImmortal(interp, &v);
+ }
retval = v;
R_REF(retval);
break;