Index: Grammar/Grammar
===================================================================
RCS file: /cvsroot/python/python/dist/src/Grammar/Grammar,v
retrieving revision 1.48
diff -c -r1.48 Grammar
*** Grammar/Grammar	4 Aug 2002 17:29:52 -0000	1.48
--- Grammar/Grammar	30 Jan 2003 15:14:48 -0000
***************
*** 28,34 ****
  file_input: (NEWLINE | stmt)* ENDMARKER
  eval_input: testlist NEWLINE* ENDMARKER
  
! funcdef: 'def' NAME parameters ':' suite
  parameters: '(' [varargslist] ')'
  varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
  fpdef: NAME | '(' fplist ')'
--- 28,34 ----
  file_input: (NEWLINE | stmt)* ENDMARKER
  eval_input: testlist NEWLINE* ENDMARKER
  
! funcdef: 'def' NAME parameters ['[' exprlist ']' ] ':' suite
  parameters: '(' [varargslist] ')'
  varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
  fpdef: NAME | '(' fplist ')'
***************
*** 92,98 ****
  testlist_safe: test [(',' test)+ [',']]
  dictmaker: test ':' test (',' test ':' test)* [',']
  
! classdef: 'class' NAME ['(' testlist ')'] ':' suite
  
  arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test)
  argument: [test '='] test	# Really [keyword '='] test
--- 92,98 ----
  testlist_safe: test [(',' test)+ [',']]
  dictmaker: test ':' test (',' test ':' test)* [',']
  
! classdef: 'class' NAME ['(' testlist ')'] ['[' exprlist ']'] ':' suite
  
  arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test)
  argument: [test '='] test	# Really [keyword '='] test
Index: Python/compile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v
retrieving revision 2.272
diff -c -r2.272 compile.c
*** Python/compile.c	16 Jan 2003 15:39:07 -0000	2.272
--- Python/compile.c	30 Jan 2003 15:14:49 -0000
***************
*** 617,622 ****
--- 617,623 ----
  static void symtable_node(struct symtable *, node *);
  static void symtable_funcdef(struct symtable *, node *);
  static void symtable_default_args(struct symtable *, node *);
+ static void symtable_filters(struct symtable *, node *);
  static void symtable_params(struct symtable *, node *);
  static void symtable_params_fplist(struct symtable *, node *n);
  static void symtable_global(struct symtable *, node *);
***************
*** 3641,3647 ****
  {
  	PyObject *co;
  	int ndefs;
! 	REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
  	ndefs = com_argdefs(c, n);
  	symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
  			     n->n_lineno);
--- 3642,3649 ----
  {
  	PyObject *co;
  	int ndefs;
! 	REQ(n, funcdef); 
! 	/* funcdef: 'def' NAME parameters [ '[' exprlist ']' ] ':' suite */
  	ndefs = com_argdefs(c, n);
  	symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
  			     n->n_lineno);
***************
*** 3659,3664 ****
--- 3661,3678 ----
  		else
  			com_addoparg(c, MAKE_FUNCTION, ndefs);
  		com_pop(c, ndefs);
+ 		/* [] stuff goes here */
+ 		if (TYPE(CHILD(n, 3)) == LSQB) {
+ 			node* filters = CHILD(n, 4);
+ 			int filteri = 0;
+ 
+ 			for (; filteri < NCH(filters); filteri += 2) {
+ 				com_node(c, CHILD(filters, filteri));
+ 				com_addbyte(c, ROT_TWO);
+ 				com_addoparg(c, CALL_FUNCTION, 1);
+ 				com_pop(c, 1);
+ 			}
+ 		}
  		com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
  		com_pop(c, 1);
  		Py_DECREF(co);
***************
*** 3687,3693 ****
  	char *name;
  
  	REQ(n, classdef);
! 	/* classdef: class NAME ['(' testlist ')'] ':' suite */
  	if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
  		c->c_errors++;
  		return;
--- 3701,3708 ----
  	char *name;
  
  	REQ(n, classdef);
! 	/* classdef: 'class' NAME ['(' testlist ')'] ['[' exprlist ']'] ':' 
! 			suite */
  	if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
  		c->c_errors++;
  		return;
***************
*** 3712,3717 ****
--- 3727,3734 ----
  		c->c_errors++;
  	else {
  		int closure = com_make_closure(c, co);
+ 		int filter_child = -1;
+ 
  		i = com_addconst(c, (PyObject *)co);
  		com_addoparg(c, LOAD_CONST, i);
  		com_push(c, 1);
***************
*** 3723,3728 ****
--- 3740,3764 ----
  		com_addoparg(c, CALL_FUNCTION, 0);
  		com_addbyte(c, BUILD_CLASS);
  		com_pop(c, 2);
+ 		
+ 		if (TYPE(CHILD(n, 2)) == LSQB) {
+ 			filter_child = 3;
+ 		}
+ 		else if (NCH(n) >= 6 && TYPE(CHILD(n, 5)) == LSQB) {
+ 			filter_child = 6;
+ 		}
+ 
+ 		if (filter_child != -1) {
+ 			node* filters = CHILD(n, filter_child);
+ 			int filteri = 0;
+ 
+ 			for (; filteri < NCH(filters); filteri += 2) {
+ 				com_node(c, CHILD(filters, filteri));
+ 				com_addbyte(c, ROT_TWO);
+ 				com_addoparg(c, CALL_FUNCTION, 1);
+ 				com_pop(c, 1);
+ 			}
+ 		}		
  		com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
  		com_pop(c, 1);
  		Py_DECREF(co);
***************
*** 4003,4011 ****
  {
  	PyObject *doc;
  	node *ch;
! 	REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
  	c->c_name = STR(CHILD(n, 1));
! 	doc = get_docstring(c, CHILD(n, 4));
  	if (doc != NULL) {
  		(void) com_addconst(c, doc);
  		Py_DECREF(doc);
--- 4039,4050 ----
  {
  	PyObject *doc;
  	node *ch;
! 	
! 	REQ(n, funcdef);
! 	/* funcdef: 'def' NAME parameters [ '[' exprlist ']' ] ':' suite */
! 	
  	c->c_name = STR(CHILD(n, 1));
! 	doc = get_docstring(c, CHILD(n, NCH(n)-1));
  	if (doc != NULL) {
  		(void) com_addconst(c, doc);
  		Py_DECREF(doc);
***************
*** 4017,4023 ****
  	if (TYPE(ch) == varargslist)
  		com_arglist(c, ch);
  	c->c_infunction = 1;
! 	com_node(c, CHILD(n, 4));
  	c->c_infunction = 0;
  	com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
  	com_push(c, 1);
--- 4056,4062 ----
  	if (TYPE(ch) == varargslist)
  		com_arglist(c, ch);
  	c->c_infunction = 1;
! 	com_node(c, CHILD(n, NCH(n)-1));
  	c->c_infunction = 0;
  	com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
  	com_push(c, 1);
***************
*** 4051,4057 ****
  	node *ch;
  	PyObject *doc;
  	REQ(n, classdef);
! 	/* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
  	c->c_name = STR(CHILD(n, 1));
  	c->c_private = c->c_name;
  	/* Initialize local __module__ from global __name__ */
--- 4090,4097 ----
  	node *ch;
  	PyObject *doc;
  	REQ(n, classdef);
! 	/* classdef: 'class' NAME ['(' testlist ')'] ['[' exprlist ']'] ':' 
! 			suite */
  	c->c_name = STR(CHILD(n, 1));
  	c->c_private = c->c_name;
  	/* Initialize local __module__ from global __name__ */
***************
*** 5147,5152 ****
--- 5187,5195 ----
  		symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
  		symtable_funcdef(st, n);
  		symtable_exit_scope(st);
+ 		if (TYPE(CHILD(n, 3)) == LSQB) {
+ 			symtable_filters(st, CHILD(n, 4));
+ 		}
  		break;
  	}
  	case lambdef:
***************
*** 5158,5163 ****
--- 5201,5207 ----
  		break;
  	case classdef: {
  		char *tmp, *class_name = STR(CHILD(n, 1));
+ 		int filter_child = -1;
  		symtable_add_def(st, class_name, DEF_LOCAL);
  		if (TYPE(CHILD(n, 2)) == LPAR) {
  			node *bases = CHILD(n, 3);
***************
*** 5166,5171 ****
--- 5210,5224 ----
  				symtable_node(st, CHILD(bases, i));
  			}
  		}
+ 		if (TYPE(CHILD(n, 2)) == LSQB) {
+ 			filter_child = 3;
+ 		}
+ 		else if (NCH(n) >= 6 && TYPE(CHILD(n, 5)) == LSQB) {
+ 			filter_child = 6;
+ 		}
+ 		if (filter_child != -1) {
+ 			symtable_filters(st, CHILD(n, filter_child));
+ 		}		
  		symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
  		tmp = st->st_private;
  		st->st_private = class_name;
***************
*** 5356,5361 ****
--- 5409,5426 ----
  		if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
  			symtable_node(st, CHILD(n, i));
  	}
+ }
+ 
+ static void
+ symtable_filters(struct symtable *st, node *n)
+ {
+ 	int i;
+ 	int len;
+ 	
+ 	REQ(n, exprlist);
+ 	len = (NCH(n) + 1) / 2;
+ 	for (i = 0; i < NCH(n); i += 2)
+ 		symtable_node(st, CHILD(n, i));
  }
  
  static void
