about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/ebml.rs15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/libstd/ebml.rs b/src/libstd/ebml.rs
index 07f578901fd..88a415465d4 100644
--- a/src/libstd/ebml.rs
+++ b/src/libstd/ebml.rs
@@ -98,24 +98,28 @@ fn get_doc(d: doc, tg: uint) -> doc {
     }
 }
 
-fn docs(d: doc, it: fn(uint, doc)) {
+fn docs(d: doc, it: fn(uint, doc) -> bool) {
     let mut pos = d.start;
     while pos < d.end {
         let elt_tag = vuint_at(*d.data, pos);
         let elt_size = vuint_at(*d.data, elt_tag.next);
         pos = elt_size.next + elt_size.val;
-        it(elt_tag.val, {data: d.data, start: elt_size.next, end: pos});
+        if !it(elt_tag.val, {data: d.data, start: elt_size.next, end: pos}) {
+            break;
+        }
     }
 }
 
-fn tagged_docs(d: doc, tg: uint, it: fn(doc)) {
+fn tagged_docs(d: doc, tg: uint, it: fn(doc) -> bool) {
     let mut pos = d.start;
     while pos < d.end {
         let elt_tag = vuint_at(*d.data, pos);
         let elt_size = vuint_at(*d.data, elt_tag.next);
         pos = elt_size.next + elt_size.val;
         if elt_tag.val == tg {
-            it({data: d.data, start: elt_size.next, end: pos});
+            if !it({data: d.data, start: elt_size.next, end: pos}) {
+                break;
+            }
         }
     }
 }
@@ -123,8 +127,7 @@ fn tagged_docs(d: doc, tg: uint, it: fn(doc)) {
 fn doc_data(d: doc) -> ~[u8] { vec::slice::<u8>(*d.data, d.start, d.end) }
 
 fn with_doc_data<T>(d: doc, f: fn(x: &[u8]) -> T) -> T {
-    // FIXME (#2880): use vec::view once the region inferencer can handle it.
-    ret f(vec::slice::<u8>(*d.data, d.start, d.end));
+    ret f(vec::slice(*d.data, d.start, d.end));
 }
 
 fn doc_as_str(d: doc) -> ~str { ret str::from_bytes(doc_data(d)); }