pike.git / src / operators.c

version» Context lines:

pike.git/src/operators.c:1568:    *! In Pike 7.0 and earlier the addition order was unspecified.    *!    *! The treatment of @[UNDEFINED] was new    *! in Pike 7.0.    *!    *! @seealso    *! @[`-()], @[lfun::`+()], @[lfun::``+()]    */   PMOD_EXPORT void f_add(INT32 args)   { -  INT_TYPE e,size; +  INT_TYPE e;    TYPE_FIELD types=0;       if(!args)    SIMPLE_WRONG_NUM_ARGS_ERROR("`+", 1);       if (args == 1) return;       for(e=-args;e<0;e++) types |= 1<<TYPEOF(sp[e]);       switch(types)
pike.git/src/operators.c:1628:    o_cast_to_string(); /* free:s old sp[e] */    sp[e-1] = Pike_sp[-1];    Pike_sp--;    }    }    add_strings(args);    return;       case BIT_INT:    { -  size = 0; -  for(e = -args; e < 0; e++) +  INT_TYPE size = sp[-args].u.integer; +  for(e = -args+1; e < 0; e++)    {    if (DO_INT_TYPE_ADD_OVERFLOW(size, sp[e].u.integer, &size))    {    convert_svalue_to_bignum(sp-args);    f_add(args);    return;    }    }    sp-=args;    push_int(size);    break; -  +     } -  +     case BIT_FLOAT:    {    double res = Pike_sp[-args].u.float_number;    for(e=args-1; e>0; e-- )    res += sp[-e].u.float_number;    Pike_sp -= args-1;    Pike_sp[-1].u.float_number = res;    }    break;   
pike.git/src/operators.c:1666:    for(int i=0;i<args;i++)    if (TYPEOF(sp[i-args]) == T_FLOAT)    res += Pike_sp[i-args].u.float_number;    else    res += (double)Pike_sp[i-args].u.integer;    Pike_sp-=args;    push_float(res);    return;    }    - #define ADD_WITH_UNDEFINED(TYPE, T_TYPEID, ADD_FUNC, PUSH_FUNC) do { \ -  int e; \ -  if (TYPEOF(sp[-args]) == T_INT) { \ -  if(IS_UNDEFINED(sp-args)) \ -  { \ -  struct TYPE *x; \ -  \ -  for(e=1;e<args;e++) \ -  if(TYPEOF(sp[e-args]) != T_TYPEID) \ -  SIMPLE_ARG_TYPE_ERROR("`+", e+1, #TYPE); \ -  \ -  x = ADD_FUNC(sp-args+1,args-1); \ -  pop_n_elems(args); \ -  PUSH_FUNC(x); \ -  return; \ -  } \ -  \ -  for(e=1;e<args;e++) \ -  if (TYPEOF(sp[e-args]) != T_INT) \ -  SIMPLE_ARG_TYPE_ERROR("`+", e+1, "int"); \ -  } \ -  \ -  else { \ -  for(e=1;e<args;e++) \ -  if (TYPEOF(sp[e-args]) != T_TYPEID) \ -  SIMPLE_ARG_TYPE_ERROR("`+", e+1, #TYPE); \ -  } \ -  \ -  DO_IF_DEBUG (Pike_fatal ("Shouldn't be reached.\n")); \ -  break; \ -  } while (0) -  +    #define ADD(TYPE, ADD_FUNC, PUSH_FUNC) do { \    struct TYPE *x = ADD_FUNC (sp - args, args); \    pop_n_elems (args); \    PUSH_FUNC (x); \    return; \    } while (0)    -  case BIT_ARRAY|BIT_INT: -  ADD_WITH_UNDEFINED (array, T_ARRAY, add_arrays, push_array); -  break; + #define REMOVE_UNDEFINED(TYPE) \ +  do { \ +  int to = -args, i=-args; \ +  for(; i<0; i++) \ +  { \ +  if(TYPEOF(Pike_sp[i]) == PIKE_T_INT) \ +  { \ +  if(!IS_UNDEFINED(Pike_sp+i)) \ +  SIMPLE_ARG_TYPE_ERROR("`+", args+i, #TYPE); \ +  } \ +  else if(to!=i) \ +  Pike_sp[to++] = Pike_sp[i]; \ +  else to++; \ +  } \ +  for(int i=to; i<0; i++) \ +  TYPEOF(Pike_sp[i])=PIKE_T_INT; \ +  Pike_sp += to; \ +  args += to; \ +  } while(0);    -  +  case BIT_ARRAY|BIT_INT: +  REMOVE_UNDEFINED (array); +  /* Fallthrough */    case BIT_ARRAY:    ADD (array, add_arrays, push_array);    break;       case BIT_MAPPING|BIT_INT: -  ADD_WITH_UNDEFINED (mapping, T_MAPPING, add_mappings, push_mapping); -  break; -  +  REMOVE_UNDEFINED (mapping); +  /* Fallthrough */    case BIT_MAPPING:    ADD (mapping, add_mappings, push_mapping);    break;       case BIT_MULTISET|BIT_INT: -  ADD_WITH_UNDEFINED (multiset, T_MULTISET, add_multisets, push_multiset); -  break; -  +  REMOVE_UNDEFINED (multiset); +  /* Fallthrough */    case BIT_MULTISET:    ADD (multiset, add_multisets, push_multiset);    break;    - #undef ADD_WITH_UNDEFINED + #undef REMOVE_UNDEFINED   #undef ADD    }   }      static int generate_sum(node *n)   {    struct compilation *c = THIS_COMPILATION;    node **first_arg, **second_arg, **third_arg;    switch(count_args(CDR(n)))    {