aboutsummaryrefslogtreecommitdiff
path: root/src/rt/rust_builtin.cpp
diff options
context:
space:
mode:
authorRoy Frostig <[email protected]>2010-07-25 21:45:09 -0700
committerRoy Frostig <[email protected]>2010-07-25 21:45:09 -0700
commit5b6e714d05a0c96ade618256a67a9cb7f337f196 (patch)
tree45406973ea3c0ffb1a9e070588f4ca5fc8c7744c /src/rt/rust_builtin.cpp
parentDon't write to NULL after calling C natives returning void. (diff)
downloadrust-5b6e714d05a0c96ade618256a67a9cb7f337f196.tar.xz
rust-5b6e714d05a0c96ade618256a67a9cb7f337f196.zip
Expose an RNG (the one used by our runtime) to Rust via std.
Diffstat (limited to 'src/rt/rust_builtin.cpp')
-rw-r--r--src/rt/rust_builtin.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 99fa9535..e8d2d67d 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -127,6 +127,31 @@ vec_len(rust_task *task, type_desc *ty, rust_vec *v)
return v->fill / ty->size;
}
+extern "C" CDECL void *
+rand_new(rust_task *task)
+{
+ rust_dom *dom = task->dom;
+ randctx *rctx = (randctx *) task->malloc(sizeof(randctx));
+ if (!rctx) {
+ task->fail(1);
+ return NULL;
+ }
+ isaac_init(dom, rctx);
+ return rctx;
+}
+
+extern "C" CDECL size_t
+rand_next(rust_task *task, randctx *rctx)
+{
+ return rand(rctx);
+}
+
+extern "C" CDECL void
+rand_free(rust_task *task, randctx *rctx)
+{
+ task->free(rctx);
+}
+
//
// Local Variables:
// mode: C++