5439 Commits

Author SHA1 Message Date
Brian Anderson
50331595fc std: Delete unused file 2014-05-15 13:50:50 -07:00
Brian Anderson
514fc308b0 std: Remove run_in_bare_thread 2014-05-15 13:50:50 -07:00
Felix S. Klock II
7f88cfde18 Add IntoMaybeOwned impl for StrBuf to ease conversion to MaybeOwned. 2014-05-15 13:50:42 -07:00
Daniel Micay
e043644cea use sched_yield on linux and freebsd
pthread_yield is non-standard, while sched_yield is POSIX

The Linux documentation recommends using the standard function. This is
the only feature we're currently using that's present in glibc but not
in musl.
2014-05-15 13:50:36 -07:00
Alex Crichton
8211539114 Register new snapshots 2014-05-15 13:50:34 -07:00
Aaron Turon
912a9675c0 Make from_bits in bitflags! safe; add from_bits_truncate
Previously, the `from_bits` function in the `std::bitflags::bitflags`
macro was marked as unsafe, as it did not check that the bits being
converted actually corresponded to flags.

This patch changes the function to check against the full set of
possible flags and return an `Option` which is `None` if a non-flag bit
is set. It also adds a `from_bits_truncate` function which simply zeros
any bits not corresponding to a flag.

This addresses the concern raised in https://github.com/mozilla/rust/pull/13897
2014-05-15 13:50:33 -07:00
Kevin Ballard
d547de998d Make Vec.truncate() resilient against failure in Drop
If a vector element fails in Drop, Vec needs to make sure it doesn't try
to re-drop any elements it already dropped.
2014-05-15 13:50:29 -07:00
Brian Anderson
ef788d51dd std: Modify TempDir to not fail on drop. Closes #12628
After discussion with Alex, we think the proper policy is for dtors
to not fail. This is consistent with C++. BufferedWriter already
does this, so this patch modifies TempDir to not fail in the dtor,
adding a `close` method for handling errors on destruction.
2014-05-15 13:50:24 -07:00
bors
ba5f53009a auto merge of #13948 : huonw/rust/test-regex-filter, r=alexcrichton
This allows writing a regex to filter tests more precisely, rather than having to list long paths e.g.

```
$ ./stdtest-x86_64-unknown-linux-gnu 'vec.*clone'

running 2 tests
test vec::tests::test_clone ... ok
test vec::tests::test_clone_from ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured
```

The regex change is fully backwards compatible, since test names are Rust
identifiers + `:`, and hence not special regex characters.

(See commits for details.)
2014-05-15 11:22:02 -07:00
bors
fbd8f4a3a3 auto merge of #13954 : aturon/rust/issue-11650, r=alexcrichton
## Process API

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.

## Dynamic library API

`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.

## ToCStr API

Adds ToCStr impl for &Path and ~str. 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 ~str, 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. 

## Tickets closed

Closes #11650.
Closes #7928.
2014-05-15 08:36:50 -07:00
Huon Wilson
18c13de5e6 std:: switch the order in which dynamic_lib adds search paths.
The compiler needs to be opening e.g. libregex in the correct directory,
which requires getting these in the right order.
2014-05-15 23:04:09 +10: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
Patrick Walton
7abf6f1346 librand: Remove all uses of ~str from librand 2014-05-14 18:29:13 -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
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
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
d9906813c8 auto merge of #14186 : omasanori/rust/suppress-warnings, r=alexcrichton 2014-05-14 04:06:26 -07:00
J.C. Moyer
1595885501 Implement set complement and universe for bitflags 2014-05-14 04:37:06 -04:00
Daniel Brooks
9eb723d000 define Eq,TotalEq,Ord,TotalOrd for &mut T
Also Show, which is useful in assertions. Fixes #14074
2014-05-14 00:48:02 -07:00
Alex Crichton
325cc51502 core: Inherit the atomics module 2014-05-13 23:59:03 -07:00
bors
e4414739a5 auto merge of #13127 : kballard/rust/read_at_least, r=alexcrichton
Reader.read_at_least() ensures that at least a given number of bytes
have been read. The most common use-case for this is ensuring at least 1
byte has been read. If the reader returns 0 enough times in a row, a new
error kind NoProgress will be returned instead of looping infinitely.

This change is necessary in order to properly support Readers that
repeatedly return 0, either because they're broken, or because they're
attempting to do a non-blocking read on some resource that never becomes
available.

Also add .push() and .push_at_least() methods. push() is like read() but
the results are appended to the passed Vec.

Remove Reader.fill() and Reader.push_exact() as they end up being thin
wrappers around read_at_least() and push_at_least().

[breaking-change]
2014-05-13 20:01:28 -07:00
Kevin Ballard
972f2e5855 io: Add .read_at_least() to Reader
Reader.read_at_least() ensures that at least a given number of bytes
have been read. The most common use-case for this is ensuring at least 1
byte has been read. If the reader returns 0 enough times in a row, a new
error kind NoProgress will be returned instead of looping infinitely.

This change is necessary in order to properly support Readers that
repeatedly return 0, either because they're broken, or because they're
attempting to do a non-blocking read on some resource that never becomes
available.

Also add .push() and .push_at_least() methods. push() is like read() but
the results are appended to the passed Vec.

Remove Reader.fill() and Reader.push_exact() as they end up being thin
wrappers around read_at_least() and push_at_least().

[breaking-change]
2014-05-13 18:45:20 -07:00
Alex Crichton
f09592a5d1 io: Implement process wait timeouts
This implements set_timeout() for std::io::Process which will affect wait()
operations on the process. This follows the same pattern as the rest of the
timeouts emerging in std::io::net.

The implementation was super easy for everything except libnative on unix
(backwards from usual!), which required a good bit of signal handling. There's a
doc comment explaining the strategy in libnative. Internally, this also required
refactoring the "helper thread" implementation used by libnative to allow for an
extra helper thread (not just the timer).

This is a breaking change in terms of the io::Process API. It is now possible
for wait() to fail, and subsequently wait_with_output(). These two functions now
return IoResult<T> due to the fact that they can time out.

Additionally, the wait_with_output() function has moved from taking `&mut self`
to taking `self`. If a timeout occurs while waiting with output, the semantics
are undesirable in almost all cases if attempting to re-wait on the process.
Equivalent functionality can still be achieved by dealing with the output
handles manually.

[breaking-change]

cc #13523
2014-05-13 17:27:42 -07:00
Florian Zeitz
df802a2754 std: Rename str::Normalizations to str::Decompositions
The Normalizations iterator has been renamed to Decompositions.
It does not currently include all forms of Unicode normalization,
but only encompasses decompositions.
If implemented recomposition would likely be a separate iterator
which works on the result of this one.

[breaking-change]
2014-05-13 17:24:07 -07:00
Florian Zeitz
74ad023674 std, core: Generate unicode.rs using unicode.py 2014-05-13 17:24:07 -07:00
OGINO Masanori
de2c48c30a Add tests for from_bits.
Signed-off-by: OGINO Masanori <masanori.ogino@gmail.com>
2014-05-13 17:24:07 -07:00
Alex Crichton
cbc31df4fc std: Move the owned module from core to std
The compiler was updated to recognize that implementations for ty_uniq(..) are
allowed if the Box lang item is located in the current crate. This enforces the
idea that libcore cannot allocated, and moves all related trait implementations
from libcore to libstd.

This is a breaking change in that the AnyOwnExt trait has moved from the any
module to the owned module. Any previous users of std::any::AnyOwnExt should now
use std::owned::AnyOwnExt instead. This was done because the trait is intended
for Box traits and only Box traits.

[breaking-change]
2014-05-13 17:24:07 -07:00
OGINO Masanori
6ce7dfb996 Suppress a "unused variable" warning.
Signed-off-by: OGINO Masanori <masanori.ogino@gmail.com>
2014-05-14 09:14:45 +09:00
bors
cb115ac2d4 auto merge of #14075 : Rufflewind/rust/patch-3, r=alexcrichton
- Use Unicode-aware versions of `CreateProcess` (Fixes #13815) and `Get/FreeEnvironmentStrings`.
    - Includes a helper function `os::win32::as_mut_utf16_p`, which does the same thing as `os::win32::as_utf16_p` except the pointer is mutable.
    - Fixed `make_command_line` to handle Unicode correctly.
- Tests for the above.
2014-05-13 16:01:48 -07:00
Phil Ruffwind
d9eca56c06 Use Get/FreeEnvironmentStringsW instead of Get/FreeEnvironmentStringsA
Changed libstd to use Get/FreeEnvironmentStringsW instead of
Get/FreeEnvironmentStringsA to support Unicode environment variables.
2014-05-13 17:19:01 -04:00
Phil Ruffwind
e12aeb39bc Use CreateProcessW instead of CreateProcessA
Changed libnative to use CreateProcessW instead of CreateProcessA.  In
addition, the lpEnvironment parameter now uses Unicode.

Added a helper function os::win32::as_mut_utf16_p, which does basically
the same thing as os::win32::as_utf16_p except the pointer is mutable.
2014-05-13 17:19:00 -04:00
Dylan Braithwaite
1ca6b2cc66 Added functions pop_char and shift_char to StrBuf struct along with appropriate unit tests, using the same test case as push_char.
Changed StrBuf.shift_byte() that it no longer reallocates the buffer by just calling Vec.shift();

Added warning to shift_char()'s docs about it having to copy the whole buffer, as per the docs for
Vec.shift().
2014-05-13 11:01:12 +01:00
bors
e162438162 auto merge of #13919 : thomaslee/rust/thomaslee_proposed_tcpstream_open, r=alexcrichton
Been meaning to try my hand at something like this for a while, and noticed something similar mentioned as part of #13537. The suggestion on the original ticket is to use `TcpStream::open(&str)` to pass in a host + port string, but seems a little cleaner to pass in host and port separately -- so a signature like `TcpStream::open(&str, u16)`.

Also means we can use std::io::net::addrinfo directly instead of using e.g. liburl to parse the host+port pair from a string.

One outstanding issue in this PR that I'm not entirely sure how to address: in open_timeout, the timeout_ms will apply for every A record we find associated with a hostname -- probably not the intended behavior, but I didn't want to waste my time on elaborate alternatives until the general idea was a-OKed. :)

Anyway, perhaps there are other reasons for us to prefer the original proposed syntax, but thought I'd get some thoughts on this. Maybe there are some solid reasons to prefer using liburl to do this stuff.
2014-05-12 23:11:45 -07:00
Tom Lee
8252353916 Document a possible way in which connect_timout may change in the future 2014-05-12 21:41:48 -07:00
Tom Lee
611c2ae4f1 Try to parse TcpStream::connect 'host' parameter as an IP.
Fall back to get_host_addresses to try a DNS lookup if we can't
parse it as an IP address.
2014-05-12 21:41:48 -07:00
Tom Lee
a57889a580 Easier interface for TCP ::connect and ::bind.
Prior to this commit, TcpStream::connect and TcpListener::bind took a
single SocketAddr argument. This worked well enough, but the API felt a
little too "low level" for most simple use cases.

A great example is connecting to rust-lang.org on port 80. Rust users would
need to:

  1. resolve the IP address of rust-lang.org using
     io::net::addrinfo::get_host_addresses.

  2. check for errors

  3. if all went well, use the returned IP address and the port number
     to construct a SocketAddr

  4. pass this SocketAddr to TcpStream::connect.

I'm modifying the type signature of TcpStream::connect and
TcpListener::bind so that the API is a little easier to use.

TcpStream::connect now accepts two arguments: a string describing the
host/IP of the host we wish to connect to, and a u16 representing the
remote port number.

Similarly, TcpListener::bind has been modified to take two arguments:
a string describing the local interface address (e.g. "0.0.0.0" or
"127.0.0.1") and a u16 port number.

Here's how to port your Rust code to use the new TcpStream::connect API:

  // old ::connect API
  let addr = SocketAddr{ip: Ipv4Addr{127, 0, 0, 1}, port: 8080};
  let stream = TcpStream::connect(addr).unwrap()

  // new ::connect API (minimal change)
  let addr = SocketAddr{ip: Ipv4Addr{127, 0, 0, 1}, port: 8080};
  let stream = TcpStream::connect(addr.ip.to_str(), addr.port()).unwrap()

  // new ::connect API (more compact)
  let stream = TcpStream::connect("127.0.0.1", 8080).unwrap()

  // new ::connect API (hostname)
  let stream = TcpStream::connect("rust-lang.org", 80)

Similarly, for TcpListener::bind:

  // old ::bind API
  let addr = SocketAddr{ip: Ipv4Addr{0, 0, 0, 0}, port: 8080};
  let mut acceptor = TcpListener::bind(addr).listen();

  // new ::bind API (minimal change)
  let addr = SocketAddr{ip: Ipv4Addr{0, 0, 0, 0}, port: 8080};
  let mut acceptor = TcpListener::bind(addr.ip.to_str(), addr.port()).listen()

  // new ::bind API (more compact)
  let mut acceptor = TcpListener::bind("0.0.0.0", 8080).listen()

[breaking-change]
2014-05-12 21:41:48 -07:00
Alex Crichton
5001a66665 Test fixes from rollup
Closes #14163 (Fix typos in rustc manpage)
Closes #14161 (Add the patch number to version strings. Closes #13289)
Closes #14156 (rustdoc: Fix hiding implementations of traits)
Closes #14152 (add shebang to scripts that have execute bit set)
Closes #14150 (libcore: remove fails from slice.rs and remove duplicated length checking)
Closes #14147 (Make ProcessOutput Eq, TotalEq, Clone)
Closes #14142 (doc: updates rust manual (loop to continue))
Closes #14141 (doc: Update the linkage documentation)
Closes #14139 (Remove an unnecessary .move_iter().collect())
Closes #14136 (Two minor fixes in parser.rs)
Closes #14130 (Fixed typo in comments of driver.rs)
Closes #14128 (Add `stat` method to `std::io::fs::File` to stat without a Path.)
Closes #14114 (rustdoc: List macros in the sidebar)
Closes #14113 (shootout-nbody improvement)
Closes #14112 (Improved example code in Option)
Closes #14104 (Remove reference to MutexArc)
Closes #14087 (emacs: highlight `macro_name!` in macro invocations using [] delimiters)
2014-05-12 20:17:36 -07:00
Adolfo Ochagavía
85e34b2396 Improved example code in Option 2014-05-12 19:52:29 -07:00
Yuri Kunde Schlesner
8c55fcd1f2 Add stat method to std::io::fs::File to stat without a Path.
The `FileStat` struct contained a `path` field, which was filled by the
`stat` and `lstat` function. Since this field isn't in fact returned by
the operating system (it was copied from the paths passed to the
functions) it was removed, as in the `fstat` case we aren't working with
a `Path`, but directly with a fd.

If your code used the `path` field of `FileStat` you will now have to
manually store the path passed to `stat` along with the returned struct.

[breaking-change]
2014-05-12 19:52:29 -07:00
Simon Sapin
16351731ac Remove an unnecessary .move_iter().collect() 2014-05-12 19:52:29 -07:00
Yehuda Katz
31de69d0dd Make ProcessOutput Eq, TotalEq, Clone 2014-05-12 19:52:29 -07:00
Brian Anderson
c1da4f875f Add the patch number to version strings. Closes #13289 2014-05-12 19:52:29 -07:00
Patrick Walton
6559a3675e librustc: Remove all uses of ~str from librustc. 2014-05-12 11:28:57 -07:00
Daniel Micay
8b912bc56b register snapshots 2014-05-12 02:52:32 -04:00
bors
72fc4a5eb7 auto merge of #14119 : thestinger/rust/heap, r=cmr 2014-05-11 17:51:41 -07:00
bors
b40c3e9d3d auto merge of #14110 : SSheldon/rust/strbuf_mutable, r=alexcrichton
Despite implementing the Container trait, StrBuf did not implement the Mutable trait and had no clear method; this request implements the clear method of the Mutable trait for StrBuf.

Testing done: added a test and ran `make check` without any failures.
2014-05-11 16:21:44 -07:00