pike.git / src / operators.c

version» Context lines:

pike.git/src/operators.c:32:   #include "pike_security.h"   #include "pike_compiler.h"      #define sp Pike_sp      #define OP_DIVISION_BY_ZERO_ERROR(FUNC) \    math_error(FUNC, sp-2, 2, 0, "Division by zero.\n")   #define OP_MODULO_BY_ZERO_ERROR(FUNC) \    math_error(FUNC, sp-2, 2, 0, "Modulo by zero.\n")    +  /* These calculations should always give some margin based on the size. */ +  /* One extra char for the sign. */ + #define MAX_INT_SPRINTF_LEN (1 + (SIZEOF_INT_TYPE * 5 + 1) / 2) +    /* The destructive multiset merge code is broken.    * l->msd gets -1 refs.    *    * Disable it for now.    * /grubba 2008-07-08    */   #undef PIKE_MERGE_DESTR_A   #define PIKE_MERGE_DESTR_A 0       /* This calculation should always give some margin based on the size. */
pike.git/src/operators.c:322:    break;       default:    Pike_error("Cannot cast %s to int.\n", get_name_of_type(TYPEOF(sp[-1])));    }   }      /* Special case for casting to string. */   PMOD_EXPORT void o_cast_to_string(void)   { -  char buf[MAX_NUM_BUF]; +  struct pike_string *s; +     switch(TYPEOF(sp[-1]))    {    case T_OBJECT:    if(!sp[-1].u.object->prog) {    /* Casting a destructed object should be like casting a zero. */    pop_stack();    push_constant_text("0");    } else {    {    struct object *o = sp[-1].u.object;
pike.git/src/operators.c:350:       if(TYPEOF(sp[-1]) != PIKE_T_STRING)    {    if(TYPEOF(sp[-1]) == T_OBJECT && sp[-1].u.object->prog)    {    struct object *o = sp[-1].u.object;    int f = FIND_LFUN(o->prog->inherits[SUBTYPEOF(sp[-1])].prog,    LFUN__IS_TYPE);    if( f != -1)    { -  struct pike_string *s; +     REF_MAKE_CONST_STRING(s, "string");    push_string(s);    apply_low(o, f, 1);    f=!UNSAFE_IS_ZERO(sp-1);    pop_stack();    if(f) return;    }    }    Pike_error("Cast failed, wanted string, got %s\n",    get_name_of_type(TYPEOF(sp[-1])));    }    }    return;       case T_ARRAY:    {    int i, alen;    struct array *a = sp[-1].u.array; -  struct pike_string *s; +     int shift = 0;    alen = a->size;       for(i = 0; i<alen; i++) {    INT_TYPE val;    if (TYPEOF(a->item[i]) != T_INT) {    Pike_error(    "Can only cast array(int) to string, item %d is not an integer: %O\n",    i, a->item + i);    }
pike.git/src/operators.c:433:    break;    case 2:    {    p_wchar2 *str2 = STR2(s);    for(i = a->size; i--; ) {    str2[i] = (p_wchar2) a->item[i].u.integer;    }    }    break;    } -  s = end_shared_string(s); +     pop_stack(); -  push_string(s); +  push_string(end_shared_string(s));    }    return;       default:    Pike_error("Cannot cast %s to string.\n", get_name_of_type(TYPEOF(sp[-1])));       case PIKE_T_STRING:    return;       case T_FLOAT: -  +  { +  char buf[MAX_FLOAT_SPRINTF_LEN+1];    format_pike_float (buf, sp[-1].u.float_number); -  +  s = make_shared_string(buf);    break; -  +  }       case T_INT: -  sprintf(buf, "%"PRINTPIKEINT"d", sp[-1].u.integer); +  { +  INT_TYPE org; +  char buf[MAX_INT_SPRINTF_LEN]; +  register char*b = buf+sizeof buf-1; +  register unsigned INT_TYPE i; +  org = sp[-1].u.integer; +  *b-- = '\0'; +  i = org; +  +  if( org < 0 ) +  i = -i; +  +  goto jin; /* C as a macro assembler :-) */ +  do +  { +  i /= 10; + jin: *b-- = '0'+(i%10); +  } +  while( i >= 10 ); +  +  if( org < 0 ) +  *b = '-'; +  else +  b++; +  s = make_shared_string(b); +  }    break;    }    -  SET_SVAL(sp[-1], PIKE_T_STRING, 0, string, make_shared_string(buf)); +  SET_SVAL(sp[-1], PIKE_T_STRING, 0, string, s);   }      PMOD_EXPORT void o_cast(struct pike_type *type, INT32 run_time_type)   {    if(run_time_type != TYPEOF(sp[-1]))    {    if(run_time_type == T_MIXED)    return;       if (TYPEOF(sp[-1]) == T_OBJECT && !sp[-1].u.object->prog) {