diff options
| author | blake2-ppc <blake2-ppc> | 2013-08-09 19:55:15 +0200 |
|---|---|---|
| committer | blake2-ppc <blake2-ppc> | 2013-08-11 06:56:07 +0200 |
| commit | 5cfad6fbae7ab6b0a64234f53f0f22ce4169da07 (patch) | |
| tree | f8340212eb8581b6699f52360fb2f3f21b7a99d2 /src/libsyntax/parse/parser.rs | |
| parent | bf809768ee8ff3ea4ef434721ff82b09a4df261a (diff) | |
| download | rust-5cfad6fbae7ab6b0a64234f53f0f22ce4169da07.tar.gz rust-5cfad6fbae7ab6b0a64234f53f0f22ce4169da07.zip | |
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
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 77c50a779c0..59db1a3cfa2 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -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) { |
