Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: pkg/compiler/lib/src/js_backend/frequency_namer.dart

Issue 1212613009: dart2js: Implement frequency based naming. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 part of js_backend;
6
7 class FrequencyBasedNamer extends Namer with _MinifiedFieldNamer,
8 _MinifiedOneShotInterceptorNamer implements jsAst.TokenFinalizer {
9 _FieldNamingRegistry fieldRegistry;
10 List<TokenName> tokens = new List<TokenName>();
11
12 Map<NamingScope, TokenScope> _tokenScopes =
13 new Maplet<NamingScope, TokenScope>();
14
15 // Some basic settings for smaller names
16 String get isolateName => 'I';
17 String get isolatePropertiesName => 'p';
18 bool get shouldMinify => true;
19
20 final String getterPrefix = 'g';
21 final String setterPrefix = 's';
22 final String callPrefix = ''; // this will create function names $<n>
23
24 FrequencyBasedNamer(Compiler compiler) : super(compiler) {
25 fieldRegistry = new _FieldNamingRegistry(this);
26 }
27
28 TokenScope newScopeFor(NamingScope scope) {
29 if (scope == NamingScope.instance) {
30 Set<String> illegalNames = new Set<String>();
31 for (String illegal in MinifyNamer._reservedNativeProperties) {
32 illegalNames.add(illegal);
33 if (MinifyNamer._hasBannedPrefix(illegal)) {
34 illegalNames.add(illegal.substring(1));
35 }
36 }
37 return new TokenScope(illegalNames);
38 } else {
39 return new TokenScope();
40 }
41 }
42
43 @override
44 jsAst.Name getFreshName(NamingScope scope, String proposedName,
45 {bool sanitizeForNatives: false,
46 bool sanitizeForAnnotations: false}) {
47 // Grab the scope for this token
48 TokenScope tokenScope = _tokenScopes.putIfAbsent(scope,
49 () => newScopeFor(scope));
50
51 // Get the name the normal namer would use as a key.
52 String proposed = _generateFreshStringForName(proposedName,
53 getUsedNames(scope),
54 getSuggestedNames(scope),
55 sanitizeForNatives:
56 sanitizeForNatives,
57 sanitizeForAnnotations:
58 sanitizeForAnnotations);
59
60 TokenName name = new TokenName(tokenScope, proposed);
61 tokens.add(name);
62 return name;
63 }
64
65 @override
66 jsAst.Name instanceFieldPropertyName(Element element) {
67 jsAst.Name proposed = _minifiedInstanceFieldPropertyName(element);
68 if (proposed != null) {
69 return proposed;
70 }
71 return super.instanceFieldPropertyName(element);
72 }
73
74 @override
75 void finalizeTokens() {
76 int compareReferenceCount(TokenName a, TokenName b) {
77 int result = b._rc - a._rc;
78 if (result == 0) result = a._proposed.compareTo(b._proposed);
79 return result;
80 }
81
82 List<TokenName> usedNames =
83 tokens.where((TokenName a) => a._rc > 0).toList();
84 usedNames.sort(compareReferenceCount);
85 usedNames.forEach((TokenName token) => token.finalize());
86 }
87 }
88
89 class TokenScope {
90 List<int> _nextName = [$a];
91 final Set<String> illegalNames;
92
93 TokenScope([this.illegalNames = const ImmutableEmptySet()]);
94
95 bool _incrementPosition(int pos) {
sra1 2015/07/01 04:11:09 Add a comment to say what sequence this generates.
herhut 2015/07/02 08:54:51 Done.
96 bool overflow = false;
97 if (pos < 0) return true;
98 int value = _nextName[pos];
99 if (value == $_) {
100 value = $0;
101 } else if (value == $9) {
102 value = $a;
103 } else if (value == $z) {
104 value = $A;
105 } else if (value == $Z) {
106 overflow = _incrementPosition(pos - 1);
107 value = (pos > 0) ? $_ : $a;
108 } else {
109 value++;
110 }
111 _nextName[pos] = value;
112 return overflow;
113 }
114
115 _incrementName() {
116 if (_incrementPosition(_nextName.length - 1)) {
117 _nextName.add($a);
118 }
119 }
120
121 String getNextName() {
122 String proposal;
123 do {
124 proposal = new String.fromCharCodes(_nextName);
125 _incrementName();
126 } while (MinifyNamer._hasBannedPrefix(proposal) ||
127 illegalNames.contains(proposal));
128
129 return proposal;
130 }
131 }
132
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698