pike.git / src / las.c

version» Context lines:

pike.git/src/las.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/   /**/   #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"   #include "las.h"   #include "array.h"   #include "object.h"   #include "stralloc.h"   #include "dynamic_buffer.h"   #include "lex.h"   #include "pike_types.h"
pike.git/src/las.c:1923:    CAR(n)->u.sval.subtype == FUNCTION_BUILTIN && /* driver fun? */    CAR(n)->u.sval.u.efun->optimize)    {    if((tmp1=CAR(n)->u.sval.u.efun->optimize(n)))    {    goto use_tmp1;    }    }    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.    */    if (CDR(n)->token == F_ARG_LIST &&    CDDR(n)->token == F_CONSTANT &&    ((CDDR(n)->u.sval.type == T_INT &&    CDDR(n)->u.sval.u.integer <= 0) ||    (CDDR(n)->u.sval.type == T_FLOAT &&    CDDR(n)->u.sval.u.float_number <= 0.0))) {
pike.git/src/las.c:1945:    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;    } -  /* ((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:    if(!CAR(n)) goto use_cdr;    if(!CDR(n)) goto use_car;       /*    * { X; break; Y; } -> { X; return; }    * { X; return; Y; } -> { X; return; }    * { X; continue; Y; } -> { X; return; }
pike.git/src/las.c:2044:    break;       case '?':    /* (! X) ? Y : Z -> X ? Z : Y */    if(CAR(n)->token == F_NOT)    {    tmp1=mknode('?',CAAR(n),mknode(':',CDDR(n),CADR(n)));    CAAR(n)=CDDR(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;       case F_ADD_EQ:    if(CDR(n)->token == F_CONSTANT && CDR(n)->u.sval.type == T_INT)    {    /* a+=0 -> a */    if(CDR(n)->u.sval.u.integer == 0) goto use_car;       /* a+=1 -> ++a */    if(CDR(n)->u.sval.u.integer == 1)
pike.git/src/las.c:2342:    use_car:    tmp1=CAR(n);    CAR(n)=0;    goto use_tmp1;       use_cdr:    tmp1=CDR(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    if(l_flag > 3)    {    fprintf(stderr,"Result: ");    print_tree(n);    }   #endif    continue;