Skip to content

Commit c6dc929

Browse files
committed
---
yaml --- r: 275062 b: refs/heads/stable c: b81fdd4 h: refs/heads/master
1 parent 1e139da commit c6dc929

Some content is hidden

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

65 files changed

+2626
-1864
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ refs/heads/tmp: e06d2ad9fcd5027bcaac5b08fc9aa39a49d0ecd3
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: c0221c8897db309a79990367476177b1230bb264
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828
32-
refs/heads/stable: aeda8445a7295b7ca9e836db8c0328829cd6ee21
32+
refs/heads/stable: b81fdd4cd2b967e73ac1f3f5cfbe8229853876d9
3333
refs/tags/1.0.0: 55bd4f8ff2b323f317ae89e254ce87162d52a375
3434
refs/tags/1.1.0: bc3c16f09287e5545c1d3f76b7abd54f2eca868b
3535
refs/tags/1.2.0: f557861f822c34f07270347b94b5280de20a597e

branches/stable/RELEASES.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ Misc
9494
the `-Z unstable-options` flag.
9595
* [When running tests with `--test`, rustdoc will pass `--cfg`
9696
arguments to the compiler][1.7dt].
97-
* [The compiler is built with RPATH information by default][1.7rp].
97+
* [The compiler is built with RPATH information by default][1.7rpa].
9898
This means that it will be possible to run `rustc` when installed in
9999
unusual configurations without configuring the dynamic linker search
100100
path explicitly.
101-
* [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dt]. This makes
101+
* [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
102102
any RPATH entries (emitted with `-C rpath`) *not* take precedence
103103
over `LD_LIBRARY_PATH`.
104104

@@ -132,15 +132,15 @@ Compatibility Notes
132132
[1.7cp]: https://github.com/rust-lang/cargo/pull/2224
133133
[1.7d]: https://github.com/rust-lang/rust/pull/30724
134134
[1.7dt]: https://github.com/rust-lang/rust/pull/30372
135-
[1.7dt]: https://github.com/rust-lang/rust/pull/30394
135+
[1.7dta]: https://github.com/rust-lang/rust/pull/30394
136136
[1.7f]: https://github.com/rust-lang/rust/pull/30672
137137
[1.7h]: https://github.com/rust-lang/rust/pull/30818
138138
[1.7j]: https://github.com/rust-lang/rust/pull/30711
139139
[1.7ll]: https://github.com/rust-lang/rust/pull/30663
140140
[1.7m]: https://github.com/rust-lang/rust/pull/30381
141141
[1.7p]: https://github.com/rust-lang/rust/pull/30681
142142
[1.7rp]: https://github.com/rust-lang/rust/pull/29498
143-
[1.7rp]: https://github.com/rust-lang/rust/pull/30353
143+
[1.7rpa]: https://github.com/rust-lang/rust/pull/30353
144144
[1.7rr]: https://github.com/rust-lang/cargo/pull/2279
145145
[1.7sf]: https://github.com/rust-lang/rust/pull/30389
146146
[1.7utf8]: https://github.com/rust-lang/rust/pull/30740

branches/stable/src/doc/book/ownership.md

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -124,21 +124,65 @@ special annotation here, it’s the default thing that Rust does.
124124
## The details
125125

126126
The reason that we cannot use a binding after we’ve moved it is subtle, but
127-
important. When we write code like this:
127+
important.
128+
129+
When we write code like this:
130+
131+
```rust
132+
let x = 10;
133+
```
134+
135+
Rust allocates memory for an integer [i32] on the [stack][sh], copies the bit
136+
pattern representing the value of 10 to the allocated memory and binds the
137+
variable name x to this memory region for future reference.
138+
139+
Now consider the following code fragment:
128140

129141
```rust
130142
let v = vec![1, 2, 3];
131143

132-
let v2 = v;
144+
let mut v2 = v;
145+
```
146+
147+
The first line allocates memory for the vector object `v` on the stack like
148+
it does for `x` above. But in addition to that it also allocates some memory
149+
on the [heap][sh] for the actual data (`[1, 2, 3]`). Rust copies the address
150+
of this heap allocation to an internal pointer, which is part of the vector
151+
object placed on the stack (let's call it the data pointer).
152+
153+
It is worth pointing out (even at the risk of stating the obvious) that the
154+
vector object and its data live in separate memory regions instead of being a
155+
single contiguous memory allocation (due to reasons we will not go into at
156+
this point of time). These two parts of the vector (the one on the stack and
157+
one on the heap) must agree with each other at all times with regards to
158+
things like the length, capacity etc.
159+
160+
When we move `v` to `v2`, rust actually does a bitwise copy of the vector
161+
object `v` into the stack allocation represented by `v2`. This shallow copy
162+
does not create a copy of the heap allocation containing the actual data.
163+
Which means that there would be two pointers to the contents of the vector
164+
both pointing to the same memory allocation on the heap. It would violate
165+
Rust’s safety guarantees by introducing a data race if one could access both
166+
`v` and `v2` at the same time.
167+
168+
For example if we truncated the vector to just two elements through `v2`:
169+
170+
```rust
171+
# let v = vec![1, 2, 3];
172+
# let mut v2 = v;
173+
v2.truncate(2);
133174
```
134175

135-
The first line allocates memory for the vector object, `v`, and for the data it
136-
contains. The vector object is stored on the [stack][sh] and contains a pointer
137-
to the content (`[1, 2, 3]`) stored on the [heap][sh]. When we move `v` to `v2`,
138-
it creates a copy of that pointer, for `v2`. Which means that there would be two
139-
pointers to the content of the vector on the heap. It would violate Rust’s
140-
safety guarantees by introducing a data race. Therefore, Rust forbids using `v`
141-
after we’ve done the move.
176+
and `v1` were still accessible we'd end up with an invalid vector since `v1`
177+
would not know that the heap data has been truncated. Now, the part of the
178+
vector `v1` on the stack does not agree with the corresponding part on the
179+
heap. `v1` still thinks there are three elements in the vector and will
180+
happily let us access the non existent element `v1[2]` but as you might
181+
already know this is a recipe for disaster. Especially because it might lead
182+
to a segmentation fault or worse allow an unauthorized user to read from
183+
memory to which they don't have access.
184+
185+
This is why Rust forbids using `v` after we’ve done the move.
142186

143187
[sh]: the-stack-and-the-heap.html
144188

branches/stable/src/libcollections/btree/map.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,10 @@ impl<K: Ord, V> BTreeMap<K, V> {
375375
///
376376
/// If the map did not have this key present, `None` is returned.
377377
///
378-
/// If the map did have this key present, the key is not updated, the
379-
/// value is updated and the old value is returned.
380-
/// See the [module-level documentation] for more.
378+
/// If the map did have this key present, the value is updated, and the old
379+
/// value is returned. The key is not updated, though; this matters for
380+
/// types that can be `==` without being identical. See the [module-level
381+
/// documentation] for more.
381382
///
382383
/// [module-level documentation]: index.html#insert-and-complex-keys
383384
///

branches/stable/src/libcore/fmt/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ pub trait Write {
121121
self.0.write_str(s)
122122
}
123123

124+
fn write_char(&mut self, c: char) -> Result {
125+
self.0.write_char(c)
126+
}
127+
124128
fn write_fmt(&mut self, args: Arguments) -> Result {
125129
self.0.write_fmt(args)
126130
}

branches/stable/src/libcore/mem.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -571,9 +571,25 @@ pub const POST_DROP_USIZE: usize = POST_DROP_U64 as usize;
571571
/// ```
572572
/// use std::mem;
573573
///
574-
/// let one = unsafe { mem::transmute_copy(&1) };
574+
/// #[repr(packed)]
575+
/// struct Foo {
576+
/// bar: u8,
577+
/// }
578+
///
579+
/// let foo_slice = [10u8];
580+
///
581+
/// unsafe {
582+
/// // Copy the data from 'foo_slice' and treat it as a 'Foo'
583+
/// let mut foo_struct: Foo = mem::transmute_copy(&foo_slice);
584+
/// assert_eq!(foo_struct.bar, 10);
585+
///
586+
/// // Modify the copied data
587+
/// foo_struct.bar = 20;
588+
/// assert_eq!(foo_struct.bar, 20);
589+
/// }
575590
///
576-
/// assert_eq!(1, one);
591+
/// // The contents of 'foo_slice' should not have changed
592+
/// assert_eq!(foo_slice, [10]);
577593
/// ```
578594
#[inline]
579595
#[stable(feature = "rust1", since = "1.0.0")]

branches/stable/src/liblibc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Subproject commit a64ee24718c0289b82a77d692cf56f8a1226de51
1+
Subproject commit 403bdc88394919f297bdb365032044cc0481c319

0 commit comments

Comments
 (0)