Skip to content

Commit 214626d

Browse files
committed
---
yaml --- r: 11892 b: refs/heads/master c: 3dca339 h: refs/heads/master v: v3
1 parent 3ff4cc1 commit 214626d

File tree

7 files changed

+279
-145
lines changed

7 files changed

+279
-145
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: f69e9ff643921bfe81f2d772042eae3f5acabaef
2+
refs/heads/master: 3dca3393fa6459da14151b22f403b3f3b8dada55
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/rustc/metadata/astencode.rs

Lines changed: 148 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,19 @@ import std::serialization::serializer;
1313
import std::serialization::deserializer;
1414
import std::serialization::serializer_helpers;
1515
import std::serialization::deserializer_helpers;
16+
import std::prettyprint::serializer;
1617
import std::smallintmap::map;
1718
import middle::trans::common::maps;
1819
import middle::{ty, typeck, last_use, ast_map};
19-
import middle::typeck::method_origin;
20-
import middle::typeck::vtable_res;
21-
import middle::typeck::vtable_origin;
20+
import middle::typeck::{method_origin,
21+
serialize_method_origin,
22+
deserialize_method_origin,
23+
vtable_res,
24+
vtable_origin};
2225
import driver::session::session;
23-
import middle::freevars::freevar_entry;
26+
import middle::freevars::{freevar_entry,
27+
serialize_freevar_entry,
28+
deserialize_freevar_entry};
2429
import c = common;
2530
import e = encoder;
2631

@@ -302,13 +307,13 @@ impl of tr for span {
302307

303308
impl serializer_helpers<S: serializer> for S {
304309
fn emit_def_id(did: ast::def_id) {
305-
astencode_gen::serialize_syntax_ast_def_id(self, did)
310+
ast::serialize_def_id(self, did)
306311
}
307312
}
308313

309314
impl deserializer_helpers<D: deserializer> for D {
310315
fn read_def_id(xcx: extended_decode_ctxt) -> ast::def_id {
311-
let did = astencode_gen::deserialize_syntax_ast_def_id(self);
316+
let did = ast::deserialize_def_id(self);
312317
did.tr(xcx)
313318
}
314319
}
@@ -330,7 +335,7 @@ impl deserializer_helpers<D: deserializer> for D {
330335

331336
fn encode_ast(ebml_w: ebml::writer, item: ast::inlined_item) {
332337
ebml_w.wr_tag(c::tag_tree as uint) {||
333-
astencode_gen::serialize_syntax_ast_inlined_item(ebml_w, item)
338+
ast::serialize_inlined_item(ebml_w, item)
334339
}
335340
}
336341

@@ -375,7 +380,7 @@ fn simplify_ast(ii: ast::inlined_item) -> ast::inlined_item {
375380
fn decode_ast(par_doc: ebml::doc) -> ast::inlined_item {
376381
let chi_doc = par_doc[c::tag_tree];
377382
let d = ebml::ebml_deserializer(chi_doc);
378-
astencode_gen::deserialize_syntax_ast_inlined_item(d)
383+
ast::deserialize_inlined_item(d)
379384
}
380385

381386
fn renumber_ast(xcx: extended_decode_ctxt, ii: ast::inlined_item)
@@ -400,12 +405,12 @@ fn renumber_ast(xcx: extended_decode_ctxt, ii: ast::inlined_item)
400405
// Encoding and decoding of ast::def
401406

402407
fn encode_def(ebml_w: ebml::writer, def: ast::def) {
403-
astencode_gen::serialize_syntax_ast_def(ebml_w, def)
408+
ast::serialize_def(ebml_w, def)
404409
}
405410

406411
fn decode_def(xcx: extended_decode_ctxt, doc: ebml::doc) -> ast::def {
407412
let dsr = ebml::ebml_deserializer(doc);
408-
let def = astencode_gen::deserialize_syntax_ast_def(dsr);
413+
let def = ast::deserialize_def(dsr);
409414
def.tr(xcx)
410415
}
411416

@@ -448,13 +453,12 @@ impl of tr for ast::def {
448453
// Encoding and decoding of freevar information
449454

450455
fn encode_freevar_entry(ebml_w: ebml::writer, fv: freevar_entry) {
451-
astencode_gen::serialize_middle_freevars_freevar_entry(ebml_w, fv)
456+
serialize_freevar_entry(ebml_w, fv)
452457
}
453458

454459
impl helper for ebml::ebml_deserializer {
455460
fn read_freevar_entry(xcx: extended_decode_ctxt) -> freevar_entry {
456-
let fv =
457-
astencode_gen::deserialize_middle_freevars_freevar_entry(self);
461+
let fv = deserialize_freevar_entry(self);
458462
fv.tr(xcx)
459463
}
460464
}
@@ -469,16 +473,16 @@ impl of tr for freevar_entry {
469473
// Encoding and decoding of method_origin
470474

471475
fn encode_method_origin(ebml_w: ebml::writer, mo: method_origin) {
472-
astencode_gen::serialize_middle_typeck_method_origin(ebml_w, mo)
476+
serialize_method_origin(ebml_w, mo)
473477
}
474478

475479
impl helper for ebml::ebml_deserializer {
476480
fn read_method_origin(xcx: extended_decode_ctxt) -> method_origin {
477-
let fv = astencode_gen::deserialize_middle_typeck_method_origin(self);
481+
let fv = deserialize_method_origin(self);
478482
fv.tr(xcx)
479483
}
480484
fn read_is_last_use(xcx: extended_decode_ctxt) -> last_use::is_last_use {
481-
let lu = astencode_gen::deserialize_middle_last_use_is_last_use(self);
485+
let lu = last_use::deserialize_is_last_use(self);
482486
lu.tr(xcx)
483487
}
484488
}
@@ -692,7 +696,7 @@ fn encode_side_tables_for_id(ecx: @e::encode_ctxt,
692696
ebml_w.tag(c::tag_table_def) {||
693697
ebml_w.id(id);
694698
ebml_w.tag(c::tag_table_val) {||
695-
astencode_gen::serialize_syntax_ast_def(ebml_w, def)
699+
ast::serialize_def(ebml_w, def)
696700
}
697701
}
698702
}
@@ -774,7 +778,7 @@ fn encode_side_tables_for_id(ecx: @e::encode_ctxt,
774778
ebml_w.tag(c::tag_table_last_use) {||
775779
ebml_w.id(id);
776780
ebml_w.tag(c::tag_table_val) {||
777-
astencode_gen::serialize_middle_last_use_is_last_use(ebml_w, m)
781+
last_use::serialize_is_last_use(ebml_w, m)
778782
}
779783
}
780784
}
@@ -786,8 +790,7 @@ fn encode_side_tables_for_id(ecx: @e::encode_ctxt,
786790
ebml_w.tag(c::tag_table_method_map) {||
787791
ebml_w.id(id);
788792
ebml_w.tag(c::tag_table_val) {||
789-
astencode_gen::
790-
serialize_middle_typeck_method_origin(ebml_w, mo)
793+
serialize_method_origin(ebml_w, mo)
791794
}
792795
}
793796
}
@@ -901,3 +904,128 @@ fn decode_side_tables(xcx: extended_decode_ctxt,
901904
#debug[">< Side table doc loaded"];
902905
}
903906
}
907+
908+
// ______________________________________________________________________
909+
// Testing of astencode_gen
910+
911+
#[cfg(test)]
912+
fn encode_item_ast(ebml_w: ebml::writer, item: @ast::item) {
913+
ebml_w.wr_tag(c::tag_tree as uint) {||
914+
ast::serialize_item(ebml_w, *item);
915+
}
916+
}
917+
918+
#[cfg(test)]
919+
fn decode_item_ast(par_doc: ebml::doc) -> @ast::item {
920+
let chi_doc = par_doc[c::tag_tree];
921+
let d = ebml::ebml_deserializer(chi_doc);
922+
@ast::deserialize_item(d)
923+
}
924+
925+
#[cfg(test)]
926+
fn new_parse_sess() -> parser::parse_sess {
927+
let cm = codemap::new_codemap();
928+
let handler = diagnostic::mk_handler(option::none);
929+
let sess = @{
930+
cm: cm,
931+
mutable next_id: 1,
932+
span_diagnostic: diagnostic::mk_span_handler(handler, cm),
933+
mutable chpos: 0u,
934+
mutable byte_pos: 0u
935+
};
936+
ret sess;
937+
}
938+
939+
#[cfg(test)]
940+
iface fake_ext_ctxt {
941+
fn session() -> fake_session;
942+
}
943+
944+
#[cfg(test)]
945+
type fake_options = {cfg: ast::crate_cfg};
946+
947+
#[cfg(test)]
948+
type fake_session = {opts: @fake_options,
949+
parse_sess: parser::parse_sess};
950+
951+
#[cfg(test)]
952+
impl of fake_ext_ctxt for fake_session {
953+
fn session() -> fake_session {self}
954+
}
955+
956+
#[cfg(test)]
957+
fn mk_ctxt() -> fake_ext_ctxt {
958+
let opts : fake_options = {cfg: []};
959+
{opts: @opts, parse_sess: new_parse_sess()} as fake_ext_ctxt
960+
}
961+
962+
#[cfg(test)]
963+
fn roundtrip(in_item: @ast::item) {
964+
#debug["in_item = %s", pprust::item_to_str(in_item)];
965+
let mbuf = io::mem_buffer();
966+
let ebml_w = ebml::writer(io::mem_buffer_writer(mbuf));
967+
encode_item_ast(ebml_w, in_item);
968+
let ebml_doc = ebml::doc(@io::mem_buffer_buf(mbuf));
969+
let out_item = decode_item_ast(ebml_doc);
970+
#debug["out_item = %s", pprust::item_to_str(out_item)];
971+
972+
let exp_str =
973+
io::with_str_writer {|w| ast::serialize_item(w, *in_item) };
974+
let out_str =
975+
io::with_str_writer {|w| ast::serialize_item(w, *out_item) };
976+
977+
#debug["expected string: %s", exp_str];
978+
#debug["actual string : %s", out_str];
979+
980+
assert exp_str == out_str;
981+
}
982+
983+
#[test]
984+
fn test_basic() {
985+
let ext_cx = mk_ctxt();
986+
roundtrip(#ast(item){
987+
fn foo() {}
988+
});
989+
}
990+
991+
#[test]
992+
fn test_smalltalk() {
993+
let ext_cx = mk_ctxt();
994+
roundtrip(#ast(item){
995+
fn foo() -> int { 3 + 4 } // first smalltalk program ever executed.
996+
});
997+
}
998+
999+
#[test]
1000+
fn test_more() {
1001+
let ext_cx = mk_ctxt();
1002+
roundtrip(#ast(item){
1003+
fn foo(x: uint, y: uint) -> uint {
1004+
let z = x + y;
1005+
ret z;
1006+
}
1007+
});
1008+
}
1009+
1010+
#[test]
1011+
fn test_simplification() {
1012+
let ext_cx = mk_ctxt();
1013+
let item_in = ast::ii_item(#ast(item) {
1014+
fn new_int_alist<B: copy>() -> alist<int, B> {
1015+
fn eq_int(&&a: int, &&b: int) -> bool { a == b }
1016+
ret {eq_fn: eq_int, mut data: []};
1017+
}
1018+
});
1019+
let item_out = simplify_ast(item_in);
1020+
let item_exp = ast::ii_item(#ast(item) {
1021+
fn new_int_alist<B: copy>() -> alist<int, B> {
1022+
ret {eq_fn: eq_int, mut data: []};
1023+
}
1024+
});
1025+
alt (item_out, item_exp) {
1026+
(ast::ii_item(item_out), ast::ii_item(item_exp)) {
1027+
assert pprust::item_to_str(item_out) == pprust::item_to_str(item_exp);
1028+
}
1029+
_ { fail; }
1030+
}
1031+
}

trunk/src/rustc/middle/freevars.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@ import syntax::print::pprust::path_to_str;
55
import std::map::*;
66
import option::*;
77
import syntax::{ast, ast_util, visit};
8+
import syntax::ast::{serialize_span, deserialize_span};
89
import middle::resolve;
910
import syntax::codemap::span;
1011

1112
export annotate_freevars;
1213
export freevar_map;
1314
export freevar_info;
14-
export freevar_entry;
15+
export freevar_entry, serialize_freevar_entry, deserialize_freevar_entry;
1516
export get_freevars;
1617
export has_freevars;
1718

1819
// A vector of defs representing the free variables referred to in a function.
1920
// (The def_upvar will already have been stripped).
21+
#[auto_serialize]
2022
type freevar_entry = {
2123
def: ast::def, //< The variable being accessed free.
2224
span: span //< First span where it is accessed (there can be multiple)

trunk/src/rustc/middle/last_use.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import std::map::hashmap;
2525
// (by `break` or conditionals), and for handling loops.
2626

2727
// Marks expr_paths that are last uses.
28+
#[auto_serialize]
2829
enum is_last_use {
2930
is_last_use,
3031
has_last_use,

trunk/src/rustc/middle/typeck.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ import middle::ty::{node_id_to_type, arg, block_ty,
1414
import util::ppaux::ty_to_str;
1515
import std::smallintmap;
1616
import std::map::{hashmap, int_hash};
17+
import std::serialization::{serialize_uint, deserialize_uint};
1718
import syntax::print::pprust::*;
1819

1920
export check_crate;
20-
export method_map, method_origin, method_static, method_param, method_iface;
21-
export vtable_map, vtable_res, vtable_origin, vtable_static, vtable_param,
22-
vtable_iface;
21+
export method_map;
22+
export method_origin, serialize_method_origin, deserialize_method_origin;
23+
export vtable_map;
24+
export vtable_res;
25+
export vtable_origin;
2326

27+
#[auto_serialize]
2428
enum method_origin {
2529
method_static(ast::def_id),
2630
// iface id, method num, param num, bound num
@@ -37,6 +41,7 @@ enum vtable_origin {
3741
vtable_param(uint, uint),
3842
vtable_iface(ast::def_id, [ty::t]),
3943
}
44+
4045
type vtable_map = hashmap<ast::node_id, vtable_res>;
4146

4247
type ty_table = hashmap<ast::def_id, ty::t>;

0 commit comments

Comments
 (0)