Skip to content

Commit 7ba1062

Browse files
committed
---
yaml --- r: 98254 b: refs/heads/master c: a0ecb15 h: refs/heads/master v: v3
1 parent d10be35 commit 7ba1062

Some content is hidden

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

76 files changed

+1088
-601
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 99cde8482efaed4757422d24cd46de8fa64c92cb
2+
refs/heads/master: a0ecb154110d397aa241ee95da89b3a35ff6e503
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: b6400f998497c3958f40997a71756ead344a776d
55
refs/heads/try: c274a6888410ce3e357e014568b43310ed787d36

trunk/doc/rust.md

Lines changed: 50 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2211,12 +2211,9 @@ dereferences (`*expr`), [indexing expressions](#index-expressions)
22112211
(`expr[expr]`), and [field references](#field-expressions) (`expr.f`).
22122212
All other expressions are rvalues.
22132213

2214-
The left operand of an [assignment](#assignment-expressions),
2215-
[binary move](#binary-move-expressions) or
2214+
The left operand of an [assignment](#assignment-expressions) or
22162215
[compound-assignment](#compound-assignment-expressions) expression is an lvalue context,
2217-
as is the single operand of a unary [borrow](#unary-operator-expressions),
2218-
or [move](#unary-move-expressions) expression,
2219-
and _both_ operands of a [swap](#swap-expressions) expression.
2216+
as is the single operand of a unary [borrow](#unary-operator-expressions).
22202217
All other expression contexts are rvalue contexts.
22212218

22222219
When an lvalue is evaluated in an _lvalue context_, it denotes a memory location;
@@ -2229,9 +2226,8 @@ A temporary's lifetime equals the largest lifetime of any reference that points
22292226

22302227
When a [local variable](#memory-slots) is used
22312228
as an [rvalue](#lvalues-rvalues-and-temporaries)
2232-
the variable will either be [moved](#move-expressions) or copied,
2233-
depending on its type.
2234-
For types that contain [owning pointers](#owning-pointers)
2229+
the variable will either be moved or copied, depending on its type.
2230+
For types that contain [owning pointers](#pointer-types)
22352231
or values that implement the special trait `Drop`,
22362232
the variable is moved.
22372233
All other types are copied.
@@ -2890,16 +2886,26 @@ match x {
28902886

28912887
The first pattern matches lists constructed by applying `Cons` to any head value, and a
28922888
tail value of `~Nil`. The second pattern matches _any_ list constructed with `Cons`,
2893-
ignoring the values of its arguments. The difference between `_` and `*` is that the pattern `C(_)` is only type-correct if
2894-
`C` has exactly one argument, while the pattern `C(..)` is type-correct for any enum variant `C`, regardless of how many arguments `C` has.
2895-
2896-
To execute an `match` expression, first the head expression is evaluated, then
2897-
its value is sequentially compared to the patterns in the arms until a match
2889+
ignoring the values of its arguments. The difference between `_` and `*` is that the pattern
2890+
`C(_)` is only type-correct if `C` has exactly one argument, while the pattern `C(..)` is
2891+
type-correct for any enum variant `C`, regardless of how many arguments `C` has.
2892+
2893+
A `match` behaves differently depending on whether or not the head expression
2894+
is an [lvalue or an rvalue](#lvalues-rvalues-and-temporaries).
2895+
If the head expression is an rvalue, it is
2896+
first evaluated into a temporary location, and the resulting value
2897+
is sequentially compared to the patterns in the arms until a match
28982898
is found. The first arm with a matching pattern is chosen as the branch target
28992899
of the `match`, any variables bound by the pattern are assigned to local
29002900
variables in the arm's block, and control enters the block.
29012901

2902-
An example of an `match` expression:
2902+
When the head expression is an lvalue, the match does not allocate a
2903+
temporary location (however, a by-value binding may copy or move from
2904+
the lvalue). When possible, it is preferable to match on lvalues, as the
2905+
lifetime of these matches inherits the lifetime of the lvalue, rather
2906+
than being restricted to the inside of the match.
2907+
2908+
An example of a `match` expression:
29032909

29042910
~~~~
29052911
# fn process_pair(a: int, b: int) { }
@@ -2929,19 +2935,31 @@ Patterns that bind variables
29292935
default to binding to a copy or move of the matched value
29302936
(depending on the matched value's type).
29312937
This can be changed to bind to a reference by
2932-
using the ```ref``` keyword,
2933-
or to a mutable reference using ```ref mut```.
2934-
2935-
A pattern that's just an identifier,
2936-
like `Nil` in the previous answer,
2937-
could either refer to an enum variant that's in scope,
2938-
or bind a new variable.
2939-
The compiler resolves this ambiguity by forbidding variable bindings that occur in ```match``` patterns from shadowing names of variants that are in scope.
2940-
For example, wherever ```List``` is in scope,
2941-
a ```match``` pattern would not be able to bind ```Nil``` as a new name.
2942-
The compiler interprets a variable pattern `x` as a binding _only_ if there is no variant named `x` in scope.
2943-
A convention you can use to avoid conflicts is simply to name variants with upper-case letters,
2944-
and local variables with lower-case letters.
2938+
using the `ref` keyword,
2939+
or to a mutable reference using `ref mut`.
2940+
2941+
Patterns can also dereference pointers by using the `&`,
2942+
`~` or `@` symbols, as appropriate. For example, these two matches
2943+
on `x: &int` are equivalent:
2944+
2945+
~~~~
2946+
# let x = &3;
2947+
let y = match *x { 0 => "zero", _ => "some" };
2948+
let z = match x { &0 => "zero", _ => "some" };
2949+
2950+
assert_eq!(y, z);
2951+
~~~~
2952+
2953+
A pattern that's just an identifier, like `Nil` in the previous answer,
2954+
could either refer to an enum variant that's in scope, or bind a new variable.
2955+
The compiler resolves this ambiguity by forbidding variable bindings that occur
2956+
in `match` patterns from shadowing names of variants that are in scope.
2957+
For example, wherever `List` is in scope,
2958+
a `match` pattern would not be able to bind `Nil` as a new name.
2959+
The compiler interprets a variable pattern `x` as a binding _only_ if there is
2960+
no variant named `x` in scope.
2961+
A convention you can use to avoid conflicts is simply to name variants with
2962+
upper-case letters, and local variables with lower-case letters.
29452963

29462964
Multiple match patterns may be joined with the `|` operator.
29472965
A range of values may be specified with `..`.
@@ -3122,19 +3140,20 @@ A `struct` *type* is a heterogeneous product of other types, called the *fields*
31223140
the *record* types of the ML family,
31233141
or the *structure* types of the Lisp family.]
31243142

3125-
New instances of a `struct` can be constructed with a [struct expression](#struct-expressions).
3143+
New instances of a `struct` can be constructed with a [struct expression](#structure-expressions).
31263144

31273145
The memory order of fields in a `struct` is given by the item defining it.
31283146
Fields may be given in any order in a corresponding struct *expression*;
31293147
the resulting `struct` value will always be laid out in memory in the order specified by the corresponding *item*.
31303148

3131-
The fields of a `struct` may be qualified by [visibility modifiers](#visibility-modifiers),
3149+
The fields of a `struct` may be qualified by [visibility modifiers](#re-exporting-and-visibility),
31323150
to restrict access to implementation-private data in a structure.
31333151

31343152
A _tuple struct_ type is just like a structure type, except that the fields are anonymous.
31353153

31363154
A _unit-like struct_ type is like a structure type, except that it has no fields.
3137-
The one value constructed by the associated [structure expression](#structure-expression) is the only value that inhabits such a type.
3155+
The one value constructed by the associated [structure expression](#structure-expressions)
3156+
is the only value that inhabits such a type.
31383157

31393158
### Enumerated types
31403159

@@ -3805,7 +3824,7 @@ over the output format of a Rust crate.
38053824
### Logging system
38063825

38073826
The runtime contains a system for directing [logging
3808-
expressions](#log-expressions) to a logging console and/or internal logging
3827+
expressions](#logging-expressions) to a logging console and/or internal logging
38093828
buffers. Logging can be enabled per module.
38103829

38113830
Logging output is enabled by setting the `RUST_LOG` environment

trunk/doc/tutorial.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,10 +1020,15 @@ being destroyed along with the owner. Since the `list` variable above is
10201020
immutable, the whole list is immutable. The memory allocation itself is the
10211021
box, while the owner holds onto a pointer to it:
10221022

1023-
Cons cell Cons cell Cons cell
1024-
+-----------+ +-----+-----+ +-----+-----+
1025-
| 1 | ~ | -> | 2 | ~ | -> | 3 | ~ | -> Nil
1026-
+-----------+ +-----+-----+ +-----+-----+
1023+
List box List box List box List box
1024+
+--------------+ +--------------+ +--------------+ +--------------+
1025+
list -> | Cons | 1 | ~ | -> | Cons | 2 | ~ | -> | Cons | 3 | ~ | -> | Nil |
1026+
+--------------+ +--------------+ +--------------+ +--------------+
1027+
1028+
> Note: the above diagram shows the logical contents of the enum. The actual
1029+
> memory layout of the enum may vary. For example, for the `List` enum shown
1030+
> above, Rust guarantees that there will be no enum tag field in the actual
1031+
> structure. See the language reference for more details.
10271032
10281033
An owned box is a common example of a type with a destructor. The allocated
10291034
memory is cleaned up when the box is destroyed.

trunk/mk/docs.mk

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ CDOCS :=
1717
DOCS_L10N :=
1818
HTML_DEPS :=
1919

20-
BASE_DOC_OPTS := --include-before-body=doc/version_info.html --standalone \
21-
--toc --number-sections
22-
HTML_OPTS = $(BASE_DOC_OPTS) --to=html5 --section-divs --css=rust.css \
23-
--include-in-header=doc/favicon.inc
24-
TEX_OPTS = $(BASE_DOC_OPTS) --to=latex
20+
BASE_DOC_OPTS := --standalone --toc --number-sections
21+
HTML_OPTS = $(BASE_DOC_OPTS) --to=html5 --section-divs --css=rust.css \
22+
--include-before-body=doc/version_info.html --include-in-header=doc/favicon.inc
23+
TEX_OPTS = $(BASE_DOC_OPTS) --include-before-body=doc/version.md --to=latex
2524
EPUB_OPTS = $(BASE_DOC_OPTS) --to=epub
2625

2726
######################################################################
2827
# Rust version
2928
######################################################################
29+
3030
doc/version.md: $(MKFILE_DEPS) $(wildcard $(S)doc/*.*)
3131
@$(call E, version-stamp: $@)
3232
$(Q)echo "$(CFG_VERSION)" >$@
@@ -84,7 +84,7 @@ doc/rust.tex: rust.md doc/version.md
8484
$(CFG_PANDOC) $(TEX_OPTS) --output=$@
8585

8686
DOCS += doc/rust.epub
87-
doc/rust.epub: rust.md doc/version_info.html doc/rust.css
87+
doc/rust.epub: rust.md
8888
@$(call E, pandoc: $@)
8989
$(Q)$(CFG_NODE) $(S)doc/prep.js --highlight $< | \
9090
$(CFG_PANDOC) $(EPUB_OPTS) --output=$@
@@ -114,7 +114,7 @@ doc/tutorial.tex: tutorial.md doc/version.md
114114
$(CFG_PANDOC) $(TEX_OPTS) --output=$@
115115

116116
DOCS += doc/tutorial.epub
117-
doc/tutorial.epub: tutorial.md doc/version_info.html doc/rust.css
117+
doc/tutorial.epub: tutorial.md
118118
@$(call E, pandoc: $@)
119119
$(Q)$(CFG_NODE) $(S)doc/prep.js --highlight $< | \
120120
$(CFG_PANDOC) $(EPUB_OPTS) --output=$@
@@ -265,6 +265,7 @@ endif # No pandoc / node
265265
######################################################################
266266
# LLnextgen (grammar analysis from refman)
267267
######################################################################
268+
268269
ifeq ($(CFG_LLNEXTGEN),)
269270
$(info cfg: no llnextgen found, omitting grammar-verification)
270271
else

trunk/src/etc/vim/syntax/rust.vim

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
" Maintainer: Patrick Walton <[email protected]>
44
" Maintainer: Ben Blum <[email protected]>
55
" Maintainer: Chris Morgan <[email protected]>
6-
" Last Change: 2013 Dec 10
6+
" Last Change: 2014 Jan 4
77

88
if version < 600
99
syntax clear
@@ -147,8 +147,8 @@ syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustFail
147147
syn match rustSpecialError display contained /\\./
148148
syn match rustSpecial display contained /\\\([nrt0\\'"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)/
149149
syn match rustStringContinuation display contained /\\\n\s*/
150-
syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustSpecial,rustSpecialError,rustStringContinuation
151-
syn region rustString start='r\z(#*\)"' end='"\z1'
150+
syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustSpecial,rustSpecialError,rustStringContinuation,@Spell
151+
syn region rustString start='r\z(#*\)"' end='"\z1' contains=@Spell
152152

153153
syn region rustAttribute start="#\[" end="\]" contains=rustString,rustDeriving
154154
syn region rustDeriving start="deriving(" end=")" contained contains=rustTrait
@@ -179,10 +179,10 @@ syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit
179179
syn match rustCharacter /'\([^'\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustSpecial,rustSpecialError
180180

181181
syn cluster rustComment contains=rustCommentLine,rustCommentLineDoc,rustCommentBlock,rustCommentBlockDoc
182-
syn region rustCommentLine start="//" end="$" contains=rustTodo
183-
syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo
184-
syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,@rustComment keepend extend
185-
syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,@rustComment keepend extend
182+
syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell
183+
syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell
184+
syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,@rustComment,@Spell keepend extend
185+
syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,@rustComment,@Spell keepend extend
186186
" FIXME: this is a really ugly and not fully correct implementation. Most
187187
" importantly, a case like ``/* */*`` should have the final ``*`` not being in
188188
" a comment, but in practice at present it leaves comments open two levels

trunk/src/libextra/bitv.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,14 +269,23 @@ impl Bitv {
269269

270270
impl Bitv {
271271
pub fn new(nbits: uint, init: bool) -> Bitv {
272-
let rep = if nbits <= uint::bits {
272+
let rep = if nbits < uint::bits {
273+
Small(SmallBitv::new(if init {(1<<nbits)-1} else {0}))
274+
} else if nbits == uint::bits {
273275
Small(SmallBitv::new(if init {!0} else {0}))
274-
}
275-
else {
276-
let nelems = nbits/uint::bits +
277-
if nbits % uint::bits == 0 {0} else {1};
278-
let elem = if init {!0u} else {0u};
279-
let s = vec::from_elem(nelems, elem);
276+
} else {
277+
let exact = nbits % uint::bits == 0;
278+
let nelems = nbits/uint::bits + if exact {0} else {1};
279+
let s =
280+
if init {
281+
if exact {
282+
vec::from_elem(nelems, !0u)
283+
} else {
284+
let mut v = vec::from_elem(nelems-1, !0u);
285+
v.push((1<<nbits % uint::bits)-1);
286+
v
287+
}
288+
} else { vec::from_elem(nelems, 0u)};
280289
Big(BigBitv::new(s))
281290
};
282291
Bitv {rep: rep, nbits: nbits}
@@ -1329,6 +1338,20 @@ mod tests {
13291338
assert_eq!(idxs, ~[0, 2, 3]);
13301339
}
13311340
1341+
#[test]
1342+
fn test_bitv_set_frombitv_init() {
1343+
let bools = [true, false];
1344+
let lengths = [10, 64, 100];
1345+
for &b in bools.iter() {
1346+
for &l in lengths.iter() {
1347+
let bitset = BitvSet::from_bitv(Bitv::new(l, b));
1348+
assert_eq!(bitset.contains(&1u), b)
1349+
assert_eq!(bitset.contains(&(l-1u)), b)
1350+
assert!(!bitset.contains(&l))
1351+
}
1352+
}
1353+
}
1354+
13321355
#[test]
13331356
fn test_small_difference() {
13341357
let mut b1 = Bitv::new(3, false);

trunk/src/libextra/c_vec.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,21 +160,19 @@ impl <T> Container for CVec<T> {
160160

161161
#[cfg(test)]
162162
mod tests {
163-
164163
use super::*;
165164

166165
use std::libc::*;
167166
use std::libc;
168167
use std::ptr;
168+
use std::rt::global_heap::malloc_raw;
169169

170170
fn malloc(n: uint) -> CVec<u8> {
171171
unsafe {
172-
let mem = libc::malloc(n as size_t);
173-
174-
assert!(mem as int != 0);
172+
let mem = malloc_raw(n);
175173

176174
CVec::new_with_dtor(mem as *mut u8, n,
177-
proc() { libc::free(mem); })
175+
proc() { libc::free(mem as *c_void); })
178176
}
179177
}
180178

0 commit comments

Comments
 (0)