From 8d561587b2be3c09116142aeb837811656257c63 Mon Sep 17 00:00:00 2001 From: Daniel Micay <danielmicay@gmail.com> Date: Tue, 16 Jul 2013 22:29:19 -0400 Subject: [PATCH 1/6] stop initializing ref_count for stack closures the only part of the header ~fn and &fn should be touching right now is the tydesc --- src/librustc/middle/trans/closure.rs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/librustc/middle/trans/closure.rs b/src/librustc/middle/trans/closure.rs index 4e754bea916..77fc168a67d 100644 --- a/src/librustc/middle/trans/closure.rs +++ b/src/librustc/middle/trans/closure.rs @@ -174,16 +174,6 @@ pub fn allocate_cbox(bcx: block, sigil: ast::Sigil, cdata_ty: ty::t) let ccx = bcx.ccx(); let tcx = ccx.tcx; - fn nuke_ref_count(bcx: block, llbox: ValueRef) { - let _icx = push_ctxt("closure::nuke_ref_count"); - // Initialize ref count to arbitrary value for debugging: - let ccx = bcx.ccx(); - let llbox = PointerCast(bcx, llbox, Type::opaque_box(ccx).ptr_to()); - let ref_cnt = GEPi(bcx, llbox, [0u, abi::box_field_refcnt]); - let rc = C_int(ccx, 0x12345678); - Store(bcx, rc, ref_cnt); - } - // Allocate and initialize the box: match sigil { ast::ManagedSigil => { @@ -195,7 +185,6 @@ pub fn allocate_cbox(bcx: block, sigil: ast::Sigil, cdata_ty: ty::t) ast::BorrowedSigil => { let cbox_ty = tuplify_box_ty(tcx, cdata_ty); let llbox = alloc_ty(bcx, cbox_ty, "__closure"); - nuke_ref_count(bcx, llbox); rslt(bcx, llbox) } } From 0239a06a6401d789a70c0089ada071ca981874df Mon Sep 17 00:00:00 2001 From: Daniel Micay <danielmicay@gmail.com> Date: Tue, 16 Jul 2013 23:26:16 -0400 Subject: [PATCH 2/6] rm unused visit_str method from TyVisitor --- src/libstd/reflect.rs | 1 + src/libstd/repr.rs | 1 + src/libstd/unstable/intrinsics.rs | 1 - src/test/run-pass/reflect-visit-data.rs | 8 -------- src/test/run-pass/reflect-visit-type.rs | 1 - 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/libstd/reflect.rs b/src/libstd/reflect.rs index fd16f4e5c69..63d2492bd33 100644 --- a/src/libstd/reflect.rs +++ b/src/libstd/reflect.rs @@ -197,6 +197,7 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> { true } + #[cfg(stage0)] fn visit_str(&self) -> bool { self.align_to::<~str>(); if ! self.inner.visit_str() { return false; } diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index 7707e83a9ce..3ab4d4ff4ab 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -269,6 +269,7 @@ impl TyVisitor for ReprVisitor { } // Type no longer exists, vestigial function. + #[cfg(stage0)] fn visit_str(&self) -> bool { fail!(); } fn visit_estr_box(&self) -> bool { diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index 015ecd67c83..796f691dd56 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -82,7 +82,6 @@ pub trait TyVisitor { fn visit_f64(&self) -> bool; fn visit_char(&self) -> bool; - fn visit_str(&self) -> bool; fn visit_estr_box(&self) -> bool; fn visit_estr_uniq(&self) -> bool; diff --git a/src/test/run-pass/reflect-visit-data.rs b/src/test/run-pass/reflect-visit-data.rs index b7ef4e3ff25..6fc04e9194b 100644 --- a/src/test/run-pass/reflect-visit-data.rs +++ b/src/test/run-pass/reflect-visit-data.rs @@ -181,13 +181,6 @@ impl<V:TyVisitor + movable_ptr> TyVisitor for ptr_visit_adaptor<V> { true } - fn visit_str(&self) -> bool { - self.align_to::<~str>(); - if ! self.inner.visit_str() { return false; } - self.bump_past::<~str>(); - true - } - fn visit_estr_box(&self) -> bool { self.align_to::<@str>(); if ! self.inner.visit_estr_box() { return false; } @@ -556,7 +549,6 @@ impl TyVisitor for my_visitor { fn visit_f64(&self) -> bool { true } fn visit_char(&self) -> bool { true } - fn visit_str(&self) -> bool { true } fn visit_estr_box(&self) -> bool { true } fn visit_estr_uniq(&self) -> bool { true } diff --git a/src/test/run-pass/reflect-visit-type.rs b/src/test/run-pass/reflect-visit-type.rs index e0d9165fe99..72fdc975a24 100644 --- a/src/test/run-pass/reflect-visit-type.rs +++ b/src/test/run-pass/reflect-visit-type.rs @@ -59,7 +59,6 @@ impl TyVisitor for MyVisitor { fn visit_f64(&self) -> bool { true } fn visit_char(&self) -> bool { true } - fn visit_str(&self) -> bool { true } fn visit_estr_box(&self) -> bool { true } fn visit_estr_uniq(&self) -> bool { true } From 0bc204e74d260f24e1458de08032c8631ae85a11 Mon Sep 17 00:00:00 2001 From: Daniel Micay <danielmicay@gmail.com> Date: Wed, 17 Jul 2013 14:04:33 -0400 Subject: [PATCH 3/6] rm unnecessary stage0 `zero_memory` fn --- src/libstd/ptr.rs | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/src/libstd/ptr.rs b/src/libstd/ptr.rs index e1a62b26bbf..3f7a857e382 100644 --- a/src/libstd/ptr.rs +++ b/src/libstd/ptr.rs @@ -80,8 +80,7 @@ pub fn is_not_null<T>(ptr: *const T) -> bool { !is_null(ptr) } #[inline] #[cfg(target_word_size = "32")] pub unsafe fn copy_memory<T>(dst: *mut T, src: *const T, count: uint) { - use unstable::intrinsics::memmove32; - memmove32(dst, src as *T, count as u32); + intrinsics::memmove32(dst, src as *T, count as u32); } /** @@ -93,8 +92,7 @@ pub unsafe fn copy_memory<T>(dst: *mut T, src: *const T, count: uint) { #[inline] #[cfg(target_word_size = "64")] pub unsafe fn copy_memory<T>(dst: *mut T, src: *const T, count: uint) { - use unstable::intrinsics::memmove64; - memmove64(dst, src as *T, count as u64); + intrinsics::memmove64(dst, src as *T, count as u64); } /** @@ -106,8 +104,7 @@ pub unsafe fn copy_memory<T>(dst: *mut T, src: *const T, count: uint) { #[inline] #[cfg(target_word_size = "32")] pub unsafe fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: uint) { - use unstable::intrinsics::memcpy32; - memcpy32(dst, src as *T, count as u32); + intrinsics::memcpy32(dst, src as *T, count as u32); } /** @@ -119,8 +116,7 @@ pub unsafe fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: u #[inline] #[cfg(target_word_size = "64")] pub unsafe fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: uint) { - use unstable::intrinsics::memcpy64; - memcpy64(dst, src as *T, count as u64); + intrinsics::memcpy64(dst, src as *T, count as u64); } /** @@ -130,8 +126,7 @@ pub unsafe fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: u #[inline] #[cfg(target_word_size = "32")] pub unsafe fn set_memory<T>(dst: *mut T, c: u8, count: uint) { - use unstable::intrinsics::memset32; - memset32(dst, c, count as u32); + intrinsics::memset32(dst, c, count as u32); } /** @@ -141,34 +136,17 @@ pub unsafe fn set_memory<T>(dst: *mut T, c: u8, count: uint) { #[inline] #[cfg(target_word_size = "64")] pub unsafe fn set_memory<T>(dst: *mut T, c: u8, count: uint) { - use unstable::intrinsics::memset64; - memset64(dst, c, count as u64); + intrinsics::memset64(dst, c, count as u64); } /** * Zeroes out `count * size_of::<T>` bytes of memory at `dst` */ #[inline] -#[cfg(not(stage0))] pub unsafe fn zero_memory<T>(dst: *mut T, count: uint) { set_memory(dst, 0, count); } -/** - * Zeroes out `count * size_of::<T>` bytes of memory at `dst` - */ -#[inline] -#[cfg(stage0)] -pub unsafe fn zero_memory<T>(dst: *mut T, count: uint) { - let mut count = count * sys::size_of::<T>(); - let mut dst = dst as *mut u8; - while count > 0 { - *dst = 0; - dst = mut_offset(dst, 1); - count -= 1; - } -} - /** * Swap the values at two mutable locations of the same type, without * deinitialising or copying either one. From 0c7b220f20367cde776b9e854b905745c9a271e2 Mon Sep 17 00:00:00 2001 From: Daniel Micay <danielmicay@gmail.com> Date: Wed, 17 Jul 2013 18:15:48 -0400 Subject: [PATCH 4/6] fix repr of unique vectors with stage0 libstd Closes #7860 --- src/libstd/repr.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index 3ab4d4ff4ab..eafa3a892e8 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -353,6 +353,15 @@ impl TyVisitor for ReprVisitor { } } + #[cfg(stage0)] + fn visit_evec_uniq(&self, mtbl: uint, inner: *TyDesc) -> bool { + do self.get::<&VecRepr> |b| { + self.writer.write_char('~'); + self.write_unboxed_vec_repr(mtbl, &b.unboxed, inner); + } + } + + #[cfg(not(stage0))] fn visit_evec_uniq(&self, mtbl: uint, inner: *TyDesc) -> bool { do self.get::<&UnboxedVecRepr> |b| { self.writer.write_char('~'); From 2988d3f5c6566b93496a5a79eebb5516fd8d866e Mon Sep 17 00:00:00 2001 From: Daniel Micay <danielmicay@gmail.com> Date: Wed, 17 Jul 2013 18:47:01 -0400 Subject: [PATCH 5/6] fix repr of @mut vectors --- src/libstd/repr.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index eafa3a892e8..4df2ace1056 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -200,7 +200,7 @@ impl ReprVisitor { } pub fn write_vec_range(&self, - mtbl: uint, + _mtbl: uint, ptr: *u8, len: uint, inner: *TyDesc) @@ -218,7 +218,6 @@ impl ReprVisitor { } else { self.writer.write_str(", "); } - self.write_mut_qualifier(mtbl); self.visit_ptr_inner(p as *c_void, inner); p = align(ptr::offset(p, sz) as uint, al) as *u8; left -= dec; @@ -303,18 +302,16 @@ impl TyVisitor for ReprVisitor { } } - fn visit_uniq(&self, mtbl: uint, inner: *TyDesc) -> bool { + fn visit_uniq(&self, _mtbl: uint, inner: *TyDesc) -> bool { self.writer.write_char('~'); - self.write_mut_qualifier(mtbl); do self.get::<*c_void> |b| { self.visit_ptr_inner(*b, inner); } } #[cfg(not(stage0))] - fn visit_uniq_managed(&self, mtbl: uint, inner: *TyDesc) -> bool { + fn visit_uniq_managed(&self, _mtbl: uint, inner: *TyDesc) -> bool { self.writer.write_char('~'); - self.write_mut_qualifier(mtbl); do self.get::<&managed::raw::BoxRepr> |b| { let p = ptr::to_unsafe_ptr(&b.data) as *c_void; self.visit_ptr_inner(p, inner); @@ -349,6 +346,7 @@ impl TyVisitor for ReprVisitor { fn visit_evec_box(&self, mtbl: uint, inner: *TyDesc) -> bool { do self.get::<&VecRepr> |b| { self.writer.write_char('@'); + self.write_mut_qualifier(mtbl); self.write_unboxed_vec_repr(mtbl, &b.unboxed, inner); } } @@ -630,6 +628,7 @@ fn test_repr() { exact_test(&(&10), "&10"); let mut x = 10; exact_test(&(&mut x), "&mut 10"); + exact_test(&(@mut [1, 2]), "@mut [1, 2]"); exact_test(&(1,), "(1,)"); exact_test(&(@[1,2,3,4,5,6,7,8]), From ce166446777c6771c136c2e896b25b750cb9685b Mon Sep 17 00:00:00 2001 From: Daniel Micay <danielmicay@gmail.com> Date: Wed, 17 Jul 2013 19:13:34 -0400 Subject: [PATCH 6/6] repr: add a test case for @mut inside another type --- src/libstd/repr.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index 4df2ace1056..0aeff2b0b77 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -621,9 +621,9 @@ fn test_repr() { exact_test(&(@"hello"), "@\"hello\""); exact_test(&(~"he\u10f3llo"), "~\"he\\u10f3llo\""); - // FIXME #4210: the mut fields are a bit off here. exact_test(&(@10), "@10"); - exact_test(&(@mut 10), "@10"); + exact_test(&(@mut 10), "@10"); // FIXME: #4210: incorrect + exact_test(&((@mut 10, 2)), "(@mut 10, 2)"); exact_test(&(~10), "~10"); exact_test(&(&10), "&10"); let mut x = 10;