Skip to content

Commit bc093e0

Browse files
committed
---
yaml --- r: 105064 b: refs/heads/snap-stage3 c: 3d9fdf7 h: refs/heads/master v: v3
1 parent 2369194 commit bc093e0

File tree

16 files changed

+282
-104
lines changed

16 files changed

+282
-104
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 62f1d68439dcfd509eaca29887afa97f22938373
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 31d5ffc5bde1d67356d1d0469fec34c6d06a32b5
4+
refs/heads/snap-stage3: 3d9fdf71656aa51c65f167e19b0d8cb54023b05e
55
refs/heads/try: db814977d07bd798feb24f6b74c00800ef458a13
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/src/doc/guide-tasks.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -493,14 +493,14 @@ Here is the function that implements the child task:
493493
~~~
494494
extern crate sync;
495495
# fn main() {
496-
fn stringifier(channel: &sync::DuplexStream<~str, uint>) {
497-
let mut value: uint;
498-
loop {
499-
value = channel.recv();
500-
channel.send(value.to_str());
501-
if value == 0 { break; }
502-
}
496+
fn stringifier(channel: &sync::DuplexStream<~str, uint>) {
497+
let mut value: uint;
498+
loop {
499+
value = channel.recv();
500+
channel.send(value.to_str());
501+
if value == 0 { break; }
503502
}
503+
}
504504
# }
505505
~~~~
506506

branches/snap-stage3/src/librustc/middle/astencode.rs

Lines changed: 94 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -581,41 +581,48 @@ impl tr for moves::CaptureVar {
581581
// Encoding and decoding of MethodCallee
582582

583583
trait read_method_callee_helper {
584-
fn read_method_callee(&mut self, xcx: &ExtendedDecodeContext) -> MethodCallee;
584+
fn read_method_callee(&mut self, xcx: &ExtendedDecodeContext) -> (u32, MethodCallee);
585585
}
586586

587587
fn encode_method_callee(ecx: &e::EncodeContext,
588588
ebml_w: &mut writer::Encoder,
589+
autoderef: u32,
589590
method: &MethodCallee) {
590-
ebml_w.emit_struct("MethodCallee", 3, |ebml_w| {
591-
ebml_w.emit_struct_field("origin", 0u, |ebml_w| {
591+
ebml_w.emit_struct("MethodCallee", 4, |ebml_w| {
592+
ebml_w.emit_struct_field("autoderef", 0u, |ebml_w| {
593+
autoderef.encode(ebml_w);
594+
});
595+
ebml_w.emit_struct_field("origin", 1u, |ebml_w| {
592596
method.origin.encode(ebml_w);
593597
});
594-
ebml_w.emit_struct_field("ty", 1u, |ebml_w| {
598+
ebml_w.emit_struct_field("ty", 2u, |ebml_w| {
595599
ebml_w.emit_ty(ecx, method.ty);
596600
});
597-
ebml_w.emit_struct_field("substs", 2u, |ebml_w| {
601+
ebml_w.emit_struct_field("substs", 3u, |ebml_w| {
598602
ebml_w.emit_substs(ecx, &method.substs);
599603
});
600604
})
601605
}
602606

603607
impl<'a> read_method_callee_helper for reader::Decoder<'a> {
604-
fn read_method_callee(&mut self, xcx: &ExtendedDecodeContext) -> MethodCallee {
605-
self.read_struct("MethodCallee", 3, |this| {
606-
MethodCallee {
607-
origin: this.read_struct_field("origin", 0, |this| {
608+
fn read_method_callee(&mut self, xcx: &ExtendedDecodeContext) -> (u32, MethodCallee) {
609+
self.read_struct("MethodCallee", 4, |this| {
610+
let autoderef = this.read_struct_field("autoderef", 0, |this| {
611+
Decodable::decode(this)
612+
});
613+
(autoderef, MethodCallee {
614+
origin: this.read_struct_field("origin", 1, |this| {
608615
let method_origin: MethodOrigin =
609616
Decodable::decode(this);
610617
method_origin.tr(xcx)
611618
}),
612-
ty: this.read_struct_field("ty", 1, |this| {
619+
ty: this.read_struct_field("ty", 2, |this| {
613620
this.read_ty(xcx)
614621
}),
615-
substs: this.read_struct_field("substs", 2, |this| {
622+
substs: this.read_struct_field("substs", 3, |this| {
616623
this.read_substs(xcx)
617624
})
618-
}
625+
})
619626
})
620627
}
621628
}
@@ -647,6 +654,20 @@ impl tr for MethodOrigin {
647654
// ______________________________________________________________________
648655
// Encoding and decoding vtable_res
649656

657+
fn encode_vtable_res_with_key(ecx: &e::EncodeContext,
658+
ebml_w: &mut writer::Encoder,
659+
autoderef: u32,
660+
dr: typeck::vtable_res) {
661+
ebml_w.emit_struct("VtableWithKey", 2, |ebml_w| {
662+
ebml_w.emit_struct_field("autoderef", 0u, |ebml_w| {
663+
autoderef.encode(ebml_w);
664+
});
665+
ebml_w.emit_struct_field("vtable_res", 1u, |ebml_w| {
666+
encode_vtable_res(ecx, ebml_w, dr);
667+
});
668+
})
669+
}
670+
650671
pub fn encode_vtable_res(ecx: &e::EncodeContext,
651672
ebml_w: &mut writer::Encoder,
652673
dr: typeck::vtable_res) {
@@ -701,6 +722,10 @@ pub fn encode_vtable_origin(ecx: &e::EncodeContext,
701722
}
702723

703724
pub trait vtable_decoder_helpers {
725+
fn read_vtable_res_with_key(&mut self,
726+
tcx: &ty::ctxt,
727+
cdata: @cstore::crate_metadata)
728+
-> (u32, typeck::vtable_res);
704729
fn read_vtable_res(&mut self,
705730
tcx: &ty::ctxt, cdata: @cstore::crate_metadata)
706731
-> typeck::vtable_res;
@@ -713,6 +738,20 @@ pub trait vtable_decoder_helpers {
713738
}
714739

715740
impl<'a> vtable_decoder_helpers for reader::Decoder<'a> {
741+
fn read_vtable_res_with_key(&mut self,
742+
tcx: &ty::ctxt,
743+
cdata: @cstore::crate_metadata)
744+
-> (u32, typeck::vtable_res) {
745+
self.read_struct("VtableWithKey", 2, |this| {
746+
let autoderef = this.read_struct_field("autoderef", 0, |this| {
747+
Decodable::decode(this)
748+
});
749+
(autoderef, this.read_struct_field("vtable_res", 1, |this| {
750+
this.read_vtable_res(tcx, cdata)
751+
}))
752+
})
753+
}
754+
716755
fn read_vtable_res(&mut self,
717756
tcx: &ty::ctxt, cdata: @cstore::crate_metadata)
718757
-> typeck::vtable_res {
@@ -1018,21 +1057,48 @@ fn encode_side_tables_for_id(ecx: &e::EncodeContext,
10181057
ebml_w.tag(c::tag_table_method_map, |ebml_w| {
10191058
ebml_w.id(id);
10201059
ebml_w.tag(c::tag_table_val, |ebml_w| {
1021-
encode_method_callee(ecx, ebml_w, method)
1060+
encode_method_callee(ecx, ebml_w, method_call.autoderef, method)
10221061
})
10231062
})
10241063
}
10251064

1026-
for &dr in maps.vtable_map.borrow().find(&id).iter() {
1065+
for &dr in maps.vtable_map.borrow().find(&method_call).iter() {
10271066
ebml_w.tag(c::tag_table_vtable_map, |ebml_w| {
10281067
ebml_w.id(id);
10291068
ebml_w.tag(c::tag_table_val, |ebml_w| {
1030-
encode_vtable_res(ecx, ebml_w, *dr);
1069+
encode_vtable_res_with_key(ecx, ebml_w, method_call.autoderef, *dr);
10311070
})
10321071
})
10331072
}
10341073

10351074
for adj in tcx.adjustments.borrow().find(&id).iter() {
1075+
match ***adj {
1076+
ty::AutoDerefRef(adj) => {
1077+
for autoderef in range(0, adj.autoderefs) {
1078+
let method_call = MethodCall::autoderef(id, autoderef as u32);
1079+
for &method in maps.method_map.borrow().find(&method_call).iter() {
1080+
ebml_w.tag(c::tag_table_method_map, |ebml_w| {
1081+
ebml_w.id(id);
1082+
ebml_w.tag(c::tag_table_val, |ebml_w| {
1083+
encode_method_callee(ecx, ebml_w, method_call.autoderef, method)
1084+
})
1085+
})
1086+
}
1087+
1088+
for &dr in maps.vtable_map.borrow().find(&method_call).iter() {
1089+
ebml_w.tag(c::tag_table_vtable_map, |ebml_w| {
1090+
ebml_w.id(id);
1091+
ebml_w.tag(c::tag_table_val, |ebml_w| {
1092+
encode_vtable_res_with_key(ecx, ebml_w,
1093+
method_call.autoderef, *dr);
1094+
})
1095+
})
1096+
}
1097+
}
1098+
}
1099+
_ => {}
1100+
}
1101+
10361102
ebml_w.tag(c::tag_table_adjustments, |ebml_w| {
10371103
ebml_w.id(id);
10381104
ebml_w.tag(c::tag_table_val, |ebml_w| {
@@ -1336,15 +1402,22 @@ fn decode_side_tables(xcx: &ExtendedDecodeContext,
13361402
dcx.tcx.ty_param_defs.borrow_mut().insert(id, bounds);
13371403
}
13381404
c::tag_table_method_map => {
1339-
let method = val_dsr.read_method_callee(xcx);
1340-
let method_call = MethodCall::expr(id);
1405+
let (autoderef, method) = val_dsr.read_method_callee(xcx);
1406+
let method_call = MethodCall {
1407+
expr_id: id,
1408+
autoderef: autoderef
1409+
};
13411410
dcx.maps.method_map.borrow_mut().insert(method_call, method);
13421411
}
13431412
c::tag_table_vtable_map => {
1344-
let vtable_res =
1345-
val_dsr.read_vtable_res(xcx.dcx.tcx,
1346-
xcx.dcx.cdata);
1347-
dcx.maps.vtable_map.borrow_mut().insert(id, vtable_res);
1413+
let (autoderef, vtable_res) =
1414+
val_dsr.read_vtable_res_with_key(xcx.dcx.tcx,
1415+
xcx.dcx.cdata);
1416+
let vtable_key = MethodCall {
1417+
expr_id: id,
1418+
autoderef: autoderef
1419+
};
1420+
dcx.maps.vtable_map.borrow_mut().insert(vtable_key, vtable_res);
13481421
}
13491422
c::tag_table_adjustments => {
13501423
let adj: @ty::AutoAdjustment = @val_dsr.read_auto_adjustment(xcx);

branches/snap-stage3/src/librustc/middle/const_eval.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ pub fn lookup_variant_by_id(tcx: &ty::ctxt,
129129
let maps = astencode::Maps {
130130
root_map: @RefCell::new(HashMap::new()),
131131
method_map: @RefCell::new(FnvHashMap::new()),
132-
vtable_map: @RefCell::new(NodeMap::new()),
132+
vtable_map: @RefCell::new(FnvHashMap::new()),
133133
capture_map: RefCell::new(NodeMap::new())
134134
};
135135
let e = match csearch::maybe_get_item_ast(tcx, enum_def,
@@ -170,7 +170,7 @@ pub fn lookup_const_by_id(tcx: &ty::ctxt, def_id: ast::DefId)
170170
let maps = astencode::Maps {
171171
root_map: @RefCell::new(HashMap::new()),
172172
method_map: @RefCell::new(FnvHashMap::new()),
173-
vtable_map: @RefCell::new(NodeMap::new()),
173+
vtable_map: @RefCell::new(FnvHashMap::new()),
174174
capture_map: RefCell::new(NodeMap::new())
175175
};
176176
let e = match csearch::maybe_get_item_ast(tcx, def_id,

branches/snap-stage3/src/librustc/middle/trans/_match.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,7 @@ struct DynamicFailureHandler<'a> {
11851185
bcx: &'a Block<'a>,
11861186
sp: Span,
11871187
msg: InternedString,
1188-
finished: @Cell<Option<BasicBlockRef>>,
1188+
finished: Cell<Option<BasicBlockRef>>,
11891189
}
11901190

11911191
impl<'a> DynamicFailureHandler<'a> {
@@ -1927,7 +1927,7 @@ fn trans_match_inner<'a>(scope_cx: &'a Block<'a>,
19271927
let chk = {
19281928
if ty::type_is_empty(tcx, t) {
19291929
// Special case for empty types
1930-
let fail_cx = @Cell::new(None);
1930+
let fail_cx = Cell::new(None);
19311931
let fail_handler = ~DynamicFailureHandler {
19321932
bcx: scope_cx,
19331933
sp: discr_expr.span,

branches/snap-stage3/src/librustc/middle/trans/callee.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -170,16 +170,11 @@ pub fn trans_fn_ref(bcx: &Block, def_id: ast::DefId, node: ExprOrMethodCall) ->
170170
let _icx = push_ctxt("trans_fn_ref");
171171

172172
let type_params = node_id_type_params(bcx, node);
173-
let vtables = match node {
174-
ExprId(id) => node_vtables(bcx, id),
175-
MethodCall(ref method_call) => {
176-
if method_call.autoderef == 0 {
177-
node_vtables(bcx, method_call.expr_id)
178-
} else {
179-
None
180-
}
181-
}
173+
let vtable_key = match node {
174+
ExprId(id) => MethodCall::expr(id),
175+
MethodCall(method_call) => method_call
182176
};
177+
let vtables = node_vtables(bcx, vtable_key);
183178
debug!("trans_fn_ref(def_id={}, node={:?}, type_params={}, vtables={})",
184179
def_id.repr(bcx.tcx()), node, type_params.repr(bcx.tcx()),
185180
vtables.repr(bcx.tcx()));

branches/snap-stage3/src/librustc/middle/trans/common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ pub fn node_id_type_params(bcx: &Block, node: ExprOrMethodCall) -> Vec<ty::t> {
829829
}
830830
}
831831

832-
pub fn node_vtables(bcx: &Block, id: ast::NodeId)
832+
pub fn node_vtables(bcx: &Block, id: typeck::MethodCall)
833833
-> Option<typeck::vtable_res> {
834834
let vtable_map = bcx.ccx().maps.vtable_map.borrow();
835835
let raw_vtables = vtable_map.find(&id);

branches/snap-stage3/src/librustc/middle/trans/meth.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ pub fn trans_static_method_callee(bcx: &Block,
208208
debug!("trans_static_method_callee: method_id={:?}, expr_id={:?}, \
209209
name={}", method_id, expr_id, token::get_name(mname));
210210

211-
let vtbls = ccx.maps.vtable_map.borrow().get_copy(&expr_id);
211+
let vtable_key = MethodCall::expr(expr_id);
212+
let vtbls = ccx.maps.vtable_map.borrow().get_copy(&vtable_key);
212213
let vtbls = resolve_vtables_in_fn_ctxt(bcx.fcx, vtbls);
213214

214215
match vtbls.get(bound_index).get(0) {
@@ -327,16 +328,11 @@ fn combine_impl_and_methods_tps(bcx: &Block,
327328

328329
// Now, do the same work for the vtables. The vtables might not
329330
// exist, in which case we need to make them.
330-
let vtables = match node {
331-
ExprId(id) => node_vtables(bcx, id),
332-
MethodCall(method_call) => {
333-
if method_call.autoderef == 0 {
334-
node_vtables(bcx, method_call.expr_id)
335-
} else {
336-
None
337-
}
338-
}
331+
let vtable_key = match node {
332+
ExprId(id) => MethodCall::expr(id),
333+
MethodCall(method_call) => method_call
339334
};
335+
let vtables = node_vtables(bcx, vtable_key);
340336
let r_m_origins = match vtables {
341337
Some(vt) => vt,
342338
None => @Vec::from_elem(node_substs.len(), @Vec::new())
@@ -597,10 +593,8 @@ pub fn trans_trait_cast<'a>(bcx: &'a Block<'a>,
597593
bcx = datum.store_to(bcx, llboxdest);
598594

599595
// Store the vtable into the second half of pair.
600-
// This is structured a bit funny because of dynamic borrow failures.
601-
let res = *ccx.maps.vtable_map.borrow().get(&id);
602-
let res = resolve_vtables_in_fn_ctxt(bcx.fcx, res);
603-
let origins = *res.get(0);
596+
let res = *ccx.maps.vtable_map.borrow().get(&MethodCall::expr(id));
597+
let origins = *resolve_vtables_in_fn_ctxt(bcx.fcx, res).get(0);
604598
let vtable = get_vtable(bcx, v_ty, origins);
605599
let llvtabledest = GEPi(bcx, lldest, [0u, abi::trt_field_vtable]);
606600
let llvtabledest = PointerCast(bcx, llvtabledest, val_ty(vtable).ptr_to());

branches/snap-stage3/src/librustc/middle/typeck/check/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ impl<'a> Inherited<'a> {
267267
node_type_substs: RefCell::new(NodeMap::new()),
268268
adjustments: RefCell::new(NodeMap::new()),
269269
method_map: @RefCell::new(FnvHashMap::new()),
270-
vtable_map: @RefCell::new(NodeMap::new()),
270+
vtable_map: @RefCell::new(FnvHashMap::new()),
271271
upvar_borrow_map: RefCell::new(HashMap::new()),
272272
}
273273
}

0 commit comments

Comments
 (0)