aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-20 09:26:38 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-20 09:26:38 +0000
commit1cd9c3ce62aef3c45e72c002cbc17706ffca67c9 (patch)
treea9f478ef02c3292615b9267bd36cd168a3a81418
parent74bf1767e3e0812c3f526a3bb0972e9145ed4461 (diff)
downloadruby-1cd9c3ce62aef3c45e72c002cbc17706ffca67c9.tar.gz
random.c: Random.bytes
* random.c (random_s_bytes): new method Random.bytes, which is equivalent to Random::DEFAULT.bytes. [Feature #4938] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62497 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--NEWS6
-rw-r--r--random.c14
-rw-r--r--test/ruby/test_rand.rb11
3 files changed, 28 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index 8270d48ed6..c55c8a98f6 100644
--- a/NEWS
+++ b/NEWS
@@ -34,6 +34,12 @@ with all sufficient information, see the ChangeLog file or Redmine
* Proc#call doesn't change $SAFE any more. [Feature #14250]
+* Random
+
+ * New methods:
+
+ * added Random.bytes. [Feature #4938]
+
=== Stdlib updates (outstanding ones only)
* Matrix
diff --git a/random.c b/random.c
index 43a3d2ffee..b800f1d9a1 100644
--- a/random.c
+++ b/random.c
@@ -1134,6 +1134,19 @@ rb_random_bytes(VALUE obj, long n)
return genrand_bytes(rnd, n);
}
+/*
+ * call-seq: Random.bytes(size) -> a_string
+ *
+ * Returns a random binary string. The argument size specified the length of
+ * the result string.
+ */
+static VALUE
+random_s_bytes(VALUE obj, VALUE len)
+{
+ rb_random_t *rnd = rand_start(&default_rand);
+ return genrand_bytes(rnd, NUM2LONG(rb_to_int(len)));
+}
+
static VALUE
range_values(VALUE vmax, VALUE *begp, VALUE *endp, int *exclp)
{
@@ -1636,6 +1649,7 @@ InitVM_Random(void)
rb_define_singleton_method(rb_cRandom, "srand", rb_f_srand, -1);
rb_define_singleton_method(rb_cRandom, "rand", random_s_rand, -1);
+ rb_define_singleton_method(rb_cRandom, "bytes", random_s_bytes, 1);
rb_define_singleton_method(rb_cRandom, "new_seed", random_seed, 0);
rb_define_singleton_method(rb_cRandom, "urandom", random_raw_seed, 1);
rb_define_private_method(CLASS_OF(rb_cRandom), "state", random_s_state, 0);
diff --git a/test/ruby/test_rand.rb b/test/ruby/test_rand.rb
index 882d33fb40..136ee4f912 100644
--- a/test/ruby/test_rand.rb
+++ b/test/ruby/test_rand.rb
@@ -347,10 +347,15 @@ END
end
def assert_random_bytes(r)
+ srand(0)
assert_equal("", r.bytes(0))
- assert_equal("\xAC".force_encoding("ASCII-8BIT"), r.bytes(1))
- assert_equal("/\xAA\xC4\x97u\xA6\x16\xB7\xC0\xCC".force_encoding("ASCII-8BIT"),
- r.bytes(10))
+ assert_equal("", Random.bytes(0))
+ x = "\xAC".force_encoding("ASCII-8BIT")
+ assert_equal(x, r.bytes(1))
+ assert_equal(x, Random.bytes(1))
+ x = "/\xAA\xC4\x97u\xA6\x16\xB7\xC0\xCC".force_encoding("ASCII-8BIT")
+ assert_equal(x, r.bytes(10))
+ assert_equal(x, Random.bytes(10))
end
def test_random_range