diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2016-05-07 11:51:14 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-09-07 20:08:01 +0900 |
commit | af5e87ab218c5f4e34c6cdb54ae119a7f0f9033f (patch) | |
tree | e050cf7f7af91f1b990287f6e17d26bc27b6171d /ext | |
parent | f4d5273989ae8d6569a62b126b2774706b86fbf5 (diff) | |
download | ruby-af5e87ab218c5f4e34c6cdb54ae119a7f0f9033f.tar.gz |
separate rb_random_t
* random.c: separate abstract rb_random_t and rb_random_mt_t for
Mersenne Twister implementation.
* include/ruby/random.h: the interface for extensions of Random
class.
* DLL imported symbol reference is not constant on Windows.
* check if properly initialized.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/-test-/random/depend | 328 | ||||
-rw-r--r-- | ext/-test-/random/extconf.rb | 3 | ||||
-rw-r--r-- | ext/-test-/random/init.c | 11 | ||||
-rw-r--r-- | ext/-test-/random/loop.c | 100 |
4 files changed, 442 insertions, 0 deletions
diff --git a/ext/-test-/random/depend b/ext/-test-/random/depend new file mode 100644 index 0000000000..4b4997d340 --- /dev/null +++ b/ext/-test-/random/depend @@ -0,0 +1,328 @@ +# AUTOGENERATED DEPENDENCIES START +init.o: $(RUBY_EXTCONF_H) +init.o: $(arch_hdrdir)/ruby/config.h +init.o: $(hdrdir)/ruby.h +init.o: $(hdrdir)/ruby/assert.h +init.o: $(hdrdir)/ruby/backward.h +init.o: $(hdrdir)/ruby/backward/2/assume.h +init.o: $(hdrdir)/ruby/backward/2/attributes.h +init.o: $(hdrdir)/ruby/backward/2/bool.h +init.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h +init.o: $(hdrdir)/ruby/backward/2/inttypes.h +init.o: $(hdrdir)/ruby/backward/2/limits.h +init.o: $(hdrdir)/ruby/backward/2/long_long.h +init.o: $(hdrdir)/ruby/backward/2/r_cast.h +init.o: $(hdrdir)/ruby/backward/2/rmodule.h +init.o: $(hdrdir)/ruby/backward/2/stdalign.h +init.o: $(hdrdir)/ruby/backward/2/stdarg.h +init.o: $(hdrdir)/ruby/defines.h +init.o: $(hdrdir)/ruby/intern.h +init.o: $(hdrdir)/ruby/internal/anyargs.h +init.o: $(hdrdir)/ruby/internal/arithmetic.h +init.o: $(hdrdir)/ruby/internal/arithmetic/char.h +init.o: $(hdrdir)/ruby/internal/arithmetic/double.h +init.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +init.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +init.o: $(hdrdir)/ruby/internal/arithmetic/int.h +init.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +init.o: $(hdrdir)/ruby/internal/arithmetic/long.h +init.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +init.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +init.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +init.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +init.o: $(hdrdir)/ruby/internal/arithmetic/short.h +init.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +init.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +init.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +init.o: $(hdrdir)/ruby/internal/assume.h +init.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +init.o: $(hdrdir)/ruby/internal/attr/artificial.h +init.o: $(hdrdir)/ruby/internal/attr/cold.h +init.o: $(hdrdir)/ruby/internal/attr/const.h +init.o: $(hdrdir)/ruby/internal/attr/constexpr.h +init.o: $(hdrdir)/ruby/internal/attr/deprecated.h +init.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +init.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +init.o: $(hdrdir)/ruby/internal/attr/error.h +init.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +init.o: $(hdrdir)/ruby/internal/attr/forceinline.h +init.o: $(hdrdir)/ruby/internal/attr/format.h +init.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +init.o: $(hdrdir)/ruby/internal/attr/noalias.h +init.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +init.o: $(hdrdir)/ruby/internal/attr/noexcept.h +init.o: $(hdrdir)/ruby/internal/attr/noinline.h +init.o: $(hdrdir)/ruby/internal/attr/nonnull.h +init.o: $(hdrdir)/ruby/internal/attr/noreturn.h +init.o: $(hdrdir)/ruby/internal/attr/pure.h +init.o: $(hdrdir)/ruby/internal/attr/restrict.h +init.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +init.o: $(hdrdir)/ruby/internal/attr/warning.h +init.o: $(hdrdir)/ruby/internal/attr/weakref.h +init.o: $(hdrdir)/ruby/internal/cast.h +init.o: $(hdrdir)/ruby/internal/compiler_is.h +init.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +init.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +init.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +init.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +init.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +init.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +init.o: $(hdrdir)/ruby/internal/compiler_since.h +init.o: $(hdrdir)/ruby/internal/config.h +init.o: $(hdrdir)/ruby/internal/constant_p.h +init.o: $(hdrdir)/ruby/internal/core.h +init.o: $(hdrdir)/ruby/internal/core/rarray.h +init.o: $(hdrdir)/ruby/internal/core/rbasic.h +init.o: $(hdrdir)/ruby/internal/core/rbignum.h +init.o: $(hdrdir)/ruby/internal/core/rclass.h +init.o: $(hdrdir)/ruby/internal/core/rdata.h +init.o: $(hdrdir)/ruby/internal/core/rfile.h +init.o: $(hdrdir)/ruby/internal/core/rhash.h +init.o: $(hdrdir)/ruby/internal/core/robject.h +init.o: $(hdrdir)/ruby/internal/core/rregexp.h +init.o: $(hdrdir)/ruby/internal/core/rstring.h +init.o: $(hdrdir)/ruby/internal/core/rstruct.h +init.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +init.o: $(hdrdir)/ruby/internal/ctype.h +init.o: $(hdrdir)/ruby/internal/dllexport.h +init.o: $(hdrdir)/ruby/internal/dosish.h +init.o: $(hdrdir)/ruby/internal/error.h +init.o: $(hdrdir)/ruby/internal/eval.h +init.o: $(hdrdir)/ruby/internal/event.h +init.o: $(hdrdir)/ruby/internal/fl_type.h +init.o: $(hdrdir)/ruby/internal/gc.h +init.o: $(hdrdir)/ruby/internal/glob.h +init.o: $(hdrdir)/ruby/internal/globals.h +init.o: $(hdrdir)/ruby/internal/has/attribute.h +init.o: $(hdrdir)/ruby/internal/has/builtin.h +init.o: $(hdrdir)/ruby/internal/has/c_attribute.h +init.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +init.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +init.o: $(hdrdir)/ruby/internal/has/extension.h +init.o: $(hdrdir)/ruby/internal/has/feature.h +init.o: $(hdrdir)/ruby/internal/has/warning.h +init.o: $(hdrdir)/ruby/internal/intern/array.h +init.o: $(hdrdir)/ruby/internal/intern/bignum.h +init.o: $(hdrdir)/ruby/internal/intern/class.h +init.o: $(hdrdir)/ruby/internal/intern/compar.h +init.o: $(hdrdir)/ruby/internal/intern/complex.h +init.o: $(hdrdir)/ruby/internal/intern/cont.h +init.o: $(hdrdir)/ruby/internal/intern/dir.h +init.o: $(hdrdir)/ruby/internal/intern/enum.h +init.o: $(hdrdir)/ruby/internal/intern/enumerator.h +init.o: $(hdrdir)/ruby/internal/intern/error.h +init.o: $(hdrdir)/ruby/internal/intern/eval.h +init.o: $(hdrdir)/ruby/internal/intern/file.h +init.o: $(hdrdir)/ruby/internal/intern/gc.h +init.o: $(hdrdir)/ruby/internal/intern/hash.h +init.o: $(hdrdir)/ruby/internal/intern/io.h +init.o: $(hdrdir)/ruby/internal/intern/load.h +init.o: $(hdrdir)/ruby/internal/intern/marshal.h +init.o: $(hdrdir)/ruby/internal/intern/numeric.h +init.o: $(hdrdir)/ruby/internal/intern/object.h +init.o: $(hdrdir)/ruby/internal/intern/parse.h +init.o: $(hdrdir)/ruby/internal/intern/proc.h +init.o: $(hdrdir)/ruby/internal/intern/process.h +init.o: $(hdrdir)/ruby/internal/intern/random.h +init.o: $(hdrdir)/ruby/internal/intern/range.h +init.o: $(hdrdir)/ruby/internal/intern/rational.h +init.o: $(hdrdir)/ruby/internal/intern/re.h +init.o: $(hdrdir)/ruby/internal/intern/ruby.h +init.o: $(hdrdir)/ruby/internal/intern/select.h +init.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +init.o: $(hdrdir)/ruby/internal/intern/signal.h +init.o: $(hdrdir)/ruby/internal/intern/sprintf.h +init.o: $(hdrdir)/ruby/internal/intern/string.h +init.o: $(hdrdir)/ruby/internal/intern/struct.h +init.o: $(hdrdir)/ruby/internal/intern/thread.h +init.o: $(hdrdir)/ruby/internal/intern/time.h +init.o: $(hdrdir)/ruby/internal/intern/variable.h +init.o: $(hdrdir)/ruby/internal/intern/vm.h +init.o: $(hdrdir)/ruby/internal/interpreter.h +init.o: $(hdrdir)/ruby/internal/iterator.h +init.o: $(hdrdir)/ruby/internal/memory.h +init.o: $(hdrdir)/ruby/internal/method.h +init.o: $(hdrdir)/ruby/internal/module.h +init.o: $(hdrdir)/ruby/internal/newobj.h +init.o: $(hdrdir)/ruby/internal/rgengc.h +init.o: $(hdrdir)/ruby/internal/scan_args.h +init.o: $(hdrdir)/ruby/internal/special_consts.h +init.o: $(hdrdir)/ruby/internal/static_assert.h +init.o: $(hdrdir)/ruby/internal/stdalign.h +init.o: $(hdrdir)/ruby/internal/stdbool.h +init.o: $(hdrdir)/ruby/internal/symbol.h +init.o: $(hdrdir)/ruby/internal/token_paste.h +init.o: $(hdrdir)/ruby/internal/value.h +init.o: $(hdrdir)/ruby/internal/value_type.h +init.o: $(hdrdir)/ruby/internal/variable.h +init.o: $(hdrdir)/ruby/internal/warning_push.h +init.o: $(hdrdir)/ruby/internal/xmalloc.h +init.o: $(hdrdir)/ruby/missing.h +init.o: $(hdrdir)/ruby/ruby.h +init.o: $(hdrdir)/ruby/st.h +init.o: $(hdrdir)/ruby/subst.h +init.o: init.c +loop.o: $(RUBY_EXTCONF_H) +loop.o: $(arch_hdrdir)/ruby/config.h +loop.o: $(hdrdir)/ruby/assert.h +loop.o: $(hdrdir)/ruby/backward.h +loop.o: $(hdrdir)/ruby/backward/2/assume.h +loop.o: $(hdrdir)/ruby/backward/2/attributes.h +loop.o: $(hdrdir)/ruby/backward/2/bool.h +loop.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h +loop.o: $(hdrdir)/ruby/backward/2/inttypes.h +loop.o: $(hdrdir)/ruby/backward/2/limits.h +loop.o: $(hdrdir)/ruby/backward/2/long_long.h +loop.o: $(hdrdir)/ruby/backward/2/r_cast.h +loop.o: $(hdrdir)/ruby/backward/2/rmodule.h +loop.o: $(hdrdir)/ruby/backward/2/stdalign.h +loop.o: $(hdrdir)/ruby/backward/2/stdarg.h +loop.o: $(hdrdir)/ruby/defines.h +loop.o: $(hdrdir)/ruby/intern.h +loop.o: $(hdrdir)/ruby/internal/anyargs.h +loop.o: $(hdrdir)/ruby/internal/arithmetic.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/char.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/double.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/int.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/long.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/short.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +loop.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +loop.o: $(hdrdir)/ruby/internal/assume.h +loop.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +loop.o: $(hdrdir)/ruby/internal/attr/artificial.h +loop.o: $(hdrdir)/ruby/internal/attr/cold.h +loop.o: $(hdrdir)/ruby/internal/attr/const.h +loop.o: $(hdrdir)/ruby/internal/attr/constexpr.h +loop.o: $(hdrdir)/ruby/internal/attr/deprecated.h +loop.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +loop.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +loop.o: $(hdrdir)/ruby/internal/attr/error.h +loop.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +loop.o: $(hdrdir)/ruby/internal/attr/forceinline.h +loop.o: $(hdrdir)/ruby/internal/attr/format.h +loop.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +loop.o: $(hdrdir)/ruby/internal/attr/noalias.h +loop.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +loop.o: $(hdrdir)/ruby/internal/attr/noexcept.h +loop.o: $(hdrdir)/ruby/internal/attr/noinline.h +loop.o: $(hdrdir)/ruby/internal/attr/nonnull.h +loop.o: $(hdrdir)/ruby/internal/attr/noreturn.h +loop.o: $(hdrdir)/ruby/internal/attr/pure.h +loop.o: $(hdrdir)/ruby/internal/attr/restrict.h +loop.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +loop.o: $(hdrdir)/ruby/internal/attr/warning.h +loop.o: $(hdrdir)/ruby/internal/attr/weakref.h +loop.o: $(hdrdir)/ruby/internal/cast.h +loop.o: $(hdrdir)/ruby/internal/compiler_is.h +loop.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +loop.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +loop.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +loop.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +loop.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +loop.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +loop.o: $(hdrdir)/ruby/internal/compiler_since.h +loop.o: $(hdrdir)/ruby/internal/config.h +loop.o: $(hdrdir)/ruby/internal/constant_p.h +loop.o: $(hdrdir)/ruby/internal/core.h +loop.o: $(hdrdir)/ruby/internal/core/rarray.h +loop.o: $(hdrdir)/ruby/internal/core/rbasic.h +loop.o: $(hdrdir)/ruby/internal/core/rbignum.h +loop.o: $(hdrdir)/ruby/internal/core/rclass.h +loop.o: $(hdrdir)/ruby/internal/core/rdata.h +loop.o: $(hdrdir)/ruby/internal/core/rfile.h +loop.o: $(hdrdir)/ruby/internal/core/rhash.h +loop.o: $(hdrdir)/ruby/internal/core/robject.h +loop.o: $(hdrdir)/ruby/internal/core/rregexp.h +loop.o: $(hdrdir)/ruby/internal/core/rstring.h +loop.o: $(hdrdir)/ruby/internal/core/rstruct.h +loop.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +loop.o: $(hdrdir)/ruby/internal/ctype.h +loop.o: $(hdrdir)/ruby/internal/dllexport.h +loop.o: $(hdrdir)/ruby/internal/dosish.h +loop.o: $(hdrdir)/ruby/internal/error.h +loop.o: $(hdrdir)/ruby/internal/eval.h +loop.o: $(hdrdir)/ruby/internal/event.h +loop.o: $(hdrdir)/ruby/internal/fl_type.h +loop.o: $(hdrdir)/ruby/internal/gc.h +loop.o: $(hdrdir)/ruby/internal/glob.h +loop.o: $(hdrdir)/ruby/internal/globals.h +loop.o: $(hdrdir)/ruby/internal/has/attribute.h +loop.o: $(hdrdir)/ruby/internal/has/builtin.h +loop.o: $(hdrdir)/ruby/internal/has/c_attribute.h +loop.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +loop.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +loop.o: $(hdrdir)/ruby/internal/has/extension.h +loop.o: $(hdrdir)/ruby/internal/has/feature.h +loop.o: $(hdrdir)/ruby/internal/has/warning.h +loop.o: $(hdrdir)/ruby/internal/intern/array.h +loop.o: $(hdrdir)/ruby/internal/intern/bignum.h +loop.o: $(hdrdir)/ruby/internal/intern/class.h +loop.o: $(hdrdir)/ruby/internal/intern/compar.h +loop.o: $(hdrdir)/ruby/internal/intern/complex.h +loop.o: $(hdrdir)/ruby/internal/intern/cont.h +loop.o: $(hdrdir)/ruby/internal/intern/dir.h +loop.o: $(hdrdir)/ruby/internal/intern/enum.h +loop.o: $(hdrdir)/ruby/internal/intern/enumerator.h +loop.o: $(hdrdir)/ruby/internal/intern/error.h +loop.o: $(hdrdir)/ruby/internal/intern/eval.h +loop.o: $(hdrdir)/ruby/internal/intern/file.h +loop.o: $(hdrdir)/ruby/internal/intern/gc.h +loop.o: $(hdrdir)/ruby/internal/intern/hash.h +loop.o: $(hdrdir)/ruby/internal/intern/io.h +loop.o: $(hdrdir)/ruby/internal/intern/load.h +loop.o: $(hdrdir)/ruby/internal/intern/marshal.h +loop.o: $(hdrdir)/ruby/internal/intern/numeric.h +loop.o: $(hdrdir)/ruby/internal/intern/object.h +loop.o: $(hdrdir)/ruby/internal/intern/parse.h +loop.o: $(hdrdir)/ruby/internal/intern/proc.h +loop.o: $(hdrdir)/ruby/internal/intern/process.h +loop.o: $(hdrdir)/ruby/internal/intern/random.h +loop.o: $(hdrdir)/ruby/internal/intern/range.h +loop.o: $(hdrdir)/ruby/internal/intern/rational.h +loop.o: $(hdrdir)/ruby/internal/intern/re.h +loop.o: $(hdrdir)/ruby/internal/intern/ruby.h +loop.o: $(hdrdir)/ruby/internal/intern/select.h +loop.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +loop.o: $(hdrdir)/ruby/internal/intern/signal.h +loop.o: $(hdrdir)/ruby/internal/intern/sprintf.h +loop.o: $(hdrdir)/ruby/internal/intern/string.h +loop.o: $(hdrdir)/ruby/internal/intern/struct.h +loop.o: $(hdrdir)/ruby/internal/intern/thread.h +loop.o: $(hdrdir)/ruby/internal/intern/time.h +loop.o: $(hdrdir)/ruby/internal/intern/variable.h +loop.o: $(hdrdir)/ruby/internal/intern/vm.h +loop.o: $(hdrdir)/ruby/internal/interpreter.h +loop.o: $(hdrdir)/ruby/internal/iterator.h +loop.o: $(hdrdir)/ruby/internal/memory.h +loop.o: $(hdrdir)/ruby/internal/method.h +loop.o: $(hdrdir)/ruby/internal/module.h +loop.o: $(hdrdir)/ruby/internal/newobj.h +loop.o: $(hdrdir)/ruby/internal/rgengc.h +loop.o: $(hdrdir)/ruby/internal/scan_args.h +loop.o: $(hdrdir)/ruby/internal/special_consts.h +loop.o: $(hdrdir)/ruby/internal/static_assert.h +loop.o: $(hdrdir)/ruby/internal/stdalign.h +loop.o: $(hdrdir)/ruby/internal/stdbool.h +loop.o: $(hdrdir)/ruby/internal/symbol.h +loop.o: $(hdrdir)/ruby/internal/token_paste.h +loop.o: $(hdrdir)/ruby/internal/value.h +loop.o: $(hdrdir)/ruby/internal/value_type.h +loop.o: $(hdrdir)/ruby/internal/variable.h +loop.o: $(hdrdir)/ruby/internal/warning_push.h +loop.o: $(hdrdir)/ruby/internal/xmalloc.h +loop.o: $(hdrdir)/ruby/missing.h +loop.o: $(hdrdir)/ruby/random.h +loop.o: $(hdrdir)/ruby/ruby.h +loop.o: $(hdrdir)/ruby/st.h +loop.o: $(hdrdir)/ruby/subst.h +loop.o: loop.c +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/-test-/random/extconf.rb b/ext/-test-/random/extconf.rb new file mode 100644 index 0000000000..d786b15db9 --- /dev/null +++ b/ext/-test-/random/extconf.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: false +require_relative "../auto_ext.rb" +auto_ext(inc: true) diff --git a/ext/-test-/random/init.c b/ext/-test-/random/init.c new file mode 100644 index 0000000000..320cba0ad6 --- /dev/null +++ b/ext/-test-/random/init.c @@ -0,0 +1,11 @@ +#include "ruby.h" + +#define init(n) {void Init_random_##n(VALUE mod, VALUE base); Init_random_##n(mod, base);} + +void +Init_random(void) +{ + VALUE base = rb_const_get(rb_cRandom, rb_intern_const("Base")); + VALUE mod = rb_define_module_under(rb_define_module("Bug"), "Random"); + TEST_INIT_FUNCS(init); +} diff --git a/ext/-test-/random/loop.c b/ext/-test-/random/loop.c new file mode 100644 index 0000000000..92af1a9b18 --- /dev/null +++ b/ext/-test-/random/loop.c @@ -0,0 +1,100 @@ +#include "ruby/random.h" + +static const uint32_t max_seeds = 1024; + +typedef struct { + rb_random_t base; + uint32_t num, idx, *buf; +} rand_loop_t; + +RB_RANDOM_INTERFACE_DECLARE(loop) +static const rb_random_interface_t random_loop_if = { + 32, + RB_RANDOM_INTERFACE_DEFINE(loop) +}; + +static size_t +random_loop_memsize(const void *ptr) +{ + const rand_loop_t *r = ptr; + return sizeof(*r) + r->num * sizeof(r->buf[0]); +} + +static rb_random_data_type_t random_loop_type = { + "random/loop", + { + rb_random_mark, + RUBY_TYPED_DEFAULT_FREE, + random_loop_memsize, + }, + RB_RANDOM_PARENT, + (void *)&random_loop_if, + RUBY_TYPED_FREE_IMMEDIATELY +}; + + +static VALUE +loop_alloc(VALUE klass) +{ + rand_loop_t *rnd; + VALUE obj = TypedData_Make_Struct(klass, rand_loop_t, &random_loop_type, rnd); + rnd->base.seed = INT2FIX(0); + return obj; +} + +static void +loop_init(rb_random_t *rnd, const uint32_t *buf, size_t len) +{ + rand_loop_t *r = (rand_loop_t *)rnd; + + if (len > max_seeds) len = max_seeds; + + REALLOC_N(r->buf, uint32_t, len); + MEMCPY(r->buf, buf, uint32_t, (r->num = (uint32_t)len)); +} + +static void +loop_get_bytes(rb_random_t *rnd, void *p, size_t n) +{ + uint8_t *buf = p; + while (n > 0) { + uint32_t x = loop_get_int32(rnd); + switch (n % 4) { + case 0: + *buf++ = (uint8_t)x; + n--; + case 3: + *buf++ = (uint8_t)x; + n--; + case 2: + *buf++ = (uint8_t)x; + n--; + case 1: + *buf++ = (uint8_t)x; + n--; + } + } +} + +static uint32_t +loop_get_int32(rb_random_t *rnd) +{ + rand_loop_t *r = (rand_loop_t *)rnd; + if (r->idx < r->num) { + uint32_t x = r->buf[r->idx++]; + if (r->idx >= r->num) r->idx = 0; + return x; + } + else if (r->num) { + return r->buf[r->idx = 0]; + } + return 0; +} + +void +Init_random_loop(VALUE mod, VALUE base) +{ + VALUE c = rb_define_class_under(mod, "Loop", base); + rb_define_alloc_func(c, loop_alloc); + RB_RANDOM_DATA_INIT_PARENT(random_loop_type); +} |