[Python-checkins] python/dist/src/Python ast.c,1.1.2.28,1.1.2.29

bcannon@users.sourceforge.net bcannon@users.sourceforge.net
Mon, 30 Jun 2003 22:32:39 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1:/tmp/cvs-serv14755/Python

Modified Files:
      Tag: ast-branch
	ast.c 
Log Message:
Catch when function arguments are out of order in terms of kinds of arguments
(default args, *NAME, etc.).  Needs better error reporting, though.

Currently causes a bus error (at least under OS X) because calls to the
affected function do not currently check the return value for possible NULL
arguments to flag a failure.


Index: ast.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/ast.c,v
retrieving revision 1.1.2.28
retrieving revision 1.1.2.29
diff -C2 -d -r1.1.2.28 -r1.1.2.29
*** ast.c	1 Jul 2003 05:24:58 -0000	1.1.2.28
--- ast.c	1 Jul 2003 05:32:37 -0000	1.1.2.29
***************
*** 92,96 ****
  }
  
! mod_ty PyAST_FromNode(const node *n)
  {
      int i, j, num, total;
--- 92,100 ----
  }
  
! /* Generate AST from concrete syntax tree
! */
! 
! mod_ty
! PyAST_FromNode(const node *n)
  {
      int i, j, num, total;
***************
*** 352,355 ****
--- 356,361 ----
      /* XXX TO DO
         check for invalid argument lists like normal after default
+             DONE; causes bus error since calls to this function do not check
+             for possible NULL result to signal an error.
         handle nested tuple arguments
      */
***************
*** 363,366 ****
--- 369,377 ----
      identifier vararg = NULL, kwarg = NULL;
      node *ch;
+     /* Used to make sure that different kinds of arguments come in the proper
+        order */
+     enum parameter_kinds
+             {fpdef_kind=1, defaults_kind=2, vararg_kind=3, kwarg_kind=4}
+             parameter_kind = fpdef_kind;
  
      if (TYPE(n) == parameters) {
***************
*** 404,412 ****
  		return NULL;
  	    }
! 	    if (TYPE(CHILD(ch, 0)) == NAME)
! 		asdl_seq_APPEND(args, Name(NEW_IDENTIFIER(CHILD(ch, 0)),
! 					   Param));
  	    if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
  		asdl_seq_APPEND(defaults, ast_for_expr(CHILD(n, i + 2)));
  		i += 2;
  	    }
--- 415,437 ----
  		return NULL;
  	    }
! 	    if (TYPE(CHILD(ch, 0)) == NAME) {
!                 if (parameter_kind > fpdef_kind) {
!                     fprintf(stderr, "Error in order of arg kinds\n");
!                     PyErr_Occurred();
!                     return NULL;
!                 }
!                     asdl_seq_APPEND(args, Name(NEW_IDENTIFIER(CHILD(ch, 0)),
!                                     Param));
!                     /* Don't need to set parameter_kind since that is the
!                        default */
!             }
  	    if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
+                 if (parameter_kind > defaults_kind) {
+                     fprintf(stderr, "Error in order of arg kinds\n");
+                     PyErr_Occurred();
+                     return NULL;
+                 }
  		asdl_seq_APPEND(defaults, ast_for_expr(CHILD(n, i + 2)));
+                 parameter_kind = defaults_kind;
  		i += 2;
  	    }
***************
*** 414,422 ****
--- 439,459 ----
  	    break;
  	case STAR:
+             if (parameter_kind > vararg_kind) {
+                 fprintf(stderr, "Error in order of arg kinds\n");
+                 PyErr_Occurred();
+                 return NULL;
+             }
  	    vararg = NEW_IDENTIFIER(CHILD(n, i+1));
+             parameter_kind = vararg_kind;
  	    i += 3;
  	    break;
  	case DOUBLESTAR:
+             if (parameter_kind > kwarg_kind) {
+                 fprintf(stderr, "Error in order of arg kinds\n");
+                 PyErr_Occurred();
+                 return NULL;
+             }
  	    kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
+             parameter_kind = kwarg_kind;
  	    i += 3;
  	    break;