diff --git a/src/las.c b/src/las.c index 1f957ccfe2f66402c03409916683fc18d384906f..fc5d39def7dff6d0976de9dcbeb2241dbbacc8e1 100644 --- a/src/las.c +++ b/src/las.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: las.c,v 1.95 1999/11/05 17:06:43 grubba Exp $"); +RCSID("$Id: las.c,v 1.96 1999/11/05 23:22:04 grubba Exp $"); #include "language.h" #include "interpret.h" @@ -122,6 +122,7 @@ INT32 count_args(node *n) if(!n) return 0; switch(n->token) { + case F_COMMA_EXPR: case F_VAL_LVAL: case F_ARG_LIST: a=count_args(CAR(n)); @@ -1092,17 +1093,20 @@ node **last_cmd(node **a) node **n; if(!a || !*a) return (node **)NULL; if((*a)->token == F_CAST) return last_cmd(&CAR(*a)); - if((*a)->token != F_ARG_LIST) return a; + if(((*a)->token != F_ARG_LIST) && + ((*a)->token != F_COMMA_EXPR)) return a; if(CDR(*a)) { - if(CDR(*a)->token != F_CAST && CAR(*a)->token != F_ARG_LIST) + if(CDR(*a)->token != F_CAST && CAR(*a)->token != F_ARG_LIST && + CAR(*a)->token != F_COMMA_EXPR) return &CDR(*a); if((n=last_cmd(&CDR(*a)))) return n; } if(CAR(*a)) { - if(CAR(*a)->token != F_CAST && CAR(*a)->token != F_ARG_LIST) + if(CAR(*a)->token != F_CAST && CAR(*a)->token != F_ARG_LIST && + CAR(*a)->token != F_COMMA_EXPR) return &CAR(*a); if((n=last_cmd(&CAR(*a)))) return n; @@ -1206,6 +1210,7 @@ static void low_print_tree(node *foo,int needlval) break; } + case F_COMMA_EXPR: case F_ARG_LIST: low_print_tree(CAR(foo),0); if(CAR(foo) && CDR(foo)) @@ -1565,6 +1570,7 @@ static int cntargs(node *n) case F_INC_LOOP: case F_DEC_LOOP: return 0; + case F_COMMA_EXPR: case F_VAL_LVAL: case F_LVALUE_LIST: case F_ARG_LIST: @@ -1590,6 +1596,7 @@ static void low_build_function_type(node *n) } switch(n->token) { + case F_COMMA_EXPR: case F_ARG_LIST: low_build_function_type(CDR(n)); low_build_function_type(CAR(n)); @@ -1806,6 +1813,7 @@ void fix_type_field(node *n) n->type = get_type_of_svalue(& n->u.sval); break; + case F_COMMA_EXPR: case F_ARG_LIST: if(!CAR(n) || CAR(n)->type==void_type_string) { @@ -1936,6 +1944,23 @@ static void optimize(node *n) } break; + case F_COMMA_EXPR: + if(!CAR(n)) goto use_cdr; + if(!CDR(n)) goto use_car; + + /* const , X -> X */ + if (CAR(n)->token == F_CONSTANT) { + goto use_cdr; + } + /* (X , const) , Y -> X , Y */ + if (CAR(n)->token == F_COMMA_EXPR && + CDAR(n)->token == F_CONSTANT) { + tmp1 = mknode(F_COMMA_EXPR, CAAR(n), CDR(n)); + CAAR(n) = CDR(n) = 0; + goto use_tmp1; + } + + /* FALL_THROUGH */ case F_ARG_LIST: case F_LVALUE_LIST: if(!CAR(n)) goto use_cdr; @@ -1971,6 +1996,14 @@ static void optimize(node *n) if (node_is_false(CAR(n))) goto use_cdr; /* 1 || Y -> 1 */ if (node_is_true(CAR(n))) goto use_car; + /* (X = 0) || Y -> (X = 0) , Y */ + if ((CAR(n)->token == F_ASSIGN) && node_is_false(CDAR(n))) { + tmp1 = mknode(F_COMMA_EXPR, mkcastnode(void_type_string, CAR(n)), + CDR(n)); + CAR(n) = 0; + CDR(n) = 0; + goto use_tmp1; + } break; case F_LAND: @@ -1985,6 +2018,14 @@ static void optimize(node *n) if (node_is_false(CAR(n))) goto use_car; /* 1 && Y -> Y */ if (node_is_true(CAR(n))) goto use_cdr; + /* (X = 1) && Y -> (X = 1) , Y */ + if ((CAR(n)->token == F_ASSIGN) && node_is_true(CDAR(n))) { + tmp1 = mknode(F_COMMA_EXPR, mkcastnode(void_type_string, CAR(n)), + CDR(n)); + CAR(n) = 0; + CDR(n) = 0; + goto use_tmp1; + } break; case '?':