pike.git / src / operators.c

version» Context lines:

pike.git/src/operators.c:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: operators.c,v 1.215 2006/08/21 18:37:44 grubba Exp $ + || $Id: operators.c,v 1.216 2007/03/20 17:41:54 grubba Exp $   */      #include "global.h"   #include <math.h>   #include "interpret.h"   #include "svalue.h"   #include "multiset.h"   #include "mapping.h"   #include "array.h"   #include "stralloc.h"
pike.git/src/operators.c:1920: Inside #if 0
   TMP_OPT(f_gt, "`<=");    TMP_OPT(f_le, "`>");    TMP_OPT(f_ge, "`<");   #endif   #undef TMP_OPT    if((more_args = is_call_to(*first_arg, f_search)) &&    (count_args(*more_args) == 2)) {    node *search_args = *more_args;    if ((search_args->token == F_ARG_LIST) &&    CAR(search_args) && -  (CAR(search_args)->type == string_type_string) && +  pike_types_le(CAR(search_args)->type, string_type_string) &&    CDR(search_args) && -  (CDR(search_args)->type == string_type_string)) { +  pike_types_le(CDR(search_args)->type, string_type_string)) {    /* !search(string a, string b) => has_prefix(a, b) */    ADD_NODE_REF(*more_args);    return mkefuncallnode("has_prefix", search_args);    }    }    }       return 0;   }   
pike.git/src/operators.c:1950:    n->tree_info |= OPT_SIDE_EFFECT;    return NULL;    }    }    return NULL;   }      static node *optimize_binary(node *n)   {    node **first_arg, **second_arg, *ret; -  if(count_args(CDR(n))==2) +  int args; +  +  if((args = count_args(CDR(n)))==2)    {    first_arg=my_get_arg(&_CDR(n), 0);    second_arg=my_get_arg(&_CDR(n), 1);      #ifdef PIKE_DEBUG    if(!first_arg || !second_arg)    Pike_fatal("Couldn't find argument!\n");   #endif       if((*second_arg)->type == (*first_arg)->type &&
pike.git/src/operators.c:1998:    ret = mknode(F_APPLY,    CAR(n),    mknode(F_ARG_LIST,    *first_arg,    CDR(*second_arg)))    )));    return ret;    }    }    } + #if 0 /* Does not work for multiplication. */ +  /* Strengthen the string type. */ +  if (n->type && (n->type->type == T_STRING) && +  CAR_TO_INT(n->type) == 32 && (args > 0)) { +  int str_width = 6; /* Width generated in int and float conversions. */ +  while (args--) { +  struct pike_type *t; +  node **arg = my_get_arg(&_CDR(n), args); +  if (!arg || !(t = (*arg)->type)) continue; +  if (t->type == T_STRING) { +  int w = CAR_TO_INT(t); +  if (w > str_width) str_width = w; +  } +  } +  if (str_width != 32) { +  type_stack_mark(); +  push_string_type(str_width); +  free_type(n->type); +  n->type = pop_unfinished_type(); +  } +  } + #endif /* 0 */    return 0;   }         static int generate_comparison(node *n)   {    if(count_args(CDR(n))==2)    {    if(do_docode(CDR(n),DO_NOT_COPY) != 2)    Pike_fatal("Count args was wrong in generate_comparison.\n");
pike.git/src/operators.c:5171:   static node *optimize_sizeof(node *n)   {    if (CDR(n) && (CDR(n)->token == F_APPLY) &&    (CADR(n)) && (CADR(n)->token == F_CONSTANT) &&    (CADR(n)->u.sval.type == T_FUNCTION) &&    (CADR(n)->u.sval.subtype == FUNCTION_BUILTIN)) {    extern struct program *string_split_iterator_program;    /* sizeof(efun(...)) */    if ((CADR(n)->u.sval.u.efun->function == f_divide) &&    CDDR(n) && (CDDR(n)->token == F_ARG_LIST) && -  CADDR(n) && (CADDR(n)->type == string_type_string) && +  CADDR(n) && pike_types_le(CADDR(n)->type, string_type_string) &&    CDDDR(n) && (CDDDR(n)->token == F_CONSTANT) &&    (CDDDR(n)->u.sval.type == T_STRING) &&    (CDDDR(n)->u.sval.u.string->len == 1)) {    p_wchar2 split = index_shared_string(CDDDR(n)->u.sval.u.string, 0);       /* sizeof(`/(str, "x")) */    ADD_NODE_REF2(CADDR(n),    return mkefuncallnode("sizeof",    mkapplynode(mkprgnode(string_split_iterator_program),    mknode(F_ARG_LIST, CADDR(n),
pike.git/src/operators.c:5193:    );    }    if ((CADR(n)->u.sval.u.efun->function == f_minus) &&    CDDR(n) && (CDDR(n)->token == F_ARG_LIST) &&    CADDR(n) && (CADDR(n)->token == F_APPLY) &&    CAADDR(n) && (CAADDR(n)->token == F_CONSTANT) &&    (CAADDR(n)->u.sval.type == T_FUNCTION) &&    (CAADDR(n)->u.sval.subtype == FUNCTION_BUILTIN) &&    (CAADDR(n)->u.sval.u.efun->function == f_divide) &&    CDADDR(n) && (CDADDR(n)->token == F_ARG_LIST) && -  CADADDR(n) && (CADADDR(n)->type == string_type_string) && +  CADADDR(n) && pike_types_le(CADADDR(n)->type, string_type_string) &&    CDDADDR(n) && (CDDADDR(n)->token == F_CONSTANT) &&    (CDDADDR(n)->u.sval.type == T_STRING) &&    (CDDADDR(n)->u.sval.u.string->len == 1) &&    CDDDR(n)) {    /* sizeof(`-(`/(str, "x"), y)) */    if (((CDDDR(n)->token == F_CONSTANT) &&    (CDDDR(n)->u.sval.type == T_ARRAY) &&    (CDDDR(n)->u.sval.u.array->size == 1) &&    (CDDDR(n)->u.sval.u.array->item[0].type == T_STRING) &&    (CDDDR(n)->u.sval.u.array->item[0].u.string->len == 0)) ||
pike.git/src/operators.c:5535:    ADD_EFUN2("`*", f_multiply,    tOr9(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction),    tFunc(tArr(tArr(tSetvar(1,tMix)))    tArr(tSetvar(1,tMix)),tArr(tVar(1))),    tFuncV(tInt,tInt,tInt),    tIfnot(tFuncV(tNone,tNot(tFlt),tMix),    tFuncV(tOr(tFlt,tInt),tOr(tFlt,tInt),tFlt)),    tFunc(tArr(tStr) tStr,tStr),    tFunc(tArr(tSetvar(0,tMix)) tInt,tArr(tVar(0))),    tFunc(tArr(tSetvar(0,tMix)) tFlt,tArr(tVar(0))), -  tFunc(tStr tInt,tStr), -  tFunc(tStr tFlt,tStr)), +  tFunc(tSetvar(0, tStr) tInt,tVar(0)), +  tFunc(tSetvar(0, tStr) tFlt,tVar(0))),    OPT_TRY_OPTIMIZE,optimize_binary,generate_multiply);       /* !function(!object...:mixed)&function(mixed...:mixed)|"    "function(int,int...:int)|"    "!function(int...:mixed)&function(float|int...:float)|"    "function(array(0=mixed),array|int|float...:array(array(0)))|"    "function(string,string|int|float...:array(string)) */    ADD_EFUN2("`/", f_divide,    tOr5(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction),    tFuncV(tInt, tInt, tInt),