diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-11-09 19:36:37 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-11-10 12:06:13 +0900 |
commit | b7e8876704648cee6866591ac1aca7a54faff742 (patch) | |
tree | e21c0a9176378eedfdcc46a64ba12456fa03429f /random.c | |
parent | 6eaed20e145c1ab4c9c4ccf669d0ebea934f4d36 (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.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -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 |