mirror of https://github.com/python/cpython.git
Replace the run-time 'future-bytecode-stream-inspection' hack to find out
how 'import' was called with a compiletime mechanism: create either a tuple of the import arguments, or None (in the case of a normal import), add it to the code-block constants, and load it onto the stack before calling IMPORT_NAME.
This commit is contained in:
parent
e868211e10
commit
dd13e4f91f
|
@ -71,7 +71,6 @@ static int import_all_from(PyObject *, PyObject *);
|
||||||
static PyObject *build_class(PyObject *, PyObject *, PyObject *);
|
static PyObject *build_class(PyObject *, PyObject *, PyObject *);
|
||||||
static int exec_statement(PyFrameObject *,
|
static int exec_statement(PyFrameObject *,
|
||||||
PyObject *, PyObject *, PyObject *);
|
PyObject *, PyObject *, PyObject *);
|
||||||
static PyObject *find_from_args(PyFrameObject *, int);
|
|
||||||
static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
|
static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
|
||||||
static void reset_exc_info(PyThreadState *);
|
static void reset_exc_info(PyThreadState *);
|
||||||
|
|
||||||
|
@ -1627,11 +1626,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
||||||
"__import__ not found");
|
"__import__ not found");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
u = find_from_args(f, INSTR_OFFSET());
|
u = POP();
|
||||||
if (u == NULL) {
|
|
||||||
x = u;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
w = Py_BuildValue("(OOOO)",
|
w = Py_BuildValue("(OOOO)",
|
||||||
w,
|
w,
|
||||||
f->f_globals,
|
f->f_globals,
|
||||||
|
@ -3068,55 +3063,6 @@ exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hack for ni.py */
|
|
||||||
static PyObject *
|
|
||||||
find_from_args(PyFrameObject *f, int nexti)
|
|
||||||
{
|
|
||||||
int opcode;
|
|
||||||
int oparg;
|
|
||||||
PyObject *list, *name;
|
|
||||||
unsigned char *next_instr;
|
|
||||||
|
|
||||||
_PyCode_GETCODEPTR(f->f_code, &next_instr);
|
|
||||||
next_instr += nexti;
|
|
||||||
|
|
||||||
opcode = (*next_instr++);
|
|
||||||
if (opcode != IMPORT_FROM && opcode != IMPORT_STAR) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
return Py_None;
|
|
||||||
}
|
|
||||||
|
|
||||||
list = PyList_New(0);
|
|
||||||
if (list == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (opcode == IMPORT_STAR) {
|
|
||||||
name = PyString_FromString("*");
|
|
||||||
if (!name)
|
|
||||||
Py_DECREF(list);
|
|
||||||
else {
|
|
||||||
if (PyList_Append(list, name) < 0) {
|
|
||||||
Py_DECREF(list);
|
|
||||||
}
|
|
||||||
Py_DECREF(name);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
do {
|
|
||||||
oparg = (next_instr[1]<<8) + next_instr[0];
|
|
||||||
/* Jump over our own argument, the next instruction
|
|
||||||
(which is a STORE), and its argument.*/
|
|
||||||
next_instr += 5;
|
|
||||||
name = Getnamev(f, oparg);
|
|
||||||
if (PyList_Append(list, name) < 0) {
|
|
||||||
Py_DECREF(list);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
opcode = (*next_instr++);
|
|
||||||
} while (opcode == IMPORT_FROM);
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DYNAMIC_EXECUTION_PROFILE
|
#ifdef DYNAMIC_EXECUTION_PROFILE
|
||||||
|
|
||||||
|
|
|
@ -2329,14 +2329,27 @@ static void
|
||||||
com_import_stmt(struct compiling *c, node *n)
|
com_import_stmt(struct compiling *c, node *n)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
PyObject *tup;
|
||||||
REQ(n, import_stmt);
|
REQ(n, import_stmt);
|
||||||
/* 'import' dotted_name (',' dotted_name)* |
|
/* 'import' dotted_name (',' dotted_name)* |
|
||||||
'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
|
'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
|
||||||
if (STR(CHILD(n, 0))[0] == 'f') {
|
if (STR(CHILD(n, 0))[0] == 'f') {
|
||||||
/* 'from' dotted_name 'import' ... */
|
/* 'from' dotted_name 'import' ... */
|
||||||
REQ(CHILD(n, 1), dotted_name);
|
REQ(CHILD(n, 1), dotted_name);
|
||||||
com_addopname(c, IMPORT_NAME, CHILD(n, 1));
|
|
||||||
|
if (TYPE(CHILD(n, 3)) == STAR) {
|
||||||
|
tup = Py_BuildValue("(s)", "*");
|
||||||
|
} else {
|
||||||
|
tup = PyTuple_New((NCH(n) - 2)/2);
|
||||||
|
for (i = 3; i < NCH(n); i += 2) {
|
||||||
|
PyTuple_SET_ITEM(tup, (i-3)/2,
|
||||||
|
PyString_FromString(STR(
|
||||||
|
CHILD(CHILD(n, i), 0))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
|
||||||
com_push(c, 1);
|
com_push(c, 1);
|
||||||
|
com_addopname(c, IMPORT_NAME, CHILD(n, 1));
|
||||||
if (TYPE(CHILD(n, 3)) == STAR)
|
if (TYPE(CHILD(n, 3)) == STAR)
|
||||||
com_addbyte(c, IMPORT_STAR);
|
com_addbyte(c, IMPORT_STAR);
|
||||||
else {
|
else {
|
||||||
|
@ -2351,8 +2364,9 @@ com_import_stmt(struct compiling *c, node *n)
|
||||||
for (i = 1; i < NCH(n); i += 2) {
|
for (i = 1; i < NCH(n); i += 2) {
|
||||||
node *subn = CHILD(n, i);
|
node *subn = CHILD(n, i);
|
||||||
REQ(subn, dotted_as_name);
|
REQ(subn, dotted_as_name);
|
||||||
com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
|
com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
|
||||||
com_push(c, 1);
|
com_push(c, 1);
|
||||||
|
com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
|
||||||
if (NCH(subn) > 1) {
|
if (NCH(subn) > 1) {
|
||||||
int j;
|
int j;
|
||||||
if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
|
if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
|
||||||
|
|
|
@ -66,7 +66,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
|
||||||
/* XXX Perhaps the magic number should be frozen and a version field
|
/* XXX Perhaps the magic number should be frozen and a version field
|
||||||
added to the .pyc file header? */
|
added to the .pyc file header? */
|
||||||
/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
|
/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
|
||||||
#define MAGIC (50822 | ((long)'\r'<<16) | ((long)'\n'<<24))
|
#define MAGIC (50823 | ((long)'\r'<<16) | ((long)'\n'<<24))
|
||||||
|
|
||||||
/* Magic word as global; note that _PyImport_Init() can change the
|
/* Magic word as global; note that _PyImport_Init() can change the
|
||||||
value of this global to accommodate for alterations of how the
|
value of this global to accommodate for alterations of how the
|
||||||
|
@ -1401,7 +1401,7 @@ PyImport_ImportModule(char *name)
|
||||||
{
|
{
|
||||||
static PyObject *fromlist = NULL;
|
static PyObject *fromlist = NULL;
|
||||||
if (fromlist == NULL && strchr(name, '.') != NULL) {
|
if (fromlist == NULL && strchr(name, '.') != NULL) {
|
||||||
fromlist = Py_BuildValue("[s]", "*");
|
fromlist = Py_BuildValue("(s)", "*");
|
||||||
if (fromlist == NULL)
|
if (fromlist == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue