Branch: Tag:

2003-11-13

2003-11-13 22:27:59 by Martin Stjernholm <mast@lysator.liu.se>

Fixed some more dubious cases where INT_TYPE values were stuffed into
potentially shorter variables. Not that I've checked whether it
actually matters, but it avoids the doubt.

Use FLOAT_ARG_TYPE instead of ARG_TYPE on the stack in a couple
places.

Rev: src/operators.c:1.184

2:   || 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.183 2003/11/13 21:55:34 mast Exp $ + || $Id: operators.c,v 1.184 2003/11/13 22:27:59 mast Exp $   */      #include "global.h"   #include <math.h> - RCSID("$Id: operators.c,v 1.183 2003/11/13 21:55:34 mast Exp $"); + RCSID("$Id: operators.c,v 1.184 2003/11/13 22:27:59 mast Exp $");   #include "interpret.h"   #include "svalue.h"   #include "multiset.h"
568:       case BIT_FLOAT:    { -  FLOAT_TYPE sum; +  FLOAT_ARG_TYPE sum;    sum=0.0;    for(e=-args; e<0; e++) sum+=sp[e].u.float_number;    sp-=args-1;
578:       case BIT_FLOAT|BIT_INT:    { -  FLOAT_TYPE sum; +  FLOAT_ARG_TYPE sum;    sum=0.0;    for(e=-args; e<0; e++)    {
586:    {    sum+=sp[e].u.float_number;    }else{ -  sum+=(FLOAT_TYPE)sp[e].u.integer; +  sum+=(FLOAT_ARG_TYPE)sp[e].u.integer;    }    }    sp-=args-1;
2366:    case TWO_TYPES(T_INT,T_FLOAT):    sp--;    sp[-1].u.float_number= -  (FLOAT_TYPE) sp[-1].u.integer * (FLOAT_TYPE)sp[0].u.float_number; +  (FLOAT_TYPE) sp[-1].u.integer * sp[0].u.float_number;    sp[-1].type=T_FLOAT;    return;   
2538:    {    struct array *a;    ptrdiff_t size, pos, last, e; -  double len; +  FLOAT_ARG_TYPE len;       len=sp[-1].u.float_number;    if(len==0.0)
2593:    case TWO_TYPES(T_ARRAY, T_INT):    {    struct array *a; -  ptrdiff_t size,e,len,pos; +  ptrdiff_t size,e,pos;    -  len=sp[-1].u.integer; +  INT_TYPE len=sp[-1].u.integer;    if(!len)    OP_DIVISION_BY_ZERO_ERROR("`/");   
2627:    {    struct array *a;    ptrdiff_t last,pos,e,size; -  double len; +  FLOAT_ARG_TYPE len;       len=sp[-1].u.float_number;    if(len==0.0)
2739:    sp--;       /* What is this trying to solve? /Noring */ +  /* It fixes rounding towards negative infinity. /mast */    if((sp[-1].u.integer<0) != (sp[0].u.integer<0))    if(tmp*sp[0].u.integer!=sp[-1].u.integer)    tmp--;
2870:    if(!sp[-1].u.integer)    OP_MODULO_BY_ZERO_ERROR("`%");    -  tmp=sp[-1].u.integer; -  if(tmp<0) +  if(sp[-1].u.integer<0)    { -  tmp=s->len % -tmp; +  tmp=s->len % -sp[-1].u.integer;    base=0;    }else{ -  tmp=s->len % tmp; +  tmp=s->len % sp[-1].u.integer;    base=s->len - tmp;    }    s=string_slice(s, base, tmp);
2889:    case TWO_TYPES(T_ARRAY,T_INT):    {    struct array *a=sp[-2].u.array; -  INT32 tmp,base; +  ptrdiff_t tmp,base;    if(!sp[-1].u.integer)    OP_MODULO_BY_ZERO_ERROR("`%");    -  tmp=sp[-1].u.integer; -  if(tmp<0) +  if(sp[-1].u.integer<0)    { -  tmp=a->size % -tmp; +  tmp=a->size % -sp[-1].u.integer;    base=0;    }else{ -  tmp=a->size % tmp; +  tmp=a->size % sp[-1].u.integer;    base=a->size - tmp;    }