Skip to content

Commit 84ddff3

Browse files
committed
auto merge of #5578 : erickt/rust/incoming, r=jbclements,erickt
Hey folks, This patch series does some work on the json decoder, specifically with auto decoding of enums. Previously, we would take this code: ``` enum A { B, C(~str, uint) } ``` and would encode a value of this enum to either `["B", []]` or `["C", ["D", 123]]`. I've changed this to `"B"` or `["C", "D", 123]`. This matches the style of the O'Caml json library [json-wheel](http://mjambon.com/json-wheel.html). I've added tests to make sure all this work. In order to make this change, I added passing a `&[&str]` vec to `Decode::emit_enum_variant` so the json decoder can convert the name of a variant into it's position. I also changed the impl of `Encodable` for `Option<T>` to have the right upper casing. I also did some work on the parser, which allows for `fn foo<T: ::cmp::Eq>() { ... }` statements (#5572), fixed the pretty printer properly expanding `debug!("...")` expressions, and removed `ast::expr_vstore_fixed`, which doesn't appear to be used anymore.
2 parents 4954d3e + c317d3f commit 84ddff3

24 files changed

+820
-316
lines changed

src/librustc/middle/astencode.rs

+39
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,7 @@ impl vtable_decoder_helpers for reader::Decoder {
681681
@self.read_to_vec(|| self.read_vtable_origin(xcx) )
682682
}
683683
684+
#[cfg(stage0)]
684685
fn read_vtable_origin(&self, xcx: @ExtendedDecodeContext)
685686
-> typeck::vtable_origin {
686687
do self.read_enum(~"vtable_origin") {
@@ -715,6 +716,44 @@ impl vtable_decoder_helpers for reader::Decoder {
715716
}
716717
}
717718
}
719+
720+
#[cfg(stage1)]
721+
#[cfg(stage2)]
722+
#[cfg(stage3)]
723+
fn read_vtable_origin(&self, xcx: @ExtendedDecodeContext)
724+
-> typeck::vtable_origin {
725+
do self.read_enum("vtable_origin") {
726+
do self.read_enum_variant(["vtable_static", "vtable_param"]) |i| {
727+
match i {
728+
0 => {
729+
typeck::vtable_static(
730+
do self.read_enum_variant_arg(0u) {
731+
self.read_def_id(xcx)
732+
},
733+
do self.read_enum_variant_arg(1u) {
734+
self.read_tys(xcx)
735+
},
736+
do self.read_enum_variant_arg(2u) {
737+
self.read_vtable_res(xcx)
738+
}
739+
)
740+
}
741+
1 => {
742+
typeck::vtable_param(
743+
do self.read_enum_variant_arg(0u) {
744+
self.read_uint()
745+
},
746+
do self.read_enum_variant_arg(1u) {
747+
self.read_uint()
748+
}
749+
)
750+
}
751+
// hard to avoid - user input
752+
_ => fail!(~"bad enum variant")
753+
}
754+
}
755+
}
756+
}
718757
}
719758
720759
// ______________________________________________________________________

src/librustc/middle/check_const.rs

-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ pub fn check_expr(sess: Session,
156156
expr_paren(e) => { check_expr(sess, def_map, method_map,
157157
tcx, e, is_const, v); }
158158
expr_vstore(_, expr_vstore_slice) |
159-
expr_vstore(_, expr_vstore_fixed(_)) |
160159
expr_vec(_, m_imm) |
161160
expr_addr_of(m_imm, _) |
162161
expr_field(*) |

src/librustc/middle/const_eval.rs

-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ pub fn classify(e: @expr,
110110

111111
ast::expr_vstore(e, vstore) => {
112112
match vstore {
113-
ast::expr_vstore_fixed(_) |
114113
ast::expr_vstore_slice => classify(e, tcx),
115114
ast::expr_vstore_uniq |
116115
ast::expr_vstore_box |

src/librustc/middle/liveness.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1290,7 +1290,7 @@ pub impl Liveness {
12901290
self.propagate_through_expr(l, ln)
12911291
}
12921292

1293-
expr_log(_, l, r) |
1293+
expr_log(l, r) |
12941294
expr_index(l, r) |
12951295
expr_binary(_, l, r) => {
12961296
self.propagate_through_exprs(~[l, r], succ)

src/librustc/middle/moves.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ pub impl VisitContext {
567567
self.consume_block(blk, visitor);
568568
}
569569

570-
expr_log(_, a_expr, b_expr) => {
570+
expr_log(a_expr, b_expr) => {
571571
self.consume_expr(a_expr, visitor);
572572
self.use_expr(b_expr, Read, visitor);
573573
}

src/librustc/middle/trans/consts.rs

-3
Original file line numberDiff line numberDiff line change
@@ -466,9 +466,6 @@ fn const_expr_unadjusted(cx: @CrateContext, e: @ast::expr) -> ValueRef {
466466
let (v, _, _) = const_vec(cx, e, *es);
467467
v
468468
}
469-
ast::expr_vstore(e, ast::expr_vstore_fixed(_)) => {
470-
const_expr(cx, e)
471-
}
472469
ast::expr_vstore(sub, ast::expr_vstore_slice) => {
473470
match sub.node {
474471
ast::expr_lit(ref lit) => {

src/librustc/middle/trans/expr.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block {
496496
ast::expr_ret(ex) => {
497497
return controlflow::trans_ret(bcx, ex);
498498
}
499-
ast::expr_log(_, lvl, a) => {
499+
ast::expr_log(lvl, a) => {
500500
return controlflow::trans_log(expr, lvl, bcx, a);
501501
}
502502
ast::expr_while(cond, ref body) => {
@@ -703,9 +703,6 @@ fn trans_rvalue_dps_unadjusted(bcx: block, expr: @ast::expr,
703703
ast::expr_vstore(contents, ast::expr_vstore_mut_slice) => {
704704
return tvec::trans_slice_vstore(bcx, expr, contents, dest);
705705
}
706-
ast::expr_vstore(contents, ast::expr_vstore_fixed(_)) => {
707-
return tvec::trans_fixed_vstore(bcx, expr, contents, dest);
708-
}
709706
ast::expr_vec(*) | ast::expr_repeat(*) => {
710707
return tvec::trans_fixed_vstore(bcx, expr, expr, dest);
711708
}

src/librustc/middle/trans/type_use.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ pub fn mark_for_expr(cx: Context, e: @expr) {
329329
type_needs(cx, use_repr, ty::type_autoderef(cx.ccx.tcx, base_ty));
330330
mark_for_method_call(cx, e.id, e.callee_id);
331331
}
332-
expr_log(_, _, val) => {
332+
expr_log(_, val) => {
333333
node_type_needs(cx, use_tydesc, val.id);
334334
}
335335
expr_call(f, _, _) => {

src/librustc/middle/ty.rs

-1
Original file line numberDiff line numberDiff line change
@@ -3114,7 +3114,6 @@ pub fn expr_kind(tcx: ctxt,
31143114
ast::expr_lit(@codemap::spanned {node: lit_str(_), _}) |
31153115
ast::expr_vstore(_, ast::expr_vstore_slice) |
31163116
ast::expr_vstore(_, ast::expr_vstore_mut_slice) |
3117-
ast::expr_vstore(_, ast::expr_vstore_fixed(_)) |
31183117
ast::expr_vec(*) => {
31193118
RvalueDpsExpr
31203119
}

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

+1-9
Original file line numberDiff line numberDiff line change
@@ -2366,7 +2366,7 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt,
23662366
}
23672367
fcx.write_bot(id);
23682368
}
2369-
ast::expr_log(_, lv, e) => {
2369+
ast::expr_log(lv, e) => {
23702370
check_expr_has_type(fcx, lv,
23712371
ty::mk_mach_uint(tcx, ast::ty_u32));
23722372

@@ -3301,14 +3301,6 @@ pub fn ast_expr_vstore_to_vstore(fcx: @mut FnCtxt,
33013301
v: ast::expr_vstore)
33023302
-> ty::vstore {
33033303
match v {
3304-
ast::expr_vstore_fixed(None) => ty::vstore_fixed(n),
3305-
ast::expr_vstore_fixed(Some(u)) => {
3306-
if n != u {
3307-
let s = fmt!("fixed-size sequence mismatch: %u vs. %u",u, n);
3308-
fcx.ccx.tcx.sess.span_err(e.span,s);
3309-
}
3310-
ty::vstore_fixed(u)
3311-
}
33123304
ast::expr_vstore_uniq => ty::vstore_uniq,
33133305
ast::expr_vstore_box | ast::expr_vstore_mut_box => ty::vstore_box,
33143306
ast::expr_vstore_slice | ast::expr_vstore_mut_slice => {

src/libstd/ebml.rs

+54-2
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ pub mod reader {
335335
self.push_doc(self.next_doc(EsEnum), f)
336336
}
337337
338+
#[cfg(stage0)]
338339
fn read_enum_variant<T>(&self, f: &fn(uint) -> T) -> T {
339340
debug!("read_enum_variant()");
340341
let idx = self._next_uint(EsEnumVid);
@@ -344,6 +345,18 @@ pub mod reader {
344345
}
345346
}
346347
348+
#[cfg(stage1)]
349+
#[cfg(stage2)]
350+
#[cfg(stage3)]
351+
fn read_enum_variant<T>(&self, _names: &[&str], f: &fn(uint) -> T) -> T {
352+
debug!("read_enum_variant()");
353+
let idx = self._next_uint(EsEnumVid);
354+
debug!(" idx=%u", idx);
355+
do self.push_doc(self.next_doc(EsEnumBody)) {
356+
f(idx)
357+
}
358+
}
359+
347360
fn read_enum_variant_arg<T>(&self, idx: uint, f: &fn() -> T) -> T {
348361
debug!("read_enum_variant_arg(idx=%u)", idx);
349362
f()
@@ -397,8 +410,37 @@ pub mod reader {
397410
debug!("read_tup_elt(idx=%u)", idx);
398411
f()
399412
}
400-
}
401413
414+
#[cfg(stage0)]
415+
fn read_option<T>(&self, f: &fn() -> T) -> Option<T> {
416+
debug!("read_option()");
417+
do self.read_enum("Option") || {
418+
do self.read_enum_variant |idx| {
419+
match idx {
420+
0 => None,
421+
1 => Some(f()),
422+
_ => fail!(),
423+
}
424+
}
425+
}
426+
}
427+
428+
#[cfg(stage1)]
429+
#[cfg(stage2)]
430+
#[cfg(stage3)]
431+
fn read_option<T>(&self, f: &fn() -> T) -> Option<T> {
432+
debug!("read_option()");
433+
do self.read_enum("Option") || {
434+
do self.read_enum_variant(["None", "Some"]) |idx| {
435+
match idx {
436+
0 => None,
437+
1 => Some(f()),
438+
_ => fail!(),
439+
}
440+
}
441+
}
442+
}
443+
}
402444
}
403445
404446
pub mod writer {
@@ -664,9 +706,19 @@ pub mod writer {
664706
665707
fn emit_tup(&self, _len: uint, f: &fn()) { f() }
666708
fn emit_tup_elt(&self, _idx: uint, f: &fn()) { f() }
667-
}
668709
710+
fn emit_option(&self, f: &fn()) {
711+
self.emit_enum("Option", f);
712+
}
713+
fn emit_option_none(&self) {
714+
self.emit_enum_variant("None", 0, 0, || ())
715+
}
716+
fn emit_option_some(&self, f: &fn()) {
717+
self.emit_enum_variant("Some", 1, 1, f)
718+
}
719+
}
669720
}
721+
670722
// ___________________________________________________________________________
671723
// Testing
672724

0 commit comments

Comments
 (0)