diff options
Diffstat (limited to 'src/libstd/ebml.rs')
| -rw-r--r-- | src/libstd/ebml.rs | 15 |
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)); } |
