diff --git a/src/las.c b/src/las.c index 8b490c627e280637920e2cb2c90402a8048bbf1b..db1452237f17f8822f1f3bcec7597dc23ffa609e 100644 --- a/src/las.c +++ b/src/las.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: las.c,v 1.97 1999/11/06 00:08:45 grubba Exp $"); +RCSID("$Id: las.c,v 1.98 1999/11/06 01:38:12 grubba Exp $"); #include "language.h" #include "interpret.h" @@ -1930,6 +1930,22 @@ static void optimize(node *n) } break; + case F_CAST: + if (n->type == void_type_string) { + /* (void) const -> */ + if (!CAR(n) || CAR(n)->token == F_CONSTANT) + goto zap_node; + + /* (void)(X, const) -> (void)X */ + if (CAR(n)->token == F_COMMA_EXPR && + CDAR(n)->token == F_CONSTANT) { + tmp1 = mkcastnode(void_type_string, CAAR(n)); + CAAR(n) = 0; + goto use_tmp1; + } + } + break; + case F_RANGE: /* X[Y..Z] * Warn if Z is a constant <= 0. @@ -1952,29 +1968,13 @@ static void optimize(node *n) if (CAR(n)->token == F_CONSTANT) { goto use_cdr; } - /* ((void) const) , X -> X */ - if (CAR(n)->token == F_CAST && - CAR(n)->type == void_type_string && - CAAR(n)->token == F_CONSTANT) { - goto use_cdr; - } /* (X , const) , Y -> X , Y */ if (CAR(n)->token == F_COMMA_EXPR && - CDAR(n)->token == F_CONSTANT) { + CDAR(n) && CDAR(n)->token == F_CONSTANT) { tmp1 = mknode(F_COMMA_EXPR, CAAR(n), CDR(n)); CAAR(n) = CDR(n) = 0; goto use_tmp1; } - /* ((void)(X, const)), Y -> ((void) X), Y */ - if (CAR(n)->token == F_CAST && - CAR(n)->type == void_type_string && - CAAR(n)->token == F_COMMA_EXPR && - CDR(CAAR(n))->token == F_CONSTANT) { - tmp1 = mknode(F_COMMA_EXPR, mkcastnode(void_type_string, CAR(CAAR(n))), - CDR(n)); - CAR(CAAR(n)) = CDR(n) = 0; - goto use_tmp1; - } /* FALL_THROUGH */ case F_ARG_LIST: case F_LVALUE_LIST: @@ -2051,17 +2051,19 @@ static void optimize(node *n) CAAR(n)=CDDR(n)=CADR(n)=0; goto use_tmp1; } - /* 0 ? Y : Z -> Z */ - if (node_is_false(CAR(n))) { - tmp1 = CDDR(n); - CDDR(n) = 0; - goto use_tmp1; - } - /* 1 ? Y : Z -> Y */ - if (node_is_true(CAR(n))) { - tmp1 = CADR(n); - CADR(n) = 0; - goto use_tmp1; + if (CDR(n)) { + /* 0 ? Y : Z -> Z */ + if (node_is_false(CAR(n))) { + tmp1 = CDDR(n); + CDDR(n) = 0; + goto use_tmp1; + } + /* 1 ? Y : Z -> Y */ + if (node_is_true(CAR(n))) { + tmp1 = CADR(n); + CADR(n) = 0; + goto use_tmp1; + } } break; @@ -2349,13 +2351,20 @@ static void optimize(node *n) CDR(n)=0; goto use_tmp1; + zap_node: + tmp1 = 0; + goto use_tmp1; + use_tmp1: if(CAR(n->parent) == n) CAR(n->parent) = tmp1; else CDR(n->parent) = tmp1; - if(tmp1) tmp1->parent = n->parent; + if(tmp1) + tmp1->parent = n->parent; + else + tmp1 = n->parent; free_node(n); n=tmp1; #ifdef PIKE_DEBUG