about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-09-10 17:22:20 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-09-10 17:26:17 -0700
commit2aa67e9aa9a29e9302337dd56313c4a2023a8900 (patch)
treed8081a92cb8f430894b0c662207c11f76d55accc /src/rustc
parentcb7a5395ddfaa7b8fc40db57b32c22f69780ccd6 (diff)
downloadrust-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.rs2
-rw-r--r--src/rustc/middle/lang_items.rs7
-rw-r--r--src/rustc/middle/trans/alt.rs25
-rw-r--r--src/rustc/middle/trans/callee.rs5
-rw-r--r--src/rustc/middle/ty.rs9
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}
 }