Commit 94390a4e authored by Guido van Rossum's avatar Guido van Rossum

use getargs() in more cases;

oct(0) should return '0', not '00'
parent 2c475427
...@@ -50,32 +50,25 @@ builtin_abs(self, v) ...@@ -50,32 +50,25 @@ builtin_abs(self, v)
} }
static object * static object *
builtin_apply(self, v) builtin_apply(self, args)
object *self; object *self;
object *v; object *args;
{ {
object *func, *args; object *func, *arglist;
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { if (!getargs(args, "(OO)", &func, &arglist))
err_setstr(TypeError, "apply() requires (func,args)");
return NULL; return NULL;
} return call_object(func, arglist);
func = gettupleitem(v, 0);
args = gettupleitem(v, 1);
return call_object(func, args);
} }
static object * static object *
builtin_chr(self, v) builtin_chr(self, args)
object *self; object *self;
object *v; object *args;
{ {
long x; long x;
char s[1]; char s[1];
if (v == NULL || !is_intobject(v)) { if (!getargs(args, "l", &x))
err_setstr(TypeError, "chr() requires int argument");
return NULL; return NULL;
}
x = getintvalue(v);
if (x < 0 || x >= 256) { if (x < 0 || x >= 256) {
err_setstr(ValueError, "chr() arg not in range(256)"); err_setstr(ValueError, "chr() arg not in range(256)");
return NULL; return NULL;
...@@ -140,12 +133,8 @@ builtin_divmod(self, args) ...@@ -140,12 +133,8 @@ builtin_divmod(self, args)
object *args; object *args;
{ {
object *v, *w, *x; object *v, *w, *x;
if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) { if (!getargs(args, "(OO)", &v, &w))
err_setstr(TypeError, "divmod() requires 2 arguments");
return NULL; return NULL;
}
v = gettupleitem(args, 0);
w = gettupleitem(args, 1);
if (v->ob_type->tp_as_number == NULL || if (v->ob_type->tp_as_number == NULL ||
w->ob_type->tp_as_number == NULL) { w->ob_type->tp_as_number == NULL) {
err_setstr(TypeError, "divmod() requires numeric arguments"); err_setstr(TypeError, "divmod() requires numeric arguments");
...@@ -186,6 +175,10 @@ exec_eval(v, start) ...@@ -186,6 +175,10 @@ exec_eval(v, start)
return NULL; return NULL;
} }
s = getstringvalue(str); s = getstringvalue(str);
if (strlen(s) != getstringsize(str)) {
err_setstr(ValueError, "embedded '\\0' in string arg");
return NULL;
}
if (start == eval_input) { if (start == eval_input) {
while (*s == ' ' || *s == '\t') while (*s == ' ' || *s == '\t')
s++; s++;
...@@ -216,6 +209,7 @@ builtin_execfile(self, v) ...@@ -216,6 +209,7 @@ builtin_execfile(self, v)
{ {
object *str = NULL, *globals = NULL, *locals = NULL, *w; object *str = NULL, *globals = NULL, *locals = NULL, *w;
FILE* fp; FILE* fp;
char *s;
int n; int n;
if (v != NULL) { if (v != NULL) {
if (is_stringobject(v)) if (is_stringobject(v))
...@@ -235,8 +229,12 @@ builtin_execfile(self, v) ...@@ -235,8 +229,12 @@ builtin_execfile(self, v)
"execfile arguments must be filename[,dict[,dict]]"); "execfile arguments must be filename[,dict[,dict]]");
return NULL; return NULL;
} }
if (strlen(s) != getstringsize(str)) {
err_setstr(ValueError, "embedded '\\0' in string arg");
return NULL;
}
BGN_SAVE BGN_SAVE
fp = fopen(getstringvalue(str), "r"); fp = fopen(s, "r");
END_SAVE END_SAVE
if (fp == NULL) { if (fp == NULL) {
err_setstr(IOError, "execfile cannot open the file argument"); err_setstr(IOError, "execfile cannot open the file argument");
...@@ -276,34 +274,28 @@ builtin_float(self, v) ...@@ -276,34 +274,28 @@ builtin_float(self, v)
} }
static object * static object *
builtin_getattr(self, v) builtin_getattr(self, args)
object *self; object *self;
object *v; object *args;
{ {
object *name; object *v;
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 || char *name;
(name = gettupleitem(v, 1), !is_stringobject(name))) { if (!getargs(args, "(Os)", &v, &name))
err_setstr(TypeError,
"getattr() arguments must be (object, string)");
return NULL; return NULL;
} return getattr(v, name);
return getattr(gettupleitem(v, 0), getstringvalue(name));
} }
static object * static object *
builtin_setattr(self, v) builtin_setattr(self, args)
object *self; object *self;
object *v; object *args;
{ {
object *name; object *v;
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3 || char *name;
(name = gettupleitem(v, 1), !is_stringobject(name))) { object *value;
err_setstr(TypeError, if (!getargs(args, "(OsO)", &v, &name, &value))
"setattr() arguments must be (object, string, object)");
return NULL; return NULL;
} if (setattr(v, name, value) != 0)
if (setattr(gettupleitem(v, 0),
getstringvalue(name), gettupleitem(v, 2)) != 0)
return NULL; return NULL;
INCREF(None); INCREF(None);
return None; return None;
...@@ -502,7 +494,9 @@ builtin_oct(self, v) ...@@ -502,7 +494,9 @@ builtin_oct(self, v)
if (is_intobject(v)) { if (is_intobject(v)) {
char buf[20]; char buf[20];
long x = getintvalue(v); long x = getintvalue(v);
if (x >= 0) if (x == 0)
strcpy(buf, "0");
else if (x > 0)
sprintf(buf, "0%lo", x); sprintf(buf, "0%lo", x);
else else
sprintf(buf, "-0%lo", -x); sprintf(buf, "-0%lo", -x);
...@@ -517,35 +511,30 @@ builtin_oct(self, v) ...@@ -517,35 +511,30 @@ builtin_oct(self, v)
} }
static object * static object *
builtin_open(self, v) builtin_open(self, args)
object *self; object *self;
object *v; object *args;
{ {
object *name, *mode; char *name, *mode;
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 || if (!getargs(args, "(ss)", &name, &mode))
!is_stringobject(name = gettupleitem(v, 0)) ||
!is_stringobject(mode = gettupleitem(v, 1))) {
err_setstr(TypeError, "open() requires 2 string arguments");
return NULL; return NULL;
} return newfileobject(name, mode);
v = newfileobject(getstringvalue(name), getstringvalue(mode));
return v;
} }
static object * static object *
builtin_ord(self, v) builtin_ord(self, args)
object *self; object *self;
object *v; object *args;
{ {
if (v == NULL || !is_stringobject(v)) { char *s;
err_setstr(TypeError, "ord() must have string argument"); int len;
if (!getargs(args, "s#", &s, &len))
return NULL; return NULL;
} if (len != 1) {
if (getstringsize(v) != 1) {
err_setstr(ValueError, "ord() arg must have length 1"); err_setstr(ValueError, "ord() arg must have length 1");
return NULL; return NULL;
} }
return newintobject((long)(getstringvalue(v)[0] & 0xff)); return newintobject((long)(s[0] & 0xff));
} }
static object * static object *
...@@ -554,12 +543,8 @@ builtin_pow(self, args) ...@@ -554,12 +543,8 @@ builtin_pow(self, args)
object *args; object *args;
{ {
object *v, *w, *x; object *v, *w, *x;
if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) { if (!getargs(args, "(OO)", &v, &w))
err_setstr(TypeError, "pow() requires 2 arguments");
return NULL; return NULL;
}
v = gettupleitem(args, 0);
w = gettupleitem(args, 1);
if (v->ob_type->tp_as_number == NULL || if (v->ob_type->tp_as_number == NULL ||
w->ob_type->tp_as_number == NULL) { w->ob_type->tp_as_number == NULL) {
err_setstr(TypeError, "pow() requires numeric arguments"); err_setstr(TypeError, "pow() requires numeric arguments");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment