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.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"   #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:115:   }   #endif      INT32 count_args(node *n)   {    int a,b;    check_tree(n,0);    if(!n) return 0;    switch(n->token)    { +  case F_COMMA_EXPR:    case F_VAL_LVAL:    case F_ARG_LIST:    a=count_args(CAR(n));    if(a==-1) return -1;    b=count_args(CDR(n));    if(b==-1) return -1;    return a+b;       case F_CAST:    if(n->type == void_type_string)
pike.git/src/las.c:1085:    if(!n) return 0;    if(!n->type) return 1;    return type_may_overload(n->type->str, lfun);   }      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;    }    return 0;   }      static node **low_get_arg(node **a,int *nr)   {    node **n;
pike.git/src/las.c:1199:    init_buf();    low_describe_type(foo->type->str);    s=simple_free_buf();    printf("(%s){",s);    free(s);    low_print_tree(CAR(foo),0);    printf("}");    break;    }    +  case F_COMMA_EXPR:    case F_ARG_LIST:    low_print_tree(CAR(foo),0);    if(CAR(foo) && CDR(foo))    {    if(CAR(foo)->type == void_type_string &&    CDR(foo)->type == void_type_string)    printf(";\n");    else    putchar(',');    }
pike.git/src/las.c:1558:    case F_CAST:    case F_APPLY:    return n->type != void_type_string;       case F_FOREACH:    case F_INC_NEQ_LOOP:    case F_DEC_NEQ_LOOP:    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:    return cntargs(CAR(n))+cntargs(CDR(n));       /* this might not be true, but it doesn't matter very much */    default: return 1;    }   }   
pike.git/src/las.c:1583:    if(function_type_max++ > 999)    {    reset_type_stack();    push_type(T_MIXED);    push_type(T_MIXED); /* is varargs */    push_type(T_MANY);    return;    }    switch(n->token)    { +  case F_COMMA_EXPR:    case F_ARG_LIST:    low_build_function_type(CDR(n));    low_build_function_type(CAR(n));    break;       case F_PUSH_ARRAY: /* We let this ruin type-checking for now.. */    reset_type_stack();    push_type(T_MIXED);    push_type(T_MIXED); /* is varargs */    push_type(T_MANY);
pike.git/src/las.c:1799:    case F_SWITCH:    if(!match_types(CAR(n)->type,mixed_type_string))    yyerror("Bad switch expression.\n");    copy_shared_string(n->type,void_type_string);    break;       case F_CONSTANT:    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)    {    if(CDR(n))    copy_shared_string(n->type,CDR(n)->type);    else    copy_shared_string(n->type,void_type_string);    return;    }   
pike.git/src/las.c:1929:    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))) {    yywarning("Range end is not positive.");    }    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;    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:1964:    if(CAR(n)->token==F_NOT && CDR(n)->token==F_NOT)    {    tmp1=mknode(F_NOT,mknode(F_LAND,CAAR(n),CADR(n)),0);    CAAR(n)=CADR(n)=0;    goto use_tmp1;    }    /* 0 || Y -> Y */    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:    /* !x && !y -> !(x || y) */    if(CAR(n)->token==F_NOT && CDR(n)->token==F_NOT)    {    tmp1=mknode(F_NOT,mknode(F_LOR,CAAR(n),CADR(n)),0);    CAAR(n)=CADR(n)=0;    goto use_tmp1;    }    /* 0 && Y -> 0 */    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 '?':    /* (! 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;    }