# HG changeset patch # User Jaroslav Hajek # Date 1248083470 -7200 # Node ID 357cff83985db5175236cded3f978a35a9993c99 # Parent 0a696f8aa43445847d3e51fbd45b9c6c4240c13e fix signed integer shift diff -r 0a696f8aa434 -r 357cff83985d src/ChangeLog --- a/src/ChangeLog Fri Jul 17 15:50:50 2009 -0400 +++ b/src/ChangeLog Mon Jul 20 11:51:10 2009 +0200 @@ -1,3 +1,8 @@ +2009-07-20 Jaroslav Hajek + + * bitfcns.cc (DO_UBITSHIFT): Avoid overflow. + (DO_SBITSHIFT): Fix mask calculation. + 2009-07-17 Benjamin Lindner * DLD-FUNCTIONS/__magick_read__.cc (F__magick_read__): diff -r 0a696f8aa434 -r 357cff83985d src/bitfcns.cc --- a/src/bitfcns.cc Fri Jul 17 15:50:50 2009 -0400 +++ b/src/bitfcns.cc Mon Jul 20 11:51:10 2009 +0200 @@ -381,7 +381,7 @@ { \ int bits_in_type = octave_ ## T :: nbits (); \ T ## NDArray m = m_arg.T ## _array_value (); \ - octave_ ## T mask = ~0ULL; \ + octave_ ## T mask = octave_ ## T::max (); \ if ((N) < bits_in_type) \ mask = bitshift (mask, (N) - bits_in_type); \ else if ((N) < 1) \ @@ -395,11 +395,12 @@ { \ int bits_in_type = octave_ ## T :: nbits (); \ T ## NDArray m = m_arg.T ## _array_value (); \ - octave_ ## T mask = -1; \ + octave_ ## T mask = octave_ ## T::max (); \ if ((N) < bits_in_type) \ mask = bitshift (mask, (N) - bits_in_type); \ else if ((N) < 1) \ mask = 0; \ + mask = mask | octave_ ## T :: min (); /* FIXME: 2's complement only? */ \ DO_BITSHIFT (T); \ } \ while (0)