summaryrefslogtreecommitdiff
path: root/random.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-11-09 19:36:37 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-11-10 12:06:13 +0900
commitb7e8876704648cee6866591ac1aca7a54faff742 (patch)
treee21c0a9176378eedfdcc46a64ba12456fa03429f /random.c
parent6eaed20e145c1ab4c9c4ccf669d0ebea934f4d36 (diff)
[Bug #19100] Add `init_int32` function to `rb_random_interface_t`
Distinguish initialization by single word from initialization by array.
Diffstat (limited to 'random.c')
-rw-r--r--random.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/random.c b/random.c
index 100a54f4e4..759e15335a 100644
--- a/random.c
+++ b/random.c
@@ -371,11 +371,14 @@ rand_init(const rb_random_interface_t *rng, rb_random_t *rnd, VALUE seed)
INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER);
if (sign < 0)
sign = -sign;
- if (len > 1) {
+ if (len <= 1) {
+ rng->init_int32(rnd, len ? buf[0] : 0);
+ }
+ else {
if (sign != 2 && buf[len-1] == 1) /* remove leading-zero-guard */
len--;
+ rng->init(rnd, buf, len);
}
- rng->init(rnd, buf, len);
explicit_bzero(buf, len * sizeof(*buf));
ALLOCV_END(buf0);
return seed;
@@ -892,15 +895,17 @@ rand_mt_load(VALUE obj, VALUE dump)
}
static void
+rand_mt_init_int32(rb_random_t *rnd, uint32_t data)
+{
+ struct MT *mt = &((rb_random_mt_t *)rnd)->mt;
+ init_genrand(mt, data);
+}
+
+static void
rand_mt_init(rb_random_t *rnd, const uint32_t *buf, size_t len)
{
struct MT *mt = &((rb_random_mt_t *)rnd)->mt;
- if (len <= 1) {
- init_genrand(mt, len ? buf[0] : 0);
- }
- else {
- init_by_array(mt, buf, (int)len);
- }
+ init_by_array(mt, buf, (int)len);
}
static unsigned int