add imp.get_frozen_object()

This commit is contained in:
Guido van Rossum 1995-08-04 04:08:57 +00:00
parent b7b45627e8
commit 6ec1efb645
1 changed files with 56 additions and 15 deletions

View File

@ -411,13 +411,13 @@ find_module(name, path, buf, buflen, p_fp)
{ {
int i, npath, len, namelen; int i, npath, len, namelen;
struct filedescr *fdp; struct filedescr *fdp;
FILE *fp; FILE *fp = NULL;
if (path == NULL) if (path == NULL)
path = sysget("path"); path = sysget("path");
if (path == NULL || !is_listobject(path)) { if (path == NULL || !is_listobject(path)) {
err_setstr(ImportError, err_setstr(ImportError,
"module search path must be list of directory names"); "sys.path must be a list of directory names");
return NULL; return NULL;
} }
npath = getlistsize(path); npath = getlistsize(path);
@ -528,7 +528,7 @@ init_builtin(name)
if (strcmp(name, inittab[i].name) == 0) { if (strcmp(name, inittab[i].name) == 0) {
if (inittab[i].initfunc == NULL) { if (inittab[i].initfunc == NULL) {
err_setstr(ImportError, err_setstr(ImportError,
"cannot re-init internal module"); "Cannot re-init internal module");
return -1; return -1;
} }
if (verbose) if (verbose)
@ -544,9 +544,7 @@ init_builtin(name)
} }
/* Initialize a frozen module. /* Frozen modules */
Return 1 for succes, 0 if the module is not found, and -1 with
an exception set if the initialization failed. */
extern struct frozen { extern struct frozen {
char *name; char *name;
@ -554,21 +552,50 @@ extern struct frozen {
int size; int size;
} frozen_modules[]; } frozen_modules[];
/* This function is also used from frozenmain.c */ static struct frozen *
find_frozen(name)
char *name;
{
struct frozen *p;
object *co;
for (p = frozen_modules; ; p++) {
if (p->name == NULL)
return NULL;
if (strcmp(p->name, name) == 0)
break;
}
return p;
}
static object *
get_frozen_object(name)
char *name;
{
struct frozen *p = find_frozen(name);
if (p == NULL) {
err_setstr(ImportError, "No such frozen object");
return NULL;
}
return rds_object(p->code, p->size);
}
/* Initialize a frozen module.
Return 1 for succes, 0 if the module is not found, and -1 with
an exception set if the initialization failed.
This function is also used from frozenmain.c */
int int
init_frozen(name) init_frozen(name)
char *name; char *name;
{ {
struct frozen *p; struct frozen *p = find_frozen(name);
object *co; object *co;
object *m; object *m;
for (p = frozen_modules; ; p++) {
if (p->name == NULL) if (p == NULL)
return 0; return 0;
if (strcmp(p->name, name) == 0)
break;
}
if (verbose) if (verbose)
fprintf(stderr, "import %s # frozen\n", name); fprintf(stderr, "import %s # frozen\n", name);
co = rds_object(p->code, p->size); co = rds_object(p->code, p->size);
@ -576,7 +603,7 @@ init_frozen(name)
return -1; return -1;
if (!is_codeobject(co)) { if (!is_codeobject(co)) {
DECREF(co); DECREF(co);
err_setstr(SystemError, "frozen object is not a code object"); err_setstr(TypeError, "frozen object is not a code object");
return -1; return -1;
} }
m = exec_code_module(name, co); m = exec_code_module(name, co);
@ -785,6 +812,19 @@ imp_init_frozen(self, args)
return m; return m;
} }
static object *
imp_get_frozen_object(self, args)
object *self;
object *args;
{
char *name;
int ret;
object *m;
if (!newgetargs(args, "s", &name))
return NULL;
return get_frozen_object(name);
}
static object * static object *
imp_is_builtin(self, args) imp_is_builtin(self, args)
object *self; object *self;
@ -928,6 +968,7 @@ imp_new_module(self, args)
} }
static struct methodlist imp_methods[] = { static struct methodlist imp_methods[] = {
{"get_frozen_object", imp_get_frozen_object, 1},
{"get_magic", imp_get_magic, 1}, {"get_magic", imp_get_magic, 1},
{"get_suffixes", imp_get_suffixes, 1}, {"get_suffixes", imp_get_suffixes, 1},
{"find_module", imp_find_module, 1}, {"find_module", imp_find_module, 1},