Skip to content

Commit 8715a65

Browse files
committed
Auto merge of #23298 - Manishearth:rollup, r=Manishearth
None
2 parents 425297a + 419c0ff commit 8715a65

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+606
-487
lines changed

configure

+2-1
Original file line numberDiff line numberDiff line change
@@ -760,8 +760,9 @@ fi
760760
# Force bitrig to build with clang; gcc doesn't like us there
761761
if [ $CFG_OSTYPE = unknown-bitrig ]
762762
then
763-
step_msg "on Bitrig, forcing use of clang"
763+
step_msg "on Bitrig, forcing use of clang, disabling jemalloc"
764764
CFG_ENABLE_CLANG=1
765+
CFG_ENABLE_JEMALLOC=0
765766
fi
766767

767768
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]

mk/main.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ ifdef CFG_DISABLE_DEBUG
130130
CFG_RUSTC_FLAGS += --cfg ndebug
131131
else
132132
$(info cfg: enabling more debugging (CFG_ENABLE_DEBUG))
133-
CFG_RUSTC_FLAGS += --cfg debug
133+
CFG_RUSTC_FLAGS += --cfg debug -C debug-assertions=on
134134
endif
135135

136136
ifdef SAVE_TEMPS

mk/tests.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ TEST_SREQ$(1)_T_$(2)_H_$(3) = \
590590

591591
# The tests select when to use debug configuration on their own;
592592
# remove directive, if present, from CFG_RUSTC_FLAGS (issue #7898).
593-
CTEST_RUSTC_FLAGS := $$(subst -C debug-assertions,,$$(CFG_RUSTC_FLAGS))
593+
CTEST_RUSTC_FLAGS := $$(subst -C debug-assertions,,$$(subst -C debug-assertions=on,,$$(CFG_RUSTC_FLAGS)))
594594

595595
# The tests cannot be optimized while the rest of the compiler is optimized, so
596596
# filter out the optimization (if any) from rustc and then figure out if we need

src/doc/trpl/comments.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ The other kind of comment is a doc comment. Doc comments use `///` instead of
2828
///
2929
/// * `name` - The name of the person you'd like to greet.
3030
///
31-
/// # Example
31+
/// # Examples
3232
///
3333
/// ```rust
3434
/// let name = "Steve";

src/doc/trpl/hello-cargo.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,16 @@ Once you have this file in place, we should be ready to build! Try this:
7878
```bash
7979
$ cargo build
8080
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
81-
$ ./target/hello_world
81+
$ ./target/debug/hello_world
8282
Hello, world!
8383
```
8484

8585
Bam! We build our project with `cargo build`, and run it with
86-
`./target/hello_world`. This hasn't bought us a whole lot over our simple use
86+
`./target/debug/hello_world`. This hasn't bought us a whole lot over our simple use
8787
of `rustc`, but think about the future: when our project has more than one
8888
file, we would need to call `rustc` more than once, and pass it a bunch of options to
8989
tell it to build everything together. With Cargo, as our project grows, we can
90-
just `cargo build` and it'll work the right way.
90+
just `cargo build` and it'll work the right way. When you're project is finally ready for release, you can use `cargo build --release` to compile your crates with optimizations.
9191

9292
You'll also notice that Cargo has created a new file: `Cargo.lock`.
9393

@@ -163,4 +163,4 @@ much more in-depth guide to Cargo can be found [here](http://doc.crates.io/guide
163163

164164
Now that you've got the tools down, let's actually learn more about the Rust
165165
language itself. These are the basics that will serve you well through the rest
166-
of your time with Rust.
166+
of your time with Rust.

src/doc/trpl/installing-rust.md

+5
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ rustc 1.0.0-nightly (f11f3e7ba 2015-01-04) (built 2015-01-06)
7878

7979
If you did, Rust has been installed successfully! Congrats!
8080

81+
This installer also installs a copy of the documentation locally, so you can
82+
read it offline. On UNIX systems, `/usr/local/share/doc/rust` is the location.
83+
On Windows, it's in a `share/doc` directory, inside wherever you installed Rust
84+
to.
85+
8186
If not, there are a number of places where you can get help. The easiest is
8287
[the #rust IRC channel on irc.mozilla.org](irc://irc.mozilla.org/#rust), which
8388
you can access through

src/doc/trpl/static-and-dynamic-dispatch.md

+68-49
Original file line numberDiff line numberDiff line change
@@ -102,49 +102,88 @@ reason.
102102
Rust provides dynamic dispatch through a feature called 'trait objects.' Trait
103103
objects, like `&Foo` or `Box<Foo>`, are normal values that store a value of
104104
*any* type that implements the given trait, where the precise type can only be
105-
known at runtime. The methods of the trait can be called on a trait object via
106-
a special record of function pointers (created and managed by the compiler).
105+
known at runtime.
107106

108-
A function that takes a trait object is not specialized to each of the types
109-
that implements `Foo`: only one copy is generated, often (but not always)
110-
resulting in less code bloat. However, this comes at the cost of requiring
111-
slower virtual function calls, and effectively inhibiting any chance of
112-
inlining and related optimisations from occurring.
107+
A trait object can be obtained from a pointer to a concrete type that
108+
implements the trait by *casting* it (e.g. `&x as &Foo`) or *coercing* it
109+
(e.g. using `&x` as an argument to a function that takes `&Foo`).
113110

114-
Trait objects are both simple and complicated: their core representation and
115-
layout is quite straight-forward, but there are some curly error messages and
116-
surprising behaviors to discover.
111+
These trait object coercions and casts also work for pointers like `&mut T` to
112+
`&mut Foo` and `Box<T>` to `Box<Foo>`, but that's all at the moment. Coercions
113+
and casts are identical.
117114

118-
### Obtaining a trait object
115+
This operation can be seen as "erasing" the compiler's knowledge about the
116+
specific type of the pointer, and hence trait objects are sometimes referred to
117+
as "type erasure".
119118

120-
There's two similar ways to get a trait object value: casts and coercions. If
121-
`T` is a type that implements a trait `Foo` (e.g. `u8` for the `Foo` above),
122-
then the two ways to get a `Foo` trait object out of a pointer to `T` look
123-
like:
119+
Coming back to the example above, we can use the same trait to perform dynamic
120+
dispatch with trait objects by casting:
124121

125-
```{rust,ignore}
126-
let ref_to_t: &T = ...;
122+
```rust
123+
# trait Foo { fn method(&self) -> String; }
124+
# impl Foo for u8 { fn method(&self) -> String { format!("u8: {}", *self) } }
125+
# impl Foo for String { fn method(&self) -> String { format!("string: {}", *self) } }
127126

128-
// `as` keyword for casting
129-
let cast = ref_to_t as &Foo;
127+
fn do_something(x: &Foo) {
128+
x.method();
129+
}
130130

131-
// using a `&T` in a place that has a known type of `&Foo` will implicitly coerce:
132-
let coerce: &Foo = ref_to_t;
131+
fn main() {
132+
let x = 5u8;
133+
do_something(&x as &Foo);
134+
}
135+
```
133136

134-
fn also_coerce(_unused: &Foo) {}
135-
also_coerce(ref_to_t);
137+
or by coercing:
138+
139+
```rust
140+
# trait Foo { fn method(&self) -> String; }
141+
# impl Foo for u8 { fn method(&self) -> String { format!("u8: {}", *self) } }
142+
# impl Foo for String { fn method(&self) -> String { format!("string: {}", *self) } }
143+
144+
fn do_something(x: &Foo) {
145+
x.method();
146+
}
147+
148+
fn main() {
149+
let x = "Hello".to_string();
150+
do_something(&x);
151+
}
136152
```
137153

138-
These trait object coercions and casts also work for pointers like `&mut T` to
139-
`&mut Foo` and `Box<T>` to `Box<Foo>`, but that's all at the moment. Coercions
140-
and casts are identical.
154+
A function that takes a trait object is not specialized to each of the types
155+
that implements `Foo`: only one copy is generated, often (but not always)
156+
resulting in less code bloat. However, this comes at the cost of requiring
157+
slower virtual function calls, and effectively inhibiting any chance of
158+
inlining and related optimisations from occurring.
141159

142-
This operation can be seen as "erasing" the compiler's knowledge about the
143-
specific type of the pointer, and hence trait objects are sometimes referred to
144-
as "type erasure".
160+
### Why pointers?
161+
162+
Rust does not put things behind a pointer by default, unlike many managed
163+
languages, so types can have different sizes. Knowing the size of the value at
164+
compile time is important for things like passing it as an argument to a
165+
function, moving it about on the stack and allocating (and deallocating) space
166+
on the heap to store it.
167+
168+
For `Foo`, we would need to have a value that could be at least either a
169+
`String` (24 bytes) or a `u8` (1 byte), as well as any other type for which
170+
dependent crates may implement `Foo` (any number of bytes at all). There's no
171+
way to guarantee that this last point can work if the values are stored without
172+
a pointer, because those other types can be arbitrarily large.
173+
174+
Putting the value behind a pointer means the size of the value is not relevant
175+
when we are tossing a trait object around, only the size of the pointer itself.
145176

146177
### Representation
147178

179+
The methods of the trait can be called on a trait object via a special record
180+
of function pointers traditionally called a 'vtable' (created and managed by
181+
the compiler).
182+
183+
Trait objects are both simple and complicated: their core representation and
184+
layout is quite straight-forward, but there are some curly error messages and
185+
surprising behaviors to discover.
186+
148187
Let's start simple, with the runtime representation of a trait object. The
149188
`std::raw` module contains structs with layouts that are the same as the
150189
complicated built-in types, [including trait objects][stdraw]:
@@ -265,23 +304,3 @@ let y = TraitObject {
265304
If `b` or `y` were owning trait objects (`Box<Foo>`), there would be a
266305
`(b.vtable.destructor)(b.data)` (respectively `y`) call when they went out of
267306
scope.
268-
269-
### Why pointers?
270-
271-
The use of language like "fat pointer" implies that a trait object is
272-
always a pointer of some form, but why?
273-
274-
Rust does not put things behind a pointer by default, unlike many managed
275-
languages, so types can have different sizes. Knowing the size of the value at
276-
compile time is important for things like passing it as an argument to a
277-
function, moving it about on the stack and allocating (and deallocating) space
278-
on the heap to store it.
279-
280-
For `Foo`, we would need to have a value that could be at least either a
281-
`String` (24 bytes) or a `u8` (1 byte), as well as any other type for which
282-
dependent crates may implement `Foo` (any number of bytes at all). There's no
283-
way to guarantee that this last point can work if the values are stored without
284-
a pointer, because those other types can be arbitrarily large.
285-
286-
Putting the value behind a pointer means the size of the value is not relevant
287-
when we are tossing a trait object around, only the size of the pointer itself.

src/liballoc/arc.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ use heap::deallocate;
8888

8989
/// An atomically reference counted wrapper for shared state.
9090
///
91-
/// # Example
91+
/// # Examples
9292
///
9393
/// In this example, a large vector of floats is shared between several tasks.
9494
/// With simple pipes, without `Arc`, a copy would have to be made for each

src/liballoc/boxed.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ impl<T : ?Sized> Box<T> {
133133
/// automatically managed that may lead to memory or other resource
134134
/// leak.
135135
///
136-
/// # Example
136+
/// # Examples
137137
/// ```
138138
/// use std::boxed;
139139
///

src/liballoc/rc.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ pub fn is_unique<T>(rc: &Rc<T>) -> bool {
264264
///
265265
/// If the `Rc<T>` is not unique, an `Err` is returned with the same `Rc<T>`.
266266
///
267-
/// # Example
267+
/// # Examples
268268
///
269269
/// ```
270270
/// use std::rc::{self, Rc};
@@ -298,7 +298,7 @@ pub fn try_unwrap<T>(rc: Rc<T>) -> Result<T, Rc<T>> {
298298
///
299299
/// Returns `None` if the `Rc<T>` is not unique.
300300
///
301-
/// # Example
301+
/// # Examples
302302
///
303303
/// ```
304304
/// use std::rc::{self, Rc};

src/libcollections/borrow.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ impl<T> ToOwned for T where T: Clone {
127127
/// is desired, `to_mut` will obtain a mutable references to an owned
128128
/// value, cloning if necessary.
129129
///
130-
/// # Example
130+
/// # Examples
131131
///
132132
/// ```rust
133133
/// use std::borrow::Cow;

src/libcollections/btree/map.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,7 @@ impl<'a, K: Ord, V> OccupiedEntry<'a, K, V> {
11771177
impl<K, V> BTreeMap<K, V> {
11781178
/// Gets an iterator over the entries of the map.
11791179
///
1180-
/// # Example
1180+
/// # Examples
11811181
///
11821182
/// ```
11831183
/// use std::collections::BTreeMap;

src/libcollections/fmt.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ use string;
420420
///
421421
/// * args - a structure of arguments generated via the `format_args!` macro.
422422
///
423-
/// # Example
423+
/// # Examples
424424
///
425425
/// ```rust
426426
/// use std::fmt;

src/libcollections/macros.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ macro_rules! vec {
4848
/// Use the syntax described in `std::fmt` to create a value of type `String`.
4949
/// See `std::fmt` for more information.
5050
///
51-
/// # Example
51+
/// # Examples
5252
///
5353
/// ```
5454
/// format!("test");

src/libcollections/slice.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ pub trait SliceExt {
277277
///
278278
/// Panics if `size` is 0.
279279
///
280-
/// # Example
280+
/// # Examples
281281
///
282282
/// Print the adjacent pairs of a slice (i.e. `[1,2]`, `[2,3]`,
283283
/// `[3,4]`):
@@ -300,7 +300,7 @@ pub trait SliceExt {
300300
///
301301
/// Panics if `size` is 0.
302302
///
303-
/// # Example
303+
/// # Examples
304304
///
305305
/// Print the slice two elements at a time (i.e. `[1,2]`,
306306
/// `[3,4]`, `[5]`):
@@ -390,7 +390,7 @@ pub trait SliceExt {
390390
/// `Err` is returned, containing the index where a matching
391391
/// element could be inserted while maintaining sorted order.
392392
///
393-
/// # Example
393+
/// # Examples
394394
///
395395
/// Looks up a series of four elements. The first is found, with a
396396
/// uniquely determined position; the second and third are not
@@ -416,7 +416,7 @@ pub trait SliceExt {
416416

417417
/// Return the number of elements in the slice
418418
///
419-
/// # Example
419+
/// # Examples
420420
///
421421
/// ```
422422
/// let a = [1, 2, 3];
@@ -427,7 +427,7 @@ pub trait SliceExt {
427427

428428
/// Returns true if the slice has a length of 0
429429
///
430-
/// # Example
430+
/// # Examples
431431
///
432432
/// ```
433433
/// let a = [1, 2, 3];
@@ -529,7 +529,7 @@ pub trait SliceExt {
529529
///
530530
/// Panics if `a` or `b` are out of bounds.
531531
///
532-
/// # Example
532+
/// # Examples
533533
///
534534
/// ```rust
535535
/// let mut v = ["a", "b", "c", "d"];
@@ -549,7 +549,7 @@ pub trait SliceExt {
549549
///
550550
/// Panics if `mid > len`.
551551
///
552-
/// # Example
552+
/// # Examples
553553
///
554554
/// ```rust
555555
/// let mut v = [1, 2, 3, 4, 5, 6];
@@ -578,7 +578,7 @@ pub trait SliceExt {
578578

579579
/// Reverse the order of elements in a slice, in place.
580580
///
581-
/// # Example
581+
/// # Examples
582582
///
583583
/// ```rust
584584
/// let mut v = [1, 2, 3];
@@ -638,7 +638,7 @@ pub trait SliceExt {
638638
/// shorter of `self.len()` and `src.len()`). Returns the number
639639
/// of elements copied.
640640
///
641-
/// # Example
641+
/// # Examples
642642
///
643643
/// ```rust
644644
/// let mut dst = [0, 0, 0];
@@ -676,7 +676,7 @@ pub trait SliceExt {
676676
/// `Err` is returned, containing the index where a matching
677677
/// element could be inserted while maintaining sorted order.
678678
///
679-
/// # Example
679+
/// # Examples
680680
///
681681
/// Looks up a series of four elements. The first is found, with a
682682
/// uniquely determined position; the second and third are not
@@ -707,7 +707,7 @@ pub trait SliceExt {
707707
/// Returns `true` if successful and `false` if the slice is at the
708708
/// last-ordered permutation.
709709
///
710-
/// # Example
710+
/// # Examples
711711
///
712712
/// ```rust
713713
/// let v: &mut [_] = &mut [0, 1, 2];
@@ -727,7 +727,7 @@ pub trait SliceExt {
727727
/// Returns `true` if successful and `false` if the slice is at the
728728
/// first-ordered permutation.
729729
///
730-
/// # Example
730+
/// # Examples
731731
///
732732
/// ```rust
733733
/// let v: &mut [_] = &mut [1, 0, 2];

0 commit comments

Comments
 (0)