1. 23 3月, 2013 2 次提交
    • B
      auto merge of #5463 : alexcrichton/rust/faster-fmt, r=graydon · f011f928
      bors 提交于
      This is a minor step towards #3571, although I'm sure there's still more work to be done. Previously, `fmt!` collected a bunch of strings in a vector and then called `str::concat`. This changes the behavior by maintaining only one buffer and appending directly into that buffer. This avoids doubly-allocating memory, and it has the added bonus of reducing some allocations in `core::unstable::extfmt`
      
      One of the unfortunate side effects of this is that the `rt` module in `extfmt.rs` had to be duplicated to avoid `stage0` errors. Dealing with the change in conversion functions may require a bit of a dance when a snapshot happens, but I think it's doable.
      
      If the second speedup commit isn't deemed necessary, I got about a 15% speedup with just the first patch which doesn't require any modification of `extfmt.rs`, so no snapshot weirdness.
      
      Here's some other things I ran into when looking at `fmt!`:
      * I don't think that #2249 is relevant any more except for maybe removing one of `%i` or `%d`
      * I'm not sure what was in mind for using traits with #3571, but I thought that formatters like `%u` could invoke the `to_uint()` method on the `NumCast` trait, but I ran into some problems like those in #5462
      
      I'm having trouble thinking of other wins for `fmt!`, but if there's some suggestions I'd be more than willing to look into if they'd work out or not.
      f011f928
    • B
      auto merge of #5398 : dbaupp/rust/core-readlines, r=graydon · 1616ffd0
      bors 提交于
      The `each_line` function in `ReaderUtil` acts very differently to equivalent functions in Python, Ruby, Clojure etc. E.g. given a file `t` with contents `trailing\nnew line\n` and `n` containing `no trailing\nnew line`:
      
      Rust:
      ```Rust
      t: ~[~"trailing", ~"new line", ~""]
      n: ~[~"no trailing", ~"new line"]
      ```
      
      Python:
      ```Python
      >>> open('t').readlines()
      ['trailing\n', 'new line\n']
      >>> open('n').readlines()
      ['no trailing\n', 'new line']
      ```
      
      Ruby:
      ```Ruby
      irb(main):001:0> File.readlines('t')
      => ["trailing\n", "new line\n"]
      irb(main):002:0> File.readlines('n')
      => ["no trailing\n", "new line"]
      ```
      
      Clojure
      ```Clojure
      user=> (read-lines "t")
      ("trailing" "new line")
      user=> (read-lines "n")
      ("no trailing" "new line")
      ```
      
      The extra string that rust includes at the end is inconsistent, and means that it is impossible to distinguish between the "real" empty line a file that ends `...\n\n`, and the "fake" one after the last `\n`.
      
      The code attached makes Rust's `each_line` act like Clojure (and PHP, i.e. not including the `\n`), as well as adjusting `str::lines` to fix the trailing empty line problem.
      
      Also, add a convenience `read_lines` method to read all the lines in a file into a vector.
      1616ffd0
  2. 22 3月, 2013 38 次提交