Skip to content

Commit 83e4f50

Browse files
committed
---
yaml --- r: 73261 b: refs/heads/dist-snap c: 0b39bc2 h: refs/heads/master i: 73259: 644399d v: v3
1 parent 500b787 commit 83e4f50

File tree

12 files changed

+297
-19
lines changed

12 files changed

+297
-19
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
99
refs/heads/incoming: b50030718cf28f2a5a81857a26b57442734fe854
10-
refs/heads/dist-snap: dc57d15b69601e8d88e7ee71b578a1624e28f89e
10+
refs/heads/dist-snap: 0b39bc275e8f573238ad23fc8f86c87cec5e103d
1111
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1212
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1313
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/libcore/io.rs

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,37 @@
1010

1111
/*!
1212
13-
Basic input/output
13+
The `io` module contains basic input and output routines.
14+
15+
A quick summary:
16+
17+
## `Reader` and `Writer` traits
18+
19+
These traits define the minimal set of methods that anything that can do
20+
input and output should implement.
21+
22+
## `ReaderUtil` and `WriterUtil` traits
23+
24+
Richer methods that allow you to do more. `Reader` only lets you read a certain
25+
number of bytes into a buffer, while `ReaderUtil` allows you to read a whole
26+
line, for example.
27+
28+
Generally, these richer methods are probably the ones you want to actually
29+
use in day-to-day Rust.
30+
31+
Furthermore, because there is an implementation of `ReaderUtil` for
32+
`<T: Reader>`, when your input or output code implements `Reader`, you get
33+
all of these methods for free.
34+
35+
## `print` and `println`
36+
37+
These very useful functions are defined here. You generally don't need to
38+
import them, though, as the prelude already does.
39+
40+
## `stdin`, `stdout`, and `stderr`
41+
42+
These functions return references to the classic three file descriptors. They
43+
implement `Reader` and `Writer`, where appropriate.
1444
1545
*/
1646

@@ -1010,6 +1040,16 @@ pub fn FILE_reader(f: *libc::FILE, cleanup: bool) -> @Reader {
10101040
// top-level functions that take a reader, or a set of default methods on
10111041
// reader (which can then be called reader)
10121042

1043+
/**
1044+
* Gives a `Reader` that allows you to read values from standard input.
1045+
*
1046+
* # Examples
1047+
* ~~~
1048+
* let stdin = core::io::stdin();
1049+
* let line = stdin.read_line();
1050+
* core::io::print(line);
1051+
* ~~~
1052+
*/
10131053
pub fn stdin() -> @Reader {
10141054
unsafe {
10151055
@rustrt::rust_get_stdin() as @Reader
@@ -1561,13 +1601,57 @@ pub fn buffered_file_writer(path: &Path) -> Result<@Writer, ~str> {
15611601
// FIXME (#2004) it would be great if this could be a const
15621602
// FIXME (#2004) why are these different from the way stdin() is
15631603
// implemented?
1604+
1605+
1606+
/**
1607+
* Gives a `Writer` which allows you to write to the standard output.
1608+
*
1609+
* # Examples
1610+
* ~~~
1611+
* let stdout = core::io::stdout();
1612+
* stdout.write_str("hello\n");
1613+
* ~~~
1614+
*/
15641615
pub fn stdout() -> @Writer { fd_writer(libc::STDOUT_FILENO as c_int, false) }
1616+
1617+
/**
1618+
* Gives a `Writer` which allows you to write to standard error.
1619+
*
1620+
* # Examples
1621+
* ~~~
1622+
* let stderr = core::io::stderr();
1623+
* stderr.write_str("hello\n");
1624+
* ~~~
1625+
*/
15651626
pub fn stderr() -> @Writer { fd_writer(libc::STDERR_FILENO as c_int, false) }
15661627

1628+
/**
1629+
* Prints a string to standard output.
1630+
*
1631+
* This string will not have an implicit newline at the end. If you want
1632+
* an implicit newline, please see `println`.
1633+
*
1634+
* # Examples
1635+
* ~~~
1636+
* // print is imported into the prelude, and so is always available.
1637+
* print("hello");
1638+
* ~~~
1639+
*/
15671640
pub fn print(s: &str) {
15681641
stdout().write_str(s);
15691642
}
15701643

1644+
/**
1645+
* Prints a string to standard output, followed by a newline.
1646+
*
1647+
* If you do not want an implicit newline, please see `print`.
1648+
*
1649+
* # Examples
1650+
* ~~~
1651+
* // println is imported into the prelude, and so is always available.
1652+
* println("hello");
1653+
* ~~~
1654+
*/
15711655
pub fn println(s: &str) {
15721656
stdout().write_line(s);
15731657
}

branches/dist-snap/src/libcore/rt/stack.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ pub impl StackSegment {
3939

4040
/// Point to the low end of the allocated stack
4141
fn start(&self) -> *uint {
42-
vec::raw::to_ptr(self.buf) as *uint
42+
unsafe {
43+
vec::raw::to_ptr(self.buf) as *uint
44+
}
4345
}
4446

4547
/// Point one word beyond the high end of the allocated stack

branches/dist-snap/src/libcore/rt/uv/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ use vec;
4444
use ptr;
4545
use cast;
4646
use str;
47+
use option::*;
48+
use str::raw::from_c_str;
49+
use to_str::ToStr;
4750
use libc::{c_void, c_int, size_t, malloc, free};
4851
use cast::transmute;
4952
use ptr::null;

branches/dist-snap/src/libcore/rt/uv/uvio.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use option::*;
1212
use result::*;
1313
use ops::Drop;
14+
use old_iter::CopyableIter;
1415
use cell::{Cell, empty_cell};
1516
use cast::transmute;
1617
use clone::Clone;

branches/dist-snap/src/libcore/unstable/lang.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use libc::{c_char, c_uchar, c_void, size_t, uintptr_t, c_int, STDERR_FILENO};
1616
use managed::raw::BoxRepr;
1717
use str;
1818
use sys;
19+
use cast::transmute;
1920
use rt::{context, OldTaskContext};
2021
use rt::local_services::borrow_local_services;
2122
use option::{Option, Some, None};

branches/dist-snap/src/librustc/lib/llvm.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
use core::hashmap::HashMap;
12-
use core::libc::c_uint;
12+
use core::libc::{c_uint, c_ushort};
1313

1414
pub type Opcode = u32;
1515
pub type Bool = c_uint;
@@ -221,7 +221,7 @@ pub mod llvm {
221221
use super::{SectionIteratorRef, TargetDataRef, TypeKind, TypeRef, UseRef};
222222
use super::{ValueRef};
223223

224-
use core::libc::{c_char, c_int, c_longlong, c_uint, c_ulonglong};
224+
use core::libc::{c_char, c_int, c_longlong, c_ushort, c_uint, c_ulonglong};
225225

226226
#[link_args = "-Lrustllvm -lrustllvm"]
227227
#[link_name = "rustllvm"]
@@ -451,6 +451,10 @@ pub mod llvm {
451451
/* all zeroes */
452452
#[fast_ffi]
453453
pub unsafe fn LLVMConstAllOnes(Ty: TypeRef) -> ValueRef;
454+
#[fast_ffi]
455+
pub unsafe fn LLVMConstICmp(Pred: c_ushort, V1: ValueRef, V2: ValueRef) -> ValueRef;
456+
#[fast_ffi]
457+
pub unsafe fn LLVMConstFCmp(Pred: c_ushort, V1: ValueRef, V2: ValueRef) -> ValueRef;
454458
/* only for int/vector */
455459
#[fast_ffi]
456460
pub unsafe fn LLVMGetUndef(Ty: TypeRef) -> ValueRef;
@@ -1914,6 +1918,16 @@ pub fn SetLinkage(Global: ValueRef, Link: Linkage) {
19141918
}
19151919
}
19161920

1921+
pub fn ConstICmp(Pred: IntPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef {
1922+
unsafe {
1923+
llvm::LLVMConstICmp(Pred as c_ushort, V1, V2)
1924+
}
1925+
}
1926+
pub fn ConstFCmp(Pred: RealPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef {
1927+
unsafe {
1928+
llvm::LLVMConstFCmp(Pred as c_ushort, V1, V2)
1929+
}
1930+
}
19171931
/* Memory-managed object interface to type handles. */
19181932

19191933
pub struct TypeNames {

branches/dist-snap/src/librustc/metadata/encoder.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,8 +386,20 @@ fn encode_reexported_static_methods(ecx: @EncodeContext,
386386
match ecx.tcx.trait_methods_cache.find(&exp.def_id) {
387387
Some(methods) => {
388388
match ecx.tcx.items.find(&exp.def_id.node) {
389-
Some(&ast_map::node_item(_, path)) => {
390-
if mod_path != *path {
389+
Some(&ast_map::node_item(item, path)) => {
390+
let original_name = ecx.tcx.sess.str_of(item.ident);
391+
392+
//
393+
// We don't need to reexport static methods on traits
394+
// declared in the same module as our `pub use ...` since
395+
// that's done when we encode the trait item.
396+
//
397+
// The only exception is when the reexport *changes* the
398+
// name e.g. `pub use Foo = self::Bar` -- we have
399+
// encoded metadata for static methods relative to Bar,
400+
// but not yet for Foo.
401+
//
402+
if mod_path != *path || *exp.name != *original_name {
391403
for methods.each |&m| {
392404
if m.explicit_self == ast::sty_static {
393405
encode_reexported_static_method(ecx,

branches/dist-snap/src/librustc/middle/trans/consts.rs

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
// except according to those terms.
1010

1111
use back::abi;
12-
use lib::llvm::{llvm, SetLinkage, PrivateLinkage,
13-
ValueRef, TypeRef, Bool, True, False};
12+
use lib::llvm::{llvm, ConstFCmp, ConstICmp, SetLinkage, PrivateLinkage, ValueRef, TypeRef, Bool,
13+
True, False};
14+
use lib::llvm::{IntEQ, IntNE, IntUGT, IntUGE, IntULT, IntULE, IntSGT, IntSGE, IntSLT, IntSLE,
15+
RealOEQ, RealOGT, RealOGE, RealOLT, RealOLE, RealONE};
16+
1417
use metadata::csearch;
1518
use middle::const_eval;
1619
use middle::trans::adt;
@@ -280,8 +283,8 @@ fn const_expr_unadjusted(cx: @CrateContext, e: @ast::expr) -> ValueRef {
280283
else if signed { llvm::LLVMConstSRem(te1, te2) }
281284
else { llvm::LLVMConstURem(te1, te2) }
282285
}
283-
ast::and |
284-
ast::or => cx.sess.span_unimpl(e.span, "binop logic"),
286+
ast::and => llvm::LLVMConstAnd(te1, te2),
287+
ast::or => llvm::LLVMConstOr(te1, te2),
285288
ast::bitxor => llvm::LLVMConstXor(te1, te2),
286289
ast::bitand => llvm::LLVMConstAnd(te1, te2),
287290
ast::bitor => llvm::LLVMConstOr(te1, te2),
@@ -290,14 +293,44 @@ fn const_expr_unadjusted(cx: @CrateContext, e: @ast::expr) -> ValueRef {
290293
if signed { llvm::LLVMConstAShr(te1, te2) }
291294
else { llvm::LLVMConstLShr(te1, te2) }
292295
}
293-
ast::eq |
294-
ast::lt |
295-
ast::le |
296-
ast::ne |
297-
ast::ge |
298-
ast::gt => cx.sess.span_unimpl(e.span, "binop comparator")
299-
}
300-
}
296+
ast::eq => {
297+
if is_float { ConstFCmp(RealOEQ, te1, te2) }
298+
else { ConstICmp(IntEQ, te1, te2) }
299+
},
300+
ast::lt => {
301+
if is_float { ConstFCmp(RealOLT, te1, te2) }
302+
else {
303+
if signed { ConstICmp(IntSLT, te1, te2) }
304+
else { ConstICmp(IntULT, te1, te2) }
305+
}
306+
},
307+
ast::le => {
308+
if is_float { ConstFCmp(RealOLE, te1, te2) }
309+
else {
310+
if signed { ConstICmp(IntSLE, te1, te2) }
311+
else { ConstICmp(IntULE, te1, te2) }
312+
}
313+
},
314+
ast::ne => {
315+
if is_float { ConstFCmp(RealONE, te1, te2) }
316+
else { ConstICmp(IntNE, te1, te2) }
317+
},
318+
ast::ge => {
319+
if is_float { ConstFCmp(RealOGE, te1, te2) }
320+
else {
321+
if signed { ConstICmp(IntSGE, te1, te2) }
322+
else { ConstICmp(IntUGE, te1, te2) }
323+
}
324+
},
325+
ast::gt => {
326+
if is_float { ConstFCmp(RealOGT, te1, te2) }
327+
else {
328+
if signed { ConstICmp(IntSGT, te1, te2) }
329+
else { ConstICmp(IntUGT, te1, te2) }
330+
}
331+
},
332+
};
333+
},
301334
ast::expr_unary(u, e) => {
302335
let te = const_expr(cx, e);
303336
let ty = ty::expr_ty(cx.tcx, e);

branches/dist-snap/src/test/auxiliary/mod_trait_with_static_methods_lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
// except according to those terms.
1010

1111
pub use sub_foo::Foo;
12+
pub use Baz = self::Bar;
13+
14+
pub trait Bar {
15+
pub fn bar() -> Self;
16+
}
17+
18+
impl Bar for int {
19+
pub fn bar() -> int { 84 }
20+
}
1221

1322
pub mod sub_foo {
1423
pub trait Foo {
@@ -18,4 +27,5 @@ pub mod sub_foo {
1827
impl Foo for int {
1928
pub fn foo() -> int { 42 }
2029
}
30+
2131
}

0 commit comments

Comments
 (0)