From: Olly B. <ol...@us...> - 2006-09-20 11:20:55
|
Update of /cvsroot/swig/SWIG/Source/CParse In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv27298/Source/CParse Modified Files: parser.y Log Message: Allow templates to be instantiated using negative numbers and constant expressions (which fixes SF bug #956282 and several others). Index: parser.y =================================================================== RCS file: /cvsroot/swig/SWIG/Source/CParse/parser.y,v retrieving revision 1.192 retrieving revision 1.193 diff -C2 -d -r1.192 -r1.193 *** parser.y 20 Sep 2006 08:04:24 -0000 1.192 --- parser.y 20 Sep 2006 11:20:52 -0000 1.193 *************** *** 337,344 **** /* private are needed only when they are pure virtuals */ Setattr(n,k_access, "private"); ! if ((Cmp(Getattr(n,k_storage),"virtual") == 0) ! && (Cmp(Getattr(n,k_value),"0") == 0)) { ! only_csymbol = !Swig_need_protected(n); ! } } if (only_csymbol) { --- 337,344 ---- /* private are needed only when they are pure virtuals */ Setattr(n,k_access, "private"); ! if ((Cmp(Getattr(n,k_storage),"virtual") == 0) ! && (Cmp(Getattr(n,k_value),"0") == 0)) { ! only_csymbol = !Swig_need_protected(n); ! } } if (only_csymbol) { *************** *** 1441,1445 **** %type <bases> base_list inherit raw_inherit; %type <dtype> definetype def_args etype; ! %type <dtype> expr exprnum exprcompound ; %type <id> ename ; %type <id> template_decl; --- 1441,1445 ---- %type <bases> base_list inherit raw_inherit; %type <dtype> definetype def_args etype; ! %type <dtype> expr exprnum exprcompound valexpr; %type <id> ename ; %type <id> template_decl; *************** *** 4433,4454 **** } } ! ! } ! | exprnum { ! $$ = NewParm(0,0); ! Setfile($$,cparse_file); ! Setline($$,cparse_line); ! Setattr($$,k_value,$1.val); } ! | STRING { ! String *v = NewString($1); $$ = NewParm(0,0); Setfile($$,cparse_file); Setline($$,cparse_line); ! Setattr($$,k_value,v); ! Delete(v); } ; ! def_args : EQUAL definetype { $$ = $2; --- 4433,4446 ---- } } ! } ! | valexpr { $$ = NewParm(0,0); Setfile($$,cparse_file); Setline($$,cparse_line); ! Setattr($$,k_value,$1.val); } ; ! def_args : EQUAL definetype { $$ = $2; *************** *** 5273,5283 **** */ ! expr : exprnum { $$ = $1; } ! | string { ! $$.val = NewString($1); ! $$.type = T_STRING; } | SIZEOF LPAREN type parameter_declarator RPAREN { ! SwigType_push($3,$4.type); $$.val = NewStringf("sizeof(%s)",SwigType_str($3,0)); $$.type = T_ULONG; --- 5265,5295 ---- */ ! expr : valexpr { $$ = $1; } ! | type { ! Node *n; ! $$.val = $1; ! $$.type = T_INT; ! /* Check if value is in scope */ ! n = Swig_symbol_clookup($1,0); ! if (n) { ! /* A band-aid for enum values used in expressions. */ ! if (Strcmp(nodeType(n),"enumitem") == 0) { ! String *q = Swig_symbol_qualified(n); ! if (q) { ! $$.val = NewStringf("%s::%s", q, Getattr(n,k_name)); ! Delete(q); ! } ! } ! } ! } ! ; ! ! valexpr : exprnum { $$ = $1; } ! | string { ! $$.val = NewString($1); ! $$.type = T_STRING; } | SIZEOF LPAREN type parameter_declarator RPAREN { ! SwigType_push($3,$4.type); $$.val = NewStringf("sizeof(%s)",SwigType_str($3,0)); $$.type = T_ULONG; *************** *** 5296,5316 **** $$.throwf = 0; } - | type { - Node *n; - $$.val = $1; - $$.type = T_INT; - /* Check if value is in scope */ - n = Swig_symbol_clookup($1,0); - if (n) { - /* A band-aid for enum values used in expressions. */ - if (Strcmp(nodeType(n),"enumitem") == 0) { - String *q = Swig_symbol_qualified(n); - if (q) { - $$.val = NewStringf("%s::%s", q, Getattr(n,k_name)); - Delete(q); - } - } - } - } /* grouping */ --- 5308,5311 ---- *************** *** 5413,5417 **** $$.type = T_INT; } ! | MINUS expr %prec UMINUS { $$.val = NewStringf("-%s",$2.val); $$.type = $2.type; --- 5408,5412 ---- $$.type = T_INT; } ! | MINUS expr %prec UMINUS { $$.val = NewStringf("-%s",$2.val); $$.type = $2.type; *************** *** 5420,5424 **** $$.val = NewStringf("+%s",$2.val); $$.type = $2.type; ! } | NOT expr { $$.val = NewStringf("~%s",$2.val); --- 5415,5419 ---- $$.val = NewStringf("+%s",$2.val); $$.type = $2.type; ! } | NOT expr { $$.val = NewStringf("~%s",$2.val); |