From 5a1a9b21000580c64d56e86c4616d261e0e968f3 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 20 May 2013 03:57:51 -0400 Subject: [PATCH 1/5] librustc: classify newtype scalar structs as immediates. --- src/librustc/middle/trans/base.rs | 10 +++++----- src/librustc/middle/trans/callee.rs | 8 ++++---- src/librustc/middle/trans/datum.rs | 16 +++++++-------- src/librustc/middle/trans/expr.rs | 2 +- src/librustc/middle/trans/foreign.rs | 14 ++++++------- src/librustc/middle/trans/glue.rs | 2 +- src/librustc/middle/trans/monomorphize.rs | 2 +- src/librustc/middle/trans/type_of.rs | 6 +++--- src/librustc/middle/ty.rs | 24 +++++++++++++++++++---- 9 files changed, 50 insertions(+), 34 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 66cca74214a41..7271d65875b4b 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -1034,13 +1034,13 @@ pub fn do_spill_noroot(cx: block, v: ValueRef) -> ValueRef { pub fn spill_if_immediate(cx: block, v: ValueRef, t: ty::t) -> ValueRef { let _icx = cx.insn_ctxt("spill_if_immediate"); - if ty::type_is_immediate(t) { return do_spill(cx, v, t); } + if ty::type_is_immediate(cx.tcx(), t) { return do_spill(cx, v, t); } return v; } pub fn load_if_immediate(cx: block, v: ValueRef, t: ty::t) -> ValueRef { let _icx = cx.insn_ctxt("load_if_immediate"); - if ty::type_is_immediate(t) { return Load(cx, v); } + if ty::type_is_immediate(cx.tcx(), t) { return Load(cx, v); } return v; } @@ -1571,7 +1571,7 @@ pub fn mk_standard_basic_blocks(llfn: ValueRef) -> BasicBlocks { // slot where the return value of the function must go. pub fn make_return_pointer(fcx: fn_ctxt, output_type: ty::t) -> ValueRef { unsafe { - if !ty::type_is_immediate(output_type) { + if !ty::type_is_immediate(fcx.ccx.tcx, output_type) { llvm::LLVMGetParam(fcx.llfn, 0) } else { let lloutputtype = type_of::type_of(*fcx.ccx, output_type); @@ -1612,7 +1612,7 @@ pub fn new_fn_ctxt_w_id(ccx: @CrateContext, ty::subst_tps(ccx.tcx, substs.tys, substs.self_ty, output_type) } }; - let is_immediate = ty::type_is_immediate(substd_output_type); + let is_immediate = ty::type_is_immediate(ccx.tcx, substd_output_type); let fcx = @mut fn_ctxt_ { llfn: llfndecl, @@ -1732,7 +1732,7 @@ pub fn copy_args_to_allocas(fcx: fn_ctxt, // This alloca should be optimized away by LLVM's mem-to-reg pass in // the event it's not truly needed. // only by value if immediate: - let llarg = if datum::appropriate_mode(arg_ty).is_by_value() { + let llarg = if datum::appropriate_mode(bcx.tcx(), arg_ty).is_by_value() { let alloc = alloc_ty(bcx, arg_ty); Store(bcx, raw_llarg, alloc); alloc diff --git a/src/librustc/middle/trans/callee.rs b/src/librustc/middle/trans/callee.rs index 382e80148ec01..46f3535bf84e6 100644 --- a/src/librustc/middle/trans/callee.rs +++ b/src/librustc/middle/trans/callee.rs @@ -508,7 +508,7 @@ pub fn trans_call_inner(in_cx: block, let mut llargs = ~[]; - if ty::type_is_immediate(ret_ty) { + if ty::type_is_immediate(bcx.tcx(), ret_ty) { unsafe { llargs.push(llvm::LLVMGetUndef(T_ptr(T_i8()))); } @@ -557,7 +557,7 @@ pub fn trans_call_inner(in_cx: block, // case to ignore instead of invoking the Store // below into a scratch pointer of a mismatched // type. - } else if ty::type_is_immediate(ret_ty) { + } else if ty::type_is_immediate(bcx.tcx(), ret_ty) { let llscratchptr = alloc_ty(bcx, ret_ty); Store(bcx, llresult, llscratchptr); bcx = glue::drop_ty(bcx, llscratchptr, ret_ty); @@ -571,7 +571,7 @@ pub fn trans_call_inner(in_cx: block, // If this is an immediate, store into the result location. // (If this was not an immediate, the result will already be // directly written into the output slot.) - if ty::type_is_immediate(ret_ty) { + if ty::type_is_immediate(bcx.tcx(), ret_ty) { Store(bcx, llresult, lldest); } } @@ -775,7 +775,7 @@ pub fn trans_arg_expr(bcx: block, scratch.add_clean(bcx); temp_cleanups.push(scratch.val); - match arg_datum.appropriate_mode() { + match arg_datum.appropriate_mode(bcx.tcx()) { ByValue => val = Load(bcx, scratch.val), ByRef => val = scratch.val, } diff --git a/src/librustc/middle/trans/datum.rs b/src/librustc/middle/trans/datum.rs index 4a9a907d5b7c0..5bbcebe10ecea 100644 --- a/src/librustc/middle/trans/datum.rs +++ b/src/librustc/middle/trans/datum.rs @@ -195,7 +195,7 @@ pub fn scratch_datum(bcx: block, ty: ty::t, zero: bool) -> Datum { Datum { val: scratch, ty: ty, mode: ByRef, source: RevokeClean } } -pub fn appropriate_mode(ty: ty::t) -> DatumMode { +pub fn appropriate_mode(tcx: ty::ctxt, ty: ty::t) -> DatumMode { /*! * * Indicates the "appropriate" mode for this value, @@ -204,7 +204,7 @@ pub fn appropriate_mode(ty: ty::t) -> DatumMode { if ty::type_is_nil(ty) || ty::type_is_bot(ty) { ByValue - } else if ty::type_is_immediate(ty) { + } else if ty::type_is_immediate(tcx, ty) { ByValue } else { ByRef @@ -474,10 +474,10 @@ pub impl Datum { } } - fn appropriate_mode(&self) -> DatumMode { + fn appropriate_mode(&self, tcx: ty::ctxt) -> DatumMode { /*! See the `appropriate_mode()` function */ - appropriate_mode(self.ty) + appropriate_mode(tcx, self.ty) } fn to_appropriate_llval(&self, bcx: block) -> ValueRef { @@ -485,7 +485,7 @@ pub impl Datum { * * Yields an llvalue with the `appropriate_mode()`. */ - match self.appropriate_mode() { + match self.appropriate_mode(bcx.tcx()) { ByValue => self.to_value_llval(bcx), ByRef => self.to_ref_llval(bcx) } @@ -496,7 +496,7 @@ pub impl Datum { * * Yields a datum with the `appropriate_mode()`. */ - match self.appropriate_mode() { + match self.appropriate_mode(bcx.tcx()) { ByValue => self.to_value_datum(bcx), ByRef => self.to_ref_datum(bcx) } @@ -626,7 +626,7 @@ pub impl Datum { // changing the type, so I am putting this // code in place here to do the right // thing if this change ever goes through. - assert!(ty::type_is_immediate(ty)); + assert!(ty::type_is_immediate(bcx.tcx(), ty)); (Some(Datum {ty: ty, ..*self}), bcx) } }; @@ -666,7 +666,7 @@ pub impl Datum { // except for changing the type, so I am putting this // code in place here to do the right thing if this // change ever goes through. - assert!(ty::type_is_immediate(ty)); + assert!(ty::type_is_immediate(bcx.tcx(), ty)); (Some(Datum {ty: ty, ..*self}), bcx) } } diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index 8883cc44d1213..e9c688b94d3df 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -287,7 +287,7 @@ pub fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock { debug!("add_env(closure_ty=%s)", closure_ty.repr(tcx)); let scratch = scratch_datum(bcx, closure_ty, false); let llfn = GEPi(bcx, scratch.val, [0u, abi::fn_field_code]); - assert_eq!(datum.appropriate_mode(), ByValue); + assert_eq!(datum.appropriate_mode(tcx), ByValue); Store(bcx, datum.to_appropriate_llval(bcx), llfn); let llenv = GEPi(bcx, scratch.val, [0u, abi::fn_field_box]); Store(bcx, base::null_env_ptr(bcx), llenv); diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs index 13d8f854fb20f..3c24de2ed18f5 100644 --- a/src/librustc/middle/trans/foreign.rs +++ b/src/librustc/middle/trans/foreign.rs @@ -99,7 +99,7 @@ fn foreign_signature(ccx: @CrateContext, fn_sig: &ty::FnSig) LlvmSignature { llarg_tys: llarg_tys, llret_ty: llret_ty, - sret: !ty::type_is_immediate(fn_sig.output), + sret: !ty::type_is_immediate(ccx.tcx, fn_sig.output), } } @@ -191,7 +191,7 @@ fn build_wrap_fn_(ccx: @CrateContext, // Patch up the return type if it's not immediate and we're returning via // the C ABI. - if needs_c_return && !ty::type_is_immediate(tys.fn_sig.output) { + if needs_c_return && !ty::type_is_immediate(ccx.tcx, tys.fn_sig.output) { let lloutputtype = type_of::type_of(*fcx.ccx, tys.fn_sig.output); fcx.llretptr = Some(alloca(raw_block(fcx, false, fcx.llstaticallocas), lloutputtype)); @@ -695,7 +695,7 @@ pub fn trans_intrinsic(ccx: @CrateContext, // is not necessary since, for intrinsics, there is no // cleanup to concern ourselves with. let tp_ty = substs.tys[0]; - let mode = appropriate_mode(tp_ty); + let mode = appropriate_mode(ccx.tcx, tp_ty); let src = Datum {val: get_param(decl, first_real_arg + 1u), ty: tp_ty, mode: mode, source: RevokeClean}; bcx = src.move_to(bcx, DROP_EXISTING, @@ -704,7 +704,7 @@ pub fn trans_intrinsic(ccx: @CrateContext, ~"move_val_init" => { // See comments for `"move_val"`. let tp_ty = substs.tys[0]; - let mode = appropriate_mode(tp_ty); + let mode = appropriate_mode(ccx.tcx, tp_ty); let src = Datum {val: get_param(decl, first_real_arg + 1u), ty: tp_ty, mode: mode, source: RevokeClean}; bcx = src.move_to(bcx, INIT, get_param(decl, first_real_arg)); @@ -775,7 +775,7 @@ pub fn trans_intrinsic(ccx: @CrateContext, let lldestptr = PointerCast(bcx, lldestptr, T_ptr(T_i8())); let llsrcval = get_param(decl, first_real_arg); - let llsrcptr = if ty::type_is_immediate(in_type) { + let llsrcptr = if ty::type_is_immediate(ccx.tcx, in_type) { let llsrcptr = alloca(bcx, llintype); Store(bcx, llsrcval, llsrcptr); llsrcptr @@ -1206,7 +1206,7 @@ pub fn trans_foreign_fn(ccx: @CrateContext, let mut i = 0u; let n = tys.fn_sig.inputs.len(); - if !ty::type_is_immediate(tys.fn_sig.output) { + if !ty::type_is_immediate(ccx.tcx, tys.fn_sig.output) { let llretptr = load_inbounds(bcx, llargbundle, ~[0u, n]); llargvals.push(llretptr); } else { @@ -1234,7 +1234,7 @@ pub fn trans_foreign_fn(ccx: @CrateContext, shim_types: &ShimTypes, llargbundle: ValueRef, llretval: ValueRef) { - if ty::type_is_immediate(shim_types.fn_sig.output) { + if ty::type_is_immediate(bcx.tcx(), shim_types.fn_sig.output) { // Write the value into the argument bundle. let arg_count = shim_types.fn_sig.inputs.len(); let llretptr = load_inbounds(bcx, diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index f77e2e0d52aa2..506406e542c06 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -641,7 +641,7 @@ pub fn incr_refcnt_of_boxed(cx: block, box_ptr: ValueRef) { pub fn declare_tydesc_addrspace(ccx: @CrateContext, t: ty::t) -> addrspace { if !ty::type_needs_drop(ccx.tcx, t) { return default_addrspace; - } else if ty::type_is_immediate(t) { + } else if ty::type_is_immediate(ccx.tcx, t) { // For immediate types, we don't actually need an addrspace, because // e.g. boxed types include pointers to their contents which are // already correctly tagged with addrspaces. diff --git a/src/librustc/middle/trans/monomorphize.rs b/src/librustc/middle/trans/monomorphize.rs index 40b92d336536c..470077dcd233f 100644 --- a/src/librustc/middle/trans/monomorphize.rs +++ b/src/librustc/middle/trans/monomorphize.rs @@ -378,7 +378,7 @@ pub fn make_mono_id(ccx: @CrateContext, let llty = type_of::type_of(ccx, subst); let size = machine::llbitsize_of_real(ccx, llty); let align = machine::llalign_of_pref(ccx, llty); - let mode = datum::appropriate_mode(subst); + let mode = datum::appropriate_mode(ccx.tcx, subst); let data_class = mono_data_classify(subst); // Special value for nil to prevent problems diff --git a/src/librustc/middle/trans/type_of.rs b/src/librustc/middle/trans/type_of.rs index 8d5721aeb6512..a9126cb136ac3 100644 --- a/src/librustc/middle/trans/type_of.rs +++ b/src/librustc/middle/trans/type_of.rs @@ -19,8 +19,8 @@ use util::ppaux; use syntax::ast; -pub fn arg_is_indirect(_: @CrateContext, arg_ty: &ty::t) -> bool { - !ty::type_is_immediate(*arg_ty) +pub fn arg_is_indirect(ccx: @CrateContext, arg_ty: &ty::t) -> bool { + !ty::type_is_immediate(ccx.tcx, *arg_ty) } pub fn type_of_explicit_arg(ccx: @CrateContext, arg_ty: &ty::t) -> TypeRef { @@ -40,7 +40,7 @@ pub fn type_of_fn(cx: @CrateContext, inputs: &[ty::t], output: ty::t) // Arg 0: Output pointer. // (if the output type is non-immediate) - let output_is_immediate = ty::type_is_immediate(output); + let output_is_immediate = ty::type_is_immediate(cx.tcx, output); let lloutputtype = type_of(cx, output); if !output_is_immediate { atys.push(T_ptr(lloutputtype)); diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 1a2a84ceae856..0bf3c4c98f8f4 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -1689,9 +1689,25 @@ pub fn type_is_scalar(ty: t) -> bool { } } -pub fn type_is_immediate(ty: t) -> bool { - return type_is_scalar(ty) || type_is_boxed(ty) || - type_is_unique(ty) || type_is_region_ptr(ty); +pub fn type_is_newtype_scalar(cx: ctxt, ty: t) -> bool { + match get(ty).sty { + ty_struct(def_id, ref substs) => { + let fields = struct_fields(cx, def_id, substs); + + // Is this a newtype scalar struct? + if fields.len() == 1 && fields[0].ident == special_idents::unnamed_field { + type_is_scalar(fields[0].mt.ty) + } else { + false + } + } + _ => false + } +} + +pub fn type_is_immediate(cx: ctxt, ty: t) -> bool { + return type_is_newtype_scalar(cx, ty) || type_is_scalar(ty) || + type_is_boxed(ty) || type_is_unique(ty) || type_is_region_ptr(ty); } pub fn type_needs_drop(cx: ctxt, ty: t) -> bool { @@ -3215,7 +3231,7 @@ pub fn expr_kind(tcx: ctxt, ast::expr_cast(*) => { match tcx.node_types.find(&(expr.id as uint)) { Some(&t) => { - if ty::type_is_immediate(t) { + if ty::type_is_immediate(tcx, t) { RvalueDatumExpr } else { RvalueDpsExpr From 154456c608d73648e3146d8d6cfd394b1bf373a6 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 20 May 2013 04:01:17 -0400 Subject: [PATCH 2/5] librustc: Fix LLVM assertion with immediates and by-value self. --- src/librustc/middle/trans/callee.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/trans/callee.rs b/src/librustc/middle/trans/callee.rs index 46f3535bf84e6..d7a5afec1ae41 100644 --- a/src/librustc/middle/trans/callee.rs +++ b/src/librustc/middle/trans/callee.rs @@ -486,8 +486,22 @@ pub fn trans_call_inner(in_cx: block, } Method(d) => { // Weird but true: we pass self in the *environment* slot! + let llselfptr = + if ty::type_is_immediate(bcx.tcx(), d.self_ty) && + d.self_mode != ty::ByRef && + llvm::LLVMGetTypeKind(val_ty(d.llself)) != lib::llvm::Pointer { + + let llselfptr = alloca(bcx, val_ty(d.llself)); + + Store(bcx, d.llself, llselfptr); + bcx = glue::drop_ty(bcx, llselfptr, d.self_ty); + + llselfptr + } else { + d.llself + }; let llself = PointerCast(bcx, - d.llself, + llselfptr, T_opaque_box_ptr(ccx)); (d.llfn, llself) } From 99b0eeb7ab6e540801a23658b51d6d31820c3d5c Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 20 May 2013 04:13:32 -0400 Subject: [PATCH 3/5] Add test for #5321. --- src/test/run-pass/issue-3559 | Bin 9768 -> 0 bytes src/test/run-pass/issue-3702 | Bin 14700 -> 0 bytes src/test/run-pass/issue-4016 | Bin 9760 -> 0 bytes src/test/run-pass/issue-4092 | Bin 96008 -> 0 bytes .../issue-5321-immediates-with-bare-self.rs | 35 ++++++++++++++++++ 5 files changed, 35 insertions(+) delete mode 100755 src/test/run-pass/issue-3559 delete mode 100755 src/test/run-pass/issue-3702 delete mode 100755 src/test/run-pass/issue-4016 delete mode 100755 src/test/run-pass/issue-4092 create mode 100644 src/test/run-pass/issue-5321-immediates-with-bare-self.rs diff --git a/src/test/run-pass/issue-3559 b/src/test/run-pass/issue-3559 deleted file mode 100755 index 505b9b65512f2b19991af162d8b930b0598403f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9768 zcmeHNeQaA-6~A^;X12ERpo3D_aKV+LLSnmdY)1^qDT#Q2C}e9Ys%qip`MsCM!}c@J z&uM~G(JG?wWEELrNEMo(Li-~^6RHqG9gJyhDz-n61{ELEm_&rO;))_w6M|~6h2MGa z-uNqNHwnZ)?;EiA7vecucIaS5Q>7r`Sj># z$B&Oc`URr4L!ceq5+gY;gOT%@@nbXXEbjbpJB>TY!Bqj4v34vSER%Q{E*Z@34?ScpG&2Yb@}2OD!56SEoGI=lOeE3IX0~ z-+heD$suZ+>pC_%Guko&2iw+FI^43ZB$w8ffb+6to`79^QMD?BZ!NFiV`sEK)A0L~LXExHYuD}WU z#Q`86TV;I=_e$L55LJY+)fRje_#E)ie#YXMNHN=slEK7%M2|8S0TKI-O`{Odx=_K< zcJHhAqTLQ&{@9R#~+d$a~GSi~(&(Q-}3*TF)eM$&{8D zh!3U)5te*TOdvT~lQrSu$pNTLi1@qY(L+sR&2|bN{K(y!hc`z z6tF;Z&0yM*<%(?-2M^0RU|=7?zAK}3?KPGRt!k^eg27#H2M1%`U#^-j=&_|til>qT zYPno626WXrnJ>jEwtB)iNTE)R_BGrTlnbzdmUgXpNbxc-Bz3zl-f9&>Mh0j zrBXY3tMN8wC@WXPv!0u0Zjz&l^Kevg>}W`FW};!mnT+n8bjG5QN%Z>X`@S|7jia87 zW>L>Xr%^u^okOih%c!4@o`wu`eiE&FooAyL&{3R*vhqA6y#nQv&L0}zB4Q1yYNV=0 zs%oUFMyk+*D$`YEx~fc9mFcQ7T~(%3WlB}1P<7@i`7v2L8k*R+qBvJaH?Aqp&FRJi zpdOoD+c@w;tlGwbr``HTZhg_Me~h{b5}7>r;8)NeJ+g5?MO&wJVK=TLx(oD?f8$l^ z(HF=Y*QobN>b*!k> z?(o^*XLiZ|_lS=~o)>(dxC37SV;2M;eFt)33wcjqU{&xvCfGXl-p%f-V*X7ze{}cW zvpr3_C7D`^X+7+<=S6!#w5y_R<){9O;{VQTqJ34g*F}3vv?RL~k0* z0Y3tM1pEm25%446N5GGO9|1oCegymo{BI+0f0py(Q)#VWsHJK-5m!s4{6fB<+D0PH zbGnf{G^{0ubTv7j92ptn@zgkb#9F9h7UeUzW`UCz)iToFmcfxN;+-iZb~;plUpGI} zL@s-Ks)*J1WGM^hWxaFxl8&sm)n8{;W>1zIOL?22pGCiD6t(g)Vaofno-xRrSnl{V zDAh9ZAO)@)l-gIdFB9jnCcR{w+@!k^4sy2B6HsD1IQw)_&6n6e1Fn~9F3%T{(#e}8 zb|yG=Y}7izYC)s4n72UrevtJR7hoJEnGB@rRWkbV<5R5S&St+2xXJAjCEcG2;^hw+ z^ib~G^Hi-qi0UF$ z>k&-T*mr`9?7PIWAGGsSU7%`pzub-F#cn+A)bZLzZ#)kR{K;J&J^}opUgS!}JJ1(t zoF2`@d(xK(zn3xj9#jP0heWP?hpGx(zDH5kuMdjWg}(0*j%Q-|dx}2_e)(SY7vMdl z3_$k%3x(v*3H=X%NbNX zIEBrHU%7Yy5%S<#2mXqOL!$@RJMh~b_`Q$}(xyCmAEc+%51@Py1>21vOJ%FE2!0`P zd}_NLC-z@rn5PrN!y_Xj^ZI;7P363u$~iCM^n1rFLcdpuc)wSvFkW_l&LM7#qN&qe z!MJ;bG|?`)s_%Ff?qu6tPXo-O-ih=_=szxWfZNyDkRr@_5&` kX_xlxFVZg7ZSGL-o|HFa>)qIWD@sc9KJ2=FY2UE_07w&!>i_@% diff --git a/src/test/run-pass/issue-3702 b/src/test/run-pass/issue-3702 deleted file mode 100755 index 3f39ee314421be851b6bb59b5444a7b8b9b6864b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14700 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 diff --git a/src/test/run-pass/issue-4016 b/src/test/run-pass/issue-4016 deleted file mode 100755 index ff979383c1020274f9b7fccb94818ba13a7106e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9760 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +trait Fooable { + fn yes(self); +} + +impl Fooable for uint { + fn yes(self) { + for self.times { + io::println("yes"); + } + } +} + +struct Bar(uint); +impl Fooable for Bar { + fn yes(self) { + for self.times { + io::println("yes"); + } + } +} + +fn main() { + 2.yes(); + Bar(2).yes(); +} From edf210c78bdda09ff927710e601d19581decaaf3 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 20 May 2013 04:33:34 -0400 Subject: [PATCH 4/5] librustc: Also treat a struct with a single scalar field as an immediate. --- src/librustc/middle/trans/glue.rs | 27 +++++++++++++++++++++++++++ src/librustc/middle/ty.rs | 4 ++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index 506406e542c06..366c1a58052d0 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -100,6 +100,15 @@ pub fn drop_ty_immediate(bcx: block, v: ValueRef, t: ty::t) -> block { ty::ty_estr(ty::vstore_box) => { decr_refcnt_maybe_free(bcx, v, t) } + ty::ty_struct(def_id, ref substs) => { + let fields = ty::struct_fields(bcx.tcx(), def_id, substs); + + if fields.len() == 1 { + drop_ty_immediate(bcx, v, fields[0].mt.ty) + } else { + bcx.tcx().sess.bug(~"drop_ty_immediate: non-box ty") + } + } _ => bcx.tcx().sess.bug(~"drop_ty_immediate: non-box ty") } } @@ -120,6 +129,15 @@ pub fn take_ty_immediate(bcx: block, v: ValueRef, t: ty::t) -> Result { ty::ty_estr(ty::vstore_uniq) => { tvec::duplicate_uniq(bcx, v, t) } + ty::ty_struct(def_id, ref substs) => { + let fields = ty::struct_fields(bcx.tcx(), def_id, substs); + + if fields.len() == 1 { + take_ty_immediate(bcx, v, fields[0].mt.ty) + } else { + rslt(bcx, v) + } + } _ => rslt(bcx, v) } } @@ -147,6 +165,15 @@ pub fn free_ty_immediate(bcx: block, v: ValueRef, t: ty::t) -> block { Store(bcx, v, vp); free_ty(bcx, vp, t) } + ty::ty_struct(def_id, ref substs) => { + let fields = ty::struct_fields(bcx.tcx(), def_id, substs); + + if fields.len() == 1 { + free_ty_immediate(bcx, v, fields[0].mt.ty) + } else { + bcx.tcx().sess.bug(~"free_ty_immediate: non-box ty") + } + } _ => bcx.tcx().sess.bug(~"free_ty_immediate: non-box ty") } } diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 0bf3c4c98f8f4..7080f6f7726be 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -1694,8 +1694,8 @@ pub fn type_is_newtype_scalar(cx: ctxt, ty: t) -> bool { ty_struct(def_id, ref substs) => { let fields = struct_fields(cx, def_id, substs); - // Is this a newtype scalar struct? - if fields.len() == 1 && fields[0].ident == special_idents::unnamed_field { + // Is this a newtype/single field scalar struct? + if fields.len() == 1 { type_is_scalar(fields[0].mt.ty) } else { false From 2409d959e43fd567dd96693a6e432733f6df9411 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 20 May 2013 04:41:39 -0400 Subject: [PATCH 5/5] librustc: Update comment to reflect changes. --- src/librustc/middle/trans/datum.rs | 13 ------------- src/librustc/middle/ty.rs | 6 +----- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/librustc/middle/trans/datum.rs b/src/librustc/middle/trans/datum.rs index 5bbcebe10ecea..718e4de286264 100644 --- a/src/librustc/middle/trans/datum.rs +++ b/src/librustc/middle/trans/datum.rs @@ -620,12 +620,6 @@ pub impl Datum { ByValue => { // Actually, this case cannot happen right // now, because enums are never immediate. - // But in principle newtype'd immediate - // values should be immediate, and in that - // case the * would be a no-op except for - // changing the type, so I am putting this - // code in place here to do the right - // thing if this change ever goes through. assert!(ty::type_is_immediate(bcx.tcx(), ty)); (Some(Datum {ty: ty, ..*self}), bcx) } @@ -659,13 +653,6 @@ pub impl Datum { ) } ByValue => { - // Actually, this case cannot happen right now, - // because structs are never immediate. But in - // principle, newtype'd immediate values should be - // immediate, and in that case the * would be a no-op - // except for changing the type, so I am putting this - // code in place here to do the right thing if this - // change ever goes through. assert!(ty::type_is_immediate(bcx.tcx(), ty)); (Some(Datum {ty: ty, ..*self}), bcx) } diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 7080f6f7726be..a2ca6390e5e99 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -1695,11 +1695,7 @@ pub fn type_is_newtype_scalar(cx: ctxt, ty: t) -> bool { let fields = struct_fields(cx, def_id, substs); // Is this a newtype/single field scalar struct? - if fields.len() == 1 { - type_is_scalar(fields[0].mt.ty) - } else { - false - } + fields.len() == 1 && type_is_scalar(fields[0].mt.ty) } _ => false }