summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2020-01-02 11:48:03 -0800
committerAaron Patterson <tenderlove@github.com>2020-01-13 13:58:23 -0800
commit91601dcc6a608cb6f9a124959c738755091dfbd9 (patch)
treeef55399c8a55d7c223b5376f2b341a142474e26b
parent5f3189474c3ee3e11b6588acfbb026e119522092 (diff)
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.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/2808
-rw-r--r--test/ruby/test_time.rb4
-rw-r--r--time.c16
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
diff --git a/time.c b/time.c
index 817b6ef101..b5d1aee375 100644
--- a/time.c
+++ b/time.c
@@ -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