From 180a389832ea505df5a05620a35fcfc4ba311936 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 27 Apr 2011 18:10:02 -0700 Subject: stdlib/rt: Add an unsafe function to cast immutable vectors to mutable ones --- src/lib/_vec.rs | 2 ++ src/rt/rust_builtin.cpp | 9 +++++++++ src/rt/rustrt.def.in | 1 + 3 files changed, 12 insertions(+) (limited to 'src') 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 -- cgit v1.2.3