Added hooks to support importing pyc code from a resource on the mac.

This commit is contained in:
Jack Jansen 1995-02-15 22:57:06 +00:00
parent 3cfc8bd841
commit 9c96a923fb
2 changed files with 47 additions and 8 deletions

View File

@ -39,6 +39,9 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "eval.h" #include "eval.h"
#include "osdefs.h" #include "osdefs.h"
#include "importdl.h" #include "importdl.h"
#ifdef macintosh
#include "macglue.h"
#endif
extern int verbose; /* Defined in pythonrun.c */ extern int verbose; /* Defined in pythonrun.c */
@ -135,10 +138,10 @@ add_module(name)
/* Execute a code object in a module and return the module object /* Execute a code object in a module and return the module object
WITH INCREMENTED REFERENCE COUNT */ WITH INCREMENTED REFERENCE COUNT */
static object * object *
exec_code_module(name, co) exec_code_module(name, co)
char *name; char *name;
codeobject *co; object *co;
{ {
object *m, *d, *v; object *m, *d, *v;
@ -269,13 +272,12 @@ load_compiled_module(name, cpathname, fp)
if (verbose) if (verbose)
fprintf(stderr, "import %s # precompiled from %s\n", fprintf(stderr, "import %s # precompiled from %s\n",
name, cpathname); name, cpathname);
m = exec_code_module(name, co); m = exec_code_module(name, (object *)co);
DECREF(co); DECREF(co);
return m; return m;
} }
/* Parse a source file and return the corresponding code object */ /* Parse a source file and return the corresponding code object */
static codeobject * static codeobject *
@ -379,7 +381,7 @@ load_source_module(name, pathname, fp)
name, pathname); name, pathname);
write_compiled_module(co, cpathname, mtime); write_compiled_module(co, cpathname, mtime);
} }
m = exec_code_module(name, co); m = exec_code_module(name, (object *)co);
DECREF(co); DECREF(co);
return m; return m;
@ -422,6 +424,13 @@ find_module(name, path, buf, buflen, p_fp)
strcpy(buf, getstringvalue(v)); strcpy(buf, getstringvalue(v));
if (strlen(buf) != len) if (strlen(buf) != len)
continue; /* v contains '\0' */ continue; /* v contains '\0' */
#ifdef macintosh
if ( PyMac_FindResourceModule(name, buf) ) {
static struct filedescr resfiledescr = { "", "", PY_RESOURCE};
return &resfiledescr;
}
#endif
if (len > 0 && buf[len-1] != SEP) if (len > 0 && buf[len-1] != SEP)
buf[len++] = SEP; buf[len++] = SEP;
strcpy(buf+len, name); strcpy(buf+len, name);
@ -479,13 +488,20 @@ load_module(name)
m = load_dynamic_module(name, buf); m = load_dynamic_module(name, buf);
break; break;
#ifdef macintosh
case PY_RESOURCE:
m = PyMac_LoadResourceModule(name, buf);
break;
#endif
default: default:
err_setstr(SystemError, err_setstr(SystemError,
"find_module returned unexpected result"); "find_module returned unexpected result");
m = NULL; m = NULL;
} }
fclose(fp); if ( fp )
fclose(fp);
return m; return m;
} }
@ -555,7 +571,7 @@ init_frozen(name)
err_setstr(SystemError, "frozen object is not a code object"); err_setstr(SystemError, "frozen object is not a code object");
return -1; return -1;
} }
m = exec_code_module(name, (codeobject *)co); m = exec_code_module(name, co);
DECREF(co); DECREF(co);
if (m == NULL) if (m == NULL)
return -1; return -1;
@ -874,6 +890,23 @@ imp_load_source(self, args)
return m; return m;
} }
#ifdef macintosh
static object *
imp_load_resource(self, args)
object *self;
object *args;
{
char *name;
char *pathname;
object *m;
if (!newgetargs(args, "ss", &name, &pathname))
return NULL;
m = PyMac_LoadResourceModule(name, pathname);
return m;
}
#endif /* macintosh */
static object * static object *
imp_new_module(self, args) imp_new_module(self, args)
object *self; object *self;
@ -897,6 +930,9 @@ static struct methodlist imp_methods[] = {
{"load_dynamic", imp_load_dynamic, 1}, {"load_dynamic", imp_load_dynamic, 1},
{"load_source", imp_load_source, 1}, {"load_source", imp_load_source, 1},
{"new_module", imp_new_module, 1}, {"new_module", imp_new_module, 1},
#ifdef macintosh
{"load_resource", imp_load_resource, 1},
#endif
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };

View File

@ -23,8 +23,11 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/ ******************************************************************/
/* Definitions for dynamic loading of extension modules */ /* Definitions for dynamic loading of extension modules */
#ifdef macintosh
enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE};
#else
enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION}; enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION};
#endif
extern struct filedescr { extern struct filedescr {
char *suffix; char *suffix;