Issue #13959: Re-implement imp.load_compiled() in imp.py.
diff --git a/Lib/imp.py b/Lib/imp.py
index dc685d0..6a86ba9 100644
--- a/Lib/imp.py
+++ b/Lib/imp.py
@@ -14,7 +14,7 @@
 from _imp import (get_magic, get_tag, get_suffixes, cache_from_source,
                   source_from_cache)
 # Should be re-implemented here (and mostly deprecated)
-from _imp import (find_module, load_compiled, NullImporter,
+from _imp import (find_module, NullImporter,
                   SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION,
                   PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN,
                   PY_CODERESOURCE, IMP_HOOK)
@@ -25,17 +25,17 @@
 import os
 
 
-class _LoadSourceCompatibility(_bootstrap._SourceFileLoader):
+class _HackedGetData:
 
-    """Compatibility support for implementing load_source()."""
+    """Compatibiilty support for 'file' arguments of various load_*()
+    functions."""
 
     def __init__(self, fullname, path, file=None):
         super().__init__(fullname, path)
         self.file = file
 
     def get_data(self, path):
-        """Gross hack to contort SourceFileLoader to deal w/ load_source()'s bad
-        API."""
+        """Gross hack to contort loader to deal w/ load_*()'s bad API."""
         if self.file and path == self._path:
             with self.file:
                 # Technically should be returning bytes, but
@@ -48,10 +48,25 @@
             return super().get_data(path)
 
 
+class _LoadSourceCompatibility(_HackedGetData, _bootstrap._SourceFileLoader):
+
+    """Compatibility support for implementing load_source()."""
+
+
 def load_source(name, pathname, file=None):
     return _LoadSourceCompatibility(name, pathname, file).load_module(name)
 
 
+class _LoadCompiledCompatibility(_HackedGetData,
+        _bootstrap._SourcelessFileLoader):
+
+    """Compatibility support for implementing load_compiled()."""
+
+
+def load_compiled(name, pathname, file=None):
+    return _LoadCompiledCompatibility(name, pathname, file).load_module(name)
+
+
 def load_package(name, path):
     if os.path.isdir(path):
         extensions = _bootstrap._suffix_list(PY_SOURCE)
diff --git a/Python/import.c b/Python/import.c
index 3e620b3..07c3d6f 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1062,58 +1062,6 @@
 }
 
 
-/* Read a code object from a file and check it for validity */
-
-static PyCodeObject *
-read_compiled_module(PyObject *cpathname, FILE *fp)
-{
-    PyObject *co;
-
-    co = PyMarshal_ReadLastObjectFromFile(fp);
-    if (co == NULL)
-        return NULL;
-    if (!PyCode_Check(co)) {
-        PyErr_Format(PyExc_ImportError,
-                     "Non-code object in %R", cpathname);
-        Py_DECREF(co);
-        return NULL;
-    }
-    return (PyCodeObject *)co;
-}
-
-
-/* Load a module from a compiled file, execute it, and return its
-   module object WITH INCREMENTED REFERENCE COUNT */
-
-static PyObject *
-load_compiled_module(PyObject *name, PyObject *cpathname, FILE *fp)
-{
-    long magic;
-    PyCodeObject *co;
-    PyObject *m;
-
-    magic = PyMarshal_ReadLongFromFile(fp);
-    if (magic != pyc_magic) {
-        PyErr_Format(PyExc_ImportError,
-                     "Bad magic number in %R", cpathname);
-        return NULL;
-    }
-    /* Skip mtime and size */
-    (void) PyMarshal_ReadLongFromFile(fp);
-    (void) PyMarshal_ReadLongFromFile(fp);
-    co = read_compiled_module(cpathname, fp);
-    if (co == NULL)
-        return NULL;
-    if (Py_VerboseFlag)
-        PySys_FormatStderr("import %U # precompiled from %R\n",
-                           name, cpathname);
-    m = PyImport_ExecCodeModuleObject(name, (PyObject *)co,
-                                      cpathname, cpathname);
-    Py_DECREF(co);
-
-    return m;
-}
-
 static void
 update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
 {
@@ -3010,29 +2958,6 @@
     }
 }
 
-static PyObject *
-imp_load_compiled(PyObject *self, PyObject *args)
-{
-    PyObject *name, *pathname;
-    PyObject *fob = NULL;
-    PyObject *m;
-    FILE *fp;
-    if (!PyArg_ParseTuple(args, "UO&|O:load_compiled",
-                          &name,
-                          PyUnicode_FSDecoder, &pathname,
-                          &fob))
-        return NULL;
-    fp = get_file(pathname, fob, "rb");
-    if (fp == NULL) {
-        Py_DECREF(pathname);
-        return NULL;
-    }
-    m = load_compiled_module(name, pathname, fp);
-    fclose(fp);
-    Py_DECREF(pathname);
-    return m;
-}
-
 #ifdef HAVE_DYNAMIC_LOADING
 
 static PyObject *
@@ -3209,7 +3134,6 @@
     {"init_frozen",             imp_init_frozen,        METH_VARARGS},
     {"is_builtin",              imp_is_builtin,         METH_VARARGS},
     {"is_frozen",               imp_is_frozen,          METH_VARARGS},
-    {"load_compiled",           imp_load_compiled,      METH_VARARGS},
 #ifdef HAVE_DYNAMIC_LOADING
     {"load_dynamic",            imp_load_dynamic,       METH_VARARGS},
 #endif