mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
Support ".pyc" files: cached compilation results.
(Similar to Emacs ".elc" files.)
This commit is contained in:
parent
2cfd356f0a
commit
c405b7b2fa
1 changed files with 72 additions and 5 deletions
|
@ -33,6 +33,13 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include "errcode.h"
|
#include "errcode.h"
|
||||||
#include "sysmodule.h"
|
#include "sysmodule.h"
|
||||||
#include "pythonrun.h"
|
#include "pythonrun.h"
|
||||||
|
#include "marshal.h"
|
||||||
|
#include "compile.h"
|
||||||
|
#include "ceval.h"
|
||||||
|
|
||||||
|
#ifdef THINK_C
|
||||||
|
#define macintosh
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define pathname separator used in file names */
|
/* Define pathname separator used in file names */
|
||||||
|
|
||||||
|
@ -130,11 +137,15 @@ get_module(m, name, m_ret)
|
||||||
char *name;
|
char *name;
|
||||||
object **m_ret;
|
object **m_ret;
|
||||||
{
|
{
|
||||||
object *d;
|
codeobject *co = NULL;
|
||||||
FILE *fp;
|
object *v, *d;
|
||||||
|
FILE *fp, *fpc;
|
||||||
node *n;
|
node *n;
|
||||||
int err;
|
int err;
|
||||||
char namebuf[256];
|
char namebuf[258];
|
||||||
|
int namelen;
|
||||||
|
long mtime;
|
||||||
|
extern long getmtime();
|
||||||
|
|
||||||
fp = open_module(name, ".py", namebuf);
|
fp = open_module(name, ".py", namebuf);
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
|
@ -144,7 +155,33 @@ get_module(m, name, m_ret)
|
||||||
err_setstr(RuntimeError, "no module source file");
|
err_setstr(RuntimeError, "no module source file");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
/* Get mtime -- always useful */
|
||||||
|
mtime = getmtime(namebuf);
|
||||||
|
/* Check ".pyc" file first */
|
||||||
|
namelen = strlen(namebuf);
|
||||||
|
namebuf[namelen] = 'c';
|
||||||
|
namebuf[namelen+1] = '\0';
|
||||||
|
fpc = fopen(namebuf, "rb");
|
||||||
|
if (fpc != NULL) {
|
||||||
|
long pyc_mtime;
|
||||||
|
(void) rd_long(fpc); /* Reserved for magic word */
|
||||||
|
pyc_mtime = rd_long(fpc);
|
||||||
|
if (pyc_mtime != 0 && pyc_mtime != -1 && pyc_mtime == mtime) {
|
||||||
|
v = rd_object(fpc);
|
||||||
|
if (v == NULL || err_occurred() || !is_codeobject(v)) {
|
||||||
|
err_clear();
|
||||||
|
XDECREF(v);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
co = (codeobject *)v;
|
||||||
|
}
|
||||||
|
fclose(fpc);
|
||||||
|
}
|
||||||
|
namebuf[namelen] = '\0';
|
||||||
|
if (co == NULL)
|
||||||
err = parse_file(fp, namebuf, file_input, &n);
|
err = parse_file(fp, namebuf, file_input, &n);
|
||||||
|
else
|
||||||
|
err = E_DONE;
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
if (err != E_DONE) {
|
if (err != E_DONE) {
|
||||||
err_input(err);
|
err_input(err);
|
||||||
|
@ -159,7 +196,37 @@ get_module(m, name, m_ret)
|
||||||
*m_ret = m;
|
*m_ret = m;
|
||||||
}
|
}
|
||||||
d = getmoduledict(m);
|
d = getmoduledict(m);
|
||||||
return run_node(n, namebuf, d, d);
|
if (co == NULL) {
|
||||||
|
co = compile(n, namebuf);
|
||||||
|
freetree(n);
|
||||||
|
if (co == NULL)
|
||||||
|
return NULL;
|
||||||
|
/* Now write the code object to the ".pyc" file */
|
||||||
|
namebuf[namelen] = 'c';
|
||||||
|
namebuf[namelen+1] = '\0';
|
||||||
|
fpc = fopen(namebuf, "wb");
|
||||||
|
if (fpc != NULL) {
|
||||||
|
wr_long(0L, fpc); /* Reserved for magic word */
|
||||||
|
/* First write a 0 for mtime */
|
||||||
|
wr_long(0L, fpc);
|
||||||
|
wr_object((object *)co, fpc);
|
||||||
|
if (ferror(fpc)) {
|
||||||
|
/* Don't keep partial file */
|
||||||
|
fclose(fpc);
|
||||||
|
(void) unlink(namebuf);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Now write the true mtime */
|
||||||
|
fseek(fpc, 4L, 0);
|
||||||
|
wr_long(mtime, fpc);
|
||||||
|
fflush(fpc);
|
||||||
|
fclose(fpc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
v = eval_code(co, d, d, (object *)NULL);
|
||||||
|
DECREF(co);
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue