pike.git / src / operators.c

version» Context lines:

pike.git/src/operators.c:39:       /* This calculation should always give some margin based on the size. */    /* It utilizes that log10(256) ~= 2.4 < 5/2. */    /* One extra char for the sign and one for the \0 terminator. */   #define MAX_INT_SPRINTF_LEN (2 + (SIZEOF_INT_TYPE * 5 + 1) / 2)       /* Enough to hold a Pike float or int in textform    */   #define MAX_NUM_BUF (MAXIMUM(MAX_INT_SPRINTF_LEN,MAX_FLOAT_SPRINTF_LEN))    + static int has_lfun( enum LFUN lfun, int arg ); + static int call_lhs_lfun( enum LFUN lfun, int arg ); +    void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind)   {    switch(TYPEOF(*what))    {    case T_ARRAY:    simple_array_index_no_free(to,what->u.array,ind);    break;       case T_MAPPING:    mapping_index_no_free(to,what->u.mapping,ind);
pike.git/src/operators.c:201:   PMOD_EXPORT void o_cast_to_int(void)   {    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_int (0);    } -  -  else { +  else    { -  struct object *o = sp[-1].u.object; -  struct program *p = o->prog->inherits[SUBTYPEOF(sp[-1])].prog; -  int f = FIND_LFUN(p, LFUN_CAST); -  if(f == -1) -  Pike_error("No cast method in object.\n"); +  if( sp[-1].u.object->prog == bignum_program ) +  return; +     ref_push_string(literal_int_string); -  apply_low(o, f, 1); -  stack_pop_keep_top(); -  } +  if(!call_lhs_lfun(LFUN_CAST,2)) +  Pike_error("No cast method in object <2>.\n"); +  stack_pop_keep_top(); /* pop object. */       if(TYPEOF(sp[-1]) != PIKE_T_INT)    { -  if(TYPEOF(sp[-1]) == T_OBJECT && sp[-1].u.object->prog) +  if(TYPEOF(sp[-1]) == T_OBJECT)    {    struct object *o = sp[-1].u.object; -  int f = FIND_LFUN(o->prog->inherits[SUBTYPEOF(sp[-1])].prog, -  LFUN__IS_TYPE); -  if( f != -1) +  if( o->prog == bignum_program ) +  return; +  else if( o->prog )    {    ref_push_string(literal_int_string); -  apply_low(o, f, 1); -  f=!UNSAFE_IS_ZERO(sp-1); +  if( call_lhs_lfun(LFUN__IS_TYPE,2) ) +  if( !UNSAFE_IS_ZERO(sp-1) ) +  {    pop_stack(); -  if(f) return; +  return;    } -  +  pop_stack();    } -  +  }    Pike_error("Cast failed, wanted int, got %s\n",    get_name_of_type(TYPEOF(sp[-1])));    }    else if(SUBTYPEOF(sp[-1]) == NUMBER_UNDEFINED)    Pike_error("Cannot cast this object to int.\n");    }    break;       case T_FLOAT: {    FLOAT_TYPE f = sp[-1].u.float_number;
pike.git/src/operators.c:288:   {    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 { +  } else    { -  struct object *o = sp[-1].u.object; -  int f = FIND_LFUN(o->prog->inherits[SUBTYPEOF(sp[-1])].prog, LFUN_CAST); -  if(f == -1) -  Pike_error("No cast method in object.\n"); +     ref_push_string(literal_string_string); -  apply_low(o, f, 1); +  if(!call_lhs_lfun(LFUN_CAST,2)) +  Pike_error("No cast method in object.\n");    stack_pop_keep_top(); -  } +        if(TYPEOF(sp[-1]) != PIKE_T_STRING)    {    if(TYPEOF(sp[-1])==PIKE_T_INT && SUBTYPEOF(sp[-1])==NUMBER_UNDEFINED)    Pike_error("Cannot cast this object to string.\n");    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) -  { +     ref_push_string(literal_string_string); -  apply_low(o, f, 1); -  f=!UNSAFE_IS_ZERO(sp-1); +  if( call_lhs_lfun( LFUN__IS_TYPE,2 ) ) +  if( !UNSAFE_IS_ZERO(sp-1) ) +  {    pop_stack(); -  if(f) return; +  return;    } -  +  pop_stack();    }    Pike_error("Cast failed, wanted string, got %s\n",    get_name_of_type(TYPEOF(sp[-1])));    }    }    return;       case T_ARRAY:    {    int i, alen;
pike.git/src/operators.c:2215:    {    ref_push_type_value(float_type_string);    stack_swap();    f_cast();    return 1;    }       return 0;   }    + static int has_lfun(enum LFUN lfun, int arg) + { +  struct program *p; +  +  if(TYPEOF(sp[-arg]) == T_OBJECT && (p = sp[-arg].u.object->prog)) +  return FIND_LFUN(p->inherits[SUBTYPEOF(sp[-arg])].prog, lfun); +  return -1; + } +  + static int call_lhs_lfun( enum LFUN lfun, int arg ) + { +  int i = has_lfun(lfun,arg); +  +  if(i != -1) +  { +  apply_low(Pike_sp[-arg].u.object, i, arg-1); +  return 1; +  } +  return 0; + } +    static int call_lfun(enum LFUN left, enum LFUN right)   {    struct object *o;    struct program *p;    int i;       if(TYPEOF(sp[-2]) == T_OBJECT &&    (p = (o = sp[-2].u.object)->prog) &&    (i = FIND_LFUN(p->inherits[SUBTYPEOF(sp[-2])].prog, left)) != -1)    {