From 6fe59bf8776f8913aacfb00a2281c94a117b95d1 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Sun, 11 Aug 2013 13:29:14 -0400 Subject: Add a field `borrow_offset` to the type descriptor indicating what amount a T* pointer must be adjusted to reach the contents of the box. For `~T` types, this requires knowing the type `T`, which is not known in the case of objects. --- src/libstd/unstable/intrinsics.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/libstd') diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index c60edad3dbd..d2807303fb2 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -38,16 +38,34 @@ pub use realstd::unstable::intrinsics::{TyDesc, Opaque, TyVisitor}; pub type GlueFn = extern "Rust" fn(*i8); -// NB: this has to be kept in sync with the Rust ABI. +// NB: this has to be kept in sync with `type_desc` in `rt` #[lang="ty_desc"] #[cfg(not(test))] pub struct TyDesc { + // sizeof(T) size: uint, + + // alignof(T) align: uint, + + // Called on a copy of a value of type `T` *after* memcpy take_glue: GlueFn, + + // Called when a value of type `T` is no longer needed drop_glue: GlueFn, + + // Called by drop glue when a value of type `T` can be freed free_glue: GlueFn, + + // Called by reflection visitor to visit a value of type `T` visit_glue: GlueFn, + + // If T represents a box pointer (`@U` or `~U`), then + // `borrow_offset` is the amount that the pointer must be adjusted + // to find the payload. This is always derivable from the type + // `U`, but in the case of `@Trait` or `~Trait` objects, the type + // `U` is unknown. + borrow_offset: uint, } #[lang="opaque"] -- cgit 1.4.1-3-g733a5 From df016dc4bf2efd3f4e0f9d67dda1875453c705b2 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Sun, 11 Aug 2013 13:58:01 -0400 Subject: Update type visitor to use &Visitor and not @Visitor --- src/librustc/middle/trans/glue.rs | 3 ++- src/librustc/middle/trans/reflect.rs | 6 +----- src/librustc/middle/ty.rs | 9 ++++----- src/librustc/middle/typeck/check/mod.rs | 3 ++- src/libstd/repr.rs | 24 ++++++++++++++++++++++++ src/libstd/unstable/intrinsics.rs | 4 ++++ 6 files changed, 37 insertions(+), 12 deletions(-) (limited to 'src/libstd') diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index c65d8d31b74..4f894deb1a1 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -348,7 +348,8 @@ pub fn make_visit_glue(bcx: @mut Block, v: ValueRef, t: ty::t) -> @mut Block { let _icx = push_ctxt("make_visit_glue"); do with_scope(bcx, None, "visitor cleanup") |bcx| { let mut bcx = bcx; - let (visitor_trait, object_ty) = match ty::visitor_object_ty(bcx.tcx()){ + let (visitor_trait, object_ty) = match ty::visitor_object_ty(bcx.tcx(), + ty::re_static) { Ok(pair) => pair, Err(s) => { bcx.tcx().sess.fatal(s); diff --git a/src/librustc/middle/trans/reflect.rs b/src/librustc/middle/trans/reflect.rs index e0403ac9ad7..fe5f8cd70ef 100644 --- a/src/librustc/middle/trans/reflect.rs +++ b/src/librustc/middle/trans/reflect.rs @@ -100,17 +100,13 @@ impl Reflector { debug!("arg %u: %s", i, bcx.val_to_str(*a)); } let bool_ty = ty::mk_bool(); - // XXX: Should not be BoxTraitStore! let result = unpack_result!(bcx, callee::trans_call_inner( self.bcx, None, mth_ty, bool_ty, |bcx| meth::trans_trait_callee_from_llval(bcx, mth_ty, mth_idx, v, - ty::BoxTraitStore, - ast::sty_region( - None, - ast::m_imm)), + None), ArgVals(args), None, DontAutorefArg)); let result = bool_to_i1(bcx, result); let next_bcx = sub_block(bcx, "next"); diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 14d3a926231..2ba6930d9c5 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -4487,7 +4487,8 @@ pub fn get_opaque_ty(tcx: ctxt) -> Result { } } -pub fn visitor_object_ty(tcx: ctxt) -> Result<(@TraitRef, t), ~str> { +pub fn visitor_object_ty(tcx: ctxt, + region: ty::Region) -> Result<(@TraitRef, t), ~str> { let trait_lang_item = match tcx.lang_items.require(TyVisitorTraitLangItem) { Ok(id) => id, Err(s) => { return Err(s); } @@ -4498,13 +4499,11 @@ pub fn visitor_object_ty(tcx: ctxt) -> Result<(@TraitRef, t), ~str> { tps: ~[] }; let trait_ref = @TraitRef { def_id: trait_lang_item, substs: substs }; - let mut static_trait_bound = EmptyBuiltinBounds(); - static_trait_bound.add(BoundStatic); Ok((trait_ref, mk_trait(tcx, trait_ref.def_id, trait_ref.substs.clone(), - BoxTraitStore, + RegionTraitStore(region), ast::m_imm, - static_trait_bound))) + EmptyBuiltinBounds()))) } diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 8bc32412568..a125dd27777 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -3437,7 +3437,8 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) { Ok(t) => t, Err(s) => { tcx.sess.span_fatal(it.span, s); } }; - let visitor_object_ty = match ty::visitor_object_ty(tcx) { + let region = ty::re_bound(ty::br_anon(0)); + let visitor_object_ty = match ty::visitor_object_ty(tcx, region) { Ok((_, vot)) => vot, Err(s) => { tcx.sess.span_fatal(it.span, s); } }; diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index a53e3e796a7..d0970f1b6b7 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -158,6 +158,7 @@ impl ReprVisitor { } #[inline] + #[cfg(stage0)] pub fn visit_ptr_inner(&self, ptr: *c_void, inner: *TyDesc) -> bool { unsafe { let u = ReprVisitor(ptr, self.writer); @@ -167,6 +168,17 @@ impl ReprVisitor { } } + #[inline] + #[cfg(not(stage0))] + pub fn visit_ptr_inner(&self, ptr: *c_void, inner: *TyDesc) -> bool { + unsafe { + let u = ReprVisitor(ptr, self.writer); + let v = reflect::MovePtrAdaptor(u); + visit_tydesc(inner, &v as &TyVisitor); + true + } + } + #[inline] pub fn write(&self) -> bool { do self.get |v:&T| { @@ -556,6 +568,7 @@ impl TyVisitor for ReprVisitor { fn visit_closure_ptr(&self, _ck: uint) -> bool { true } } +#[cfg(stage0)] pub fn write_repr(writer: @Writer, object: &T) { unsafe { let ptr = ptr::to_unsafe_ptr(object) as *c_void; @@ -566,6 +579,17 @@ pub fn write_repr(writer: @Writer, object: &T) { } } +#[cfg(not(stage0))] +pub fn write_repr(writer: @Writer, object: &T) { + unsafe { + let ptr = ptr::to_unsafe_ptr(object) as *c_void; + let tydesc = get_tydesc::(); + let u = ReprVisitor(ptr, writer); + let v = reflect::MovePtrAdaptor(u); + visit_tydesc(tydesc, &v as &TyVisitor) + } +} + #[cfg(test)] struct P {a: int, b: float} diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index d2807303fb2..1b7b240f01a 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -328,8 +328,12 @@ extern "rust-intrinsic" { /// Returns `true` if a type is managed (will be allocated on the local heap) pub fn contains_managed() -> bool; + #[cfg(stage0)] pub fn visit_tydesc(td: *TyDesc, tv: @TyVisitor); + #[cfg(not(stage0))] + pub fn visit_tydesc(td: *TyDesc, tv: &TyVisitor); + pub fn frame_address(f: &once fn(*u8)); /// Get the address of the `__morestack` stack growth function. -- cgit 1.4.1-3-g733a5