[Python-checkins] CVS: python/dist/src/Python getargs.c,2.59,2.60

Jeremy Hylton jhylton@users.sourceforge.net
2001年5月29日 10:46:21 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv13431
Modified Files:
	getargs.c 
Log Message:
Change cascaded if stmts to switch stmt in vgetargs1().
In the default branch, keep three ifs that are used if level == 0, the
most common case. Note that first if here is a slight optimization
for the 'O' format.
Second part of SF patch 426072.
Index: getargs.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/getargs.c,v
retrieving revision 2.59
retrieving revision 2.60
diff -C2 -r2.59 -r2.60
*** getargs.c	2001年05月29日 17:37:05	2.59
--- getargs.c	2001年05月29日 17:46:19	2.60
***************
*** 81,84 ****
--- 81,85 ----
 	int max = 0;
 	int level = 0;
+ 	int endfmt = 0;
 	char *formatsave = format;
 	int i, len;
***************
*** 87,122 ****
 	assert(compat || (args != (PyObject*)NULL));
 
! 	for (;;) {
 		int c = *format++;
! 		if (c == '(' /* ')' */) {
 			if (level == 0)
 				max++;
 			level++;
! 		}
! 		else if (/* '(' */ c == ')') {
 			if (level == 0)
! 				Py_FatalError(/* '(' */
! 				 "excess ')' in getargs format");
 			else
 				level--;
- 		}
- 		else if (c == '0円')
 			break;
! 		else if (c == ':') {
 			fname = format;
 			break;
! 		}
! 		else if (c == ';') {
 			message = format;
 			break;
 		}
- 		else if (level != 0)
- 			; /* Pass */
- 		else if (c == 'e')
- 			; /* Pass */
- 		else if (isalpha(c))
- 			max++;
- 		else if (c == '|')
- 			min = max;
 	}
 	
--- 88,128 ----
 	assert(compat || (args != (PyObject*)NULL));
 
! 	while (endfmt == 0) {
 		int c = *format++;
! 		switch (c) {
! 		case '(':
 			if (level == 0)
 				max++;
 			level++;
! 			break;
! 		case ')':
 			if (level == 0)
! 				Py_FatalError("excess ')' in getargs format");
 			else
 				level--;
 			break;
! 		case '0円':
! 			endfmt = 1;
! 			break;
! 		case ':':
 			fname = format;
+ 			endfmt = 1;
 			break;
! 		case ';':
 			message = format;
+ 			endfmt = 1;
+ 			break;
+ 		default:
+ 			if (level == 0) {
+ 				if (c == 'O')
+ 					max++;
+ 				else if (isalpha(c)) {
+ 					if (c != 'e') /* skip encoded */
+ 						max++;
+ 				} else if (c == '|')
+ 					min = max;
+ 			}
 			break;
 		}
 	}
 	

AltStyle によって変換されたページ (->オリジナル) /