Lots of changes, most minor (fatal() instead of abort(), use of
err_fetch/err_restore and so on).  But...
NOTE: import.c has been rewritten and all the DL stuff is now in the
new file importdl.c.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 4f6c852..39dcc41 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -40,15 +40,35 @@
 /* Forward */
 static object *filterstring PROTO((object *, object *));
 static object *filtertuple  PROTO((object *, object *));
-static object *exec_eval PROTO((object *v, int start));
 
 static object *
-builtin_abs(self, v)
+builtin___import__(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	char *name;
+	object *m;
+
+	if (!newgetargs(args, "s:__import__", &name))
+		return NULL;
+	m = import_module(name);
+	XINCREF(m);
+
+	return m;
+}
+
+
+static object *
+builtin_abs(self, args)
+	object *self;
+	object *args;
+{
+	object *v;
 	number_methods *nm;
-	if (v == NULL || (nm = v->ob_type->tp_as_number) == NULL) {
+
+	if (!newgetargs(args, "O:abs", &v))
+		return NULL;
+	if ((nm = v->ob_type->tp_as_number) == NULL) {
 		err_setstr(TypeError, "abs() requires numeric argument");
 		return NULL;
 	}
@@ -61,7 +81,8 @@
 	object *args;
 {
 	object *func, *arglist;
-	if (!getargs(args, "(OO)", &func, &arglist))
+
+	if (!newgetargs(args, "OO:apply", &func, &arglist))
 		return NULL;
 	if (!is_tupleobject(arglist)) {
 		err_setstr(TypeError, "apply() 2nd argument must be tuple");
@@ -101,12 +122,11 @@
 	object *self;
 	object *args;
 {
-	if (args == NULL) {
-		err_setstr(TypeError,
-			   "callable requires exactly one argument");
+	object *v;
+
+	if (!newgetargs(args, "O:callable", &v))
 		return NULL;
-	}
-	return newintobject((long)callable(args));
+	return newintobject((long)callable(v));
 }
 
 static object *
@@ -119,7 +139,7 @@
 	int len;
 	register int i, j;
 
-	if (!getargs(args, "(OO)", &func, &seq))
+	if (!newgetargs(args, "OO:filter", &func, &seq))
 		return NULL;
 
 	if (is_stringobject(seq)) {
@@ -212,7 +232,8 @@
 {
 	long x;
 	char s[1];
-	if (!getargs(args, "l", &x))
+
+	if (!newgetargs(args, "l:chr", &x))
 		return NULL;
 	if (x < 0 || x >= 256) {
 		err_setstr(ValueError, "chr() arg not in range(256)");
@@ -228,7 +249,8 @@
 	object *args;
 {
 	object *a, *b;
-	if (!getargs(args, "(OO)", &a, &b))
+
+	if (!newgetargs(args, "OO:cmp", &a, &b))
 		return NULL;
 	return newintobject((long)cmpobject(a, b));
 }
@@ -241,7 +263,7 @@
 	object *v, *w;
 	object *res;
 
-	if (!getargs(args, "(OO)", &v, &w))
+	if (!newgetargs(args, "OO:coerce", &v, &w))
 		return NULL;
 	if (is_instanceobject(v) || is_instanceobject(w))
 		return instancebinop(v, w, "__coerce__", "__rcoerce__");
@@ -262,7 +284,8 @@
 	char *filename;
 	char *startstr;
 	int start;
-	if (!getargs(args, "(sss)", &str, &filename, &startstr))
+
+	if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
 		return NULL;
 	if (strcmp(startstr, "exec") == 0)
 		start = file_input;
@@ -277,11 +300,15 @@
 }
 
 static object *
-builtin_dir(self, v)
+builtin_dir(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v = NULL;
 	object *d;
+
+	if (!newgetargs(args, "|O:dir", &v))
+		return NULL;
 	if (v == NULL) {
 		d = getlocals();
 		INCREF(d);
@@ -314,13 +341,15 @@
 	object *args;
 {
 	object *v, *w, *x;
-	if (!getargs(args, "(OO)", &v, &w))
+
+	if (!newgetargs(args, "OO:divmod", &v, &w))
 		return NULL;
 	if (is_instanceobject(v) || is_instanceobject(w))
 		return instancebinop(v, w, "__divmod__", "__rdivmod__");
 	if (v->ob_type->tp_as_number == NULL ||
 				w->ob_type->tp_as_number == NULL) {
-		err_setstr(TypeError, "divmod() requires numeric or class instance arguments");
+		err_setstr(TypeError,
+		    "divmod() requires numeric or class instance arguments");
 		return NULL;
 	}
 	if (coerce(&v, &w) != 0)
@@ -332,110 +361,80 @@
 }
 
 static object *
-exec_eval(v, start)
-	object *v;
-	int start;
+builtin_eval(self, args)
+	object *self;
+	object *args;
 {
-	object *str = NULL, *globals = NULL, *locals = NULL;
-	char *s;
-	int n;
-	/* XXX This is a bit of a mess.  Should make it varargs */
-	if (v != NULL) {
-		if (is_tupleobject(v) &&
-				((n = gettuplesize(v)) == 2 || n == 3)) {
-			str = gettupleitem(v, 0);
-			globals = gettupleitem(v, 1);
-			if (n == 3)
-				locals = gettupleitem(v, 2);
-		}
-		else
-			str = v;
-	}
-	if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
-			globals != NULL && !is_dictobject(globals) ||
-			locals != NULL && !is_dictobject(locals)) {
-		err_setstr(TypeError,
-		  "eval arguments must be (string|code)[,dict[,dict]]");
-		return NULL;
-	}
+	object *cmd;
+	object *globals = NULL, *locals = NULL;
+	char *str;
 
-	if (is_codeobject(str))
-		return eval_code((codeobject *) str, globals, locals,
+	if (!newgetargs(args, "O|O!O!:eval",
+			&cmd,
+			&Mappingtype, &globals,
+			&Mappingtype, &locals))
+		return NULL;
+	if (is_codeobject(cmd))
+		return eval_code((codeobject *) cmd, globals, locals,
 				 (object *)NULL, (object *)NULL);
-	s = getstringvalue(str);
-	if (strlen(s) != getstringsize(str)) {
-		err_setstr(ValueError, "embedded '\\0' in string arg");
+	if (!is_stringobject(cmd)) {
+		err_setstr(TypeError,
+			   "eval() argument 1 must be string or code object");
 		return NULL;
 	}
-	if (start == eval_input) {
-		while (*s == ' ' || *s == '\t')
-			s++;
+	str = getstringvalue(cmd);
+	if (strlen(str) != getstringsize(cmd)) {
+		err_setstr(ValueError,
+			   "embedded '\\0' in string arg");
+		return NULL;
 	}
-	return run_string(s, start, globals, locals);
+	while (*str == ' ' || *str == '\t')
+		str++;
+	return run_string(str, eval_input, globals, locals);
 }
 
 static object *
-builtin_eval(self, v)
+builtin_execfile(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	return exec_eval(v, eval_input);
-}
-
-static object *
-builtin_execfile(self, v)
-	object *self;
-	object *v;
-{
-	object *str = NULL, *globals = NULL, *locals = NULL, *w;
+	char *filename;
+	object *globals = NULL, *locals = NULL;
+	object *res;
 	FILE* fp;
 	char *s;
 	int n;
-	if (v != NULL) {
-		if (is_stringobject(v))
-			str = v;
-		else if (is_tupleobject(v) &&
-				((n = gettuplesize(v)) == 2 || n == 3)) {
-			str = gettupleitem(v, 0);
-			globals = gettupleitem(v, 1);
-			if (n == 3)
-				locals = gettupleitem(v, 2);
-		}
-	}
-	if (str == NULL || !is_stringobject(str) ||
-			globals != NULL && !is_dictobject(globals) ||
-			locals != NULL && !is_dictobject(locals)) {
-		err_setstr(TypeError,
-		    "execfile arguments must be filename[,dict[,dict]]");
+
+	if (!newgetargs(args, "s|O!O!:execfile",
+			&filename,
+			&Mappingtype, &globals,
+			&Mappingtype, &locals))
 		return NULL;
-	}
-	s = getstringvalue(str);
-	if (strlen(s) != getstringsize(str)) {
-		err_setstr(ValueError, "embedded '\\0' in string arg");
-		return NULL;
-	}
 	BGN_SAVE
-	fp = fopen(s, "r");
+	fp = fopen(filename, "r");
 	END_SAVE
 	if (fp == NULL) {
-		err_setstr(IOError, "execfile cannot open the file argument");
+		err_errno(IOError);
 		return NULL;
 	}
-	w = run_file(fp, getstringvalue(str), file_input, globals, locals);
+	res = run_file(fp, filename, file_input, globals, locals);
 	BGN_SAVE
 	fclose(fp);
 	END_SAVE
-	return w;
+	return res;
 }
 
 static object *
-builtin_float(self, v)
+builtin_float(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
 	number_methods *nb;
-	
-	if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
+
+	if (!newgetargs(args, "O:float", &v))
+		return NULL;
+	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_float == NULL) {
 		err_setstr(TypeError,
 			   "float() argument can't be converted to float");
@@ -451,7 +450,8 @@
 {
 	object *v;
 	object *name;
-	if (!getargs(args, "(OS)", &v, &name))
+
+	if (!newgetargs(args, "OS:getattr", &v, &name))
 		return NULL;
 	return getattro(v, name);
 }
@@ -463,7 +463,8 @@
 {
 	object *v;
 	object *name;
-	if (!getargs(args, "(OS)", &v, &name))
+
+	if (!newgetargs(args, "OS:hasattr", &v, &name))
 		return NULL;
 	v = getattro(v, name);
 	if (v == NULL) {
@@ -480,7 +481,8 @@
 	object *args;
 {
 	object *v;
-	if (!getargs(args, "O", &v))
+
+	if (!newgetargs(args, "O:id", &v))
 		return NULL;
 	return newintobject((long)v);
 }
@@ -498,16 +500,17 @@
 
 	object *func, *result;
 	sequence *seqs = NULL, *sqp;
-	int n, len, newfunc = 0;
+	int n, len;
 	register int i, j;
 
-	if (args == NULL || !is_tupleobject(args)) {
+	n = gettuplesize(args);
+	if (n < 2) {
 		err_setstr(TypeError, "map() requires at least two args");
 		return NULL;
 	}
 
 	func = gettupleitem(args, 0);
-	n    = gettuplesize(args) - 1;
+	n--;
 
 	if ((seqs = NEW(sequence, n)) == NULL) {
 		err_nomem();
@@ -633,7 +636,8 @@
 	object *v;
 	object *name;
 	object *value;
-	if (!getargs(args, "(OSO)", &v, &name, &value))
+
+	if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
 		return NULL;
 	if (setattro(v, name, value) != 0)
 		return NULL;
@@ -648,7 +652,8 @@
 {
 	object *v;
 	object *name;
-	if (!getargs(args, "(OS)", &v, &name))
+
+	if (!newgetargs(args, "OS:delattr", &v, &name))
 		return NULL;
 	if (setattro(v, name, (object *)NULL) != 0)
 		return NULL;
@@ -663,7 +668,8 @@
 {
 	object *v;
 	long x;
-	if (!getargs(args, "O", &v))
+
+	if (!newgetargs(args, "O:hash", &v))
 		return NULL;
 	x = hashobject(v);
 	if (x == -1)
@@ -672,13 +678,17 @@
 }
 
 static object *
-builtin_hex(self, v)
+builtin_hex(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
 	number_methods *nb;
+
+	if (!newgetargs(args, "O:hex", &v))
+		return NULL;
 	
-	if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
+	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_hex == NULL) {
 		err_setstr(TypeError,
 			   "hex() argument can't be converted to hex");
@@ -690,26 +700,37 @@
 static object *builtin_raw_input PROTO((object *, object *));
 
 static object *
-builtin_input(self, v)
+builtin_input(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	object *line = builtin_raw_input(self, v);
+	object *line;
+	char *str;
+	object *res;
+
+	line = builtin_raw_input(self, args);
 	if (line == NULL)
 		return line;
-	v = exec_eval(line, eval_input);
+	if (!getargs(line, "s;embedded '\\0' in input line", &str))
+		return NULL;
+	while (*str == ' ' || *str == '\t')
+			str++;
+	res = run_string(str, eval_input, (object *)NULL, (object *)NULL);
 	DECREF(line);
-	return v;
+	return res;
 }
 
 static object *
-builtin_int(self, v)
+builtin_int(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
 	number_methods *nb;
-	
-	if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
+
+	if (!newgetargs(args, "O:int", &v))
+		return NULL;
+	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_int == NULL) {
 		err_setstr(TypeError,
 			   "int() argument can't be converted to int");
@@ -719,16 +740,16 @@
 }
 
 static object *
-builtin_len(self, v)
+builtin_len(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
 	long len;
 	typeobject *tp;
-	if (v == NULL) {
-		err_setstr(TypeError, "len() without argument");
+
+	if (!newgetargs(args, "O:len", &v))
 		return NULL;
-	}
 	tp = v->ob_type;
 	if (tp->tp_as_sequence != NULL) {
 		len = (*tp->tp_as_sequence->sq_length)(v);
@@ -747,13 +768,16 @@
 }
 
 static object *
-builtin_long(self, v)
+builtin_long(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
 	number_methods *nb;
 	
-	if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
+	if (!newgetargs(args, "O:long", &v))
+		return NULL;
+	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_long == NULL) {
 		err_setstr(TypeError,
 			   "long() argument can't be converted to long");
@@ -763,17 +787,18 @@
 }
 
 static object *
-min_max(v, sign)
-	object *v;
+min_max(args, sign)
+	object *args;
 	int sign;
 {
 	int i;
-	object *w, *x;
+	object *v, *w, *x;
 	sequence_methods *sq;
-	if (v == NULL) {
-		err_setstr(TypeError, "min() or max() without argument");
+
+	if (gettuplesize(args) > 1)
+		v = args;
+	else if (!newgetargs(args, "O:min/max", &v))
 		return NULL;
-	}
 	sq = v->ob_type->tp_as_sequence;
 	if (sq == NULL) {
 		err_setstr(TypeError, "min() or max() of non-sequence");
@@ -823,12 +848,15 @@
 }
 
 static object *
-builtin_oct(self, v)
+builtin_oct(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
 	number_methods *nb;
-	
+
+	if (!newgetargs(args, "O:oct", &v))
+		return NULL;
 	if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_oct == NULL) {
 		err_setstr(TypeError,
@@ -847,9 +875,8 @@
 	char *mode = "r";
 	int bufsize = -1;
 	object *f;
-	if (!getargs(args, "s", &name) &&
-	    (err_clear(), !getargs(args, "(ss)", &name, &mode)) &&
-	    (err_clear(), !getargs(args, "(ssi)", &name, &mode, &bufsize)))
+
+	if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
 		return NULL;
 	f = newfileobject(name, mode);
 	if (f != NULL)
@@ -862,15 +889,11 @@
 	object *self;
 	object *args;
 {
-	char *s;
-	int len;
-	if (!getargs(args, "s#", &s, &len))
+	char c;
+
+	if (!newgetargs(args, "c:ord", &c))
 		return NULL;
-	if (len != 1) {
-		err_setstr(ValueError, "ord() arg must have length 1");
-		return NULL;
-	}
-	return newintobject((long)(s[0] & 0xff));
+	return newintobject((long)(c & 0xff));
 }
 
 static object *
@@ -878,9 +901,9 @@
 	object *self;
 	object *args;
 {
-	object *v, *w, *z, *x;
- 	z = None;
-	if (!newgetargs(args, "OO|O", &v, &w, &z))
+	object *v, *w, *z = None, *x;
+
+	if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
 		return NULL;
 	if (z == None) {
 		if (is_instanceobject(v) || is_instanceobject(w))
@@ -913,43 +936,25 @@
 }
 
 static object *
-builtin_range(self, v)
+builtin_range(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	static char *errmsg = "range() requires 1-3 int arguments";
+	long ilow = 0, ihigh = 0, istep = 1;
 	int i, n;
-	long ilow, ihigh, istep;
-	if (v != NULL && is_intobject(v)) {
-		ilow = 0; ihigh = getintvalue(v); istep = 1;
-	}
-	else if (v == NULL || !is_tupleobject(v)) {
-		err_setstr(TypeError, errmsg);
-		return NULL;
+	object *v;
+
+	if (gettuplesize(args) <= 1) {
+		if (!newgetargs(args,
+				"i;range() requires 1-3 int arguments",
+				&ihigh))
+			return NULL;
 	}
 	else {
-		n = gettuplesize(v);
-		if (n < 1 || n > 3) {
-			err_setstr(TypeError, errmsg);
+		if (!newgetargs(args,
+				"ii|i;range() requires 1-3 int arguments",
+				&ilow, &ihigh, &istep))
 			return NULL;
-		}
-		for (i = 0; i < n; i++) {
-			if (!is_intobject(gettupleitem(v, i))) {
-				err_setstr(TypeError, errmsg);
-				return NULL;
-			}
-		}
-		if (n == 3) {
-			istep = getintvalue(gettupleitem(v, 2));
-			--n;
-		}
-		else
-			istep = 1;
-		ihigh = getintvalue(gettupleitem(v, --n));
-		if (n > 0)
-			ilow = getintvalue(gettupleitem(v, 0));
-		else
-			ilow = 0;
 	}
 	if (istep == 0) {
 		err_setstr(ValueError, "zero step for range()");
@@ -978,73 +983,66 @@
 }
 
 static object *
-builtin_xrange(self, v)
+builtin_xrange(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	static char *errmsg = "xrange() requires 1-3 int arguments";
-	int i, n;
-	long start, stop, step, len;
-	if (v != NULL && is_intobject(v))
-		start = 0, stop = getintvalue(v), step = 1;
+	long ilow = 0, ihigh = 0, istep = 1;
+	int n;
+	object *v;
 
-	else if (v == NULL || !is_tupleobject(v)) {
-		err_setstr(TypeError, errmsg);
-		return NULL;
+	if (gettuplesize(args) <= 1) {
+		if (!newgetargs(args,
+				"i;xrange() requires 1-3 int arguments",
+				&ihigh))
+			return NULL;
 	}
 	else {
-		n = gettuplesize(v);
-		if (n < 1 || n > 3) {
-			err_setstr(TypeError, errmsg);
+		if (!newgetargs(args,
+				"ii|i;xrange() requires 1-3 int arguments",
+				&ilow, &ihigh, &istep))
 			return NULL;
-		}
-		for (i = 0; i < n; i++) {
-			if (!is_intobject(gettupleitem(v, i))) {
-				err_setstr(TypeError, errmsg);
-				return NULL;
-			}
-		}
-		if (n == 3) {
-			step = getintvalue(gettupleitem(v, 2));
-			--n;
-		}
-		else
-			step = 1;
-		stop = getintvalue(gettupleitem(v, --n));
-		if (n > 0)
-			start = getintvalue(gettupleitem(v, 0));
-		else
-			start = 0;
 	}
-
-	if (step == 0) {
+	if (istep == 0) {
 		err_setstr(ValueError, "zero step for xrange()");
 		return NULL;
 	}
-
-	len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
-	if (len < 0)
-		len = 0;
-
-	return newrangeobject(start, len, step, 1);
+	/* XXX ought to check overflow of subtraction */
+	if (istep > 0)
+		n = (ihigh - ilow + istep - 1) / istep;
+	else
+		n = (ihigh - ilow + istep + 1) / istep;
+	if (n < 0)
+		n = 0;
+	return newrangeobject(ilow, n, istep, 1);
 }
 
 static object *
-builtin_raw_input(self, v)
+builtin_raw_input(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	object *f = sysget("stdout");
-	if (f == NULL) {
-		err_setstr(RuntimeError, "lost sys.stdout");
+	object *v = NULL;
+	object *f;
+
+	if (!newgetargs(args, "|O:[raw_]input", &v))
 		return NULL;
-	}
-	flushline();
 	if (v != NULL) {
+		f = sysget("stdout");
+		if (f == NULL) {
+			err_setstr(RuntimeError, "lost sys.stdout");
+			return NULL;
+		}
+		flushline();
 		if (writeobject(v, f, PRINT_RAW) != 0)
 			return NULL;
 	}
-	return filegetline(sysget("stdin"), -1);
+	f = sysget("stdin");
+	if (f == NULL) {
+		err_setstr(RuntimeError, "lost sys.stdin");
+		return NULL;
+	}
+	return filegetline(f, -1);
 }
 
 static object *
@@ -1052,18 +1050,14 @@
 	object *self;
 	object *args;
 {
-	object *seq, *func, *result;
+	object *seq, *func, *result = NULL;
 	sequence_methods *sqf;
 	register int i;
 
-	if (getargs(args, "(OO)", &func, &seq))
-		result = NULL;
-	else {
-		err_clear();
-		if (!getargs(args, "(OOO)", &func, &seq, &result))
-			return NULL;
+	if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
+		return NULL;
+	if (result != NULL)
 		INCREF(result);
-	}
 
 	if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
 		err_setstr(TypeError,
@@ -1116,22 +1110,26 @@
 }
 
 static object *
-builtin_reload(self, v)
+builtin_reload(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
+
+	if (!newgetargs(args, "O:reload", &v))
+		return NULL;
 	return reload_module(v);
 }
 
 static object *
-builtin_repr(self, v)
+builtin_repr(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	if (v == NULL) {
-		err_badarg();
+	object *v;
+
+	if (!newgetargs(args, "O:repr", &v))
 		return NULL;
-	}
 	return reprobject(v);
 }
 
@@ -1145,13 +1143,10 @@
 	double x;
 	double f;
 	int ndigits = 0;
-	int sign = 1;
 	int i;
-	if (!getargs(args, "d", &x)) {
-		err_clear();
-		if (!getargs(args, "(di)", &x, &ndigits))
+
+	if (!newgetargs(args, "d|i:round", &x, &ndigits))
 			return NULL;
-	}
 	f = 1.0;
 	for (i = ndigits; --i >= 0; )
 		f = f*10.0;
@@ -1164,25 +1159,27 @@
 }
 
 static object *
-builtin_str(self, v)
+builtin_str(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	if (v == NULL) {
-		err_badarg();
+	object *v;
+
+	if (!newgetargs(args, "O:str", &v))
 		return NULL;
-	}
 	return strobject(v);
 }
 
 static object *
-builtin_tuple(self, v)
+builtin_tuple(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v;
 	sequence_methods *sqf;
-	if (v == NULL)
-		v = None; /* Force error later */
+
+	if (!newgetargs(args, "O:tuple", &v))
+		return NULL;
 	if (is_tupleobject(v)) {
 		INCREF(v);
 		return v;
@@ -1235,25 +1232,29 @@
 }
 
 static object *
-builtin_type(self, v)
+builtin_type(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
-	if (v == NULL) {
-		err_setstr(TypeError, "type() requires an argument");
+	object *v;
+
+	if (!newgetargs(args, "O:type", &v))
 		return NULL;
-	}
 	v = (object *)v->ob_type;
 	INCREF(v);
 	return v;
 }
 
 static object *
-builtin_vars(self, v)
+builtin_vars(self, args)
 	object *self;
-	object *v;
+	object *args;
 {
+	object *v = NULL;
 	object *d;
+
+	if (!newgetargs(args, "|O:vars", &v))
+		return NULL;
 	if (v == NULL) {
 		d = getlocals();
 		INCREF(d);
@@ -1270,48 +1271,49 @@
 }
 
 static struct methodlist builtin_methods[] = {
-	{"abs",		builtin_abs},
-	{"apply",	builtin_apply},
-	{"callable",	builtin_callable},
-	{"chr",		builtin_chr},
-	{"cmp",		builtin_cmp},
-	{"coerce",	builtin_coerce},
-	{"compile",	builtin_compile},
-	{"delattr",	builtin_delattr},
-	{"dir",		builtin_dir},
-	{"divmod",	builtin_divmod},
-	{"eval",	builtin_eval},
-	{"execfile",	builtin_execfile},
-	{"filter",	builtin_filter},
-	{"float",	builtin_float},
-	{"getattr",	builtin_getattr},
-	{"hasattr",	builtin_hasattr},
-	{"hash",	builtin_hash},
-	{"hex",		builtin_hex},
-	{"id",		builtin_id},
-	{"input",	builtin_input},
-	{"int",		builtin_int},
-	{"len",		builtin_len},
-	{"long",	builtin_long},
-	{"map",		builtin_map},
-	{"max",		builtin_max},
-	{"min",		builtin_min},
-	{"oct",		builtin_oct},
-	{"open",	builtin_open},
-	{"ord",		builtin_ord},
+	{"__import__",	builtin___import__, 1},
+	{"abs",		builtin_abs, 1},
+	{"apply",	builtin_apply, 1},
+	{"callable",	builtin_callable, 1},
+	{"chr",		builtin_chr, 1},
+	{"cmp",		builtin_cmp, 1},
+	{"coerce",	builtin_coerce, 1},
+	{"compile",	builtin_compile, 1},
+	{"delattr",	builtin_delattr, 1},
+	{"dir",		builtin_dir, 1},
+	{"divmod",	builtin_divmod, 1},
+	{"eval",	builtin_eval, 1},
+	{"execfile",	builtin_execfile, 1},
+	{"filter",	builtin_filter, 1},
+	{"float",	builtin_float, 1},
+	{"getattr",	builtin_getattr, 1},
+	{"hasattr",	builtin_hasattr, 1},
+	{"hash",	builtin_hash, 1},
+	{"hex",		builtin_hex, 1},
+	{"id",		builtin_id, 1},
+	{"input",	builtin_input, 1},
+	{"int",		builtin_int, 1},
+	{"len",		builtin_len, 1},
+	{"long",	builtin_long, 1},
+	{"map",		builtin_map, 1},
+	{"max",		builtin_max, 1},
+	{"min",		builtin_min, 1},
+	{"oct",		builtin_oct, 1},
+	{"open",	builtin_open, 1},
+	{"ord",		builtin_ord, 1},
 	{"pow",		builtin_pow, 1},
-	{"range",	builtin_range},
-	{"raw_input",	builtin_raw_input},
-	{"reduce",	builtin_reduce},
-	{"reload",	builtin_reload},
-	{"repr",	builtin_repr},
-	{"round",	builtin_round},
-	{"setattr",	builtin_setattr},
-	{"str",		builtin_str},
-	{"tuple",	builtin_tuple},
-	{"type",	builtin_type},
-	{"vars",	builtin_vars},
-	{"xrange",	builtin_xrange},
+	{"range",	builtin_range, 1},
+	{"raw_input",	builtin_raw_input, 1},
+	{"reduce",	builtin_reduce, 1},
+	{"reload",	builtin_reload, 1},
+	{"repr",	builtin_repr, 1},
+	{"round",	builtin_round, 1},
+	{"setattr",	builtin_setattr, 1},
+	{"str",		builtin_str, 1},
+	{"tuple",	builtin_tuple, 1},
+	{"type",	builtin_type, 1},
+	{"vars",	builtin_vars, 1},
+	{"xrange",	builtin_xrange, 1},
 	{NULL,		NULL},
 };
 
@@ -1324,6 +1326,13 @@
 	return mappinglookup(builtin_dict, name);
 }
 
+object *
+getbuiltins(name)
+	char *name;
+{
+	return dictlookup(builtin_dict, name);
+}
+
 int
 setbuiltin(cname, value)
 	char *cname;