Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 94390a4

Browse files
committed
use getargs() in more cases;
oct(0) should return '0', not '00'
1 parent 2c47542 commit 94390a4

1 file changed

Lines changed: 48 additions & 63 deletions

File tree

Python/bltinmodule.c

Lines changed: 48 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -50,32 +50,25 @@ builtin_abs(self, v)
5050
}
5151

5252
static object *
53-
builtin_apply(self, v)
53+
builtin_apply(self, args)
5454
object *self;
55-
object *v;
55+
object *args;
5656
{
57-
object *func, *args;
58-
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
59-
err_setstr(TypeError, "apply() requires (func,args)");
57+
object *func, *arglist;
58+
if (!getargs(args, "(OO)", &func, &arglist))
6059
return NULL;
61-
}
62-
func = gettupleitem(v, 0);
63-
args = gettupleitem(v, 1);
64-
return call_object(func, args);
60+
return call_object(func, arglist);
6561
}
6662

6763
static object *
68-
builtin_chr(self, v)
64+
builtin_chr(self, args)
6965
object *self;
70-
object *v;
66+
object *args;
7167
{
7268
long x;
7369
char s[1];
74-
if (v == NULL || !is_intobject(v)) {
75-
err_setstr(TypeError, "chr() requires int argument");
70+
if (!getargs(args, "l", &x))
7671
return NULL;
77-
}
78-
x = getintvalue(v);
7972
if (x < 0 || x >= 256) {
8073
err_setstr(ValueError, "chr() arg not in range(256)");
8174
return NULL;
@@ -140,12 +133,8 @@ builtin_divmod(self, args)
140133
object *args;
141134
{
142135
object *v, *w, *x;
143-
if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
144-
err_setstr(TypeError, "divmod() requires 2 arguments");
136+
if (!getargs(args, "(OO)", &v, &w))
145137
return NULL;
146-
}
147-
v = gettupleitem(args, 0);
148-
w = gettupleitem(args, 1);
149138
if (v->ob_type->tp_as_number == NULL ||
150139
w->ob_type->tp_as_number == NULL) {
151140
err_setstr(TypeError, "divmod() requires numeric arguments");
@@ -186,6 +175,10 @@ exec_eval(v, start)
186175
return NULL;
187176
}
188177
s = getstringvalue(str);
178+
if (strlen(s) != getstringsize(str)) {
179+
err_setstr(ValueError, "embedded '\\0' in string arg");
180+
return NULL;
181+
}
189182
if (start == eval_input) {
190183
while (*s == ' ' || *s == '\t')
191184
s++;
@@ -216,6 +209,7 @@ builtin_execfile(self, v)
216209
{
217210
object *str = NULL, *globals = NULL, *locals = NULL, *w;
218211
FILE* fp;
212+
char *s;
219213
int n;
220214
if (v != NULL) {
221215
if (is_stringobject(v))
@@ -235,8 +229,12 @@ builtin_execfile(self, v)
235229
"execfile arguments must be filename[,dict[,dict]]");
236230
return NULL;
237231
}
232+
if (strlen(s) != getstringsize(str)) {
233+
err_setstr(ValueError, "embedded '\\0' in string arg");
234+
return NULL;
235+
}
238236
BGN_SAVE
239-
fp = fopen(getstringvalue(str), "r");
237+
fp = fopen(s, "r");
240238
END_SAVE
241239
if (fp == NULL) {
242240
err_setstr(IOError, "execfile cannot open the file argument");
@@ -276,34 +274,28 @@ builtin_float(self, v)
276274
}
277275

278276
static object *
279-
builtin_getattr(self, v)
277+
builtin_getattr(self, args)
280278
object *self;
281-
object *v;
279+
object *args;
282280
{
283-
object *name;
284-
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
285-
(name = gettupleitem(v, 1), !is_stringobject(name))) {
286-
err_setstr(TypeError,
287-
"getattr() arguments must be (object, string)");
281+
object *v;
282+
char *name;
283+
if (!getargs(args, "(Os)", &v, &name))
288284
return NULL;
289-
}
290-
return getattr(gettupleitem(v, 0), getstringvalue(name));
285+
return getattr(v, name);
291286
}
292287

293288
static object *
294-
builtin_setattr(self, v)
289+
builtin_setattr(self, args)
295290
object *self;
296-
object *v;
291+
object *args;
297292
{
298-
object *name;
299-
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3 ||
300-
(name = gettupleitem(v, 1), !is_stringobject(name))) {
301-
err_setstr(TypeError,
302-
"setattr() arguments must be (object, string, object)");
293+
object *v;
294+
char *name;
295+
object *value;
296+
if (!getargs(args, "(OsO)", &v, &name, &value))
303297
return NULL;
304-
}
305-
if (setattr(gettupleitem(v, 0),
306-
getstringvalue(name), gettupleitem(v, 2)) != 0)
298+
if (setattr(v, name, value) != 0)
307299
return NULL;
308300
INCREF(None);
309301
return None;
@@ -502,7 +494,9 @@ builtin_oct(self, v)
502494
if (is_intobject(v)) {
503495
char buf[20];
504496
long x = getintvalue(v);
505-
if (x >= 0)
497+
if (x == 0)
498+
strcpy(buf, "0");
499+
else if (x > 0)
506500
sprintf(buf, "0%lo", x);
507501
else
508502
sprintf(buf, "-0%lo", -x);
@@ -517,35 +511,30 @@ builtin_oct(self, v)
517511
}
518512

519513
static object *
520-
builtin_open(self, v)
514+
builtin_open(self, args)
521515
object *self;
522-
object *v;
516+
object *args;
523517
{
524-
object *name, *mode;
525-
if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
526-
!is_stringobject(name = gettupleitem(v, 0)) ||
527-
!is_stringobject(mode = gettupleitem(v, 1))) {
528-
err_setstr(TypeError, "open() requires 2 string arguments");
518+
char *name, *mode;
519+
if (!getargs(args, "(ss)", &name, &mode))
529520
return NULL;
530-
}
531-
v = newfileobject(getstringvalue(name), getstringvalue(mode));
532-
return v;
521+
return newfileobject(name, mode);
533522
}
534523

535524
static object *
536-
builtin_ord(self, v)
525+
builtin_ord(self, args)
537526
object *self;
538-
object *v;
527+
object *args;
539528
{
540-
if (v == NULL || !is_stringobject(v)) {
541-
err_setstr(TypeError, "ord() must have string argument");
529+
char *s;
530+
int len;
531+
if (!getargs(args, "s#", &s, &len))
542532
return NULL;
543-
}
544-
if (getstringsize(v) != 1) {
533+
if (len != 1) {
545534
err_setstr(ValueError, "ord() arg must have length 1");
546535
return NULL;
547536
}
548-
return newintobject((long)(getstringvalue(v)[0] & 0xff));
537+
return newintobject((long)(s[0] & 0xff));
549538
}
550539

551540
static object *
@@ -554,12 +543,8 @@ builtin_pow(self, args)
554543
object *args;
555544
{
556545
object *v, *w, *x;
557-
if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
558-
err_setstr(TypeError, "pow() requires 2 arguments");
546+
if (!getargs(args, "(OO)", &v, &w))
559547
return NULL;
560-
}
561-
v = gettupleitem(args, 0);
562-
w = gettupleitem(args, 1);
563548
if (v->ob_type->tp_as_number == NULL ||
564549
w->ob_type->tp_as_number == NULL) {
565550
err_setstr(TypeError, "pow() requires numeric arguments");

0 commit comments

Comments
 (0)