@@ -50,32 +50,25 @@ builtin_abs(self, v)
5050}
5151
5252static 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
6763static 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
278276static 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
293288static 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
519513static 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
535524static 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
551540static 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