Skip to content

Commit 0685cd1

Browse files
committed
---
yaml --- r: 83161 b: refs/heads/auto c: 6c08cc2 h: refs/heads/master i: 83159: abdf67b v: v3
1 parent f5676a1 commit 0685cd1

File tree

16 files changed

+142
-47
lines changed

16 files changed

+142
-47
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1313
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1414
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1515
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
16-
refs/heads/auto: 88ab38cf060b794f3c4c3572cee7ca25354946d6
16+
refs/heads/auto: 6c08cc2db4f98e9f07ae7d50338396c4123c2f0a
1717
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1818
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c
1919
refs/tags/0.1: b19db808c2793fe2976759b85a355c3ad8c8b336

branches/auto/doc/rust.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,10 +2067,6 @@ The currently implemented features of the compiler are:
20672067
For now this style of variant is hidden behind a feature
20682068
flag.
20692069

2070-
* `once_fns` - Onceness guarantees a closure is only executed once. Defining a
2071-
closure as `once` is unlikely to be supported going forward. So
2072-
they are hidden behind this feature until they are to be removed.
2073-
20742070
If a feature is promoted to a language feature, then all existing programs will
20752071
start to receive compilation warnings about #[feature] directives which enabled
20762072
the new feature (because the directive is no longer necessary). However, if

branches/auto/src/libextra/uuid.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ use std::rand::Rng;
6666
use std::cmp::Eq;
6767
use std::cast::{transmute,transmute_copy};
6868

69+
use serialize::{Encoder, Encodable, Decoder, Decodable};
70+
6971
/// A 128-bit (16 byte) buffer containing the ID
7072
pub type UuidBytes = [u8, ..16];
7173

@@ -486,6 +488,21 @@ impl TotalEq for Uuid {
486488
}
487489
}
488490

491+
// FIXME #9845: Test these more thoroughly
492+
impl<T: Encoder> Encodable<T> for Uuid {
493+
/// Encode a UUID as a hypenated string
494+
fn encode(&self, e: &mut T) {
495+
e.emit_str(self.to_hyphenated_str());
496+
}
497+
}
498+
499+
impl<T: Decoder> Decodable<T> for Uuid {
500+
/// Decode a UUID from a string
501+
fn decode(d: &mut T) -> Uuid {
502+
from_str(d.read_str()).unwrap()
503+
}
504+
}
505+
489506
/// Generates a random instance of UUID (V4 conformant)
490507
impl rand::Rand for Uuid {
491508
#[inline]
@@ -770,6 +787,20 @@ mod test {
770787
assert!(ub.len() == 16);
771788
assert!(! ub.iter().all(|&b| b == 0));
772789
}
790+
791+
#[test]
792+
fn test_serialize_round_trip() {
793+
use std;
794+
use ebml;
795+
use serialize::{Encodable, Decodable};
796+
797+
let u = Uuid::new_v4();
798+
let bytes = do std::io::with_bytes_writer |wr| {
799+
u.encode(&mut ebml::writer::Encoder(wr));
800+
};
801+
let u2 = Decodable::decode(&mut ebml::reader::Decoder(ebml::reader::Doc(@bytes)));
802+
assert_eq!(u, u2);
803+
}
773804
}
774805

775806
#[cfg(test)]

branches/auto/src/librustc/driver/session.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -74,11 +74,12 @@ pub static statik: uint = 1 << 21;
7474
pub static print_link_args: uint = 1 << 22;
7575
pub static no_debug_borrows: uint = 1 << 23;
7676
pub static lint_llvm: uint = 1 << 24;
77-
pub static print_llvm_passes: uint = 1 << 25;
78-
pub static no_vectorize_loops: uint = 1 << 26;
79-
pub static no_vectorize_slp: uint = 1 << 27;
80-
pub static no_prepopulate_passes: uint = 1 << 28;
81-
pub static use_softfp: uint = 1 << 29;
77+
pub static once_fns: uint = 1 << 25;
78+
pub static print_llvm_passes: uint = 1 << 26;
79+
pub static no_vectorize_loops: uint = 1 << 27;
80+
pub static no_vectorize_slp: uint = 1 << 28;
81+
pub static no_prepopulate_passes: uint = 1 << 29;
82+
pub static use_softfp: uint = 1 << 30;
8283

8384
pub fn debugging_opts_map() -> ~[(&'static str, &'static str, uint)] {
8485
~[("verbose", "in general, enable more debug printouts", verbose),
@@ -117,6 +118,9 @@ pub fn debugging_opts_map() -> ~[(&'static str, &'static str, uint)] {
117118
("lint-llvm",
118119
"Run the LLVM lint pass on the pre-optimization IR",
119120
lint_llvm),
121+
("once-fns",
122+
"Allow 'once fn' closures to deinitialize captured variables",
123+
once_fns),
120124
("print-llvm-passes",
121125
"Prints the llvm optimization passes being run",
122126
print_llvm_passes),
@@ -322,6 +326,7 @@ impl Session_ {
322326
pub fn debug_borrows(&self) -> bool {
323327
self.opts.optimize == No && !self.debugging_opt(no_debug_borrows)
324328
}
329+
pub fn once_fns(&self) -> bool { self.debugging_opt(once_fns) }
325330
pub fn print_llvm_passes(&self) -> bool {
326331
self.debugging_opt(print_llvm_passes)
327332
}

branches/auto/src/librustc/front/feature_gate.rs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[
3333
("globs", Active),
3434
("macro_rules", Active),
3535
("struct_variant", Active),
36-
("once_fns", Active),
3736

3837
// These are used to test this portion of the compiler, they don't actually
3938
// mean anything
@@ -127,20 +126,6 @@ impl Visitor<()> for Context {
127126

128127
visit::walk_item(self, i, ());
129128
}
130-
131-
fn visit_ty(&mut self, t: &ast::Ty, _: ()) {
132-
match t.node {
133-
ast::ty_closure(closure) if closure.onceness == ast::Once => {
134-
self.gate_feature("once_fns", t.span,
135-
"once functions are \
136-
experimental and likely to be removed");
137-
138-
},
139-
_ => {}
140-
}
141-
142-
visit::walk_ty(self, t, ());
143-
}
144129
}
145130

146131
pub fn check_crate(sess: Session, crate: &ast::Crate) {

branches/auto/src/librustc/middle/borrowck/gather_loans/gather_moves.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -102,16 +102,28 @@ fn check_is_legal_to_move_from(bccx: &BorrowckCtxt,
102102
match cmt.cat {
103103
mc::cat_deref(_, _, mc::region_ptr(*)) |
104104
mc::cat_deref(_, _, mc::gc_ptr(*)) |
105-
mc::cat_deref(_, _, mc::unsafe_ptr(*)) |
106-
mc::cat_stack_upvar(*) |
107-
mc::cat_copied_upvar(mc::CopiedUpvar { onceness: ast::Many, _ }) => {
105+
mc::cat_deref(_, _, mc::unsafe_ptr(*)) => {
108106
bccx.span_err(
109107
cmt0.span,
110108
format!("cannot move out of {}",
111109
bccx.cmt_to_str(cmt)));
112110
false
113111
}
114112

113+
// These are separate from the above cases for a better error message.
114+
mc::cat_stack_upvar(*) |
115+
mc::cat_copied_upvar(mc::CopiedUpvar { onceness: ast::Many, _ }) => {
116+
let once_hint = if bccx.tcx.sess.once_fns() {
117+
" (unless the destination closure type is `once fn')"
118+
} else {
119+
""
120+
};
121+
bccx.span_err(
122+
cmt0.span,
123+
format!("cannot move out of {}{}", bccx.cmt_to_str(cmt), once_hint));
124+
false
125+
}
126+
115127
// Can move out of captured upvars only if the destination closure
116128
// type is 'once'. 1-shot stack closures emit the copied_upvar form
117129
// (see mem_categorization.rs).

branches/auto/src/librustc/middle/mem_categorization.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -508,10 +508,12 @@ impl mem_categorization_ctxt {
508508
let var_is_refd = match (closure_ty.sigil, closure_ty.onceness) {
509509
// Many-shot stack closures can never move out.
510510
(ast::BorrowedSigil, ast::Many) => true,
511-
// 1-shot stack closures can move out.
512-
(ast::BorrowedSigil, ast::Once) => false,
511+
// 1-shot stack closures can move out with "-Z once-fns".
512+
(ast::BorrowedSigil, ast::Once)
513+
if self.tcx.sess.once_fns() => false,
514+
(ast::BorrowedSigil, ast::Once) => true,
513515
// Heap closures always capture by copy/move, and can
514-
// move out if they are once.
516+
// move out iff they are once.
515517
(ast::OwnedSigil, _) |
516518
(ast::ManagedSigil, _) => false,
517519

branches/auto/src/librustc/middle/typeck/check/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3645,7 +3645,7 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) {
36453645
let fty = ty::mk_closure(ccx.tcx, ty::ClosureTy {
36463646
purity: ast::impure_fn,
36473647
sigil: ast::BorrowedSigil,
3648-
onceness: ast::Many,
3648+
onceness: ast::Once,
36493649
region: ty::re_bound(ty::br_anon(0)),
36503650
bounds: ty::EmptyBuiltinBounds(),
36513651
sig: ty::FnSig {

branches/auto/src/libstd/num/num.rs

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,26 @@ pub trait Orderable: Ord {
4242
fn clamp(&self, mn: &Self, mx: &Self) -> Self;
4343
}
4444

45+
/// Return the smaller number.
4546
#[inline(always)] pub fn min<T: Orderable>(x: T, y: T) -> T { x.min(&y) }
47+
/// Return the larger number.
4648
#[inline(always)] pub fn max<T: Orderable>(x: T, y: T) -> T { x.max(&y) }
49+
/// Returns the number constrained within the range `mn <= self <= mx`.
4750
#[inline(always)] pub fn clamp<T: Orderable>(value: T, mn: T, mx: T) -> T { value.clamp(&mn, &mx) }
4851

4952
pub trait Zero {
5053
fn zero() -> Self; // FIXME (#5527): This should be an associated constant
5154
fn is_zero(&self) -> bool;
5255
}
5356

57+
/// Returns `0` of appropriate type.
5458
#[inline(always)] pub fn zero<T: Zero>() -> T { Zero::zero() }
5559

5660
pub trait One {
5761
fn one() -> Self; // FIXME (#5527): This should be an associated constant
5862
}
5963

64+
/// Returns `1` of appropriate type.
6065
#[inline(always)] pub fn one<T: One>() -> T { One::one() }
6166

6267
pub trait Signed: Num
@@ -69,8 +74,26 @@ pub trait Signed: Num
6974
fn is_negative(&self) -> bool;
7075
}
7176

77+
/// Computes the absolute value.
78+
///
79+
/// For float, f32, and f64, `NaN` will be returned if the number is `NaN`
7280
#[inline(always)] pub fn abs<T: Signed>(value: T) -> T { value.abs() }
81+
/// The positive difference of two numbers.
82+
///
83+
/// Returns `zero` if the number is less than or equal to `other`,
84+
/// otherwise the difference between `self` and `other` is returned.
7385
#[inline(always)] pub fn abs_sub<T: Signed>(x: T, y: T) -> T { x.abs_sub(&y) }
86+
/// Returns the sign of the number.
87+
///
88+
/// For float, f32, f64:
89+
/// - `1.0` if the number is positive, `+0.0` or `infinity`
90+
/// - `-1.0` if the number is negative, `-0.0` or `neg_infinity`
91+
/// - `NaN` if the number is `NaN`
92+
///
93+
/// For int:
94+
/// - `0` if the number is zero
95+
/// - `1` if the number is positive
96+
/// - `-1` if the number is negative
7497
#[inline(always)] pub fn signum<T: Signed>(value: T) -> T { value.signum() }
7598

7699
pub trait Unsigned: Num {}
@@ -106,7 +129,11 @@ pub trait Integer: Num
106129
fn is_odd(&self) -> bool;
107130
}
108131

132+
/// Calculates the Greatest Common Divisor (GCD) of the number and `other`.
133+
///
134+
/// The result is always positive.
109135
#[inline(always)] pub fn gcd<T: Integer>(x: T, y: T) -> T { x.gcd(&y) }
136+
/// Calculates the Lowest Common Multiple (LCM) of the number and `other`.
110137
#[inline(always)] pub fn lcm<T: Integer>(x: T, y: T) -> T { x.lcm(&y) }
111138

112139
pub trait Round {
@@ -132,10 +159,23 @@ pub trait Algebraic {
132159
fn hypot(&self, other: &Self) -> Self;
133160
}
134161

162+
/// Raise a number to a power.
163+
///
164+
/// # Example
165+
///
166+
/// ```rust
167+
/// let sixteen: float = num::pow(2.0, 4.0);
168+
/// assert_eq!(sixteen, 16.0);
169+
/// ```
135170
#[inline(always)] pub fn pow<T: Algebraic>(value: T, n: T) -> T { value.pow(&n) }
171+
/// Take the squre root of a number.
136172
#[inline(always)] pub fn sqrt<T: Algebraic>(value: T) -> T { value.sqrt() }
173+
/// Take the reciprocal (inverse) square root of a number, `1/sqrt(x)`.
137174
#[inline(always)] pub fn rsqrt<T: Algebraic>(value: T) -> T { value.rsqrt() }
175+
/// Take the cubic root of a number.
138176
#[inline(always)] pub fn cbrt<T: Algebraic>(value: T) -> T { value.cbrt() }
177+
/// Calculate the length of the hypotenuse of a right-angle triangle given legs of length `x` and
178+
/// `y`.
139179
#[inline(always)] pub fn hypot<T: Algebraic>(x: T, y: T) -> T { x.hypot(&y) }
140180

141181
pub trait Trigonometric {
@@ -151,15 +191,23 @@ pub trait Trigonometric {
151191
fn sin_cos(&self) -> (Self, Self);
152192
}
153193

194+
/// Sine function.
154195
#[inline(always)] pub fn sin<T: Trigonometric>(value: T) -> T { value.sin() }
196+
/// Cosine function.
155197
#[inline(always)] pub fn cos<T: Trigonometric>(value: T) -> T { value.cos() }
198+
/// Tangent function.
156199
#[inline(always)] pub fn tan<T: Trigonometric>(value: T) -> T { value.tan() }
157200

201+
/// Compute the arcsine of the number.
158202
#[inline(always)] pub fn asin<T: Trigonometric>(value: T) -> T { value.asin() }
203+
/// Compute the arccosine of the number.
159204
#[inline(always)] pub fn acos<T: Trigonometric>(value: T) -> T { value.acos() }
205+
/// Compute the arctangent of the number.
160206
#[inline(always)] pub fn atan<T: Trigonometric>(value: T) -> T { value.atan() }
161207

208+
/// Compute the arctangent with 2 arguments.
162209
#[inline(always)] pub fn atan2<T: Trigonometric>(x: T, y: T) -> T { x.atan2(&y) }
210+
/// Simultaneously computes the sine and cosine of the number.
163211
#[inline(always)] pub fn sin_cos<T: Trigonometric>(value: T) -> (T, T) { value.sin_cos() }
164212

165213
pub trait Exponential {
@@ -172,12 +220,18 @@ pub trait Exponential {
172220
fn log10(&self) -> Self;
173221
}
174222

223+
/// Returns `e^(value)`, (the exponential function).
175224
#[inline(always)] pub fn exp<T: Exponential>(value: T) -> T { value.exp() }
225+
/// Returns 2 raised to the power of the number, `2^(value)`.
176226
#[inline(always)] pub fn exp2<T: Exponential>(value: T) -> T { value.exp2() }
177227

228+
/// Returns the natural logarithm of the number.
178229
#[inline(always)] pub fn ln<T: Exponential>(value: T) -> T { value.ln() }
230+
/// Returns the logarithm of the number with respect to an arbitrary base.
179231
#[inline(always)] pub fn log<T: Exponential>(value: T, base: T) -> T { value.log(&base) }
232+
/// Returns the base 2 logarithm of the number.
180233
#[inline(always)] pub fn log2<T: Exponential>(value: T) -> T { value.log2() }
234+
/// Returns the base 10 logarithm of the number.
181235
#[inline(always)] pub fn log10<T: Exponential>(value: T) -> T { value.log10() }
182236

183237
pub trait Hyperbolic: Exponential {
@@ -190,12 +244,18 @@ pub trait Hyperbolic: Exponential {
190244
fn atanh(&self) -> Self;
191245
}
192246

247+
/// Hyperbolic cosine function.
193248
#[inline(always)] pub fn sinh<T: Hyperbolic>(value: T) -> T { value.sinh() }
249+
/// Hyperbolic sine function.
194250
#[inline(always)] pub fn cosh<T: Hyperbolic>(value: T) -> T { value.cosh() }
251+
/// Hyperbolic tangent function.
195252
#[inline(always)] pub fn tanh<T: Hyperbolic>(value: T) -> T { value.tanh() }
196253

254+
/// Inverse hyperbolic sine function.
197255
#[inline(always)] pub fn asinh<T: Hyperbolic>(value: T) -> T { value.asinh() }
256+
/// Inverse hyperbolic cosine function.
198257
#[inline(always)] pub fn acosh<T: Hyperbolic>(value: T) -> T { value.acosh() }
258+
/// Inverse hyperbolic tangent function.
199259
#[inline(always)] pub fn atanh<T: Hyperbolic>(value: T) -> T { value.atanh() }
200260

201261
/// Defines constants and methods common to real numbers
@@ -345,8 +405,16 @@ pub trait Float: Real
345405
fn next_after(&self, other: Self) -> Self;
346406
}
347407

408+
/// Returns the exponential of the number, minus `1`, `exp(n) - 1`, in a way
409+
/// that is accurate even if the number is close to zero.
348410
#[inline(always)] pub fn exp_m1<T: Float>(value: T) -> T { value.exp_m1() }
411+
/// Returns the natural logarithm of the number plus `1`, `ln(n + 1)`, more
412+
/// accurately than if the operations were performed separately.
349413
#[inline(always)] pub fn ln_1p<T: Float>(value: T) -> T { value.ln_1p() }
414+
/// Fused multiply-add. Computes `(a * b) + c` with only one rounding error.
415+
///
416+
/// This produces a more accurate result with better performance (on some
417+
/// architectures) than a separate multiplication operation followed by an add.
350418
#[inline(always)] pub fn mul_add<T: Float>(a: T, b: T, c: T) -> T { a.mul_add(b, c) }
351419

352420
/// A generic trait for converting a value to a number.
@@ -788,7 +856,7 @@ impl_from_primitive!(u64, n.to_u64())
788856
impl_from_primitive!(f32, n.to_f32())
789857
impl_from_primitive!(f64, n.to_f64())
790858

791-
/// Cast from one machine scalar to another
859+
/// Cast from one machine scalar to another.
792860
///
793861
/// # Example
794862
///
@@ -841,7 +909,7 @@ pub trait FromStrRadix {
841909
fn from_str_radix(str: &str, radix: uint) -> Option<Self>;
842910
}
843911

844-
/// A utility function that just calls FromStrRadix::from_str_radix
912+
/// A utility function that just calls FromStrRadix::from_str_radix.
845913
pub fn from_str_radix<T: FromStrRadix>(str: &str, radix: uint) -> Option<T> {
846914
FromStrRadix::from_str_radix(str, radix)
847915
}

0 commit comments

Comments
 (0)