diff options
author | John Hawthorn <john@hawthorn.email> | 2020-01-02 11:48:03 -0800 |
---|---|---|
committer | Aaron Patterson <tenderlove@github.com> | 2020-01-13 13:58:23 -0800 |
commit | 91601dcc6a608cb6f9a124959c738755091dfbd9 (patch) | |
tree | ef55399c8a55d7c223b5376f2b341a142474e26b | |
parent | 5f3189474c3ee3e11b6588acfbb026e119522092 (diff) | |
download | ruby-91601dcc6a608cb6f9a124959c738755091dfbd9.tar.gz |
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.
-rw-r--r-- | test/ruby/test_time.rb | 4 | ||||
-rw-r--r-- | time.c | 16 |
2 files changed, 10 insertions, 10 deletions
diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index 35e3172fb1..3cf7f2b145 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -431,6 +431,10 @@ class TestTime < Test::Unit::TestCase assert_equal(-4427700000, Time.utc(-4427700000,12,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 def test_time_interval @@ -656,7 +656,7 @@ VALUE rb_cTime; static VALUE rb_cTimeTM; 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 uint32_t month_arg(VALUE arg); static VALUE validate_utc_offset(VALUE utc_offset); @@ -2863,20 +2863,16 @@ obj2int(VALUE obj) return NUM2INT(obj); } +/* bits should be 0 <= x <= 31 */ static uint32_t -obj2ubits(VALUE obj, size_t bits) +obj2ubits(VALUE obj, unsigned int bits) { - static const uint32_t u32max = (uint32_t)-1; - const uint32_t usable_mask = ~(u32max << bits); - uint32_t rv; - int tmp = obj2int(obj); + const unsigned int usable_mask = (1U << bits) - 1; + unsigned int rv = (unsigned int)obj2int(obj); - if (tmp < 0) - rb_raise(rb_eArgError, "argument out of range"); - rv = tmp; if ((rv & usable_mask) != rv) rb_raise(rb_eArgError, "argument out of range"); - return rv; + return (uint32_t)rv; } static VALUE |