about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-08-25 14:03:23 -0700
committerBrian Anderson <banderson@mozilla.com>2011-08-27 15:54:44 -0700
commitfaef9490ae724bce4802405f826d65988b2b7b05 (patch)
treec4643570e9506e341b502726428def22bf0731fb
parent15e3ae79360508dc44f428f99bb483038fb2ab1e (diff)
Optimize std::istr::to_estr. Issue #855
-rw-r--r--src/lib/istr.rs14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/lib/istr.rs b/src/lib/istr.rs
index bed720d8c1e..4b1f990a243 100644
--- a/src/lib/istr.rs
+++ b/src/lib/istr.rs
@@ -16,11 +16,15 @@ fn from_estr(s: &str) -> istr {
 }
 
 fn to_estr(s: &istr) -> str {
-    let s2 = "";
-    for u in s {
-        str::push_byte(s2, u);
-    }
-    ret s2;
+    if byte_len(s) == 0u { ret "" };
+    let v: [u8] = unsafe::reinterpret_cast(s);
+    let vlen = vec::len(v);
+    assert vlen > 0u;
+    vec::unsafe::set_len(v, vlen - 1u);
+    let res = str::unsafe_from_bytes(v);
+    vec::unsafe::set_len(v, vlen);
+    unsafe::leak(v);
+    ret res;
 }
 
 fn from_estrs(ss: &[str]) -> [istr] {