Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 53dc735

Browse files
author
Victor Stinner
committed
Issue #3080: Add PyImport_ImportFrozenModuleObject()
find_frozen(), get_frozen_object(), is_frozen_package() and other functions related to frozen modules use Unicode strings instead of byte strings.
1 parent 9464d61 commit 53dc735

3 files changed

Lines changed: 73 additions & 38 deletions

File tree

Doc/c-api/import.rst

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,22 @@ Importing Modules
217217
For internal use only.
218218
219219
220-
.. c:function:: int PyImport_ImportFrozenModule(char *name)
220+
.. c:function:: int PyImport_ImportFrozenModuleObject(PyObject *name)
221221
222222
Load a frozen module named *name*. Return ``1`` for success, ``0`` if the
223223
module is not found, and ``-1`` with an exception set if the initialization
224224
failed. To access the imported module on a successful load, use
225225
:c:func:`PyImport_ImportModule`. (Note the misnomer --- this function would
226226
reload the module if it was already imported.)
227227
228+
.. versionadded:: 3.3
229+
230+
231+
.. c:function:: int PyImport_ImportFrozenModule(char *name)
232+
233+
Similar to :c:func:`PyImport_ImportFrozenModuleObject`, but the name is an
234+
UTF-8 encoded string instead of a Unicode object.
235+
228236
229237
.. c:type:: struct _frozen
230238

Include/import.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path);
5858
PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name);
5959
PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m);
6060
PyAPI_FUNC(void) PyImport_Cleanup(void);
61+
PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject(
62+
PyObject *name
63+
);
6164
PyAPI_FUNC(int) PyImport_ImportFrozenModule(
6265
char *name /* UTF-8 encoded string */
6366
);

Python/import.c

Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,7 +1429,7 @@ get_sourcefile(char *file)
14291429
static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
14301430
static struct filedescr *find_module(char *, char *, PyObject *,
14311431
char *, size_t, FILE **, PyObject **);
1432-
static struct _frozen * find_frozen(char *);
1432+
static struct _frozen * find_frozen(PyObject *);
14331433

14341434
/* Load a package and return its module object WITH INCREMENTED
14351435
REFERENCE COUNT */
@@ -1617,6 +1617,8 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
16171617
size_t saved_namelen;
16181618
char *saved_buf = NULL;
16191619
#endif
1620+
PyObject *fullname_obj;
1621+
16201622
if (p_loader != NULL)
16211623
*p_loader = NULL;
16221624

@@ -1662,9 +1664,16 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
16621664
Py_DECREF(meta_path);
16631665
}
16641666

1665-
if (find_frozen(fullname) != NULL) {
1666-
strcpy(buf, fullname);
1667-
return &fd_frozen;
1667+
if (fullname != NULL) {
1668+
fullname_obj = PyUnicode_FromString(fullname);
1669+
if (fullname == NULL)
1670+
return NULL;
1671+
if (find_frozen(fullname_obj) != NULL) {
1672+
Py_DECREF(fullname_obj);
1673+
strcpy(buf, fullname);
1674+
return &fd_frozen;
1675+
}
1676+
Py_DECREF(fullname_obj);
16681677
}
16691678

16701679
if (path == NULL) {
@@ -2226,37 +2235,37 @@ init_builtin(char *name)
22262235
/* Frozen modules */
22272236

22282237
static struct _frozen *
2229-
find_frozen(char *name)
2238+
find_frozen(PyObject *name)
22302239
{
22312240
struct _frozen *p;
22322241

2233-
if (!name)
2242+
if (name == NULL)
22342243
return NULL;
22352244

22362245
for (p = PyImport_FrozenModules; ; p++) {
22372246
if (p->name == NULL)
22382247
return NULL;
2239-
if (strcmp(p->name, name) == 0)
2248+
if (PyUnicode_CompareWithASCIIString(name, p->name) == 0)
22402249
break;
22412250
}
22422251
return p;
22432252
}
22442253

22452254
static PyObject *
2246-
get_frozen_object(char *name)
2255+
get_frozen_object(PyObject *name)
22472256
{
22482257
struct _frozen *p = find_frozen(name);
22492258
int size;
22502259

22512260
if (p == NULL) {
22522261
PyErr_Format(PyExc_ImportError,
2253-
"No such frozen object named %.200s",
2262+
"No such frozen object named %R",
22542263
name);
22552264
return NULL;
22562265
}
22572266
if (p->code == NULL) {
22582267
PyErr_Format(PyExc_ImportError,
2259-
"Excluded frozen object named %.200s",
2268+
"Excluded frozen object named %R",
22602269
name);
22612270
return NULL;
22622271
}
@@ -2267,14 +2276,14 @@ get_frozen_object(char *name)
22672276
}
22682277

22692278
static PyObject *
2270-
is_frozen_package(char *name)
2279+
is_frozen_package(PyObject *name)
22712280
{
22722281
struct _frozen *p = find_frozen(name);
22732282
int size;
22742283

22752284
if (p == NULL) {
22762285
PyErr_Format(PyExc_ImportError,
2277-
"No such frozen object named %.200s",
2286+
"No such frozen object named %R",
22782287
name);
22792288
return NULL;
22802289
}
@@ -2294,19 +2303,20 @@ is_frozen_package(char *name)
22942303
This function is also used from frozenmain.c */
22952304

22962305
int
2297-
PyImport_ImportFrozenModule(char *name)
2306+
PyImport_ImportFrozenModuleObject(PyObject *name)
22982307
{
2299-
struct _frozen *p = find_frozen(name);
2300-
PyObject *co;
2301-
PyObject *m;
2308+
struct _frozen *p;
2309+
PyObject *co, *m, *path;
23022310
int ispackage;
23032311
int size;
23042312

2313+
p = find_frozen(name);
2314+
23052315
if (p == NULL)
23062316
return 0;
23072317
if (p->code == NULL) {
23082318
PyErr_Format(PyExc_ImportError,
2309-
"Excluded frozen object named %.200s",
2319+
"Excluded frozen object named %R",
23102320
name);
23112321
return -1;
23122322
}
@@ -2315,40 +2325,41 @@ PyImport_ImportFrozenModule(char *name)
23152325
if (ispackage)
23162326
size = -size;
23172327
if (Py_VerboseFlag)
2318-
PySys_WriteStderr("import %s # frozen%s\n",
2328+
PySys_FormatStderr("import %U # frozen%s\n",
23192329
name, ispackage ? " package" : "");
23202330
co = PyMarshal_ReadObjectFromString((char *)p->code, size);
23212331
if (co == NULL)
23222332
return -1;
23232333
if (!PyCode_Check(co)) {
23242334
PyErr_Format(PyExc_TypeError,
2325-
"frozen object %.200s is not a code object",
2335+
"frozen object %R is not a code object",
23262336
name);
23272337
goto err_return;
23282338
}
23292339
if (ispackage) {
23302340
/* Set __path__ to the package name */
2331-
PyObject *d, *s, *l;
2341+
PyObject *d, *l;
23322342
int err;
2333-
m = PyImport_AddModule(name);
2343+
m = PyImport_AddModuleObject(name);
23342344
if (m == NULL)
23352345
goto err_return;
23362346
d = PyModule_GetDict(m);
2337-
s = PyUnicode_InternFromString(name);
2338-
if (s == NULL)
2339-
goto err_return;
23402347
l = PyList_New(1);
23412348
if (l == NULL) {
2342-
Py_DECREF(s);
23432349
goto err_return;
23442350
}
2345-
PyList_SET_ITEM(l, 0, s);
2351+
Py_INCREF(name);
2352+
PyList_SET_ITEM(l, 0, name);
23462353
err = PyDict_SetItemString(d, "__path__", l);
23472354
Py_DECREF(l);
23482355
if (err != 0)
23492356
goto err_return;
23502357
}
2351-
m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
2358+
path = PyUnicode_FromString("<frozen>");
2359+
if (path == NULL)
2360+
goto err_return;
2361+
m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
2362+
Py_DECREF(path);
23522363
if (m == NULL)
23532364
goto err_return;
23542365
Py_DECREF(co);
@@ -2359,6 +2370,19 @@ PyImport_ImportFrozenModule(char *name)
23592370
return -1;
23602371
}
23612372

2373+
int
2374+
PyImport_ImportFrozenModule(char *name)
2375+
{
2376+
PyObject *nameobj;
2377+
int ret;
2378+
nameobj = PyUnicode_InternFromString(name);
2379+
if (nameobj == NULL)
2380+
return -1;
2381+
ret = PyImport_ImportFrozenModuleObject(nameobj);
2382+
Py_DECREF(nameobj);
2383+
return ret;
2384+
}
2385+
23622386

23632387
/* Import a module, either built-in, frozen, or external, and return
23642388
its module object WITH INCREMENTED REFERENCE COUNT */
@@ -3282,39 +3306,39 @@ imp_init_builtin(PyObject *self, PyObject *args)
32823306
static PyObject *
32833307
imp_init_frozen(PyObject *self, PyObject *args)
32843308
{
3285-
char *name;
3309+
PyObject *name;
32863310
int ret;
32873311
PyObject *m;
3288-
if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
3312+
if (!PyArg_ParseTuple(args, "U:init_frozen", &name))
32893313
return NULL;
3290-
ret = PyImport_ImportFrozenModule(name);
3314+
ret = PyImport_ImportFrozenModuleObject(name);
32913315
if (ret < 0)
32923316
return NULL;
32933317
if (ret == 0) {
32943318
Py_INCREF(Py_None);
32953319
return Py_None;
32963320
}
3297-
m = PyImport_AddModule(name);
3321+
m = PyImport_AddModuleObject(name);
32983322
Py_XINCREF(m);
32993323
return m;
33003324
}
33013325

33023326
static PyObject *
33033327
imp_get_frozen_object(PyObject *self, PyObject *args)
33043328
{
3305-
char *name;
3329+
PyObject *name;
33063330

3307-
if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
3331+
if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name))
33083332
return NULL;
33093333
return get_frozen_object(name);
33103334
}
33113335

33123336
static PyObject *
33133337
imp_is_frozen_package(PyObject *self, PyObject *args)
33143338
{
3315-
char *name;
3339+
PyObject *name;
33163340

3317-
if (!PyArg_ParseTuple(args, "s:is_frozen_package", &name))
3341+
if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name))
33183342
return NULL;
33193343
return is_frozen_package(name);
33203344
}
@@ -3331,9 +3355,9 @@ imp_is_builtin(PyObject *self, PyObject *args)
33313355
static PyObject *
33323356
imp_is_frozen(PyObject *self, PyObject *args)
33333357
{
3334-
char *name;
3358+
PyObject *name;
33353359
struct _frozen *p;
3336-
if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
3360+
if (!PyArg_ParseTuple(args, "U:is_frozen", &name))
33373361
return NULL;
33383362
p = find_frozen(name);
33393363
return PyBool_FromLong((long) (p == NULL ? 0 : p->size));

0 commit comments

Comments
 (0)