diff --git a/src/libstd/managed.rs b/src/libstd/managed.rs index 57230b2fd247d..a27c8aa4a76da 100644 --- a/src/libstd/managed.rs +++ b/src/libstd/managed.rs @@ -17,6 +17,13 @@ use ptr::to_unsafe_ptr; pub static RC_MANAGED_UNIQUE : uint = (-2) as uint; pub static RC_IMMORTAL : uint = 0x77777777; +/// Returns the refcount of a shared box (as just before calling this) +#[inline] +pub fn refcount(t: @T) -> uint { + use unstable::raw::Repr; + unsafe { (*t.repr()).ref_count } +} + /// Determine if two shared boxes point to the same object #[inline] pub fn ptr_eq(a: @T, b: @T) -> bool { diff --git a/src/libstd/sys.rs b/src/libstd/sys.rs index 0299ca0b49a77..0f38671bfc293 100644 --- a/src/libstd/sys.rs +++ b/src/libstd/sys.rs @@ -13,22 +13,12 @@ #[allow(missing_doc)]; use c_str::ToCStr; -use cast; use libc::size_t; use libc; use repr; use rt::task; use str; -/// Returns the refcount of a shared box (as just before calling this) -#[inline] -pub fn refcount(t: @T) -> uint { - unsafe { - let ref_ptr: *uint = cast::transmute_copy(&t); - *ref_ptr - 1 - } -} - pub fn log_str(t: &T) -> ~str { use rt::io; use rt::io::Decorator; diff --git a/src/test/run-pass/match-pattern-drop.rs b/src/test/run-pass/match-pattern-drop.rs index 26aedf5570599..416c932b6c7ff 100644 --- a/src/test/run-pass/match-pattern-drop.rs +++ b/src/test/run-pass/match-pattern-drop.rs @@ -14,11 +14,11 @@ enum t { make_t(@int), clam, } fn foo(s: @int) { - info2!("{:?}", ::std::sys::refcount(s)); - let count = ::std::sys::refcount(s); + info2!("{:?}", ::std::managed::refcount(s)); + let count = ::std::managed::refcount(s); let x: t = make_t(s); // ref up - assert_eq!(::std::sys::refcount(s), count + 1u); - info2!("{:?}", ::std::sys::refcount(s)); + assert_eq!(::std::managed::refcount(s), count + 1u); + info2!("{:?}", ::std::managed::refcount(s)); match x { make_t(y) => { @@ -27,19 +27,19 @@ fn foo(s: @int) { } _ => { info2!("?"); fail2!(); } } - info2!("{:?}", ::std::sys::refcount(s)); - assert_eq!(::std::sys::refcount(s), count + 1u); - let _ = ::std::sys::refcount(s); // don't get bitten by last-use. + info2!("{:?}", ::std::managed::refcount(s)); + assert_eq!(::std::managed::refcount(s), count + 1u); + let _ = ::std::managed::refcount(s); // don't get bitten by last-use. } pub fn main() { let s: @int = @0; // ref up - let count = ::std::sys::refcount(s); + let count = ::std::managed::refcount(s); foo(s); // ref up then down - info2!("{}", ::std::sys::refcount(s)); - let count2 = ::std::sys::refcount(s); + info2!("{}", ::std::managed::refcount(s)); + let count2 = ::std::managed::refcount(s); assert_eq!(count, count2); } diff --git a/src/test/run-pass/unique-copy-box.rs b/src/test/run-pass/unique-copy-box.rs index 2d91cd9b8a9fc..6f4c85960356b 100644 --- a/src/test/run-pass/unique-copy-box.rs +++ b/src/test/run-pass/unique-copy-box.rs @@ -10,14 +10,14 @@ #[allow(unused_variable)]; -use std::sys; +use std::managed; pub fn main() { let i = ~@1; let j = ~@2; - let rc1 = sys::refcount(*i); + let rc1 = managed::refcount(*i); let j = i.clone(); - let rc2 = sys::refcount(*i); + let rc2 = managed::refcount(*i); error2!("rc1: {} rc2: {}", rc1, rc2); assert_eq!(rc1 + 1u, rc2); }