Skip to content

Commit 8a8f200

Browse files
committed
Introduce auto adjustment table to subsume autoderef/autoref/borrowings.
Fixes #3261 Fixes #3443
1 parent 02b4109 commit 8a8f200

Some content is hidden

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

59 files changed

+2008
-1518
lines changed

src/libcore/pipes.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,7 @@ type SharedChan<T: Send> = unsafe::Exclusive<Chan<T>>;
11771177
impl<T: Send> SharedChan<T>: Channel<T> {
11781178
fn send(+x: T) {
11791179
let mut xx = Some(move x);
1180-
do self.with |chan| {
1180+
do self.with_imm |chan| {
11811181
let mut x = None;
11821182
x <-> xx;
11831183
chan.send(option::unwrap(move x))
@@ -1186,7 +1186,7 @@ impl<T: Send> SharedChan<T>: Channel<T> {
11861186

11871187
fn try_send(+x: T) -> bool {
11881188
let mut xx = Some(move x);
1189-
do self.with |chan| {
1189+
do self.with_imm |chan| {
11901190
let mut x = None;
11911191
x <-> xx;
11921192
chan.try_send(option::unwrap(move x))

src/libcore/unsafe.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,13 @@ impl<T: Send> Exclusive<T> {
354354
move result
355355
}
356356
}
357+
358+
#[inline(always)]
359+
unsafe fn with_imm<U>(f: fn(x: &T) -> U) -> U {
360+
do self.with |x| {
361+
f(unsafe::transmute_immut(x))
362+
}
363+
}
357364
}
358365
359366
// FIXME(#2585) make this a by-move method on the exclusive

src/libstd/ebml.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ enum EbmlSerializerTag {
314314
EsEnum, EsEnumVid, EsEnumBody,
315315
EsVec, EsVecLen, EsVecElt,
316316

317+
EsOpaque,
318+
317319
EsLabel // Used only when debugging
318320
}
319321

@@ -340,6 +342,14 @@ impl ebml::Writer: SerializerPriv {
340342
}
341343
}
342344

345+
impl ebml::Writer {
346+
fn emit_opaque(f: fn()) {
347+
do self.wr_tag(EsOpaque as uint) {
348+
f()
349+
}
350+
}
351+
}
352+
343353
impl ebml::Writer: serialization::Serializer {
344354
fn emit_nil() {}
345355

@@ -397,7 +407,7 @@ impl ebml::Writer: serialization::Serializer {
397407
}
398408

399409
type EbmlDeserializer_ = {mut parent: ebml::Doc,
400-
mut pos: uint};
410+
mut pos: uint};
401411

402412
enum EbmlDeserializer {
403413
EbmlDeserializer_(EbmlDeserializer_)
@@ -462,6 +472,14 @@ priv impl EbmlDeserializer {
462472
}
463473
}
464474

475+
impl EbmlDeserializer {
476+
fn read_opaque<R>(op: fn(ebml::Doc) -> R) -> R {
477+
do self.push_doc(self.next_doc(EsOpaque)) {
478+
op(copy self.parent)
479+
}
480+
}
481+
}
482+
465483
impl EbmlDeserializer: serialization::Deserializer {
466484
fn read_nil() -> () { () }
467485

src/libstd/net_tcp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ impl TcpSocketBuf: io::Reader {
794794
count
795795
}
796796
fn read_byte() -> int {
797-
let bytes = ~[0];
797+
let mut bytes = ~[0];
798798
if self.read(bytes, 1u) == 0 { fail } else { bytes[0] as int }
799799
}
800800
fn unread_byte(amt: int) {

src/libstd/sync.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ mod tests {
775775
let (c,p) = pipes::stream();
776776
let m = ~Mutex();
777777
let m2 = ~m.clone();
778-
let sharedstate = ~0;
778+
let mut sharedstate = ~0;
779779
let ptr = ptr::addr_of(*sharedstate);
780780
do task::spawn {
781781
let sharedstate: &mut int =
@@ -1047,7 +1047,7 @@ mod tests {
10471047
// mutex mutual exclusion test, a ways above.
10481048
let (c,p) = pipes::stream();
10491049
let x2 = ~x.clone();
1050-
let sharedstate = ~0;
1050+
let mut sharedstate = ~0;
10511051
let ptr = ptr::addr_of(*sharedstate);
10521052
do task::spawn {
10531053
let sharedstate: &mut int =

src/libsyntax/ast.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,15 @@ enum vstore {
421421
vstore_slice(@region) // &[1,2,3,4](foo)?
422422
}
423423

424+
#[auto_serialize]
425+
enum expr_vstore {
426+
// FIXME (#2112): Change uint to @expr (actually only constant exprs)
427+
expr_vstore_fixed(Option<uint>), // [1,2,3,4]/_ or 4
428+
expr_vstore_uniq, // ~[1,2,3,4]
429+
expr_vstore_box, // @[1,2,3,4]
430+
expr_vstore_slice // &[1,2,3,4]
431+
}
432+
424433
pure fn is_blockish(p: ast::proto) -> bool {
425434
match p {
426435
proto_block => true,
@@ -662,7 +671,7 @@ enum alt_mode { alt_check, alt_exhaustive, }
662671

663672
#[auto_serialize]
664673
enum expr_ {
665-
expr_vstore(@expr, vstore),
674+
expr_vstore(@expr, expr_vstore),
666675
expr_vec(~[@expr], mutability),
667676
expr_rec(~[field], Option<@expr>),
668677
expr_call(@expr, ~[@expr], bool), // True iff last argument is a block

src/libsyntax/ext/auto_serialize.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ impl ext_ctxt: ext_ctxt_helpers {
260260
ast::expr_lit(
261261
@{node: ast::lit_str(s),
262262
span: span})),
263-
ast::vstore_uniq))
263+
ast::expr_vstore_uniq))
264264
}
265265

266266
fn lit_uint(span: span, i: uint) -> @ast::expr {

src/libsyntax/ext/build.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,26 @@ fn mk_base_vec_e(cx: ext_ctxt, sp: span, exprs: ~[@ast::expr]) ->
6565
let vecexpr = ast::expr_vec(exprs, ast::m_imm);
6666
mk_expr(cx, sp, vecexpr)
6767
}
68-
fn mk_vstore_e(cx: ext_ctxt, sp: span, expr: @ast::expr, vst: ast::vstore) ->
68+
fn mk_vstore_e(cx: ext_ctxt, sp: span, expr: @ast::expr,
69+
vst: ast::expr_vstore) ->
6970
@ast::expr {
7071
mk_expr(cx, sp, ast::expr_vstore(expr, vst))
7172
}
7273
fn mk_uniq_vec_e(cx: ext_ctxt, sp: span, exprs: ~[@ast::expr]) ->
7374
@ast::expr {
74-
mk_vstore_e(cx, sp, mk_base_vec_e(cx, sp, exprs), ast::vstore_uniq)
75+
mk_vstore_e(cx, sp, mk_base_vec_e(cx, sp, exprs), ast::expr_vstore_uniq)
7576
}
7677
fn mk_fixed_vec_e(cx: ext_ctxt, sp: span, exprs: ~[@ast::expr]) ->
7778
@ast::expr {
78-
mk_vstore_e(cx, sp, mk_base_vec_e(cx, sp, exprs), ast::vstore_fixed(None))
79+
mk_vstore_e(cx, sp, mk_base_vec_e(cx, sp, exprs),
80+
ast::expr_vstore_fixed(None))
7981
}
8082
fn mk_base_str(cx: ext_ctxt, sp: span, s: ~str) -> @ast::expr {
8183
let lit = ast::lit_str(@s);
8284
return mk_lit(cx, sp, lit);
8385
}
8486
fn mk_uniq_str(cx: ext_ctxt, sp: span, s: ~str) -> @ast::expr {
85-
mk_vstore_e(cx, sp, mk_base_str(cx, sp, s), ast::vstore_uniq)
87+
mk_vstore_e(cx, sp, mk_base_str(cx, sp, s), ast::expr_vstore_uniq)
8688
}
8789

8890
fn mk_rec_e(cx: ext_ctxt, sp: span,

src/libsyntax/parse/parser.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ use ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
6464
variant, view_item, view_item_, view_item_export,
6565
view_item_import, view_item_use, view_path, view_path_glob,
6666
view_path_list, view_path_simple, visibility, vstore, vstore_box,
67-
vstore_fixed, vstore_slice, vstore_uniq};
67+
vstore_fixed, vstore_slice, vstore_uniq,
68+
expr_vstore_fixed, expr_vstore_slice, expr_vstore_box,
69+
expr_vstore_uniq};
6870

6971
export file_type;
7072
export parser;
@@ -1071,7 +1073,8 @@ impl parser {
10711073
None => (),
10721074
Some(v) => {
10731075
hi = self.span.hi;
1074-
ex = expr_vstore(self.mk_expr(lo, hi, ex), vstore_fixed(v));
1076+
ex = expr_vstore(self.mk_expr(lo, hi, ex),
1077+
expr_vstore_fixed(v));
10751078
}
10761079
},
10771080
_ => ()
@@ -1370,7 +1373,7 @@ impl parser {
13701373
ex = match e.node {
13711374
expr_vec(*) | expr_lit(@{node: lit_str(_), span: _})
13721375
if m == m_imm => {
1373-
expr_vstore(e, vstore_slice(self.region_from_name(None)))
1376+
expr_vstore(e, expr_vstore_slice)
13741377
}
13751378
_ => expr_addr_of(m, e)
13761379
};
@@ -1386,7 +1389,7 @@ impl parser {
13861389
// HACK: turn @[...] into a @-evec
13871390
ex = match e.node {
13881391
expr_vec(*) | expr_lit(@{node: lit_str(_), span: _})
1389-
if m == m_imm => expr_vstore(e, vstore_box),
1392+
if m == m_imm => expr_vstore(e, expr_vstore_box),
13901393
_ => expr_unary(box(m), e)
13911394
};
13921395
}
@@ -1398,7 +1401,7 @@ impl parser {
13981401
// HACK: turn ~[...] into a ~-evec
13991402
ex = match e.node {
14001403
expr_vec(*) | expr_lit(@{node: lit_str(_), span: _})
1401-
if m == m_imm => expr_vstore(e, vstore_uniq),
1404+
if m == m_imm => expr_vstore(e, expr_vstore_uniq),
14021405
_ => expr_unary(uniq(m), e)
14031406
};
14041407
}
@@ -1849,7 +1852,7 @@ impl parser {
18491852
node: expr_lit(@{node: lit_str(_), span: _}), _
18501853
}) => {
18511854
let vst = @{id: self.get_id(), callee_id: self.get_id(),
1852-
node: expr_vstore(e, vstore_box),
1855+
node: expr_vstore(e, expr_vstore_box),
18531856
span: mk_sp(lo, hi)};
18541857
pat_lit(vst)
18551858
}
@@ -1866,7 +1869,7 @@ impl parser {
18661869
node: expr_lit(@{node: lit_str(_), span: _}), _
18671870
}) => {
18681871
let vst = @{id: self.get_id(), callee_id: self.get_id(),
1869-
node: expr_vstore(e, vstore_uniq),
1872+
node: expr_vstore(e, expr_vstore_uniq),
18701873
span: mk_sp(lo, hi)};
18711874
pat_lit(vst)
18721875
}
@@ -1884,10 +1887,12 @@ impl parser {
18841887
pat_lit(e@@{
18851888
node: expr_lit(@{node: lit_str(_), span: _}), _
18861889
}) => {
1887-
let vst = @{id: self.get_id(), callee_id: self.get_id(),
1888-
node: expr_vstore(e,
1889-
vstore_slice(self.region_from_name(None))),
1890-
span: mk_sp(lo, hi)};
1890+
let vst = @{
1891+
id: self.get_id(),
1892+
callee_id: self.get_id(),
1893+
node: expr_vstore(e, expr_vstore_slice),
1894+
span: mk_sp(lo, hi)
1895+
};
18911896
pat_lit(vst)
18921897
}
18931898
_ => pat_region(sub)

src/libsyntax/print/pprust.rs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,16 @@ fn print_vstore(s: ps, t: ast::vstore) {
976976
}
977977
}
978978

979+
fn print_expr_vstore(s: ps, t: ast::expr_vstore) {
980+
match t {
981+
ast::expr_vstore_fixed(Some(i)) => word(s.s, fmt!("%u", i)),
982+
ast::expr_vstore_fixed(None) => word(s.s, ~"_"),
983+
ast::expr_vstore_uniq => word(s.s, ~"~"),
984+
ast::expr_vstore_box => word(s.s, ~"@"),
985+
ast::expr_vstore_slice => word(s.s, ~"&"),
986+
}
987+
}
988+
979989
fn print_expr(s: ps, &&expr: @ast::expr) {
980990
fn print_field(s: ps, field: ast::field) {
981991
ibox(s, indent_unit);
@@ -992,17 +1002,17 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
9921002
let ann_node = node_expr(s, expr);
9931003
s.ann.pre(ann_node);
9941004
match expr.node {
995-
ast::expr_vstore(e, v) => match v {
996-
ast::vstore_fixed(_) => {
997-
print_expr(s, e);
998-
word(s.s, ~"/");
999-
print_vstore(s, v);
1000-
}
1001-
_ => {
1002-
print_vstore(s, v);
1003-
print_expr(s, e);
1004-
}
1005-
},
1005+
ast::expr_vstore(e, v) => match v {
1006+
ast::expr_vstore_fixed(_) => {
1007+
print_expr(s, e);
1008+
word(s.s, ~"/");
1009+
print_expr_vstore(s, v);
1010+
}
1011+
_ => {
1012+
print_expr_vstore(s, v);
1013+
print_expr(s, e);
1014+
}
1015+
},
10061016
ast::expr_vec(exprs, mutbl) => {
10071017
ibox(s, indent_unit);
10081018
word(s.s, ~"[");

src/rustc/front/test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ fn mk_test_desc_vec(cx: test_ctxt) -> @ast::expr {
294294
span: dummy_sp()};
295295
return @{id: cx.sess.next_node_id(),
296296
callee_id: cx.sess.next_node_id(),
297-
node: ast::expr_vstore(inner_expr, ast::vstore_uniq),
297+
node: ast::expr_vstore(inner_expr, ast::expr_vstore_uniq),
298298
span: dummy_sp()};
299299
}
300300

@@ -316,7 +316,7 @@ fn mk_test_desc_rec(cx: test_ctxt, test: test) -> @ast::expr {
316316
let name_expr = {id: cx.sess.next_node_id(),
317317
callee_id: cx.sess.next_node_id(),
318318
node: ast::expr_vstore(name_expr_inner,
319-
ast::vstore_uniq),
319+
ast::expr_vstore_uniq),
320320
span: dummy_sp()};
321321

322322

src/rustc/metadata/common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ enum astencode_tag { // Reserves 0x50 -- 0x6f
120120
tag_table_spill = 0x5f,
121121
tag_table_method_map = 0x60,
122122
tag_table_vtable_map = 0x61,
123-
tag_table_borrowings = 0x62
123+
tag_table_adjustments = 0x62
124124
}
125125

126126
// djb's cdb hashes.

0 commit comments

Comments
 (0)