* Import/pythonrun.h, Python/{import,pythonrun}.c,

mac/macsetfiletype.c: changes by Jack to execute .pyc file passed
	as command line argument.  On the Mac .pyc files are given a
	special type so they can be double-clicked
This commit is contained in:
Guido van Rossum 1994-09-14 13:31:04 +00:00
parent 956640880d
commit fdef271550
2 changed files with 58 additions and 1 deletions

View File

@ -176,6 +176,14 @@ static object *modules;
/* Forward */ /* Forward */
static int init_builtin PROTO((char *)); static int init_builtin PROTO((char *));
/* Helper for reading .pyc files */
long
get_pyc_magic()
{
return MAGIC;
}
/* Initialization */ /* Initialization */
void void
@ -482,6 +490,9 @@ get_module(m, name, m_ret)
/* Now write the code object to the ".pyc" file */ /* Now write the code object to the ".pyc" file */
strcpy(namebuf + len, "c"); strcpy(namebuf + len, "c");
fpc = fopen(namebuf, "wb"); fpc = fopen(namebuf, "wb");
#ifdef macintosh
setfiletype(namebuf, 'PYTH', 'PYC ');
#endif
if (fpc == NULL) { if (fpc == NULL) {
if (verbose) if (verbose)
fprintf(stderr, fprintf(stderr,

View File

@ -37,6 +37,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "ceval.h" #include "ceval.h"
#include "pythonrun.h" #include "pythonrun.h"
#include "import.h" #include "import.h"
#include "marshal.h"
#ifdef HAVE_SIGNAL_H #ifdef HAVE_SIGNAL_H
#include <signal.h> #include <signal.h>
@ -192,11 +193,24 @@ run_script(fp, filename)
char *filename; char *filename;
{ {
object *m, *d, *v; object *m, *d, *v;
char *ext;
m = add_module("__main__"); m = add_module("__main__");
if (m == NULL) if (m == NULL)
return -1; return -1;
d = getmoduledict(m); d = getmoduledict(m);
v = run_file(fp, filename, file_input, d, d); ext = filename + strlen(filename) - 4;
if ( strcmp(ext, ".pyc") == 0 ) {
/* Try to run a pyc file. First, re-open in binary */
fclose(fp);
if( (fp = fopen(filename, "rb")) == NULL ) {
fprintf(stderr, "python: Can't reopen .pyc file\n");
return -1;
}
v = run_pyc_file(fp, filename, d, d);
} else {
v = run_file(fp, filename, file_input, d, d);
}
flushline(); flushline();
if (v == NULL) { if (v == NULL) {
print_error(); print_error();
@ -356,6 +370,38 @@ run_node(n, filename, globals, locals)
return v; return v;
} }
object *
run_pyc_file(fp, filename, globals, locals)
FILE *fp;
char *filename;
object *globals, *locals;
{
codeobject *co;
object *v;
long magic;
long get_pyc_magic();
magic = rd_long(fp);
if (magic != get_pyc_magic()) {
err_setstr(RuntimeError,
"Bad magic number in .pyc file");
return NULL;
}
(void) rd_long(fp);
v = rd_object(fp);
fclose(fp);
if (v == NULL || !is_codeobject(v)) {
XDECREF(v);
err_setstr(RuntimeError,
"Bad code object in .pyc file");
return NULL;
}
co = (codeobject *)v;
v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
DECREF(co);
return v;
}
object * object *
compile_string(str, filename, start) compile_string(str, filename, start)
char *str; char *str;