[Python-checkins] python/dist/src/Python ast.c,1.1.2.26,1.1.2.27

jhylton@users.sourceforge.net jhylton@users.sourceforge.net
Mon, 28 Apr 2003 05:11:27 -0700


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

Modified Files:
      Tag: ast-branch
	ast.c 
Log Message:
Handle keyword arguments at call site.


Index: ast.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/ast.c,v
retrieving revision 1.1.2.26
retrieving revision 1.1.2.27
diff -C2 -d -r1.1.2.26 -r1.1.2.27
*** ast.c	3 Apr 2003 00:51:45 -0000	1.1.2.26
--- ast.c	28 Apr 2003 12:11:22 -0000	1.1.2.27
***************
*** 869,900 ****
      */
  
!     int i, nargs;
      asdl_seq *args = NULL;
  
      REQ(n, arglist);
  
      nargs = 0;
!     for (i = 0; i < NCH(n); i++)
! 	if (TYPE(CHILD(n, i)) == argument)
! 	    nargs++;
  
      args = asdl_seq_new(nargs);
      if (!args)
      	return NULL;
      for (i = 0; i < NCH(n); i++) {
  	node *ch = CHILD(n, i);
  	if (TYPE(ch) == argument) {
  	    expr_ty e;
! 	    if (NCH(ch) == 1)
  		e = ast_for_expr(CHILD(ch, 0));
! 	    else
! 		e = NULL;
! 	    asdl_seq_SET(args, i / 2, e);
  	}
      }
  
- 
      /* XXX syntax error if more than 255 arguments */
!     return Call(func, args, NULL, NULL, NULL);
  }
  
--- 869,922 ----
      */
  
!     int i, nargs, nkeywords;
      asdl_seq *args = NULL;
+     asdl_seq *keywords = NULL;
  
      REQ(n, arglist);
  
      nargs = 0;
!     nkeywords = 0;
!     for (i = 0; i < NCH(n); i++) 
! 	if (TYPE(CHILD(n, i)) == argument) {
! 	    if (NCH(CHILD(n, i)) == 1)
! 		nargs++;
! 	    else
! 		nkeywords++;
! 	}
  
      args = asdl_seq_new(nargs);
      if (!args)
      	return NULL;
+     keywords = asdl_seq_new(nkeywords);
+     if (!keywords)
+ 	return NULL;
+     nargs = 0;
+     nkeywords = 0;
      for (i = 0; i < NCH(n); i++) {
  	node *ch = CHILD(n, i);
  	if (TYPE(ch) == argument) {
  	    expr_ty e;
! 	    if (NCH(ch) == 1) {
  		e = ast_for_expr(CHILD(ch, 0));
! 		asdl_seq_SET(args, nargs++, e);
! 	    }  
! 	    else {
! 		keyword_ty kw;
! 		identifier key;
! 
! 		/* CHILD(ch, 0) is test, but must be an identifier? */ 
! 		e = ast_for_expr(CHILD(ch, 0));
! 		assert(e->kind == Name_kind);
! 		key = e->v.Name.id;
! 		free(e);
! 		e = ast_for_expr(CHILD(ch, 2));
! 		kw = keyword(key, e);
! 		asdl_seq_SET(keywords, nkeywords++, kw);
! 	    }
  	}
      }
  
      /* XXX syntax error if more than 255 arguments */
!     return Call(func, args, keywords, NULL, NULL);
  }