Simplify obj2ubits checks
If this value is less than zero, then the mask check is guaranteed to fail as well, so we might as well rely on that.
This commit is contained in:
parent
5f3189474c
commit
91601dcc6a
Notes:
git
2020-01-14 06:58:59 +09:00
@ -431,6 +431,10 @@ class TestTime < Test::Unit::TestCase
|
|||||||
|
|
||||||
assert_equal(-4427700000, Time.utc(-4427700000,12,1).year)
|
assert_equal(-4427700000, Time.utc(-4427700000,12,1).year)
|
||||||
assert_equal(-2**30+10, Time.utc(-2**30+10,1,1).year)
|
assert_equal(-2**30+10, Time.utc(-2**30+10,1,1).year)
|
||||||
|
|
||||||
|
assert_raise(ArgumentError) { Time.gm(2000, 1, -1) }
|
||||||
|
assert_raise(ArgumentError) { Time.gm(2000, 1, 2**30 + 1) }
|
||||||
|
assert_raise(ArgumentError) { Time.gm(2000, 1, -2**30 + 1) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_time_interval
|
def test_time_interval
|
||||||
|
16
time.c
16
time.c
@ -656,7 +656,7 @@ VALUE rb_cTime;
|
|||||||
static VALUE rb_cTimeTM;
|
static VALUE rb_cTimeTM;
|
||||||
|
|
||||||
static int obj2int(VALUE obj);
|
static int obj2int(VALUE obj);
|
||||||
static uint32_t obj2ubits(VALUE obj, size_t bits);
|
static uint32_t obj2ubits(VALUE obj, unsigned int bits);
|
||||||
static VALUE obj2vint(VALUE obj);
|
static VALUE obj2vint(VALUE obj);
|
||||||
static uint32_t month_arg(VALUE arg);
|
static uint32_t month_arg(VALUE arg);
|
||||||
static VALUE validate_utc_offset(VALUE utc_offset);
|
static VALUE validate_utc_offset(VALUE utc_offset);
|
||||||
@ -2863,20 +2863,16 @@ obj2int(VALUE obj)
|
|||||||
return NUM2INT(obj);
|
return NUM2INT(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* bits should be 0 <= x <= 31 */
|
||||||
static uint32_t
|
static uint32_t
|
||||||
obj2ubits(VALUE obj, size_t bits)
|
obj2ubits(VALUE obj, unsigned int bits)
|
||||||
{
|
{
|
||||||
static const uint32_t u32max = (uint32_t)-1;
|
const unsigned int usable_mask = (1U << bits) - 1;
|
||||||
const uint32_t usable_mask = ~(u32max << bits);
|
unsigned int rv = (unsigned int)obj2int(obj);
|
||||||
uint32_t rv;
|
|
||||||
int tmp = obj2int(obj);
|
|
||||||
|
|
||||||
if (tmp < 0)
|
|
||||||
rb_raise(rb_eArgError, "argument out of range");
|
|
||||||
rv = tmp;
|
|
||||||
if ((rv & usable_mask) != rv)
|
if ((rv & usable_mask) != rv)
|
||||||
rb_raise(rb_eArgError, "argument out of range");
|
rb_raise(rb_eArgError, "argument out of range");
|
||||||
return rv;
|
return (uint32_t)rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user