Kaydet (Commit) a5568d34 authored tarafından Guido van Rossum's avatar Guido van Rossum

Support for frozen packages, matching the revamped Tools/freeze.

Frozen packages are indicated by a negative size (the code string
is the __import__.py file).  A frozen package module has its __path__
set to a string, the package name.
üst 75dc4969
...@@ -829,18 +829,22 @@ find_module(name, path, buf, buflen, p_fp) ...@@ -829,18 +829,22 @@ find_module(name, path, buf, buflen, p_fp)
FILE **p_fp; FILE **p_fp;
{ {
int i, npath, len, namelen; int i, npath, len, namelen;
struct _frozen *f;
struct filedescr *fdp = NULL; struct filedescr *fdp = NULL;
FILE *fp = NULL; FILE *fp = NULL;
struct stat statbuf; struct stat statbuf;
static struct filedescr fd_frozen = {"", "", PY_FROZEN};
static struct filedescr fd_builtin = {"", "", C_BUILTIN};
static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
if (path == NULL) { if (path == NULL) {
if (is_builtin(name)) { if (is_builtin(name)) {
static struct filedescr fd = {"", "", C_BUILTIN}; strcpy(buf, name);
return &fd; return &fd_builtin;
} }
if (find_frozen(name) != NULL) { if ((f = find_frozen(name)) != NULL) {
static struct filedescr fd = {"", "", PY_FROZEN}; strcpy(buf, name);
return &fd; return &fd_frozen;
} }
#ifdef MS_COREDLL #ifdef MS_COREDLL
...@@ -850,11 +854,25 @@ find_module(name, path, buf, buflen, p_fp) ...@@ -850,11 +854,25 @@ find_module(name, path, buf, buflen, p_fp)
return fdp; return fdp;
} }
#endif #endif
path = PySys_GetObject("path");
}
else if (PyString_Check(path)) {
/* Submodule of frozen package */
if (PyString_Size(path) + 1 + strlen(name) >= buflen) {
PyErr_SetString(PyExc_ImportError,
"full frozen module name too long");
return NULL;
}
strcpy(buf, PyString_AsString(path));
strcat(buf, ".");
strcat(buf, name);
if (find_frozen(buf) != NULL)
return &fd_frozen;
PyErr_Format(PyExc_ImportError,
"frozen module %.200s not found", buf);
return NULL;
} }
if (path == NULL)
path = PySys_GetObject("path");
if (path == NULL || !PyList_Check(path)) { if (path == NULL || !PyList_Check(path)) {
PyErr_SetString(PyExc_ImportError, PyErr_SetString(PyExc_ImportError,
"sys.path must be a list of directory names"); "sys.path must be a list of directory names");
...@@ -915,7 +933,6 @@ find_module(name, path, buf, buflen, p_fp) ...@@ -915,7 +933,6 @@ find_module(name, path, buf, buflen, p_fp)
} }
#ifdef HAVE_STAT #ifdef HAVE_STAT
if (stat(buf, &statbuf) == 0) { if (stat(buf, &statbuf) == 0) {
static struct filedescr fd = {"", "", PKG_DIRECTORY};
if (S_ISDIR(statbuf.st_mode)) { if (S_ISDIR(statbuf.st_mode)) {
if (find_init_module(buf)) { if (find_init_module(buf)) {
#ifdef CHECK_IMPORT_CASE #ifdef CHECK_IMPORT_CASE
...@@ -923,7 +940,7 @@ find_module(name, path, buf, buflen, p_fp) ...@@ -923,7 +940,7 @@ find_module(name, path, buf, buflen, p_fp)
name)) name))
return NULL; return NULL;
#endif #endif
return &fd; return &fd_package;
} }
} }
} }
...@@ -1141,6 +1158,8 @@ load_module(name, fp, buf, type) ...@@ -1141,6 +1158,8 @@ load_module(name, fp, buf, type)
case C_BUILTIN: case C_BUILTIN:
case PY_FROZEN: case PY_FROZEN:
if (buf != NULL && buf[0] != '\0')
name = buf;
if (type == C_BUILTIN) if (type == C_BUILTIN)
err = init_builtin(name); err = init_builtin(name);
else else
...@@ -1239,6 +1258,7 @@ get_frozen_object(name) ...@@ -1239,6 +1258,7 @@ get_frozen_object(name)
char *name; char *name;
{ {
struct _frozen *p = find_frozen(name); struct _frozen *p = find_frozen(name);
int size;
if (p == NULL) { if (p == NULL) {
PyErr_Format(PyExc_ImportError, PyErr_Format(PyExc_ImportError,
...@@ -1246,7 +1266,10 @@ get_frozen_object(name) ...@@ -1246,7 +1266,10 @@ get_frozen_object(name)
name); name);
return NULL; return NULL;
} }
return PyMarshal_ReadObjectFromString((char *)p->code, p->size); size = p->size;
if (size < 0)
size = -size;
return PyMarshal_ReadObjectFromString((char *)p->code, size);
} }
/* Initialize a frozen module. /* Initialize a frozen module.
...@@ -1261,12 +1284,19 @@ PyImport_ImportFrozenModule(name) ...@@ -1261,12 +1284,19 @@ PyImport_ImportFrozenModule(name)
struct _frozen *p = find_frozen(name); struct _frozen *p = find_frozen(name);
PyObject *co; PyObject *co;
PyObject *m; PyObject *m;
int ispackage;
int size;
if (p == NULL) if (p == NULL)
return 0; return 0;
size = p->size;
ispackage = (size < 0);
if (ispackage)
size = -size;
if (Py_VerboseFlag) if (Py_VerboseFlag)
fprintf(stderr, "import %s # frozen\n", name); fprintf(stderr, "import %s # frozen%s\n",
co = PyMarshal_ReadObjectFromString((char *)p->code, p->size); name, ispackage ? " package" : "");
co = PyMarshal_ReadObjectFromString((char *)p->code, size);
if (co == NULL) if (co == NULL)
return -1; return -1;
if (!PyCode_Check(co)) { if (!PyCode_Check(co)) {
...@@ -1276,6 +1306,22 @@ PyImport_ImportFrozenModule(name) ...@@ -1276,6 +1306,22 @@ PyImport_ImportFrozenModule(name)
name); name);
return -1; return -1;
} }
if (ispackage) {
/* Set __path__ to the package name */
PyObject *d, *s;
int err;
m = PyImport_AddModule(name);
if (m == NULL)
return -1;
d = PyModule_GetDict(m);
s = PyString_InternFromString(name);
if (s == NULL)
return -1;
err = PyDict_SetItemString(d, "__path__", s);
Py_DECREF(s);
if (err != 0)
return err;
}
m = PyImport_ExecCodeModuleEx(name, co, "<frozen>"); m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Py_DECREF(co); Py_DECREF(co);
if (m == NULL) if (m == NULL)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment