aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-04-27 18:10:02 -0700
committerPatrick Walton <[email protected]>2011-04-27 18:14:56 -0700
commit180a389832ea505df5a05620a35fcfc4ba311936 (patch)
treef021ab47aee5cee988b7d8ec0b523dc4dc84a37e
parentrt: Add str_vec to the def file. Puts out burning tinderbox. (diff)
downloadrust-180a389832ea505df5a05620a35fcfc4ba311936.tar.xz
rust-180a389832ea505df5a05620a35fcfc4ba311936.zip
stdlib/rt: Add an unsafe function to cast immutable vectors to mutable ones
-rw-r--r--src/lib/_vec.rs2
-rw-r--r--src/rt/rust_builtin.cpp9
-rw-r--r--src/rt/rustrt.def.in1
3 files changed, 12 insertions, 0 deletions
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs
index cc8fabca..ab222be9 100644
--- a/src/lib/_vec.rs
+++ b/src/lib/_vec.rs
@@ -31,6 +31,8 @@ native "rust" mod rustrt {
fn vec_print_debug_info[T](vec[T] v);
fn vec_from_vbuf[T](vbuf v, uint n_elts) -> vec[T];
+
+ fn unsafe_vec_to_mut[T](vec[T] v) -> vec[mutable T];
}
fn alloc[T](uint n_elts) -> vec[T] {
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 5566835d..a2323898 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -178,6 +178,15 @@ vec_from_vbuf(rust_task *task, type_desc *ty, void *vbuf, size_t n_elts)
vbuf);
}
+extern "C" CDECL rust_vec*
+unsafe_vec_to_mut(rust_task *task, type_desc *ty, rust_vec *v)
+{
+ if (v->ref_count != CONST_REFCOUNT) {
+ v->ref();
+ }
+ return v;
+}
+
extern "C" CDECL rust_str*
str_alloc(rust_task *task, size_t n_bytes)
{
diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in
index e378fa8d..d30c146e 100644
--- a/src/rt/rustrt.def.in
+++ b/src/rt/rustrt.def.in
@@ -33,6 +33,7 @@ str_from_vec
str_push_byte
str_vec
task_sleep
+unsafe_vec_to_mut
unsupervise
upcall_clone_chan
upcall_del_chan