Skip to content

Commit 7f29fe9

Browse files
committed
---
yaml --- r: 234412 b: refs/heads/tmp c: a41d435 h: refs/heads/master v: v3
1 parent 0dd2747 commit 7f29fe9

Some content is hidden

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

57 files changed

+6403
-146
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
2626
refs/heads/beta: d2e13e822a73e0ea46ae9e21afdd3155fc997f6d
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
28-
refs/heads/tmp: b4afa8e2e5677ee18ecb138a53697a0275d6ebd0
28+
refs/heads/tmp: a41d4359c5c34c3b11f3b5c03c7e35698729b951
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: ab792abf1fcc28afbd315426213f6428da25c085
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828

branches/tmp/mk/crates.mk

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ TARGET_CRATES := libc std flate arena term \
5454
log graphviz core rbml alloc \
5555
rustc_unicode rustc_bitflags \
5656
alloc_system
57-
RUSTC_CRATES := rustc rustc_typeck rustc_borrowck rustc_resolve rustc_driver \
57+
RUSTC_CRATES := rustc rustc_typeck rustc_mir rustc_borrowck rustc_resolve rustc_driver \
5858
rustc_trans rustc_back rustc_llvm rustc_privacy rustc_lint \
5959
rustc_data_structures rustc_front rustc_platform_intrinsics
6060
HOST_CRATES := syntax $(RUSTC_CRATES) rustdoc fmt_macros
@@ -70,11 +70,12 @@ DEPS_std := core libc rand alloc collections rustc_unicode \
7070
DEPS_graphviz := std
7171
DEPS_syntax := std term serialize log fmt_macros arena libc rustc_bitflags
7272
DEPS_rustc_driver := arena flate getopts graphviz libc rustc rustc_back rustc_borrowck \
73-
rustc_typeck rustc_resolve log syntax serialize rustc_llvm \
73+
rustc_typeck rustc_mir rustc_resolve log syntax serialize rustc_llvm \
7474
rustc_trans rustc_privacy rustc_lint rustc_front
7575

7676
DEPS_rustc_trans := arena flate getopts graphviz libc rustc rustc_back \
7777
log syntax serialize rustc_llvm rustc_front rustc_platform_intrinsics
78+
DEPS_rustc_mir := rustc rustc_front syntax
7879
DEPS_rustc_typeck := rustc syntax rustc_front rustc_platform_intrinsics
7980
DEPS_rustc_borrowck := rustc rustc_front log graphviz syntax
8081
DEPS_rustc_resolve := rustc rustc_front log syntax

branches/tmp/mk/main.mk

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ RUST_LIB_FLAGS_ST3 += -C prefer-dynamic
172172
# by not emitting them.
173173
RUSTFLAGS_STAGE0 += -Z no-landing-pads
174174

175+
# Enable MIR to "always build" for crates where this works. This is
176+
# just temporary while MIR is being actively built up -- it's just a
177+
# poor man's unit testing infrastructure. Anyway we only want this for
178+
# stage1/stage2.
179+
define ADD_MIR_FLAG
180+
RUSTFLAGS1_$(1) += -Z always-build-mir
181+
RUSTFLAGS2_$(1) += -Z always-build-mir
182+
endef
183+
$(foreach crate,$(TARGET_CRATES),$(eval $(call ADD_MIR_FLAG,$(crate))))
184+
$(foreach crate,$(RUSTC_CRATES),$(eval $(call ADD_MIR_FLAG,$(crate))))
185+
$(foreach crate,$(HOST_CRATES),$(eval $(call ADD_MIR_FLAG,$(crate))))
186+
175187
# platform-specific auto-configuration
176188
include $(CFG_SRC_DIR)mk/platform.mk
177189

branches/tmp/mk/target.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$(4): \
9393
$$(LLVM_LIBDIR_RUSTFLAGS_$(2)) \
9494
$$(LLVM_STDCPP_RUSTFLAGS_$(2)) \
9595
$$(RUSTFLAGS_$(4)) \
96+
$$(RUSTFLAGS$(1)_$(4)) \
9697
$$(RUSTFLAGS$(1)_$(4)_T_$(2)) \
9798
--out-dir $$(@D) \
9899
-C extra-filename=-$$(CFG_FILENAME_EXTRA) \

branches/tmp/src/libcollections/macros.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232
/// Note that unlike array expressions this syntax supports all elements
3333
/// which implement `Clone` and the number of elements doesn't have to be
3434
/// a constant.
35+
///
36+
/// This will use `clone()` to duplicate an expression, so one should be careful
37+
/// using this with types having a nonstandard `Clone` implementation. For
38+
/// example, `vec![Rc::new(1); 5]` will create a vector of five references
39+
/// to the same boxed integer value, not five references pointing to independently
40+
/// boxed integers.
3541
#[cfg(not(test))]
3642
#[macro_export]
3743
#[stable(feature = "rust1", since = "1.0.0")]

branches/tmp/src/libgraphviz/lib.rs

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,13 @@ pub enum LabelText<'a> {
313313
/// are also the escape sequences `\l` which left-justifies the
314314
/// preceding line and `\r` which right-justifies it.
315315
EscStr(Cow<'a, str>),
316+
317+
/// This uses a graphviz [HTML string label][html]. The string is
318+
/// printed exactly as given, but between `<` and `>`. **No
319+
/// escaping is performed.**
320+
///
321+
/// [html]: http://www.graphviz.org/content/node-shapes#html
322+
HtmlStr(Cow<'a, str>),
316323
}
317324

318325
/// The style for a node or edge.
@@ -453,6 +460,14 @@ pub trait Labeller<'a,N,E> {
453460
/// is a valid DOT identifier.
454461
fn node_id(&'a self, n: &N) -> Id<'a>;
455462

463+
/// Maps `n` to one of the [graphviz `shape` names][1]. If `None`
464+
/// is returned, no `shape` attribute is specified.
465+
///
466+
/// [1]: http://www.graphviz.org/content/node-shapes
467+
fn node_shape(&'a self, _node: &N) -> Option<LabelText<'a>> {
468+
None
469+
}
470+
456471
/// Maps `n` to a label that will be used in the rendered output.
457472
/// The label need not be unique, and may be the empty string; the
458473
/// default is just the output from `node_id`.
@@ -479,6 +494,16 @@ pub trait Labeller<'a,N,E> {
479494
}
480495
}
481496

497+
/// Escape tags in such a way that it is suitable for inclusion in a
498+
/// Graphviz HTML label.
499+
pub fn escape_html(s: &str) -> String {
500+
s
501+
.replace("&", "&amp;")
502+
.replace("\"", "&quot;")
503+
.replace("<", "&lt;")
504+
.replace(">", "&gt;")
505+
}
506+
482507
impl<'a> LabelText<'a> {
483508
pub fn label<S:IntoCow<'a, str>>(s: S) -> LabelText<'a> {
484509
LabelStr(s.into_cow())
@@ -488,6 +513,10 @@ impl<'a> LabelText<'a> {
488513
EscStr(s.into_cow())
489514
}
490515

516+
pub fn html<S:IntoCow<'a, str>>(s: S) -> LabelText<'a> {
517+
HtmlStr(s.into_cow())
518+
}
519+
491520
fn escape_char<F>(c: char, mut f: F) where F: FnMut(char) {
492521
match c {
493522
// not escaping \\, since Graphviz escString needs to
@@ -505,10 +534,12 @@ impl<'a> LabelText<'a> {
505534
}
506535

507536
/// Renders text as string suitable for a label in a .dot file.
508-
pub fn escape(&self) -> String {
537+
/// This includes quotes or suitable delimeters.
538+
pub fn to_dot_string(&self) -> String {
509539
match self {
510-
&LabelStr(ref s) => s.escape_default(),
511-
&EscStr(ref s) => LabelText::escape_str(&s[..]),
540+
&LabelStr(ref s) => format!("\"{}\"", s.escape_default()),
541+
&EscStr(ref s) => format!("\"{}\"", LabelText::escape_str(&s[..])),
542+
&HtmlStr(ref s) => format!("<{}>", s),
512543
}
513544
}
514545

@@ -524,6 +555,7 @@ impl<'a> LabelText<'a> {
524555
} else {
525556
s
526557
},
558+
HtmlStr(s) => s,
527559
}
528560
}
529561

@@ -612,14 +644,15 @@ pub fn render_opts<'a, N:Clone+'a, E:Clone+'a, G:Labeller<'a,N,E>+GraphWalk<'a,N
612644
try!(indent(w));
613645
let id = g.node_id(n);
614646

615-
let escaped = &g.node_label(n).escape();
647+
let escaped = &g.node_label(n).to_dot_string();
648+
let shape;
616649

617650
let mut text = vec![id.as_slice()];
618651

619652
if !options.contains(&RenderOption::NoNodeLabels) {
620-
text.push("[label=\"");
653+
text.push("[label=");
621654
text.push(escaped);
622-
text.push("\"]");
655+
text.push("]");
623656
}
624657

625658
let style = g.node_style(n);
@@ -629,12 +662,19 @@ pub fn render_opts<'a, N:Clone+'a, E:Clone+'a, G:Labeller<'a,N,E>+GraphWalk<'a,N
629662
text.push("\"]");
630663
}
631664

665+
if let Some(s) = g.node_shape(n) {
666+
shape = s.to_dot_string();
667+
text.push("[shape=");
668+
text.push(&shape);
669+
text.push("]");
670+
}
671+
632672
text.push(";");
633673
try!(writeln(w, &text));
634674
}
635675

636676
for e in g.edges().iter() {
637-
let escaped_label = &g.edge_label(e).escape();
677+
let escaped_label = &g.edge_label(e).to_dot_string();
638678
try!(indent(w));
639679
let source = g.source(e);
640680
let target = g.target(e);
@@ -644,9 +684,9 @@ pub fn render_opts<'a, N:Clone+'a, E:Clone+'a, G:Labeller<'a,N,E>+GraphWalk<'a,N
644684
let mut text = vec![source_id.as_slice(), " -> ", target_id.as_slice()];
645685

646686
if !options.contains(&RenderOption::NoEdgeLabels) {
647-
text.push("[label=\"");
687+
text.push("[label=");
648688
text.push(escaped_label);
649-
text.push("\"]");
689+
text.push("]");
650690
}
651691

652692
let style = g.edge_style(e);
@@ -667,7 +707,7 @@ pub fn render_opts<'a, N:Clone+'a, E:Clone+'a, G:Labeller<'a,N,E>+GraphWalk<'a,N
667707
mod tests {
668708
use self::NodeLabels::*;
669709
use super::{Id, Labeller, Nodes, Edges, GraphWalk, render, Style};
670-
use super::LabelText::{self, LabelStr, EscStr};
710+
use super::LabelText::{self, LabelStr, EscStr, HtmlStr};
671711
use std::io;
672712
use std::io::prelude::*;
673713
use std::borrow::IntoCow;
@@ -805,12 +845,12 @@ mod tests {
805845
fn node_id(&'a self, n: &Node) -> Id<'a> { self.graph.node_id(n) }
806846
fn node_label(&'a self, n: &Node) -> LabelText<'a> {
807847
match self.graph.node_label(n) {
808-
LabelStr(s) | EscStr(s) => EscStr(s),
848+
LabelStr(s) | EscStr(s) | HtmlStr(s) => EscStr(s),
809849
}
810850
}
811851
fn edge_label(&'a self, e: & &'a Edge) -> LabelText<'a> {
812852
match self.graph.edge_label(e) {
813-
LabelStr(s) | EscStr(s) => EscStr(s),
853+
LabelStr(s) | EscStr(s) | HtmlStr(s) => EscStr(s),
814854
}
815855
}
816856
}

branches/tmp/src/librustc/middle/astencode.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,8 @@ impl tr for def::Def {
470470
def::DefPrimTy(p) => def::DefPrimTy(p),
471471
def::DefTyParam(s, index, def_id, n) => def::DefTyParam(s, index, def_id.tr(dcx), n),
472472
def::DefUse(did) => def::DefUse(did.tr(dcx)),
473-
def::DefUpvar(nid1, nid2) => {
474-
def::DefUpvar(dcx.tr_id(nid1), dcx.tr_id(nid2))
473+
def::DefUpvar(nid1, index, nid2) => {
474+
def::DefUpvar(dcx.tr_id(nid1), index, dcx.tr_id(nid2))
475475
}
476476
def::DefStruct(did) => def::DefStruct(did.tr(dcx)),
477477
def::DefRegion(nid) => def::DefRegion(dcx.tr_id(nid)),

branches/tmp/src/librustc/middle/def.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub enum Def {
3838
DefTyParam(ParamSpace, u32, DefId, ast::Name),
3939
DefUse(DefId),
4040
DefUpvar(ast::NodeId, // id of closed over local
41+
usize, // index in the freevars list of the closure
4142
ast::NodeId), // expr node that creates the closure
4243

4344
/// Note that if it's a tuple struct's definition, the node id of the DefId
@@ -129,7 +130,7 @@ impl Def {
129130
id
130131
}
131132
DefLocal(id) |
132-
DefUpvar(id, _) |
133+
DefUpvar(id, _, _) |
133134
DefRegion(id) |
134135
DefLabel(id) |
135136
DefSelfTy(_, Some((_, id))) => {

branches/tmp/src/librustc/middle/expr_use_visitor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl OverloadedCallType {
246246
pub struct ExprUseVisitor<'d, 't, 'a: 't, 'tcx:'a+'d+'t> {
247247
typer: &'t infer::InferCtxt<'a, 'tcx>,
248248
mc: mc::MemCategorizationContext<'t, 'a, 'tcx>,
249-
delegate: &'d mut (Delegate<'tcx>+'d),
249+
delegate: &'d mut Delegate<'tcx>,
250250
}
251251

252252
// If the TYPER results in an error, it's because the type check

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> {
578578
}))
579579
}
580580

581-
def::DefUpvar(var_id, fn_node_id) => {
581+
def::DefUpvar(var_id, _, fn_node_id) => {
582582
let ty = try!(self.node_ty(fn_node_id));
583583
match ty.sty {
584584
ty::TyClosure(closure_id, _) => {

branches/tmp/src/librustc/middle/region.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,9 @@ impl RegionMaps {
329329
pub fn item_extent(&self, n: ast::NodeId) -> CodeExtent {
330330
self.lookup_code_extent(CodeExtentData::DestructionScope(n))
331331
}
332+
pub fn opt_destruction_extent(&self, n: ast::NodeId) -> Option<CodeExtent> {
333+
self.code_extent_interner.borrow().get(&CodeExtentData::DestructionScope(n)).cloned()
334+
}
332335
pub fn intern_code_extent(&self,
333336
e: CodeExtentData,
334337
parent: CodeExtent) -> CodeExtent {

branches/tmp/src/librustc/middle/ty.rs

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3475,6 +3475,13 @@ impl<'tcx, 'container> AdtDefData<'tcx, 'container> {
34753475
.expect("variant_with_id: unknown variant")
34763476
}
34773477

3478+
pub fn variant_index_with_id(&self, vid: DefId) -> usize {
3479+
self.variants
3480+
.iter()
3481+
.position(|v| v.did == vid)
3482+
.expect("variant_index_with_id: unknown variant")
3483+
}
3484+
34783485
pub fn variant_of_def(&self, def: def::Def) -> &VariantDefData<'tcx, 'container> {
34793486
match def {
34803487
def::DefVariant(_, vid, _) => self.variant_with_id(vid),
@@ -5191,28 +5198,12 @@ impl<'tcx> TyS<'tcx> {
51915198

51925199
if !adjusted_ty.references_error() {
51935200
for i in 0..adj.autoderefs {
5194-
let method_call = MethodCall::autoderef(expr_id, i as u32);
5195-
match method_type(method_call) {
5196-
Some(method_ty) => {
5197-
// Overloaded deref operators have all late-bound
5198-
// regions fully instantiated and coverge.
5199-
let fn_ret =
5200-
cx.no_late_bound_regions(&method_ty.fn_ret()).unwrap();
5201-
adjusted_ty = fn_ret.unwrap();
5202-
}
5203-
None => {}
5204-
}
5205-
match adjusted_ty.builtin_deref(true, NoPreference) {
5206-
Some(mt) => { adjusted_ty = mt.ty; }
5207-
None => {
5208-
cx.sess.span_bug(
5209-
span,
5210-
&format!("the {}th autoderef failed: {}",
5211-
i,
5212-
adjusted_ty)
5213-
);
5214-
}
5215-
}
5201+
adjusted_ty =
5202+
adjusted_ty.adjust_for_autoderef(cx,
5203+
expr_id,
5204+
span,
5205+
i as u32,
5206+
&mut method_type);
52165207
}
52175208
}
52185209

@@ -5228,6 +5219,36 @@ impl<'tcx> TyS<'tcx> {
52285219
};
52295220
}
52305221

5222+
pub fn adjust_for_autoderef<F>(&'tcx self,
5223+
cx: &ctxt<'tcx>,
5224+
expr_id: ast::NodeId,
5225+
expr_span: Span,
5226+
autoderef: u32, // how many autoderefs so far?
5227+
mut method_type: F)
5228+
-> Ty<'tcx> where
5229+
F: FnMut(MethodCall) -> Option<Ty<'tcx>>,
5230+
{
5231+
let method_call = MethodCall::autoderef(expr_id, autoderef);
5232+
let mut adjusted_ty = self;
5233+
if let Some(method_ty) = method_type(method_call) {
5234+
// Method calls always have all late-bound regions
5235+
// fully instantiated.
5236+
let fn_ret = cx.no_late_bound_regions(&method_ty.fn_ret()).unwrap();
5237+
adjusted_ty = fn_ret.unwrap();
5238+
}
5239+
match adjusted_ty.builtin_deref(true, NoPreference) {
5240+
Some(mt) => mt.ty,
5241+
None => {
5242+
cx.sess.span_bug(
5243+
expr_span,
5244+
&format!("the {}th autoderef failed: {}",
5245+
autoderef,
5246+
adjusted_ty)
5247+
);
5248+
}
5249+
}
5250+
}
5251+
52315252
pub fn adjust_for_autoref(&'tcx self, cx: &ctxt<'tcx>,
52325253
autoref: Option<AutoRef<'tcx>>)
52335254
-> Ty<'tcx> {

0 commit comments

Comments
 (0)