summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Python/ceval.c56
-rw-r--r--Python/compile.c18
-rw-r--r--Python/import.c4
3 files changed, 19 insertions, 59 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 2648add..53a5177 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -71,7 +71,6 @@ static int import_all_from(PyObject *, PyObject *);
static PyObject *build_class(PyObject *, PyObject *, PyObject *);
static int exec_statement(PyFrameObject *,
PyObject *, PyObject *, PyObject *);
-static PyObject *find_from_args(PyFrameObject *, int);
static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
static void reset_exc_info(PyThreadState *);
@@ -1627,11 +1626,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
"__import__ not found");
break;
}
- u = find_from_args(f, INSTR_OFFSET());
- if (u == NULL) {
- x = u;
- break;
- }
+ u = POP();
w = Py_BuildValue("(OOOO)",
w,
f->f_globals,
@@ -3068,55 +3063,6 @@ exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
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
diff --git a/Python/compile.c b/Python/compile.c
index dc6e2fb..ba910c4 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2329,14 +2329,27 @@ static void
com_import_stmt(struct compiling *c, node *n)
{
int i;
+ PyObject *tup;
REQ(n, import_stmt);
/* 'import' dotted_name (',' dotted_name)* |
'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
if (STR(CHILD(n, 0))[0] == 'f') {
/* 'from' dotted_name 'import' ... */
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_addopname(c, IMPORT_NAME, CHILD(n, 1));
if (TYPE(CHILD(n, 3)) == STAR)
com_addbyte(c, IMPORT_STAR);
else {
@@ -2351,8 +2364,9 @@ com_import_stmt(struct compiling *c, node *n)
for (i = 1; i < NCH(n); i += 2) {
node *subn = CHILD(n, i);
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_addopname(c, IMPORT_NAME, CHILD(subn, 0));
if (NCH(subn) > 1) {
int j;
if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
diff --git a/Python/import.c b/Python/import.c
index f38ee41..2e058bd 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -66,7 +66,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
/* XXX Perhaps the magic number should be frozen and a version field
added to the .pyc file header? */
/* 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
value of this global to accommodate for alterations of how the
@@ -1401,7 +1401,7 @@ PyImport_ImportModule(char *name)
{
static PyObject *fromlist = NULL;
if (fromlist == NULL && strchr(name, '.') != NULL) {
- fromlist = Py_BuildValue("[s]", "*");
+ fromlist = Py_BuildValue("(s)", "*");
if (fromlist == NULL)
return NULL;
}