Skip to content

Commit 2f8b36f

Browse files
committed
auto merge of #5819 : erickt/rust/incoming, r=erickt
Good morning, This first patch series adds support for `#[deriving(Decodable, Encodable)]`, but does not yet remove `#[auto_encode]` and `#[auto_decode]`. I need a snapshot to remove the old code. Along the way it also extends support for tuple structs and struct enum variants. Also, it includes a minor fix to the pretty printer. We decided a while ago to use 4 spaces to indent a match arm instead of 2. This updates the pretty printer to reflect that.
2 parents e0defb8 + 26ecb30 commit 2f8b36f

File tree

16 files changed

+1419
-158
lines changed

16 files changed

+1419
-158
lines changed

src/librustc/middle/astencode.rs

+97
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,7 @@ trait read_method_map_entry_helper {
556556
-> method_map_entry;
557557
}
558558
559+
#[cfg(stage0)]
559560
fn encode_method_map_entry(ecx: @e::EncodeContext,
560561
ebml_w: writer::Encoder,
561562
mme: method_map_entry) {
@@ -572,7 +573,27 @@ fn encode_method_map_entry(ecx: @e::EncodeContext,
572573
}
573574
}
574575
576+
#[cfg(stage1)]
577+
#[cfg(stage2)]
578+
#[cfg(stage3)]
579+
fn encode_method_map_entry(ecx: @e::EncodeContext,
580+
ebml_w: writer::Encoder,
581+
mme: method_map_entry) {
582+
do ebml_w.emit_struct("method_map_entry", 3) {
583+
do ebml_w.emit_struct_field("self_arg", 0u) {
584+
ebml_w.emit_arg(ecx, mme.self_arg);
585+
}
586+
do ebml_w.emit_struct_field("explicit_self", 2u) {
587+
mme.explicit_self.encode(&ebml_w);
588+
}
589+
do ebml_w.emit_struct_field("origin", 1u) {
590+
mme.origin.encode(&ebml_w);
591+
}
592+
}
593+
}
594+
575595
impl read_method_map_entry_helper for reader::Decoder {
596+
#[cfg(stage0)]
576597
fn read_method_map_entry(&self, xcx: @ExtendedDecodeContext)
577598
-> method_map_entry {
578599
do self.read_struct("method_map_entry", 3) {
@@ -592,6 +613,29 @@ impl read_method_map_entry_helper for reader::Decoder {
592613
}
593614
}
594615
}
616+
617+
#[cfg(stage1)]
618+
#[cfg(stage2)]
619+
#[cfg(stage3)]
620+
fn read_method_map_entry(&self, xcx: @ExtendedDecodeContext)
621+
-> method_map_entry {
622+
do self.read_struct("method_map_entry", 3) {
623+
method_map_entry {
624+
self_arg: self.read_struct_field("self_arg", 0u, || {
625+
self.read_arg(xcx)
626+
}),
627+
explicit_self: self.read_struct_field("explicit_self", 2u, || {
628+
let self_type: ast::self_ty_ = Decodable::decode(self);
629+
self_type
630+
}),
631+
origin: self.read_struct_field("origin", 1u, || {
632+
let method_origin: method_origin =
633+
Decodable::decode(self);
634+
method_origin.tr(xcx)
635+
}),
636+
}
637+
}
638+
}
595639
}
596640
597641
impl tr for method_origin {
@@ -782,6 +826,7 @@ impl ebml_writer_helpers for writer::Encoder {
782826
}
783827
}
784828
829+
#[cfg(stage0)]
785830
fn emit_tpbt(&self, ecx: @e::EncodeContext,
786831
tpbt: ty::ty_param_bounds_and_ty) {
787832
do self.emit_struct("ty_param_bounds_and_ty", 2) {
@@ -804,6 +849,32 @@ impl ebml_writer_helpers for writer::Encoder {
804849
}
805850
}
806851
}
852+
853+
#[cfg(stage1)]
854+
#[cfg(stage2)]
855+
#[cfg(stage3)]
856+
fn emit_tpbt(&self, ecx: @e::EncodeContext,
857+
tpbt: ty::ty_param_bounds_and_ty) {
858+
do self.emit_struct("ty_param_bounds_and_ty", 2) {
859+
do self.emit_struct_field("generics", 0) {
860+
do self.emit_struct("Generics", 2) {
861+
do self.emit_struct_field("type_param_defs", 0) {
862+
do self.emit_from_vec(*tpbt.generics.type_param_defs)
863+
|type_param_def|
864+
{
865+
self.emit_type_param_def(ecx, type_param_def);
866+
}
867+
}
868+
do self.emit_struct_field("region_param", 1) {
869+
tpbt.generics.region_param.encode(self);
870+
}
871+
}
872+
}
873+
do self.emit_struct_field("ty", 1) {
874+
self.emit_ty(ecx, tpbt.ty);
875+
}
876+
}
877+
}
807878
}
808879
809880
trait write_tag_and_id {
@@ -1053,6 +1124,7 @@ impl ebml_decoder_decoder_helpers for reader::Decoder {
10531124
}
10541125
}
10551126
1127+
#[cfg(stage0)]
10561128
fn read_ty_param_bounds_and_ty(&self, xcx: @ExtendedDecodeContext)
10571129
-> ty::ty_param_bounds_and_ty
10581130
{
@@ -1075,6 +1147,31 @@ impl ebml_decoder_decoder_helpers for reader::Decoder {
10751147
}
10761148
}
10771149
1150+
#[cfg(stage1)]
1151+
#[cfg(stage2)]
1152+
#[cfg(stage3)]
1153+
fn read_ty_param_bounds_and_ty(&self, xcx: @ExtendedDecodeContext)
1154+
-> ty::ty_param_bounds_and_ty
1155+
{
1156+
do self.read_struct("ty_param_bounds_and_ty", 2) {
1157+
ty::ty_param_bounds_and_ty {
1158+
generics: do self.read_struct("Generics", 2) {
1159+
ty::Generics {
1160+
type_param_defs: self.read_struct_field("type_param_defs", 0, || {
1161+
@self.read_to_vec(|| self.read_type_param_def(xcx))
1162+
}),
1163+
region_param: self.read_struct_field(~"region_param", 1, || {
1164+
Decodable::decode(self)
1165+
})
1166+
}
1167+
},
1168+
ty: self.read_struct_field("ty", 1, || {
1169+
self.read_ty(xcx)
1170+
})
1171+
}
1172+
}
1173+
}
1174+
10781175
fn convert_def_id(&self, xcx: @ExtendedDecodeContext,
10791176
source: tydecode::DefIdSource,
10801177
did: ast::def_id) -> ast::def_id {

src/libstd/ebml.rs

+85-17
Original file line numberDiff line numberDiff line change
@@ -335,31 +335,61 @@ pub mod reader {
335335
f()
336336
}
337337
338-
fn read_seq<T>(&self, f: &fn(uint) -> T) -> T {
339-
debug!("read_seq()");
340-
do self.push_doc(self.next_doc(EsVec)) {
341-
let len = self._next_uint(EsVecLen);
342-
debug!(" len=%u", len);
343-
f(len)
338+
fn read_enum_struct_variant<T>(&self, _names: &[&str], f: &fn(uint) -> T) -> T {
339+
debug!("read_enum_struct_variant()");
340+
let idx = self._next_uint(EsEnumVid);
341+
debug!(" idx=%u", idx);
342+
do self.push_doc(self.next_doc(EsEnumBody)) {
343+
f(idx)
344344
}
345345
}
346346
347-
fn read_seq_elt<T>(&self, idx: uint, f: &fn() -> T) -> T {
348-
debug!("read_seq_elt(idx=%u)", idx);
349-
self.push_doc(self.next_doc(EsVecElt), f)
347+
fn read_enum_struct_variant_field<T>(&self, name: &str, idx: uint, f: &fn() -> T) -> T {
348+
debug!("read_enum_struct_variant_arg(name=%?, idx=%u)", name, idx);
349+
f()
350350
}
351351
352352
fn read_struct<T>(&self, name: &str, _len: uint, f: &fn() -> T) -> T {
353353
debug!("read_struct(name=%s)", name);
354354
f()
355355
}
356356
357+
#[cfg(stage0)]
357358
fn read_field<T>(&self, name: &str, idx: uint, f: &fn() -> T) -> T {
358-
debug!("read_field(name=%s, idx=%u)", name, idx);
359+
debug!("read_field(name=%?, idx=%u)", name, idx);
359360
self._check_label(name);
360361
f()
361362
}
362363
364+
#[cfg(stage1)]
365+
#[cfg(stage2)]
366+
#[cfg(stage3)]
367+
fn read_struct_field<T>(&self, name: &str, idx: uint, f: &fn() -> T) -> T {
368+
debug!("read_struct_field(name=%?, idx=%u)", name, idx);
369+
self._check_label(name);
370+
f()
371+
}
372+
373+
fn read_tuple<T>(&self, f: &fn(uint) -> T) -> T {
374+
debug!("read_tuple()");
375+
self.read_seq(f)
376+
}
377+
378+
fn read_tuple_arg<T>(&self, idx: uint, f: &fn() -> T) -> T {
379+
debug!("read_tuple_arg(idx=%u)", idx);
380+
self.read_seq_elt(idx, f)
381+
}
382+
383+
fn read_tuple_struct<T>(&self, name: &str, f: &fn(uint) -> T) -> T {
384+
debug!("read_tuple_struct(name=%?)", name);
385+
self.read_tuple(f)
386+
}
387+
388+
fn read_tuple_struct_arg<T>(&self, idx: uint, f: &fn() -> T) -> T {
389+
debug!("read_tuple_struct_arg(idx=%u)", idx);
390+
self.read_tuple_arg(idx, f)
391+
}
392+
363393
fn read_option<T>(&self, f: &fn(bool) -> T) -> T {
364394
debug!("read_option()");
365395
do self.read_enum("Option") || {
@@ -373,6 +403,20 @@ pub mod reader {
373403
}
374404
}
375405
406+
fn read_seq<T>(&self, f: &fn(uint) -> T) -> T {
407+
debug!("read_seq()");
408+
do self.push_doc(self.next_doc(EsVec)) {
409+
let len = self._next_uint(EsVecLen);
410+
debug!(" len=%u", len);
411+
f(len)
412+
}
413+
}
414+
415+
fn read_seq_elt<T>(&self, idx: uint, f: &fn() -> T) -> T {
416+
debug!("read_seq_elt(idx=%u)", idx);
417+
self.push_doc(self.next_doc(EsVecElt), f)
418+
}
419+
376420
fn read_map<T>(&self, _f: &fn(uint) -> T) -> T {
377421
debug!("read_map()");
378422
fail!(~"read_map is unimplemented");
@@ -606,29 +650,42 @@ pub mod writer {
606650
self._emit_label(name);
607651
self.wr_tag(EsEnum as uint, f)
608652
}
653+
609654
fn emit_enum_variant(&self, _v_name: &str, v_id: uint, _cnt: uint,
610655
f: &fn()) {
611656
self._emit_tagged_uint(EsEnumVid, v_id);
612657
self.wr_tag(EsEnumBody as uint, f)
613658
}
659+
614660
fn emit_enum_variant_arg(&self, _idx: uint, f: &fn()) { f() }
615661
616-
fn emit_seq(&self, len: uint, f: &fn()) {
617-
do self.wr_tag(EsVec as uint) {
618-
self._emit_tagged_uint(EsVecLen, len);
619-
f()
620-
}
662+
fn emit_enum_struct_variant(&self, v_name: &str, v_id: uint, cnt: uint, f: &fn()) {
663+
self.emit_enum_variant(v_name, v_id, cnt, f)
621664
}
622665
623-
fn emit_seq_elt(&self, _idx: uint, f: &fn()) {
624-
self.wr_tag(EsVecElt as uint, f)
666+
fn emit_enum_struct_variant_field(&self, _f_name: &str, idx: uint, f: &fn()) {
667+
self.emit_enum_variant_arg(idx, f)
625668
}
626669
627670
fn emit_struct(&self, _name: &str, _len: uint, f: &fn()) { f() }
671+
#[cfg(stage0)]
628672
fn emit_field(&self, name: &str, _idx: uint, f: &fn()) {
629673
self._emit_label(name);
630674
f()
631675
}
676+
#[cfg(stage1)]
677+
#[cfg(stage2)]
678+
#[cfg(stage3)]
679+
fn emit_struct_field(&self, name: &str, _idx: uint, f: &fn()) {
680+
self._emit_label(name);
681+
f()
682+
}
683+
684+
fn emit_tuple(&self, len: uint, f: &fn()) { self.emit_seq(len, f) }
685+
fn emit_tuple_arg(&self, idx: uint, f: &fn()) { self.emit_seq_elt(idx, f) }
686+
687+
fn emit_tuple_struct(&self, _name: &str, len: uint, f: &fn()) { self.emit_seq(len, f) }
688+
fn emit_tuple_struct_arg(&self, idx: uint, f: &fn()) { self.emit_seq_elt(idx, f) }
632689
633690
fn emit_option(&self, f: &fn()) {
634691
self.emit_enum("Option", f);
@@ -640,6 +697,17 @@ pub mod writer {
640697
self.emit_enum_variant("Some", 1, 1, f)
641698
}
642699
700+
fn emit_seq(&self, len: uint, f: &fn()) {
701+
do self.wr_tag(EsVec as uint) {
702+
self._emit_tagged_uint(EsVecLen, len);
703+
f()
704+
}
705+
}
706+
707+
fn emit_seq_elt(&self, _idx: uint, f: &fn()) {
708+
self.wr_tag(EsVecElt as uint, f)
709+
}
710+
643711
fn emit_map(&self, _len: uint, _f: &fn()) {
644712
fail!(~"emit_map is unimplemented");
645713
}

0 commit comments

Comments
 (0)