summaryrefslogtreecommitdiffstats
path: root/Python/pythonrun.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-09-14 13:31:04 (GMT)
committerGuido van Rossum <guido@python.org>1994-09-14 13:31:04 (GMT)
commitfdef2715503a56aa02716ee4bd0afcd431ba7c25 (patch)
treefd95ea8cdc7434e3cf3f4c4d82657c50ea9a97a3 /Python/pythonrun.c
parent956640880da20c20d5320477a0dcaf2026bd9426 (diff)
downloadcpython-fdef2715503a56aa02716ee4bd0afcd431ba7c25.zip
cpython-fdef2715503a56aa02716ee4bd0afcd431ba7c25.tar.gz
cpython-fdef2715503a56aa02716ee4bd0afcd431ba7c25.tar.bz2
* 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
Diffstat (limited to 'Python/pythonrun.c')
-rw-r--r--Python/pythonrun.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 8387eed..e547f92 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -37,6 +37,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "ceval.h"
#include "pythonrun.h"
#include "import.h"
+#include "marshal.h"
#ifdef HAVE_SIGNAL_H
#include <signal.h>
@@ -192,11 +193,24 @@ run_script(fp, filename)
char *filename;
{
object *m, *d, *v;
+ char *ext;
+
m = add_module("__main__");
if (m == NULL)
return -1;
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();
if (v == NULL) {
print_error();
@@ -357,6 +371,38 @@ run_node(n, filename, globals, locals)
}
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 *
compile_string(str, filename, start)
char *str;
char *filename;