call __import__() with 4 args instead of 1
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 83eeecb..0500060 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -47,8 +47,12 @@
 	object *args;
 {
 	char *name;
+	object *globals = NULL;
+	object *locals = NULL;
+	object *fromlist = NULL;
 
-	if (!newgetargs(args, "s:__import__", &name))
+	if (!newgetargs(args, "s|OOO:__import__",
+			&name, &globals, &locals, &fromlist))
 		return NULL;
 	return import_module(name);
 }
diff --git a/Python/ceval.c b/Python/ceval.c
index 411e7f3..cb9bb8a 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -93,6 +93,7 @@
 static object *build_class PROTO((object *, object *, object *));
 static int access_statement PROTO((object *, object *, frameobject *));
 static int exec_statement PROTO((object *, object *, object *));
+static object *find_from_args PROTO((frameobject *, int));
 
 
 /* Pointer to current frame, used to link new frames to */
@@ -1338,7 +1339,19 @@
 					   "__import__ not found");
 				break;
 			}
-			w = mkvalue("(O)", w);
+			if (is_methodobject(x)) {
+				u = None;
+				INCREF(u);
+			}
+			else {
+				u = find_from_args(f, INSTR_OFFSET());
+				if (u == NULL) {
+					x = u;
+					break;
+				}
+			}
+			w = mkvalue("(OOOO)", w, f->f_globals, f->f_locals, u);
+			DECREF(u);
 			if (w == NULL) {
 				x = NULL;
 				break;
@@ -1352,6 +1365,7 @@
 		case IMPORT_FROM:
 			w = GETNAMEV(oparg);
 			v = TOP();
+			fast_2_locals(f);
 			err = import_from(f->f_locals, v, w);
 			locals_2_fast(f, 0);
 			break;
@@ -2711,3 +2725,39 @@
 	DECREF(v);
 	return 0;
 }
+
+/* Hack for Ken Manheimer */
+static object *
+find_from_args(f, nexti)
+	frameobject *f;
+	int nexti;
+{
+	int opcode;
+	int oparg;
+	object *list, *name;
+	unsigned char *next_instr;
+	
+	next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
+	opcode = (*next_instr++);
+	if (opcode != IMPORT_FROM) {
+		printf("next opcode: %d\n", opcode);
+		INCREF(None);
+		return None;
+	}
+	
+	list = newlistobject(0);
+	if (list == NULL)
+		return NULL;
+	
+	do {
+		oparg = (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]);
+		name = Getnamev(f, oparg);
+		if (addlistitem(list, name) < 0) {
+			DECREF(list);
+			break;
+		}
+		opcode = (*next_instr++);
+	} while (opcode == IMPORT_FROM);
+	
+	return list;
+}