Commit Graph

29126 Commits

Author SHA1 Message Date
Huon Wilson
2f0f017d3e test: implement a no-alloc -> &str method for TestName.
This is far cheaper than the `.to_str` technique that was used previously.
2014-05-15 21:17:35 +10:00
bors
f2c4c88ff1 auto merge of #14174 : stepancheg/rust/once, r=alexcrichton
Submitting PR again, because I cannot reopen #13349, and github does not attach new patch to that PR. 

=======

Optimize `Once::doit`: perform optimistic check that initializtion is
already completed.  `load` is much cheaper than `fetch_add` at least
on x86_64.

Verified with this test:

```
static mut o: one::Once = one::ONCE_INIT;
unsafe {
    loop {
        let start = time::precise_time_ns();
        let iters = 50000000u64;
        for _ in range(0, iters) {
            o.doit(|| { println!("once!"); });
        }
        let end = time::precise_time_ns();
        let ps_per_iter = 1000 * (end - start) / iters;
        println!("{} ps per iter", ps_per_iter);

        // confuse the optimizer
        o.doit(|| { println!("once!"); });
    }
}
```

Test executed on Mac, Intel Core i7 2GHz. Result is:
* 20ns per iteration without patch
*  4ns per iteration with this patch applied

Once.doit could be even faster (800ps per iteration), if `doit` function
was split into a pair of `doit`/`doit_slow`, and `doit` marked as
`#[inline]` like this:

```
#[inline(always)]
pub fn doit(&self, f: ||) {
    if self.cnt.load(atomics::SeqCst) < 0 {
        return
    }

    self.doit_slow(f);
}

fn doit_slow(&self, f: ||) { ... }
```
2014-05-15 04:16:47 -07:00
bors
fedffa785e auto merge of #14145 : pnkfelix/rust/fsk-better-svh-via-visitor, r=alexcrichton
Teach SVH computation to ignore more implementation artifacts.

In particular, this version of strict version hash (SVH) works much
like the deriving(Hash)-based implementation did, except that it
deliberately:

  1. skips over content known not affect the generated crates, and,

  2. uses a content-based hash for names instead of using the value of
     the `Name` index itself, which can differ depending on the order
     in which strings are interned (which in turn is affected by
     e.g. the presence of `--cfg` options on the command line).

Fix #14132.
2014-05-15 02:41:50 -07:00
Felix S. Klock II
5236af8c0f Added tests checking that changes in type sig are recognized in SVH.
(Only after adding the tests did I realize that this is not really a
special case at the AST level; as far as the visitor is concerned,
`int` and `i32` and `i64` are just idents.)
2014-05-15 11:09:26 +02:00
Felix S. Klock II
930308b16e A test case for a bug I found in the new SVH while reviewing it.
Namely: non-pub `use` declarations *are* significant to the SVH
computation, since they can change which traits are part of the method
resolution step, and thus affect which methods get called from the
(potentially inlined) code.
2014-05-15 11:09:26 +02:00
Felix S. Klock II
a92d162026 Some basic acceptance tests for better SVH. 2014-05-15 11:09:26 +02:00
Felix S. Klock II
b9ed9ed5ad Teach SVH computation to ignore more implementation artifacts.
In particular, this version of strict version hash (SVH) works much
like the deriving(Hash)-based implementation did, except that uses a
content-based hash that filters rustc implementation artifacts and
surface syntax artifacts.

Fix #14132.
2014-05-15 11:09:18 +02:00
Felix S. Klock II
d6cf0dfbab syntax::visit: pub walk_explicit_self so impls can call it as defaults do.
drive-by: added some doc.
2014-05-15 10:55:02 +02:00
bors
579e0a5f55 auto merge of #14162 : brson/rust/fixvercmd, r=brson
Instead of just blindly printing arg[0], use a constant string.

Partial fix for #13582
2014-05-15 01:02:11 -07:00
Michael Woerister
3fabb1178f debuginfo: Represent SIMD types as tuple structs instead of as fixed-sized arrays 2014-05-15 09:37:43 +02:00
Aaron Turon
e71202aecf Change dynamic_library::open_external to take ToCStr
`std::unstable::dynamic_library::open_external` currently takes a
`Path`, but because `Paths` produce normalized strings, this can
change the semantics of lookups in a given environment. This patch
generalizes the function to take a `ToCStr`-bounded type, which
includes both `Path`s and `str`s.

Closes #11650.
2014-05-14 22:52:31 -07:00
Aaron Turon
046062d3bf Process::new etc should support non-utf8 commands/args
The existing APIs for spawning processes took strings for the command
and arguments, but the underlying system may not impose utf8 encoding,
so this is overly limiting.

The assumption we actually want to make is just that the command and
arguments are viewable as [u8] slices with no interior NULLs, i.e., as
CStrings. The ToCStr trait is a handy bound for types that meet this
requirement (such as &str and Path).

However, since the commands and arguments are often a mixture of
strings and paths, it would be inconvenient to take a slice with a
single T: ToCStr bound. So this patch revamps the process creation API
to instead use a builder-style interface, called `Command`, allowing
arguments to be added one at a time with differing ToCStr
implementations for each.

The initial cut of the builder API has some drawbacks that can be
addressed once issue #13851 (libstd as a facade) is closed. These are
detailed as FIXMEs.

Closes #11650.

[breaking-change]
2014-05-14 22:52:31 -07:00
Aaron Turon
8f9cbe08c6 Add ToCStr impl for &Path and StrBuf
This is a stopgap until DST (#12938) lands.

Until DST lands, we cannot decompose &str into & and str, so we cannot
usefully take ToCStr arguments by reference (without forcing an
additional & around &str). So we are instead temporarily adding an
instance for &Path and StrBuf, so that we can take ToCStr as owned. When
DST lands, the &Path instance should be removed, the string instances
should be revisted, and arguments bound by ToCStr should be passed by
reference.

FIXMEs have been added accordingly.
2014-05-14 22:42:46 -07:00
bors
73a68cdba0 auto merge of #14133 : db48x/rust/ord-for-mut-refs, r=alexcrichton
Also Show, which is useful in assertions. Fixes #14074
2014-05-14 22:06:50 -07:00
bors
e10fd31721 auto merge of #14170 : pcwalton/rust/detildestr-misclibs, r=alexcrichton
r? @brson
2014-05-14 19:31:52 -07:00
Jonathan S
39cb5b13e6 Switched to the two-way algorithm for string searching
test str::bench::bench_contains_bad_naive                   ... bench:       300 ns/iter (+/- 12)     from 1309 ns/iter (+/- 36)
test str::bench::bench_contains_equal                       ... bench:       154 ns/iter (+/- 7)      from  137 ns/iter (+/- 2)
test str::bench::bench_contains_short_long                  ... bench:      2998 ns/iter (+/- 74)     from 5473 ns/iter (+/- 14)
test str::bench::bench_contains_short_short                 ... bench:        65 ns/iter (+/- 2)      from   57 ns/iter (+/- 6)
2014-05-14 20:34:43 -05:00
Patrick Walton
351a564df5 libnum: Remove all uses of ~str from libnum 2014-05-14 18:29:14 -07:00
Patrick Walton
1ef8246946 libcollections: Remove most uses of ~str from libcollections 2014-05-14 18:29:14 -07:00
Patrick Walton
dfe021625a liburl: Remove all uses of ~str from liburl 2014-05-14 18:29:14 -07:00
Patrick Walton
ded860c0e8 libterm: Remove all uses of ~str from libterm 2014-05-14 18:29:13 -07:00
Patrick Walton
93499b1eaf libtest: Remove all uses of ~str from libtest. 2014-05-14 18:29:13 -07:00
Patrick Walton
1440e09839 libsync: Remove all uses of ~str from libsync 2014-05-14 18:29:13 -07:00
Patrick Walton
7abf6f1346 librand: Remove all uses of ~str from librand 2014-05-14 18:29:13 -07:00
Patrick Walton
6415d06616 libtime: Remove all uses of ~str from libtime 2014-05-14 18:29:13 -07:00
Patrick Walton
5a93b4f192 libsemver: Remove all uses of ~str from libsemver 2014-05-14 18:29:12 -07:00
Patrick Walton
30dbcf5f88 libglob: Remove all uses of ~str from libglob 2014-05-14 18:29:12 -07:00
Patrick Walton
8a1aaac396 liblog: Remove all uses of ~str from liblog 2014-05-14 18:29:12 -07:00
Patrick Walton
e786a745b5 libgraphviz: Remove all uses of ~str from libgraphviz. 2014-05-14 18:29:12 -07:00
Patrick Walton
ec5911b2a6 libregex: Remove all uses of ~str from libregex 2014-05-14 18:29:12 -07:00
Kevin Ballard
ba7844a7ff Change StrBuf::from_utf8() to return Result
This allows the original vector to be recovered in the event that it is
not UTF-8.

[breaking-change]
2014-05-14 17:35:55 -07:00
Kevin Ballard
d0f3cb05df Change str::from_utf8_owned() to return Result
This allows the original vector to be recovered in the event that it is
not valid UTF-8.

[breaking-change]
2014-05-14 17:35:55 -07:00
Chris Morgan
5b13ddb5f2 Use assertions in find_with_or_insert_with example
This lets us test it automatically and also makes it more obvious what
the expected result is.
2014-05-15 10:28:48 +10:00
Chris Morgan
73dc1e016d Rename HashMap.mangle to find_with_or_insert_with.
This also entails swapping the order of the find and insert callbacks so
that their order matches the order of the terms in the method name.
2014-05-15 10:13:36 +10:00
Chris Morgan
acdce63852 Tidy up the HashMap.mangle example. 2014-05-15 10:07:50 +10:00
Brian Anderson
67fa90e48a Print 'rustc' and 'rustdoc' as the command name for --version
Instead of just blindly printing arg[0], use a constant string.
Partial fix for #13582
2014-05-14 15:34:14 -07:00
Jonathan S
8a32a2a872 Added substring searching benchmarks.
test str::bench::bench_contains_bad_naive                   ... bench:      1309 ns/iter (+/- 36)
test str::bench::bench_contains_equal                       ... bench:       137 ns/iter (+/- 2)
test str::bench::bench_contains_short_long                  ... bench:      5473 ns/iter (+/- 14)
test str::bench::bench_contains_short_short                 ... bench:        57 ns/iter (+/- 6)
2014-05-14 17:24:06 -05:00
Patrick Walton
62cf95f674 libarena: Remove all uses of ~str from libarena 2014-05-14 14:58:01 -07:00
Patrick Walton
bf249b4411 libhexfloat: Remove all uses of ~str from libhexfloat 2014-05-14 14:58:01 -07:00
Patrick Walton
27977e41fc libuuid: Remove all uses of ~str from libuuid. 2014-05-14 14:58:01 -07:00
Patrick Walton
504335ae5a libworkcache: Remove all uses of ~str from libworkcache. 2014-05-14 14:58:00 -07:00
Patrick Walton
95e310abdc test: Remove all uses of ~str from the test suite. 2014-05-14 14:58:00 -07:00
bors
2a7a39191a auto merge of #14086 : Ryman/rust/resolve_error_suggestions, r=alexcrichton
Provides better help for the resolve failures inside an `impl` if the name matches:
- a field on the self type
- a method on the self type
- a method on the current trait ref (in a trait impl)

Not handling trait method suggestions if in a regular `impl` (as you can see on line 69 of the test), I believe it is possible though.

Also, provides a better message when `self` fails to resolve due to being a static method.

It's using some unsafe pointers to skip copying the larger structures (which are only used in error conditions); it's likely possible to get it working with lifetimes (all the useful refs should outlive the visitor calls) but I haven't really figured that out for this case. (can switch to copying code if wanted)

Closes #2356.
2014-05-14 12:06:29 -07:00
Kevin Butler
595e2910d8 rustc: Improve error messages for resolve failures. 2014-05-14 19:18:18 +01:00
Daniel Micay
7798755916 update valgrind headers 2014-05-14 12:34:32 -04:00
bors
1a1645d3b1 auto merge of #14009 : jcmoyer/rust/bitflags-complement, r=alexcrichton
I feel that this is a very vital, missing piece of functionality. This adds on to #13072.

Only bits used in the definition of the bitflag are considered for the universe set. This is a bit safer than simply inverting all of the bits in the wrapped value.

```rust
bitflags!(flags Flags: u32 {
    FlagA       = 0x00000001,
    FlagB       = 0x00000010,
    FlagC       = 0x00000100,
    FlagABC     = FlagA.bits
                | FlagB.bits
                | FlagC.bits
})

...

// `Not` implements set complement
assert!(!(FlagB | FlagC) == FlagA);
// `all` and `is_all` are the inverses of `empty` and `is_empty`
assert!(Flags::all() - FlagA == !FlagA);
assert!(FlagABC.is_all());
```
2014-05-14 09:21:25 -07:00
bors
96bcadc181 auto merge of #14192 : pongad/rust/walkcleanup, r=pcwalton
Fixes #14134
2014-05-14 07:31:45 -07:00
Chris Morgan
460b55262e Reinstate HashMap.mangle().
This was removed when the Robin Hood hash map came along, but it is a
useful thing to have.

The comment is taken directly from what was there before (e.g. in 0.9)
but with appropriate language changes (like `StrBuf` instead of `~str`).
2014-05-15 00:15:30 +10:00
bors
d78718ad63 auto merge of #14191 : luqmana/rust/eu, r=alexcrichton
We were correctly determining the attributes needed for the parameters for extern fns, but when that extern fn was from another crate we never bothered to pass that information along to LLVM. (i.e never called `foreign::add_argument_attributes`).

I've just changed both local and non-local (crate) extern fn's to be dealt with together (through `foreign::register_foreign_item_fn`) so we don't run into something like again.

Fixes #14177.
2014-05-14 05:56:18 -07:00
bors
d9906813c8 auto merge of #14186 : omasanori/rust/suppress-warnings, r=alexcrichton 2014-05-14 04:06:26 -07:00
Stepan Koltsov
f853cf79b5 Optimize common path of Once::doit
Optimize `Once::doit`: perform optimistic check that initializtion is
already completed.  `load` is much cheaper than `fetch_add` at least
on x86_64.

Verified with this test:

```
static mut o: one::Once = one::ONCE_INIT;
unsafe {
    loop {
        let start = time::precise_time_ns();
        let iters = 50000000u64;
        for _ in range(0, iters) {
            o.doit(|| { println!("once!"); });
        }
        let end = time::precise_time_ns();
        let ps_per_iter = 1000 * (end - start) / iters;
        println!("{} ps per iter", ps_per_iter);

        // confuse the optimizer
        o.doit(|| { println!("once!"); });
    }
}
```

Test executed on Mac, Intel Core i7 2GHz. Result is:
* 20ns per iteration without patch
*  4ns per iteration with this patch applied

Once.doit could be even faster (800ps per iteration), if `doit` function
was split into a pair of `doit`/`doit_slow`, and `doit` marked as
`#[inline]` like this:

```
#[inline(always)]
pub fn doit(&self, f: ||) {
    if self.cnt.load(atomics::SeqCst) < 0 {
        return
    }

    self.doit_slow(f);
}

fn doit_slow(&self, f: ||) { ... }
```
2014-05-14 10:23:42 +00:00