Skip to content

Commit b11122d

Browse files
author
Keegan McAllister
committed
---
yaml --- r: 142973 b: refs/heads/try2 c: dfa5595 h: refs/heads/master i: 142971: ba4b859 v: v3
1 parent 10321b1 commit b11122d

File tree

404 files changed

+4353
-4660
lines changed

Some content is hidden

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

404 files changed

+4353
-4660
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 3514a5af0629715604c9bfde11917133b9692798
8+
refs/heads/try2: dfa5595628651f55bda7437c80631d596c8b61f9
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/configure

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,6 @@ opt optimize 1 "build optimized rust code"
372372
opt optimize-cxx 1 "build optimized C++ code"
373373
opt optimize-llvm 1 "build optimized LLVM"
374374
opt debug 0 "build with extra debug fun"
375-
opt ratchet-bench 0 "ratchet benchmarks"
376375
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
377376
opt manage-submodules 1 "let the build manage the git submodules"
378377
opt mingw-cross 0 "cross-compile for win32 using mingw"
@@ -750,18 +749,18 @@ then
750749
cd ${CFG_SRC_DIR}
751750

752751
msg "git: submodule sync"
753-
"${CFG_GIT}" submodule sync
752+
"${CFG_GIT}" submodule --quiet sync
754753

755754
msg "git: submodule update"
756-
"${CFG_GIT}" submodule update --init
755+
"${CFG_GIT}" submodule --quiet update --init
757756
need_ok "git failed"
758757

759758
msg "git: submodule foreach sync"
760-
"${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
759+
"${CFG_GIT}" submodule --quiet foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
761760
need_ok "git failed"
762761

763762
msg "git: submodule foreach update"
764-
"${CFG_GIT}" submodule update --init --recursive
763+
"${CFG_GIT}" submodule --quiet update --init --recursive
765764
need_ok "git failed"
766765

767766
# NB: this is just for the sake of getting the submodule SHA1 values
@@ -770,9 +769,9 @@ then
770769
"${CFG_GIT}" submodule status --recursive
771770

772771
msg "git: submodule clobber"
773-
"${CFG_GIT}" submodule foreach --recursive git clean -dxf
772+
"${CFG_GIT}" submodule --quiet foreach --recursive git clean -dxf
774773
need_ok "git failed"
775-
"${CFG_GIT}" submodule foreach --recursive git checkout .
774+
"${CFG_GIT}" submodule --quiet foreach --recursive git checkout .
776775
need_ok "git failed"
777776

778777
cd ${CFG_BUILD_DIR}

branches/try2/doc/rust.md

Lines changed: 118 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ The keywords are the following strings:
206206
~~~~~~~~ {.keyword}
207207
as
208208
break
209+
copy
209210
do
210211
else enum extern
211212
false fn for
@@ -442,7 +443,7 @@ Two examples of paths with type arguments:
442443
~~~~
443444
# use std::hashmap::HashMap;
444445
# fn f() {
445-
# fn id<T>(t: T) -> T { t }
446+
# fn id<T:Copy>(t: T) -> T { t }
446447
type t = HashMap<int,~str>; // Type arguments used in a type expression
447448
let x = id::<int>(10); // Type arguments used in a call expression
448449
# }
@@ -906,10 +907,11 @@ example, `sys::size_of::<u32>() == 4`.
906907

907908
Since a parameter type is opaque to the generic function, the set of
908909
operations that can be performed on it is limited. Values of parameter
909-
type can only be moved, not copied.
910+
type can always be moved, but they can only be copied when the
911+
parameter is given a [`Copy` bound](#type-kinds).
910912

911913
~~~~
912-
fn id<T>(x: T) -> T { x }
914+
fn id<T: Copy>(x: T) -> T { x }
913915
~~~~
914916

915917
Similarly, [trait](#traits) bounds can be specified for type
@@ -1122,41 +1124,6 @@ static bits_n_strings: BitsNStrings<'static> = BitsNStrings {
11221124
};
11231125
~~~~
11241126

1125-
#### Mutable statics
1126-
1127-
If a static item is declared with the ```mut``` keyword, then it is allowed to
1128-
be modified by the program. One of Rust's goals is to make concurrency bugs hard
1129-
to run into, and this is obviously a very large source of race conditions or
1130-
other bugs. For this reason, an ```unsafe``` block is required when either
1131-
reading or writing a mutable static variable. Care should be taken to ensure
1132-
that modifications to a mutable static are safe with respect to other tasks
1133-
running in the same process.
1134-
1135-
Mutable statics are still very useful, however. They can be used with C
1136-
libraries and can also be bound from C libraries (in an ```extern``` block).
1137-
1138-
~~~
1139-
# fn atomic_add(_: &mut uint, _: uint) -> uint { 2 }
1140-
1141-
static mut LEVELS: uint = 0;
1142-
1143-
// This violates the idea of no shared state, and this doesn't internally
1144-
// protect against races, so this function is `unsafe`
1145-
unsafe fn bump_levels_unsafe1() -> uint {
1146-
let ret = LEVELS;
1147-
LEVELS += 1;
1148-
return ret;
1149-
}
1150-
1151-
// Assuming that we have an atomic_add function which returns the old value,
1152-
// this function is "safe" but the meaning of the return value may not be what
1153-
// callers expect, so it's still marked as `unsafe`
1154-
unsafe fn bump_levels_unsafe2() -> uint {
1155-
return atomic_add(&mut LEVELS, 1);
1156-
}
1157-
1158-
~~~
1159-
11601127
### Traits
11611128

11621129
A _trait_ describes a set of method types.
@@ -1552,6 +1519,8 @@ A complete list of the built-in language items follows:
15521519

15531520
`const`
15541521
: Cannot be mutated.
1522+
`copy`
1523+
: Can be implicitly copied.
15551524
`owned`
15561525
: Are uniquely owned.
15571526
`durable`
@@ -1618,8 +1587,7 @@ A complete list of the built-in language items follows:
16181587
`check_not_borrowed`
16191588
: Fail if a value has existing borrowed pointers to it.
16201589
`strdup_uniq`
1621-
: Return a new unique string
1622-
containing a copy of the contents of a unique string.
1590+
: Return a new unique string containing a copy of the contents of a unique string.
16231591

16241592
> **Note:** This list is likely to become out of date. We should auto-generate it
16251593
> from `librustc/middle/lang_items.rs`.
@@ -1768,13 +1736,10 @@ A temporary's lifetime equals the largest lifetime of any borrowed pointer that
17681736

17691737
#### Moved and copied types
17701738

1771-
When a [local variable](#memory-slots) is used
1772-
as an [rvalue](#lvalues-rvalues-and-temporaries)
1773-
the variable will either be [moved](#move-expressions) or copied,
1739+
When a [local variable](#memory-slots) is used as an [rvalue](#lvalues-rvalues-and-temporaries)
1740+
the variable will either be [moved](#move-expressions) or [copied](#copy-expressions),
17741741
depending on its type.
1775-
For types that contain [owning pointers](#owning-pointers)
1776-
or values that implement the special trait `Drop`,
1777-
the variable is moved.
1742+
For types that contain mutable fields or [owning pointers](#owning-pointers), the variable is moved.
17781743
All other types are copied.
17791744

17801745

@@ -1953,9 +1918,9 @@ task in a _failing state_.
19531918

19541919
### Unary operator expressions
19551920

1956-
Rust defines six symbolic unary operators.
1957-
They are all written as prefix operators,
1958-
before the expression they apply to.
1921+
Rust defines six symbolic unary operators,
1922+
in addition to the unary [copy](#unary-copy-expressions) and [move](#unary-move-expressions) operators.
1923+
They are all written as prefix operators, before the expression they apply to.
19591924

19601925
`-`
19611926
: Negation. May only be applied to numeric types.
@@ -2154,6 +2119,60 @@ An example of a parenthesized expression:
21542119
let x = (2 + 3) * 4;
21552120
~~~~
21562121

2122+
### Unary copy expressions
2123+
2124+
~~~~~~~~{.ebnf .gram}
2125+
copy_expr : "copy" expr ;
2126+
~~~~~~~~
2127+
2128+
> **Note:** `copy` expressions are deprecated. It's preferable to use
2129+
> the `Clone` trait and `clone()` method.
2130+
2131+
A _unary copy expression_ consists of the unary `copy` operator applied to
2132+
some argument expression.
2133+
2134+
Evaluating a copy expression first evaluates the argument expression, then
2135+
copies the resulting value, allocating any memory necessary to hold the new
2136+
copy.
2137+
2138+
[Managed boxes](#pointer-types) (type `@`) are, as usual, shallow-copied,
2139+
as are raw and borrowed pointers.
2140+
[Owned boxes](#pointer-types), [owned vectors](#vector-types) and similar owned types are deep-copied.
2141+
2142+
Since the binary [assignment operator](#assignment-expressions) `=` performs a copy or move implicitly,
2143+
the unary copy operator is typically only used to cause an argument to a function to be copied and passed by value.
2144+
2145+
An example of a copy expression:
2146+
2147+
~~~~
2148+
fn mutate(mut vec: ~[int]) {
2149+
vec[0] = 10;
2150+
}
2151+
2152+
let v = ~[1,2,3];
2153+
2154+
mutate(copy v); // Pass a copy
2155+
2156+
assert!(v[0] == 1); // Original was not modified
2157+
~~~~
2158+
2159+
### Unary move expressions
2160+
2161+
~~~~~~~~{.ebnf .gram}
2162+
move_expr : "move" expr ;
2163+
~~~~~~~~
2164+
2165+
A _unary move expression_ is similar to a [unary copy](#unary-copy-expressions) expression,
2166+
except that it can only be applied to a [local variable](#memory-slots),
2167+
and it performs a _move_ on its operand, rather than a copy.
2168+
That is, the memory location denoted by its operand is de-initialized after evaluation,
2169+
and the resulting value is a shallow copy of the operand,
2170+
even if the operand is an [owning type](#type-kinds).
2171+
2172+
2173+
> **Note:** In future versions of Rust, `move` may be removed as a separate operator;
2174+
> moves are now [automatically performed](#moved-and-copied-types) for most cases `move` would be appropriate.
2175+
21572176

21582177
### Call expressions
21592178

@@ -2488,11 +2507,10 @@ match x {
24882507
}
24892508
~~~~
24902509

2491-
Patterns that bind variables
2492-
default to binding to a copy or move of the matched value
2510+
Patterns that bind variables default to binding to a copy or move of the matched value
24932511
(depending on the matched value's type).
2494-
This can be changed to bind to a borrowed pointer by
2495-
using the ```ref``` keyword,
2512+
This can be made explicit using the ```copy``` keyword,
2513+
changed to bind to a borrowed pointer by using the ```ref``` keyword,
24962514
or to a mutable borrowed pointer using ```ref mut```.
24972515

24982516
A pattern that's just an identifier,
@@ -2878,18 +2896,16 @@ and the cast expression in `main`.
28782896
Within the body of an item that has type parameter declarations, the names of its type parameters are types:
28792897

28802898
~~~~~~~
2881-
fn map<A: Clone, B: Clone>(f: &fn(A) -> B, xs: &[A]) -> ~[B] {
2882-
if xs.len() == 0 {
2883-
return ~[];
2884-
}
2885-
let first: B = f(xs[0].clone());
2886-
let rest: ~[B] = map(f, xs.slice(1, xs.len()));
2887-
return ~[first] + rest;
2899+
fn map<A: Copy, B: Copy>(f: &fn(A) -> B, xs: &[A]) -> ~[B] {
2900+
if xs.len() == 0 { return ~[]; }
2901+
let first: B = f(copy xs[0]);
2902+
let rest: ~[B] = map(f, xs.slice(1, xs.len()));
2903+
return ~[first] + rest;
28882904
}
28892905
~~~~~~~
28902906

2891-
Here, `first` has type `B`, referring to `map`'s `B` type parameter;
2892-
and `rest` has type `~[B]`, a vector type with element type `B`.
2907+
Here, `first` has type `B`, referring to `map`'s `B` type parameter; and `rest` has
2908+
type `~[B]`, a vector type with element type `B`.
28932909

28942910
### Self types
28952911

@@ -2903,9 +2919,7 @@ trait Printable {
29032919
}
29042920
29052921
impl Printable for ~str {
2906-
fn make_string(&self) -> ~str {
2907-
(*self).clone()
2908-
}
2922+
fn make_string(&self) -> ~str { copy *self }
29092923
}
29102924
~~~~~~~~
29112925

@@ -2919,29 +2933,23 @@ The kinds are:
29192933

29202934
`Freeze`
29212935
: Types of this kind are deeply immutable;
2922-
they contain no mutable memory locations
2923-
directly or indirectly via pointers.
2936+
they contain no mutable memory locations directly or indirectly via pointers.
29242937
`Send`
29252938
: Types of this kind can be safely sent between tasks.
29262939
This kind includes scalars, owning pointers, owned closures, and
2927-
structural types containing only other owned types.
2928-
All `Send` types are `'static`.
2929-
`'static`
2930-
: Types of this kind do not contain any borrowed pointers;
2931-
this can be a useful guarantee for code
2932-
that breaks borrowing assumptions
2933-
using [`unsafe` operations](#unsafe-functions).
2940+
structural types containing only other owned types. All `Send` types are `Static`.
2941+
`Copy`
2942+
: This kind includes all types that can be copied. All types with
2943+
sendable kind are copyable, as are managed boxes, managed closures,
2944+
trait types, and structural types built out of these.
2945+
Types with destructors (types that implement `Drop`) can not implement `Copy`.
29342946
`Drop`
2935-
: This is not strictly a kind,
2936-
but its presence interacts with kinds:
2937-
the `Drop` trait provides a single method `drop`
2938-
that takes no parameters,
2939-
and is run when values of the type are dropped.
2940-
Such a method is called a "destructor",
2941-
and are always executed in "top-down" order:
2942-
a value is completely destroyed
2943-
before any of the values it owns run their destructors.
2944-
Only `Send` types can implement `Drop`.
2947+
: This is not strictly a kind, but its presence interacts with kinds: the `Drop`
2948+
trait provides a single method `drop` that takes no parameters, and is run
2949+
when values of the type are dropped. Such a method is called a "destructor",
2950+
and are always executed in "top-down" order: a value is completely destroyed
2951+
before any of the values it owns run their destructors. Only `Send` types
2952+
that do not implement `Copy` can implement `Drop`.
29452953

29462954
_Default_
29472955
: Types with destructors, closure environments,
@@ -2954,15 +2962,30 @@ Kinds can be supplied as _bounds_ on type parameters, like traits,
29542962
in which case the parameter is constrained to types satisfying that kind.
29552963

29562964
By default, type parameters do not carry any assumed kind-bounds at all.
2957-
When instantiating a type parameter,
2958-
the kind bounds on the parameter are checked
2959-
to be the same or narrower than the kind
2960-
of the type that it is instantiated with.
29612965

2962-
Sending operations are not part of the Rust language,
2963-
but are implemented in the library.
2964-
Generic functions that send values
2965-
bound the kind of these values to sendable.
2966+
Any operation that causes a value to be copied requires the type of that value to be of copyable kind,
2967+
so the `Copy` bound is frequently required on function type parameters.
2968+
For example, this is not a valid program:
2969+
2970+
~~~~{.xfail-test}
2971+
fn box<T>(x: T) -> @T { @x }
2972+
~~~~
2973+
2974+
Putting `x` into a managed box involves copying, and the `T` parameter has the default (non-copyable) kind.
2975+
To change that, a bound is declared:
2976+
2977+
~~~~
2978+
fn box<T: Copy>(x: T) -> @T { @x }
2979+
~~~~
2980+
2981+
Calling this second version of `box` on a noncopyable type is not
2982+
allowed. When instantiating a type parameter, the kind bounds on the
2983+
parameter are checked to be the same or narrower than the kind of the
2984+
type that it is instantiated with.
2985+
2986+
Sending operations are not part of the Rust language, but are
2987+
implemented in the library. Generic functions that send values bound
2988+
the kind of these values to sendable.
29662989

29672990
# Memory and concurrency models
29682991

@@ -3070,7 +3093,9 @@ managed box value makes a shallow copy of the pointer (optionally incrementing
30703093
a reference count, if the managed box is implemented through
30713094
reference-counting).
30723095

3073-
Owned box values exist in 1:1 correspondence with their heap allocation.
3096+
Owned box values exist in 1:1 correspondence with their heap allocation;
3097+
copying an owned box value makes a deep copy of the heap allocation and
3098+
produces a pointer to the new allocation.
30743099

30753100
An example of constructing one managed box type and value, and one owned box
30763101
type and value:

0 commit comments

Comments
 (0)