syntax: Shrink enum Token and enum nonterminal

`enum Token` was 192 bytes (64-bit), as pointed out by pnkfelix; the only
bloating variant being `INTERPOLATED(nonterminal)`.

Updating `enum nonterminal` to use ~ where variants included big types,
shrunk size_of(Token) to 32 bytes (64-bit).

I am unsure if the `nt_ident` variant should have an indirection, with
ast::ident being only 16 bytes (64-bit), but without this, enum Token
would be 40 bytes.

A dumb benchmark says that compilation time is unchanged, while peak
memory usage for compiling std.rs is down 3%

Before::

    $ time ./x86_64-unknown-linux-gnu/stage1/bin/rustc --cfg stage1 src/libstd/std.rs
    19.00user 0.39system 0:19.41elapsed 99%CPU (0avgtext+0avgdata 627820maxresident)k
    0inputs+28896outputs (0major+228665minor)pagefaults 0swaps
    $ time ./x86_64-unknown-linux-gnu/stage1/bin/rustc -O --cfg stage1 src/libstd/std.rs
    31.64user 0.34system 0:32.02elapsed 99%CPU (0avgtext+0avgdata 629876maxresident)k
    0inputs+22432outputs (0major+229411minor)pagefaults 0swaps

After::

    $ time ./x86_64-unknown-linux-gnu/stage1/bin/rustc --cfg stage1 src/libstd/std.rs
    19.07user 0.45system 0:19.55elapsed 99%CPU (0avgtext+0avgdata 609384maxresident)k
    0inputs+28896outputs (0major+221997minor)pagefaults 0swaps

    $ time ./x86_64-unknown-linux-gnu/stage1/bin/rustc -O --cfg stage1 src/libstd/std.rs
    31.90user 0.34system 0:32.28elapsed 99%CPU (0avgtext+0avgdata 612080maxresident)k
    0inputs+22432outputs (0major+223726minor)pagefaults 0swaps
This commit is contained in:
blake2-ppc
2013-08-09 19:55:15 +02:00
parent bf809768ee
commit 5cfad6fbae
4 changed files with 16 additions and 16 deletions

View File

@@ -146,7 +146,7 @@ macro_rules! maybe_whole_expr (
Some($p.mk_expr(
($p).span.lo,
($p).span.hi,
expr_path(/* bad */ (*pt).clone())))
expr_path(/* bad */ (**pt).clone())))
}
_ => None
};
@@ -235,8 +235,8 @@ macro_rules! maybe_whole (
_ => None
};
match __found__ {
Some(INTERPOLATED(token::$constructor(x))) => {
return (~[], x.clone())
Some(INTERPOLATED(token::$constructor(ref x))) => {
return (~[], (**x).clone())
}
_ => {}
}
@@ -939,7 +939,7 @@ impl Parser {
// Useless second parameter for compatibility with quasiquote macros.
// Bleh!
pub fn parse_ty(&self, _: bool) -> Ty {
maybe_whole!(self, nt_ty);
maybe_whole!(deref self, nt_ty);
let lo = self.span.lo;
@@ -1293,7 +1293,7 @@ impl Parser {
// parse a path that doesn't have type parameters attached
pub fn parse_path_without_tps(&self) -> ast::Path {
maybe_whole!(self, nt_path);
maybe_whole!(deref self, nt_path);
let (ids,is_global,sp) = self.parse_path();
ast::Path { span: sp,
global: is_global,
@@ -1306,7 +1306,7 @@ impl Parser {
before_tps: Option<&fn()>) -> ast::Path {
debug!("parse_path_with_tps(colons=%b)", colons);
maybe_whole!(self, nt_path);
maybe_whole!(deref self, nt_path);
let lo = self.span.lo;
let path = self.parse_path_without_tps();
if colons && !self.eat(&token::MOD_SEP) {
@@ -3100,7 +3100,7 @@ impl Parser {
// parse a block. No inner attrs are allowed.
pub fn parse_block(&self) -> Block {
maybe_whole!(self, nt_block);
maybe_whole!(deref self, nt_block);
let lo = self.span.lo;
if self.eat_keyword(keywords::Unsafe) {