mirror of
https://github.com/python/cpython.git
synced 2025-07-17 08:15:19 +00:00
Issue #23911: Move path-based bootstrap code to a separate frozen module.
This commit is contained in:
parent
6b4c63dea5
commit
32439d6eb6
27 changed files with 6192 additions and 5712 deletions
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "Python.h"
|
||||
#include "importlib.h"
|
||||
#include "importlib_external.h"
|
||||
|
||||
/* In order to test the support for frozen modules, by default we
|
||||
define a single frozen module, __hello__. Loading it will print
|
||||
|
@ -31,6 +32,8 @@ static unsigned char M___hello__[] = {
|
|||
static const struct _frozen _PyImport_FrozenModules[] = {
|
||||
/* importlib */
|
||||
{"_frozen_importlib", _Py_M__importlib, (int)sizeof(_Py_M__importlib)},
|
||||
{"_frozen_importlib_external", _Py_M__importlib_external,
|
||||
(int)sizeof(_Py_M__importlib_external)},
|
||||
/* Test module */
|
||||
{"__hello__", M___hello__, SIZE},
|
||||
/* Test package (negative size indicates package-ness) */
|
||||
|
|
|
@ -491,8 +491,13 @@ PyImport_GetMagicNumber(void)
|
|||
{
|
||||
long res;
|
||||
PyInterpreterState *interp = PyThreadState_Get()->interp;
|
||||
PyObject *pyc_magic = PyObject_GetAttrString(interp->importlib,
|
||||
"_RAW_MAGIC_NUMBER");
|
||||
PyObject *external, *pyc_magic;
|
||||
|
||||
external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
|
||||
if (external == NULL)
|
||||
return -1;
|
||||
pyc_magic = PyObject_GetAttrString(external, "_RAW_MAGIC_NUMBER");
|
||||
Py_DECREF(external);
|
||||
if (pyc_magic == NULL)
|
||||
return -1;
|
||||
res = PyLong_AsLong(pyc_magic);
|
||||
|
@ -737,7 +742,7 @@ PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
|
|||
const char *cpathname)
|
||||
{
|
||||
PyObject *m = NULL;
|
||||
PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL;
|
||||
PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL, *external= NULL;
|
||||
|
||||
nameobj = PyUnicode_FromString(name);
|
||||
if (nameobj == NULL)
|
||||
|
@ -765,9 +770,14 @@ PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
|
|||
"no interpreter!");
|
||||
}
|
||||
|
||||
pathobj = _PyObject_CallMethodIdObjArgs(interp->importlib,
|
||||
&PyId__get_sourcefile, cpathobj,
|
||||
NULL);
|
||||
external= PyObject_GetAttrString(interp->importlib,
|
||||
"_bootstrap_external");
|
||||
if (external != NULL) {
|
||||
pathobj = _PyObject_CallMethodIdObjArgs(external,
|
||||
&PyId__get_sourcefile, cpathobj,
|
||||
NULL);
|
||||
Py_DECREF(external);
|
||||
}
|
||||
if (pathobj == NULL)
|
||||
PyErr_Clear();
|
||||
}
|
||||
|
@ -833,7 +843,7 @@ PyObject*
|
|||
PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
|
||||
PyObject *cpathname)
|
||||
{
|
||||
PyObject *d, *res;
|
||||
PyObject *d, *external, *res;
|
||||
PyInterpreterState *interp = PyThreadState_GET()->interp;
|
||||
_Py_IDENTIFIER(_fix_up_module);
|
||||
|
||||
|
@ -845,9 +855,13 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
|
|||
if (pathname == NULL) {
|
||||
pathname = ((PyCodeObject *)co)->co_filename;
|
||||
}
|
||||
res = _PyObject_CallMethodIdObjArgs(interp->importlib,
|
||||
external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
|
||||
if (external == NULL)
|
||||
return NULL;
|
||||
res = _PyObject_CallMethodIdObjArgs(external,
|
||||
&PyId__fix_up_module,
|
||||
d, name, pathname, cpathname, NULL);
|
||||
Py_DECREF(external);
|
||||
if (res != NULL) {
|
||||
Py_DECREF(res);
|
||||
res = exec_code_in_module(name, d, co);
|
||||
|
@ -1245,6 +1259,7 @@ static void
|
|||
remove_importlib_frames(void)
|
||||
{
|
||||
const char *importlib_filename = "<frozen importlib._bootstrap>";
|
||||
const char *external_filename = "<frozen importlib._bootstrap_external>";
|
||||
const char *remove_frames = "_call_with_frames_removed";
|
||||
int always_trim = 0;
|
||||
int in_importlib = 0;
|
||||
|
@ -1274,7 +1289,10 @@ remove_importlib_frames(void)
|
|||
assert(PyTraceBack_Check(tb));
|
||||
now_in_importlib = (PyUnicode_CompareWithASCIIString(
|
||||
code->co_filename,
|
||||
importlib_filename) == 0);
|
||||
importlib_filename) == 0) ||
|
||||
(PyUnicode_CompareWithASCIIString(
|
||||
code->co_filename,
|
||||
external_filename) == 0);
|
||||
if (now_in_importlib && !in_importlib) {
|
||||
/* This is the link to this chunk of importlib tracebacks */
|
||||
outer_link = prev_link;
|
||||
|
|
6227
Python/importlib.h
6227
Python/importlib.h
File diff suppressed because it is too large
Load diff
2633
Python/importlib_external.h
Normal file
2633
Python/importlib_external.h
Normal file
File diff suppressed because it is too large
Load diff
|
@ -304,7 +304,7 @@ set_main_loader(PyObject *d, const char *filename, const char *loader_name)
|
|||
{
|
||||
PyInterpreterState *interp;
|
||||
PyThreadState *tstate;
|
||||
PyObject *filename_obj, *loader_type, *loader;
|
||||
PyObject *filename_obj, *bootstrap, *loader_type = NULL, *loader;
|
||||
int result = 0;
|
||||
|
||||
filename_obj = PyUnicode_DecodeFSDefault(filename);
|
||||
|
@ -313,7 +313,12 @@ set_main_loader(PyObject *d, const char *filename, const char *loader_name)
|
|||
/* Get current thread state and interpreter pointer */
|
||||
tstate = PyThreadState_GET();
|
||||
interp = tstate->interp;
|
||||
loader_type = PyObject_GetAttrString(interp->importlib, loader_name);
|
||||
bootstrap = PyObject_GetAttrString(interp->importlib,
|
||||
"_bootstrap_external");
|
||||
if (bootstrap != NULL) {
|
||||
loader_type = PyObject_GetAttrString(bootstrap, loader_name);
|
||||
Py_DECREF(bootstrap);
|
||||
}
|
||||
if (loader_type == NULL) {
|
||||
Py_DECREF(filename_obj);
|
||||
return -1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue