diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-09-10 17:22:20 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-09-10 17:26:17 -0700 |
| commit | 2aa67e9aa9a29e9302337dd56313c4a2023a8900 (patch) | |
| tree | d8081a92cb8f430894b0c662207c11f76d55accc /src/rustc | |
| parent | cb7a5395ddfaa7b8fc40db57b32c22f69780ccd6 (diff) | |
| download | rust-2aa67e9aa9a29e9302337dd56313c4a2023a8900.tar.gz rust-2aa67e9aa9a29e9302337dd56313c4a2023a8900.zip | |
rustc: Stop calling cmp shape glue in trans.
XFAIL's alt-borrowed_str for now. Will need to fix this up in the future.
Diffstat (limited to 'src/rustc')
| -rw-r--r-- | src/rustc/driver/driver.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/lang_items.rs | 7 | ||||
| -rw-r--r-- | src/rustc/middle/trans/alt.rs | 25 | ||||
| -rw-r--r-- | src/rustc/middle/trans/callee.rs | 5 | ||||
| -rw-r--r-- | src/rustc/middle/ty.rs | 9 |
5 files changed, 38 insertions, 10 deletions
diff --git a/src/rustc/driver/driver.rs b/src/rustc/driver/driver.rs index a82fc7ac69a..a17c61a2e30 100644 --- a/src/rustc/driver/driver.rs +++ b/src/rustc/driver/driver.rs @@ -206,7 +206,7 @@ fn compile_upto(sess: session, cfg: ast::crate_cfg, middle::region::determine_rp_in_crate(sess, ast_map, def_map, crate)); let ty_cx = ty::mk_ctxt(sess, def_map, ast_map, freevars, - region_map, rp_set); + region_map, rp_set, move lang_items); let (method_map, vtable_map) = time(time_passes, ~"typechecking", || typeck::check_crate(ty_cx, diff --git a/src/rustc/middle/lang_items.rs b/src/rustc/middle/lang_items.rs index b63a29d770e..5f9c17cebd5 100644 --- a/src/rustc/middle/lang_items.rs +++ b/src/rustc/middle/lang_items.rs @@ -44,7 +44,8 @@ struct LanguageItems { mut eq_trait: Option<def_id>, mut ord_trait: Option<def_id>, - mut str_eq_fn: Option<def_id> + mut str_eq_fn: Option<def_id>, + mut uniq_str_eq_fn: Option<def_id> } mod LanguageItems { @@ -71,7 +72,8 @@ mod LanguageItems { eq_trait: None, ord_trait: None, - str_eq_fn: None + str_eq_fn: None, + uniq_str_eq_fn: None } } } @@ -104,6 +106,7 @@ fn LanguageItemCollector(crate: @crate, session: session, item_refs.insert(~"ord", &mut items.ord_trait); item_refs.insert(~"str_eq", &mut items.str_eq_fn); + item_refs.insert(~"uniq_str_eq", &mut items.uniq_str_eq_fn); LanguageItemCollector { crate: crate, diff --git a/src/rustc/middle/trans/alt.rs b/src/rustc/middle/trans/alt.rs index a11dcdd7d75..557063ca91c 100644 --- a/src/rustc/middle/trans/alt.rs +++ b/src/rustc/middle/trans/alt.rs @@ -436,10 +436,27 @@ fn compare_values(cx: block, lhs: ValueRef, rhs: ValueRef, rhs_t: ty::t) -> return rslt(rs.bcx, rs.val); } - // Determine the operation we need. - let llop = C_u8(abi::cmp_glue_op_eq); - let cmpval = glue::call_cmp_glue(cx, lhs, rhs, rhs_t, llop); - rslt(cx, cmpval) + match ty::get(rhs_t).struct { + ty::ty_estr(ty::vstore_uniq) => { + let scratch_result = scratch_datum(cx, ty::mk_bool(cx.tcx()), + false); + let scratch_lhs = alloca(cx, val_ty(lhs)); + Store(cx, lhs, scratch_lhs); + let scratch_rhs = alloca(cx, val_ty(rhs)); + Store(cx, rhs, scratch_rhs); + let did = cx.tcx().lang_items.uniq_str_eq_fn.get(); + let bcx = callee::trans_rtcall_or_lang_call(cx, did, + ~[scratch_lhs, + scratch_rhs], + expr::SaveIn( + scratch_result.val)); + return scratch_result.to_result(bcx); + } + _ => { + cx.tcx().sess.bug(~"only scalars and unique strings supported in \ + compare_values"); + } + } } fn compile_submatch(bcx: block, m: match_, vals: ~[ValueRef], diff --git a/src/rustc/middle/trans/callee.rs b/src/rustc/middle/trans/callee.rs index 874eb86a18c..1c1654dbf93 100644 --- a/src/rustc/middle/trans/callee.rs +++ b/src/rustc/middle/trans/callee.rs @@ -273,6 +273,11 @@ fn trans_rtcall(bcx: block, name: ~str, args: ~[ValueRef], dest: expr::Dest) -> block { let did = bcx.ccx().rtcalls[name]; + return trans_rtcall_or_lang_call(bcx, did, args, dest); +} + +fn trans_rtcall_or_lang_call(bcx: block, did: ast::def_id, args: ~[ValueRef], + dest: expr::Dest) -> block { let fty = if did.crate == ast::local_crate { ty::node_id_to_type(bcx.ccx().tcx, did.node) } else { diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index f5d25feccb2..629be7022ee 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -342,7 +342,8 @@ type ctxt = inferred_modes: HashMap<ast::node_id, ast::mode>, // maps the id of borrowed expr to scope of borrowed ptr borrowings: HashMap<ast::node_id, borrow>, - normalized_cache: HashMap<t, t>}; + normalized_cache: HashMap<t, t>, + lang_items: middle::lang_items::LanguageItems}; enum tbox_flag { has_params = 1, @@ -809,7 +810,8 @@ fn mk_ctxt(s: session::session, amap: ast_map::map, freevars: freevars::freevar_map, region_map: middle::region::region_map, - region_paramd_items: middle::region::region_paramd_items) -> ctxt { + region_paramd_items: middle::region::region_paramd_items, + +lang_items: middle::lang_items::LanguageItems) -> ctxt { let interner = map::HashMap(); let vecs_implicitly_copyable = get_lint_level(s.lint_settings.default_settings, @@ -841,7 +843,8 @@ fn mk_ctxt(s: session::session, ty_param_bounds: map::int_hash(), inferred_modes: map::int_hash(), borrowings: map::int_hash(), - normalized_cache: new_ty_hash()} + normalized_cache: new_ty_hash(), + lang_items: move lang_items} } |
